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