新闻详情

新闻详情

首页 / 资讯中心 / 详情

51单片机MCU的常见最简代码

发布时间:2026/9/30 9:01:48来源:尧图网络
51单片机MCU的常见最简代码
定时器#include REGX52.H sbit LED P2^0; /* 记录已经过去多少毫秒 */ unsigned int ms_count 0; void Timer0_Init(void) { /* * TMOD Timer Mode Register * 定时器模式寄存器 * * 我们只配置 Timer0。 */ TMOD 0xF0; // 清除低4位即Timer0原来的配置 TMOD | 0x01; // Timer0设置为模式116位定时器 /* * TH0 Timer0 High * Timer0计数器的高8位 * * TL0 Timer0 Low * Timer0计数器的低8位 * * TH0 TL0 合起来就是一个16位计数器 * * TH0 TL0 * 11111100 01100110 * * FC 66 * * 所以初值 * * TH0 0xFC * TL0 0x66 * * 对于11.0592MHz传统12T 8051 * 这个数值可以得到大约1ms的定时。 */ TH0 0xFC; TL0 0x66; /* * ET0 Enable Timer0 Interrupt * * 1 允许Timer0产生中断 * 0 禁止Timer0产生中断 */ ET0 1; /* * EA Enable All * * 总中断开关 * * 1 CPU允许响应中断 * 0 CPU不响应可屏蔽中断 */ EA 1; /* * TR0 Timer0 Run * * Timer0启动开关 * * 1 开始计数 * 0 停止计数 */ TR0 1; } void main(void) { Timer0_Init(); while(1) { /* * 什么都不用做。 * * Timer0是硬件 * CPU不需要在这里不断检查它。 */ } } /* * interrupt 1 * * 表示这是Timer0的中断服务函数。 * * 注意 * 1不是“优先级1” * 而是Keil C51定义的Timer0中断编号。 */ void Timer0_ISR(void) interrupt 1 { /* * Timer0已经溢出了。 * * 模式1下需要重新装载下一次定时的初值。 */ TH0 0xFC; TL0 0x66; /* * 每进入一次这里 * 就代表大约过去了1ms。 */ ms_count; /* * 1000 × 1ms ≈ 1秒 */ if(ms_count 1000) { ms_count 0; /* * LED状态翻转 * * 0 → 1 * 1 → 0 */ LED !LED; } }按键无阻塞消抖#include REGX52.H sbit KEY P3^2; sbit LED P2^0; /* 按键状态 0 空闲等待按下 1 正在确认“按下” 2 已确认按下等待松开 3 正在确认“松开” */ volatile unsigned char key_state 0; /* 消抖倒计时单位 ms */ volatile unsigned char key_timer 0; /*---------------- Timer0每1ms中断 ----------------*/ void Timer0_Init(void) { TMOD 0xF0; TMOD | 0x01; // Timer0 模式116位定时器 /* 11.0592 MHz 晶振 传统8051机器周期 12个晶振周期 约1ms TH0 0xFC TL0 0x66 */ TH0 0xFC; TL0 0x66; ET0 1; // 开 Timer0 中断 TR0 1; // 启动 Timer0 } /*---------------- INT0 初始化 ----------------*/ void INT0_Init(void) { KEY 1; // 释放 P3.2作为输入 IT0 1; // 下降沿触发 EX0 1; // 开 INT0 } /*---------------- 主程序 ----------------*/ void main(void) { Timer0_Init(); INT0_Init(); EA 1; // 总中断开启 while(1) { switch(key_state) { /* 状态1检测到了下降沿等待20ms确认 */ case 1: if(key_timer 0) { if(KEY 0) { /* 20ms后仍然是低电平 确认真的按下 */ LED !LED; key_state 2; } else { /* 20ms以后已经恢复高电平 说明可能只是毛刺 */ key_state 0; EX0 1; } } break; /* 状态2已经按下等待松手 */ case 2: if(KEY 1) { /* 检测到松手了但先别信 再观察20ms */ key_timer 20; key_state 3; } break; /* 状态3确认松手 */ case 3: if(key_timer 0) { if(KEY 1) { /* 确实已经松开 */ key_state 0; /* 重新允许下一次按键中断 */ EX0 1; } else { /* 又变低了 说明刚才只是松手抖动 */ key_state 2; } } break; } /* 主循环这里完全可以继续做其他事情 LED_Matrix_Task(); UART_Task(); Animation_Task(); Sensor_Task(); 都不会被消抖程序卡住 */ } } /*---------------- INT0 中断 ----------------*/ void INT0_ISR(void) interrupt 0 { /* 下降沿出现 我们暂时只认为“可能按下了” */ EX0 0; // 暂时屏蔽INT0防止抖动疯狂进中断 key_timer 20; // 从20ms开始计时 key_state 1; // 进入“确认按下”状态 } /*---------------- Timer0 中断 ----------------*/ void Timer0_ISR(void) interrupt 1 { TH0 0xFC; TL0 0x66; /* Timer0每1ms帮我们走一步时间 */ if(key_timer 0) { key_timer--; } }
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CNC精密零件加工除尺寸公差外,还要明确哪些内容? 2026/9/30 22:29:53

