新浪博客

用C语言编写程序实现通过按键使C51单片机上的LED灯周期闪烁

2010-02-24 21:12阅读:
一、设计题目
二、程序功能:
开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想
用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
在我编写的实验程序中我用到了定时器中断和外部中断。程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
四、程序具体实现
实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。2S时间到后,所有灯熄灭。然后进入while循环,等待用户按键。用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。在本实验中,要求实现LED7的周期闪烁,我先设定一个标志位b=0;默认LED7灭,;然后在主函数中在定时时间到达后,通过判断和改变b的值来实现LED7的亮灭情况。然后使num=0;使定时器继续从新定时,不停循环实现LED7的周期闪烁。
程序附录:

#include<reg52.h>
#include<abs
acc.h>
#include'7279.h'
#define uchar unsigned char
#define uint unsigned int
sbit ad_busy = P3^2;
sbit key=P3^3;
uchar num;
uchar num1;


bit b;
uchar flag=0;

uchar keynumber;
#define LEDPort XBYTE[0x9000] //端口地址


void Init(void)
{
IE|=0x04;
TCON=0x01;
}
void Time0_Init(void)
{
TMOD|=0x01;
TH0=0xB8;
TL0=0x00;
ET0=1;
TR0=1;
}
void Time0(void) interrupt 1
{
TH0=0xB8;
TL0=0x00;
num++;
if(num==100)

flag=1;

}
void ISR_INT1(void) interrupt 2
{ keynumber=Read7279();
while(!key);

switch(keynumber)
{

case 0:num1=20;break;
case 1:num1=50;break;
default:break;
}
}
void main(void)
{
b=0;
Init();
Time0_Init();
EA=1;

while(!flag)
{ LEDPort=0x00; }
LEDPort=0xff;

num=0;

while(1)
{

if(num==num1)
{ if(b)
{LEDPort=0x7f;b=0;}
else
{ LEDPort=0xff;b=1;}
}

} num=0;
}

我的更多文章

下载客户端阅读体验更佳

APP专享