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

———————————————————————————————————————————— spa

定時器中斷應用實例 設計

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -3d

設計要求: code

每秒點亮P1.0口的發光二極管一次,而後熄滅,使發光二極管造成閃爍效果 blog

 

實現思路: it

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

    須要計數每秒的話,計數921600時溢出便可,在四種方式定時方式中,最大的計數範圍是方式265536,將921600分解成20份,每份計數46080時溢出,當溢出20次時燈閃爍,每次定時器溢出都要從新裝填 class

模塊設計 定時器

  • 初始化
    • LED(上拉輸入模式)
    • 定時器(T0,工做方式1,裝填初值,啓動(在中斷初始化後啓動))
    • 中斷(開放中斷,開放T0中斷)
  • while(1)
  • 中斷
    • 重置定時器(溢出位復位,從新裝填計時)
    • 判斷溢出次數(到達20次時LED改變狀態,計數清零。未到達20次時溢出次數加一)

實現代碼im

 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 }
相關文章
相關標籤/搜索