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 }

 

posted @ 2017-05-19 13:49  hugh.dong  阅读(18019)  评论(3编辑  收藏  举报