51單片機 | 定時器中斷應用實例


————————————————————————————————————————————

定時器中斷應用實例

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

設計要求:

每秒點亮P1.0口的發光二極管一次,然后熄滅,使發光二極管形成閃爍效果

 

實現思路:

  • 通過定時/計數器,每秒觸發一次P1.0取反
  • 涉及到的功能模塊:定時器,中斷,LED操作
  • 定時器裝填:

    需要計數每秒的話,計數921600時溢出即可,在四種方式定時方式中,最大的計數范圍是方式265536,將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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM