关注【电子开发圈】微信公众号,一起学习吧!
电子DIY、Arduino、51单片机、STM32单片机、FPGA……
电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机……
点击链接,免费下载100G+电子设计学习资料!
定时器中断应用实例
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果
实现思路:
- 通过定时/计数器,每秒触发一次P1.0取反
- 涉及到的功能模块:定时器,中断,LED操作
-
定时器装填:
需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式2:65536,将921600分解成20份,每份计数46080时溢出,当溢出20次时灯闪烁,每次定时器溢出都要重新装填
模块设计
-
初始化
- LED(上拉输入模式)
- 定时器(T0,工作方式1,装填初值,启动(在中断初始化后启动))
- 中断(开放中断,开放T0中断)
- while(1)
-
中断
- 重置定时器(溢出位复位,重新装填计时)
- 判断溢出次数(到达20次时LED改变状态,计数清零。未到达20次时溢出次数加一)
实现代码
#include <reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
sbit LED = P1 ^ 0;
uchar count = 0;
void Interrupt() interrupt 1
{
TH0 = (65536 - 46080) / 256; //触发中断时重新装填计时
TL0 = (65536 - 46080) % 256;
if (count == 20)
{
LED = ~LED;
count = 0;
}
else ++count;
}
void main(void)
{
LED = 0xff; //初始化LED
TMOD = 0x01; //初始化TMOD,定时器0,方式1
TH0 = (65536 - 46080) / 256; //装填计数
TL0 = (65536 - 46080) % 256;
EA = 1; //开放所有中断
ET0 = 1; //开放定时器0中断控制位
TR0 = 1; //定时器0开始计时
while(1)
{
_nop_();
}
}