|
|
AT89S52按手冊(cè)稱,有三個(gè)定時(shí)器:T0、T1和T2。近日使用AT89S52中,發(fā)現(xiàn)當(dāng)T0啟用中斷的時(shí)候,T2無法運(yùn)行,而當(dāng)T2啟用中斷的時(shí)候,T0就無法運(yùn)行,真的很惑不解。請(qǐng)各位大師指點(diǎn)。
單片機(jī)源程序如下:
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; //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
TL0=0xfd;
TH0=0xfd;
TR0=1; //啟動(dòng)定時(shí)器0
RCAP2H = 0x23;
RCAP2L = 0x12;
TH2 = 0xee;
TL2 = 0x00;
ET2=1;
TR2=1;
EA=1; //打開總中斷
}
void showtime()//顯示時(shí)間
{
uchar b=0;
switch(sss%8)
{
case 0:
case 2:
case 4:
case 6:
b=0; //顯示時(shí)間無時(shí)鐘點(diǎn)
break;
case 1:
case 3:
case 5:
case 7:
b=1; //顯示時(shí)間有時(shí)鐘點(diǎn)
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//定時(shí)器0中斷入口
{
tcp++;
}
void timer2() interrupt 5 //定時(shí)器2中斷入口
{
TF2=0;
tt++;
}
|
-
-
LCD1602_4.rar
2020-5-23 18:36 上傳
點(diǎn)擊文件名下載附件
674 Bytes, 下載次數(shù): 3
|