測(cè)試定時(shí)器0的程序
這是寫的一個(gè)簡(jiǎn)單的測(cè)試定時(shí)器0的程序:要實(shí)現(xiàn)的目標(biāo)是,LED第一個(gè)跟第二個(gè)燈先循環(huán)亮起,第三盞燈則以間隔一秒鐘的時(shí)間亮起一次,其中,第三盞燈的亮起時(shí)間以定時(shí)器0的中斷來執(zhí)行,里邊有亮點(diǎn)需要注意。
一、不要忘記中斷程序中進(jìn)if語句中的后的tt清零
二、不要忘了把定時(shí)器里邊的語句回歸哦,否則老是認(rèn)為中斷服務(wù)程序沒返回主函數(shù)呢
三、這個(gè)if語句不應(yīng)寫在主函數(shù)中,因?yàn)槿绻麑懺谥骱瘮?shù)中,時(shí)序會(huì)出現(xiàn)問題。因?yàn)槿绻趍ain函數(shù)中的話,前邊的幾個(gè)delay時(shí)間會(huì)與定時(shí)器定的準(zhǔn)確時(shí)間產(chǎn)生時(shí)序問題,因?yàn)閐elay()的時(shí)間長(zhǎng),早過了20個(gè)tt時(shí)間了,所以會(huì)出現(xiàn)時(shí)序問題!
四、另外,那個(gè)delay函數(shù)的時(shí)間也有問題,我還得重新調(diào)試下!
五、注意定時(shí)器0的初始化,中斷函數(shù)不需聲明等。
# include
# define uint unsigned int
# define uchar unsigned char
sbit P21=P2^0;
sbit P22=P2^1;
sbit P23=P2^2;
void delay(uint z); //延時(shí)函數(shù)聲明
uchar tt;
void main ()
{
TMOD=0x01; //定時(shí)器0初始化
TH0=(65536-50000)/256;//約為50ms
TL0=(65536-50000)%256;
EA=1; //開總中斷
ET0=1; //開定時(shí)器0中斷
TR0=1; //啟動(dòng)定時(shí)器工作 */
while(1)
{
P23=1; //不要忘了把定時(shí)器里邊的語句回歸哦,否則
//老是認(rèn)為中斷服務(wù)程序沒返回主函數(shù)呢
P21=0; //如果是50*20ms=1秒時(shí)候,觸發(fā)中斷
delay(2000); //P21與P22以約為1秒的時(shí)間間隔閃爍
P21=1;
delay(2000);
P22=0;
delay(2000);
P22=1;
delay(2000);
}
}
void delay(uint z) //延時(shí)函數(shù),約為1秒
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1 //定時(shí)器0中斷服務(wù)函數(shù)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20) //這個(gè)if語句不應(yīng)寫在主函數(shù)中,因?yàn)槿绻?br/> { //寫在主函數(shù)中,時(shí)序會(huì)出現(xiàn)問題
tt=0; //千萬不要忘記tt清零哇?。。?!
P23=0;
delay(2000); //delay()函數(shù)還要調(diào)試,因?yàn)?br/> //延時(shí)時(shí)間不是按照()中的數(shù)字遞增而遞增的
P21=1;
delay(2000);
P22=1;
delay(2000);
}
}





