没有合适的资源?快使用搜索试试~ 我知道了~
首页吴老师详述十年单片机编程框架:从入门到高级实战
吴老师详述十年单片机编程框架:从入门到高级实战
需积分: 13 5 下载量 75 浏览量
更新于2024-07-18
1
收藏 3.96MB PDF 举报
"《手把手教你单片机程序框架》是一本由吴坚鸿老师精心编撰的电子书,源自中国电子技术论坛的连载帖子,旨在帮助初学者理解和掌握单片机编程的基础知识。该书历时近两年,共分为19个章节,详尽地介绍了单片机编程中的关键概念和技术应用。 首先,章节一至六主要针对单片机入门者,讲述了常见的编程误区,如何通过delay()函数控制LED灯的闪烁,以及利用主循环次数和定时中断次数实现灯的周期性闪烁,这些都是理解硬件交互和程序控制的基础。接着,第七节至第十节深入探讨了独立按键的检测,包括基于主循环和定时中断的按键响应,以及不同类型的按键触发事件,如双击、组合按键和按键持续状态处理。 第十一到十五节转向更复杂的功能,如矩阵键盘的触发和编码,以及高级操作如74HC595驱动多路LED灯和优化代码实现跑马灯效果。这些章节不仅展示了实际操作技巧,还强调了代码优化的重要性。第十六节至第十七节则涉及多片单片机的协作,展示了在嵌入式系统中的集成和通信。 最后,本书的第二十节着重于LED灯的动态显示,演示了如何实现逐个点亮和熄灭LED灯的跑马灯效果,以及单片机直接控制LED灯阵列的方法。这些内容对于理解和设计实际的硬件交互非常实用。 总体来说,《手把手教你单片机程序框架》是一本实践性强、理论与实践相结合的教程,适合对单片机编程感兴趣并希望逐步提升技能的读者,无论是初学者还是有一定经验的工程师,都能从中获益匪浅。吴坚鸿老师丰富的从业经验和深入浅出的教学风格使得这本书成为学习单片机编程的宝贵资源。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10860888/bg10.jpg)
数码之家----我的数字生活,分享创意无限!http://www.mydigit.cn/
uiTimeCnt=0; //时间计数器清零
ET0=1; //开启定时中断
led_dr=0; //让 LED 灭
ucLedStep=0; //返回到上一个步骤
}
break;
}
}
/* 注释三:
* C51 的中断函数格式如下:
* void 函数名() interrupt 中断号
* {
* 中断程序内容
* }
* 函数名可以随便取,只要不是编译器已经征用的关键字。
* 这里最关键的是中断号,不同的中断号代表不同类型的中断。
* 定时中断的中断号是 1.至于其它中断的中断号,大家可以查找
* 相关书籍和资料。大家进入中断时,必须先清除中断标志,并且
* 关闭中断,然后再写代码,最后出来时,记得重装初始值,并且
* 打开中断。
*/
void T0_time() interrupt 1
{
TF0=0; //清除中断标志
TR0=0; //关中断
if(uiTimeCnt<0xffff) //设定这个条件,防止 uiTimeCnt 超范围。
{
uiTimeCnt++; //累加定时中断的次数,
}
TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1; //开中断
}
void delay_long(unsigned int uiDelayLong)
{
unsigned int i;
![](https://csdnimg.cn/release/download_crawler_static/10860888/bg11.jpg)
数码之家----我的数字生活,分享创意无限!http://www.mydigit.cn/
unsigned int j;
for(i=0;i<uiDelayLong;i++)
{
for(j=0;j<500;j++) //内嵌循环的空指令数量
{
; //一个分号相当于执行一条空语句
}
}
}
void initial_myself() //第一区 初始化单片机
{
/* 注释四:
* 单片机有几个定时器,每个定时器又有几种工作方式,
* 那么多种变化,我们记不了那么多,怎么办?
* 大家记住鸿哥的话,无论一个单片机有多少内置资源,
* 我们做系统框架的,只需要一个定时器,一种工作方式。
* 开定时器越多这个系统越不好。需要哪种定时工作方式呢?
* 就需要响应定时中断后重装一下初始值继续跑那种。
* 在 51 单片机中就是工作方式 1。其它的工作方式很少项目能用到。
*/
TMOD=0x01; //设置定时器 0 为工作方式 1
/* 注释五:
* 装定时器的初始值,就像一个水桶里装的水。如果这个桶是空桶,那么想
* 把这个桶灌满水的时间就很长,如果是里面已经装了大半的水,那么想
* 把这个桶灌满水的时间就相对比较短。也就是定时器初始值越小,产生一次
* 定时中断的时间就越长。如果初始值太小了,每次产生定时中断
* 的时间分辨率太粗,如果初始值太大了,虽然每次产生定时中断的时间分辨率很细,
* 但是太频繁的产生中断,不但会影响主函数 main()的执行效率,而且累记中断次数
* 的时间误差也会很大。凭鸿哥多年的江湖经验,
* 我觉得最大初始值减去 2000 是比较好的经验值。当然,大一点小一点没关系。不要走
* 两个极端就行。
*/
TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
led_dr=0; //LED 灭
}
void initial_peripheral() //第二区 初始化外围
{
![](https://csdnimg.cn/release/download_crawler_static/10860888/bg12.jpg)
数码之家----我的数字生活,分享创意无限!http://www.mydigit.cn/
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
}
总结陈词:
本节程序麻雀虽小五脏俱全。在本节中已经展示了我最完整的实战程序框架。
本节程序只有一个 LED 灯闪烁的单任务,如果要多增加一个任务来并行处理,该怎么办?
欲知详情,请听下回分解-----蜂鸣器的驱动程序。
![](https://csdnimg.cn/release/download_crawler_static/10860888/bg13.jpg)
数码之家----我的数字生活,分享创意无限!http://www.mydigit.cn/
第五节:蜂鸣器的驱动程序。
开场白:
上一节讲了利用累计定时中断次数实现 LED 灯闪烁,这个例子同时也第一次展示了我最完整的实战程序框
架:用 switch 语句实现状态机,外加定时中断。这个框架看似简单,实际上就是那么简单。我做的所有开发项
目都是基于这个简单框架,但是非常好用。上一节只有一个单任务的 LED 灯在闪烁,这节开始,我们多增加一
个蜂鸣器报警的任务,要教会大家四个知识点:
第一点:蜂鸣器的驱动程序框架编写。
第二点:多任务处理的程序框架。
第三点:如何控制蜂鸣器声音的长叫和短叫。
第四点:如何知道 1 秒钟需要多少个定时中断,也就是如何按比例修正时间精度。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺 51 单片机学习板。
(2)实现功能:同时跑两个任务,第一个任务让一个 LED 灯 1 秒钟闪烁一次。第二个任务让蜂鸣器在前面 3 秒
发生一次短叫报警,在后面 6 秒发生一次长叫报警,反复循环。
(3)源代码讲解如下:
#include "REG52.H"
/* 注释一:
* 如何知道 1 秒钟需要多少个定时中断?
* 这个需要编写一段小程序测试,得到测试的结果后再按比例修正。
* 步骤:
* 第一步:在程序代码上先写入 1 秒钟大概需要 200 个定时中断。
* 第二步:基于以上 1 秒钟的基准,编写一个 60 秒的简单测试程序(如果编写超过
* 60 秒的时间,这个精度还会更高)。比如,编写一个用蜂鸣器的声音来识别计时的
* 起始和终止的测试程序。
* 第三步:把程序烧录进单片机后,上电开始测试,手上同步打开手机里的秒表。
* 如果单片机仅仅跑了 27 秒。
* 第四步:那么最终得出 1 秒钟需要的定时中断次数是:const_time_1s=(200*60)/27=444
*/
#define const_time_05s 222 //0.5 秒钟的时间需要的定时中断次数
#define const_time_1s 444 //1 秒钟的时间需要的定时中断次数
#define const_time_3s 1332 //3 秒钟的时间需要的定时中断次数
#define const_time_6s 2664 //6 秒钟的时间需要的定时中断次数
#define const_voice_short 40 //蜂鸣器短叫的持续时间
#define const_voice_long 200 //蜂鸣器长叫的持续时间
![](https://csdnimg.cn/release/download_crawler_static/10860888/bg14.jpg)
数码之家----我的数字生活,分享创意无限!http://www.mydigit.cn/
void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelaylong);
void led_flicker();
void alarm_run();
void T0_time(); //定时中断函数
sbit beep_dr=P2^7; //蜂鸣器的驱动 IO 口
sbit led_dr=P3^5; //LED 灯的驱动 IO 口
unsigned char ucLedStep=0; //LED 灯的步骤变量
unsigned int uiTimeLedCnt=0; //LED 灯统计定时中断次数的延时计数器
unsigned char ucAlarmStep=0; //报警的步骤变量
unsigned int uiTimeAlarmCnt=0; //报警统计定时中断次数的延时计数器
unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器
void main()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
led_flicker(); //第一个任务 LED 灯闪烁
alarm_run(); //第二个任务报警器定时报警
}
}
void led_flicker() //第三区 LED 闪烁应用程序
{
switch(ucLedStep)
{
case 0:
if(uiTimeLedCnt>=const_time_05s) //时间到
{
uiTimeLedCnt=0; //时间计数器清零
led_dr=1; //让 LED 亮
ucLedStep=1; //切换到下一个步骤
}
剩余1208页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
wangznh
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 新型矿用本安直流稳压电源设计:双重保护电路
- 煤矿掘进工作面安全因素研究:结构方程模型
- 利用同位素位移探测原子内部新型力
- 钻锚机钻臂动力学仿真分析与优化
- 钻孔成像技术在巷道松动圈检测与支护设计中的应用
- 极化与非极化ep碰撞中J/ψ的Sivers与cos2φ效应:理论分析与COMPASS验证
- 新疆矿区1200m深孔钻探关键技术与实践
- 建筑行业事故预防:综合动态事故致因理论的应用
- 北斗卫星监测系统在电网塔形实时监控中的应用
- 煤层气羽状水平井数值模拟:交替隐式算法的应用
- 开放字符串T对偶与双空间坐标变换
- 煤矿瓦斯抽采半径测定新方法——瓦斯储量法
- 大倾角大采高工作面设备稳定与安全控制关键技术
- 超标违规背景下的热波动影响分析
- 中国煤矿选煤设计进展与挑战:历史、现状与未来发展
- 反演技术与RBF神经网络在移动机器人控制中的应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)