51单片机定时器中断程序
扫描二维码
随时随地手机看文章
程序运行开始,A灯先亮5秒,然后灭了到B灯亮5秒,B再灭再到C灯亮5秒,C灭,程序结束,不再运行。这程序该怎么写?用定时器精确定时……晶振11.092MHZ。
#include"REG52.H"
/*
*
*/
sbitLED_A=P1^0;
sbitLED_B=P1^1;
sbitLED_C=P1^2;
unsignedcharTIME_BASE;
unsignedcharMACT_ENDB;
unsignedcharRece_Errp;
/*
*定时器初始化
*/
voidSystemInit(void)
{
TMOD=0x01;
TH0=(65536-45872)/256;//定时50ms//晶振:11.0592MHZ
TL0=(65536-45872)%256;
ET0=1;
TR0=1;
EA=1;
}
intmain(void)
{
SystemInit();
while(1)
{
/*程序一开始上电Rece_Errp=0定时器5秒加一次*/
if(Rece_Errp==0)
{
LED_A=0;//A亮5秒
LED_B=1;//B是灭
LED_C=1;//C是灭
}
/*判断是否5秒时间到*/
elseif(Rece_Errp==1)
{
LED_A=1;//A是灭
LED_B=0;//B亮5秒
LED_C=1;//C是灭
}
elseif(Rece_Errp==2)
{
LED_A=1;//A是灭
LED_B=1;//B是灭
LED_C=0;//C亮5秒
}
else
{
LED_A=1;//A是灭
LED_B=1;//B是灭
LED_C=1;//C是灭
while(1);//程序运行到这里停止
}
}
}
voidTimer0_IRQ(void)interrupt1
{
TH0=(655365-45872)/256;
TL0=(655365-45872)%256;
/*进入中断50ms+1次*/
TIME_BASE++;
if(TIME_BASE==20)//20ms*50ms=刚好等于1000ms也就是1秒
{
TIME_BASE=0;
MACT_ENDB++;//一秒加一次
if(MACT_ENDB==5)//等于刚好5秒时间到
{
MACT_ENDB=0;
Rece_Errp++;//用来切换LEDA、B、C5秒灭
}
}
}