|
AT89S52按手冊稱,有三個定時器:T0、T1和T2。近日使用AT89S52中,發現當T0啟用中斷的時候,T2無法運行,而當T2啟用中斷的時候,T0就無法運行,真的很惑不解。請各位大師指點。
單片機源程序如下:
typedef unsigned char uchar;
typedef unsigned int uint;
#include<reg51.h>
#include<LCD1602_4.h>//
unsigned char tex1[]="0123456789ABCDEF";
uchar hour,min,sec;
uchar sss;
uint tcp,tt;
sfr IPH = 0xB7;
sfr T2CON = 0xc8; //timer2 control register
sbit TF2 = T2CON^7;
sbit TR2 = T2CON^2;
sbit ET2 = IE^5;
sfr T2MOD = 0xc9; //timer2 mode register
sfr RCAP2L = 0xca;
sfr RCAP2H = 0xcb;
sfr TL2 = 0xcc;
sfr TH2 = 0xcd;
void jishi()
{
if(tcp>20)
{
tcp=0;
sss++;
if(sss>7)
sss=0;
}
if(tt>10){tt=0;sec++;}
if(sec>59){sec=0;min++;}
if(min>59){min=0;hour++;}
if(hour>23)hour=0;
}
void TimerInit()
{
TMOD=0x22; //設定定時器1為8位自動重裝方式
TL0=0xfd;
TH0=0xfd;
TR0=1; //啟動定時器0
RCAP2H = 0x23;
RCAP2L = 0x12;
TH2 = 0xee;
TL2 = 0x00;
ET2=1;
TR2=1;
EA=1; //打開總中斷
}
void showtime()//顯示時間
{
uchar b=0;
switch(sss%8)
{
case 0:
case 2:
case 4:
case 6:
b=0; //顯示時間無時鐘點
break;
case 1:
case 3:
case 5:
case 7:
b=1; //顯示時間有時鐘點
break;
default:break;
}
write_LCD_Command(0x80);
write_LCD_data(tex1[hour/10]);
write_LCD_data(tex1[hour%10]);
if(b)write_LCD_data(':');
else write_LCD_data(' ');
write_LCD_data(tex1[min/10]);
write_LCD_data(tex1[min%10]);
if(b)write_LCD_data(':');
else write_LCD_data(' ');
write_LCD_data(tex1[sec/10]);
write_LCD_data(tex1[sec%10]);
}
void main()
{
TimerInit();
init_LCD();
delayms(2);
while (1)
{
jishi();
showtime();
}
}
void timer0() interrupt 1//定時器0中斷入口
{
tcp++;
}
void timer2() interrupt 5 //定時器2中斷入口
{
TF2=0;
tt++;
}
|
|