51单片机 | 定时器中断应用实例
————————————————————————————————————————————
定时器中断应用实例
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
每秒点亮P1.0口的发光二极管一次,然后熄灭,使发光二极管形成闪烁效果
实现思路:
- 通过定时/计数器,每秒触发一次P1.0取反
- 涉及到的功能模块:定时器,中断,LED操作
-
定时器装填:
需要计数每秒的话,计数921600时溢出即可,在四种方式定时方式中,最大的计数范围是方式2:65536,将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 }
分类:
嵌入式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!