|
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++;
}
|
|