网络游戏 2017-05-19
————————————————————————————————————————————
定时器中断应用实例
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果
实现思路:
通过定时/计数器,每秒触发一次P1.0取反 涉及到的功能模块:定时器,中断,LED操作 定时器装填:

需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式2:65536,将921600分解成20份,每份计数46080时溢出,当溢出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 }