———————————————————————————————————————————— 定時器中斷應用實例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
————————————————————————————————————————————
定時器中斷應用實例
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
設計要求:
每秒點亮P1.0口的發光二極體一次,然後熄滅,使發光二極體形成閃爍效果
實現思路:
- 通過定時/計數器,每秒觸發一次P1.0取反
- 涉及到的功能模塊:定時器,中斷,LED操作
-
定時器裝填:
需要計數每秒的話,計數921600時溢出即可,在四種方式定時方式中,最大的計數範圍是方式2:65536,將921600分解成20份,每份計數46080時溢出,當溢出20次時燈閃爍,每次定時器溢出都要重新裝填
模塊設計
-
初始化
- LED(上拉輸入模式)
- 定時器(T0,工作方式1,裝填初值,啟動(在中斷初始化後啟動))
- 中斷(開放中斷,開放T0中斷)
- while(1)
-
中斷
- 重置定時器(溢出位複位,重新裝填計時)
- 判斷溢出次數(到達20次時LED改變狀態,計數清零。未到達20次時溢出次數加一)
實現代碼
1 #include <reg52.h> 2 #include <intrins.h> 3 typedef unsigned char uchar; 4 sbit LED = P1 ^ 0; 5 uchar count = 0; 6 void Interrupt() interrupt 1 7 { 8 TH0 = (65536 - 46080) / 256; //觸發中斷時重新裝填計時 9 TL0 = (65536 - 46080) % 256; 10 if (count == 20) 11 { 12 LED = ~LED; 13 count = 0; 14 } 15 else ++count; 16 } 17 void main(void) 18 { 19 LED = 0xff; //初始化LED 20 TMOD = 0x01; //初始化TMOD,定時器0,方式1 21 TH0 = (65536 - 46080) / 256; //裝填計數 22 TL0 = (65536 - 46080) % 256; 23 EA = 1; //開放所有中斷 24 ET0 = 1; //開放定時器0中斷控制位 25 TR0 = 1; //定時器0開始計時 26 while(1) 27 { 28 _nop_(); 29 } 30 }