8052單片機(jī)中定時(shí)器T2的應(yīng)用
52單片機(jī)的大家都熟悉,可是其中的Timer2很少有人去用,書上和網(wǎng)上鮮有資料,這里轉(zhuǎn)載一篇文章,初步了解一下他的應(yīng)用
/***********************************************************
程序功能:52系列單片機(jī)定時(shí)器計(jì)數(shù)器2使用
程序設(shè)計(jì):燕山大學(xué)魯信瓊
晶振選擇:24MHz,如果晶振不匹配,請(qǐng)修改延時(shí)函數(shù)參數(shù);P2^6口接數(shù)碼管段選控制位;P2^7口接數(shù)碼管位選控制位;P1^7口作為測試指示燈
本實(shí)驗(yàn)注意事項(xiàng):
1.定時(shí)器2的中斷使能為IE^6位,也就是ET2;中斷服務(wù)程序標(biāo)號(hào)為5。
2.定時(shí)器2工作在16為自動(dòng)重裝模式下,不需要在中斷服務(wù)程序中重新賦初值,在程序初始化的時(shí)候我們應(yīng)該給RCAP2L和RCAP2H賦值,TH2和TL2將會(huì)在
中斷產(chǎn)生時(shí)自動(dòng)使TH2=RCAP2H,TL2=RCAP2L。
3.定時(shí)器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零,為了使定時(shí)盡量準(zhǔn)確,我們常在終端服務(wù)程序中第一步就使TF2=0。
4.使定時(shí)器2產(chǎn)生中斷的有兩個(gè)中斷源,如果EXEN2(定時(shí)器2外部使能標(biāo)志)置1的話,使定時(shí)器2進(jìn)入中斷的有可能是定時(shí)器2計(jì)數(shù)溢出,也可能是捕獲
到T2EX(單片機(jī)P1^1口)有負(fù)跳變,所以需要在中斷服務(wù)程序中判斷EXF2是否為1。
***********************************************************/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineLED_DATAP0
sbitDULA=P2^6;
sbitWELA=P2^7;
sbitLED=P1^7;
uchartimer2_ctr,num;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0};
//0123456789ABCDEF-
//24MHz晶振延時(shí)x毫秒函數(shù)
voiddelay_ms(uintxms)
{
uintx,y;
for(x=xms;x>0;x--)
for(y=248;y>0;y--);
}
//初始化主函數(shù)
voidinit_main()
{
DULA=0;//關(guān)閉數(shù)碼管顯示
WELA=0;
RCAP2H=(0xFFFF-50000)/256;
RCAP2L=(0xFFFF-50000)%256;//24MHz晶振下定時(shí)25ms,自動(dòng)重裝
TH2=RCAP2H;
TL2=RCAP2L;//定時(shí)器2賦初值
T2CON=0;//配置定時(shí)器2控制寄存器,這里其實(shí)不用配置,T2CON上電默認(rèn)就是0,這里賦值只是為了演示這個(gè)寄存器的配置
T2MOD=0;//配置定時(shí)器2工作模式寄存器,這里其實(shí)不用配置,T2MOD上電默認(rèn)就是0,這里賦值只是為了演示這個(gè)寄存器的配置
IE=0xA0;//10100000開總中斷,開外定時(shí)器2中斷,可按位操作:EA=1;ET2=1;
TR2=1;//啟動(dòng)定時(shí)器2
}
//數(shù)碼管顯示3位數(shù):0-255
voiddisplay(ucharnum)
{
uchargw,sw,bw;
bw=num/100;
sw=num%100/10;
gw=num%10;
LED_DATA=0XFE;//11111110
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[bw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
LED_DATA=0XFD;//11111101
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[sw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
LED_DATA=0XFB;//11111011
WELA=1;
_nop_();_nop_();
WELA=0;
LED_DATA=table[gw];
DULA=1;
_nop_();_nop_();
DULA=0;
delay_ms(3);
}
voidmain()
{
init_main();
while(1)
{
display(num);
}
}
voidtimer2()interrupt5
{
TF2=0;//!!!注意!!!定時(shí)器2必須由軟件對(duì)溢出標(biāo)志位清零,硬件不能清零,這里與定時(shí)器0和定時(shí)器1不同!!!
timer2_ctr++;
if(timer2_ctr>=40)//定時(shí)25ms×40=1000ms即1秒鐘,這里模擬一個(gè)60秒秒表
{
timer2_ctr=0;
LED=~LED;
num++;
if(num>=60)
{
num=0;
}
}
}
大家可以編譯下載試試哦,我試過,可以運(yùn)行,不過是12MHz的晶振。