CNC精密零件加工除尺寸公差外,还要明确哪些内容?

上周一个做机器人关节的工程师找过来,第一句话就带着气:“你们能不能别像前几家那样,报价报完又加价,样品做完又返工?项目节点已经拖了三周了。” 答案其实不复杂:报价反复返工、成品跟预期对不上&#xff…

阅读更多 →
Copilot 能换成本地吗?—— 把 endpoint 改到 TaoToken 的本地化部署与替代方案全解析 2026/9/30 22:29:47

Copilot 能换成本地吗?—— 把 endpoint 改到 TaoToken 的本地化部署与替代方案全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
化学智能体的闭环时刻:从自然语言到机器人实验,走通了哪条路 2026/9/30 22:29:33

化学智能体的闭环时刻:从自然语言到机器人实验,走通了哪条路

一个化学工作者用自然语言说出"帮我做这组样品的梯度稀释",机器人液体工作站自己产出可执行协议文件,中途发现计量矛盾还会自己改——这个场景在 2026 年之前属于演示视频,现在有了可量化的一致性证据。美国太平洋西北国家实验室&a…

阅读更多 →
【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》 2026/9/30 22:29:26

【Redis初阶】(篇二)《一文吃透 Redis:特性、应用场景、版本演进与安装配置全解析》

一.了解 Redis Redis 官网:Redis - Real-time data for agents & apps Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对(Key-Value)NoSQL 数据库。 在数据结构上,Redis 的 key 永远是…

阅读更多 →
工业配电开关三大核心指标:电气参数、公差范围与机械寿命协同解析 2026/9/30 22:29:26

工业配电开关三大核心指标:电气参数、公差范围与机械寿命协同解析

1. 工业级配电开关控制设备不是“能通电就行”的玩具——它是一套精密协同的机电系统很多人第一次接触工业级配电开关控制设备时,下意识会把它和家里墙上那个咔哒一声就跳闸的空气开关画等号。这种认知偏差,在项目现场已经酿成过三次非计划停机事故&…

阅读更多 →
成为全栈·Next.js 网站前台篇·文章列表:服务端首屏与客户端持续加载怎样协作 2026/9/30 22:29:19

成为全栈·Next.js 网站前台篇·文章列表:服务端首屏与客户端持续加载怎样协作

成为全栈Next.js 网站前台篇文章列表:服务端首屏与客户端持续加载怎样协作 首屏内容适合由服务端直接交付,继续加载需要浏览器管理交互状态。两者合在一起时,真正难的是让第 2 页从第 1 页的下一步开始,而不是重新发明一份列表。 …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