概要
51单片机流水灯实现,编制程序,用PROTEUS绘制电路图,八个LED轮流点亮,每个时间只有一只点亮,点亮时间为1秒,其余熄灭。用一个按键控制流水灯的继续和暂停。
代码
#include <REGX52.H>
#include <intrins.h>
#define u8 unsigned char //定义字符类型
#define u16 unsigned int
#define led P2 //定义IO口P2为led
bit k = 0;
u8 x = 0x01;
void Delay(u16 xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void init()//初始化,即打开各中断开关
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TH0 = 0xFC; //定时器0装初值
TL0 = 0x18; //同上
IT0 = 1;//外部中断0为跳变沿触发方式
EA = 1;//开总中断
EX0 = 1;//打开外部中断0
ET0 = 1;//打开定时器0中断开关
TR0 = 1;//打开定时器0运行开关
IP = 0x01;//设置int0优先级为高,与PX0=1;等效
}
void int0() interrupt 0 //外部中断0的执行程序。
{
Delay(20);
if(!P3^2)
{
Delay(20);
k = !k;
}
}
void t0() interrupt 1 //定时器
{
static unsigned int T0Count;
TH0 = 0xFC; //定时器0装初值
TL0 = 0x18; //同上
T0Count++; //记录定时器经过的时间
if(T0Count >= 1000)//定时1秒后执行,T0Count=1000时约1秒
{
if(!k)
{
x = _crol_(x,1);
T0Count=0; //重置定时,达到每一秒点亮一次的目的
}
else
{
x = x;
T0Count = T0Count;
}
}
}
void main()
{
init(); //初始化
while(1)
{
if(!k)
led = ~x;
else
led = led;
}
}