没有合适的资源?快使用搜索试试~ 我知道了~
首页吴坚鸿老师亲授:单片机程序设计精华
吴坚鸿老师亲授:单片机程序设计精华
需积分: 50 39 下载量 9 浏览量
更新于2024-07-18
4
收藏 5.14MB PDF 举报
"吴坚鸿-十年经验手把手教你单片机" 是一本关于单片机编程的电子书,由有着近十年经验的吴坚鸿老师编写。这本书以连载的形式详细讲解了单片机程序框架,包括90个章节,涵盖了从基础到进阶的各种实践操作,旨在帮助读者系统学习和掌握单片机开发。 书中首先讨论了初学者在学习单片机时常见的误区,然后逐步引导读者实现LED灯的闪烁、延时函数、定时中断等基础功能。通过这些基本操作,读者可以理解单片机控制硬件的基本原理。接下来,书中介绍了蜂鸣器驱动、按键检测以及各种按键事件的处理,如独立按键的单击、双击、长按等,以及矩阵键盘的操作。 在硬件扩展部分,吴老师详细讲解了如何使用74HC595芯片驱动16个LED灯,以及如何优化代码实现跑马灯效果。此外,还涉及了独立按键对跑马灯方向、速度和启停的控制,展示了如何实现更复杂的用户交互。为了模拟实际应用,书中还使用LED和按键模拟了工业自动化设备的运动控制。 在显示技术方面,吴老师探讨了数码管的动态扫描程序,不仅在主函数中实现,还在定时中断中进行了深入的实践。他还分享了数码管参数设置的各种方法,如切换窗口、闪烁设置、一二级菜单设置,以及倒计时程序,甚至模拟了iPhone 4S开机密码锁的功能。 通过这些详尽的教程,读者可以全面了解单片机编程,从基础的硬件控制到高级的系统设计,掌握实战技能。尽管电子书本身不包含程序代码,但读者可以在吴老师的原帖中获取,同时鼓励读者支持吴坚鸿老师的工作。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10689833/bg10.jpg)
第四节:累计定时中断次数使LED灯闪烁。
开场白:
上一节提到在累计主循环次数来实现计时,随着主函数里任务量的增加,为了保证
延时时间的准确性,要不断修正设定上限阀值const_time_level。
我们该怎么解决这个问题呢?本节教大家利用累计定时中断次数的方法来解决这个
问题。这一节要教会大家四个知识点:
第一点:利用累计定时中断次数的方法实现时间延时
第二点:展现鸿哥最完整的实战程序框架。在主函数循环里用switch语句实现
状态机的切换,在定时中断里累计中断次数,这两个的结合就是我写代码最本
质的框架思想。
第三点:提醒大家C语言中的int,long变量是由几个字节构成的数据,凡是在
main函数和中断函数里有可能同时改变的变量,这个变量应该在主函数中被更
改之前,先关闭相应的中断,更改完了此变量,再打开中断,否则会留下不宜
察觉的漏洞。当然在大部分的项目中可以不用这么操作,但是在一些要求非常
高的项目中,有一些核心变量必须这么做。
第四点:定时中断的初始值该怎么设置。不用严格按公式来计算时间,一般取
个经验值是最大初始值减去1000就可以了。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51单片机学习板。
(2)实现功能:让一个LED闪烁。
(3)源代码讲解如下:
#include"REG52.H"
#defineconst_time_level200
voidinitial_myself();
voidinitial_peripheral();
voiddelay_long(unsignedintuiDelaylong);
voidled_flicker();
voidT0_time();//定时中断函数
4.累计定时中断次数使LED灯闪烁
16
![](https://csdnimg.cn/release/download_crawler_static/10689833/bg11.jpg)
sbitled_dr=P3^5;
unsignedcharucLedStep=0;//步骤变量
unsignedintuiTimeCnt=0;//统计定时中断次数的延时计数器
voidmain()
{
initial_myself();
delay_long(100);
initial_peripheral();
while(1)
{
led_flicker();
}
}
voidled_flicker()////第三区LED闪烁应用程序
{
switch(ucLedStep)
{
case0:
/*注释一:
*uiTimeCnt累加定时中断的次数,每一次定时中断它都会在中断函数里自
加一。
*只有当它的次数大于或等于设定上限const_time_level时,
*才会去改变LED灯的状态,否则CPU退出led_flicker()任务,继续快速
扫描其他的任务,
*这样的程序结构就可以达到多任务并行处理的目的。这就是鸿哥在所有开
发项目中的核心框架。
*/
if(uiTimeCnt>=const_time_level)//时间到
{
/*注释二:
*ET0=0;uiTimeCnt=0;ET0=1;----在清零uiTimeCnt之前,为什
么要先禁止定时中断?
*因为uiTimeCnt是unsignedint类型,本质上是由两个字节组成
。
*在C语言中uiTimeCnt=0看似一条指令,实际上经过编译之后它不只
一条汇编指令。
4.累计定时中断次数使LED灯闪烁
17
![](https://csdnimg.cn/release/download_crawler_static/10689833/bg12.jpg)
*由于定时中断函数里也对这个变量进行累加操作,如果不禁止定时中
断,
*那么uiTimeCnt这个变量在main()函数中还没被完全清零的时候,
如果这个时候
*突然来一个定时中断,并且在中断里又更改了此变量,这种情况在某
些要求高的
*项目上会是一个不容易察觉的漏洞,为项目带来隐患。当然,大部分
的普通项目,
*都可以不用那么严格,可以不用禁止定时中断。在这里只是提醒各位
初学者有这种情况。
*/
ET0=0;//禁止定时中断
uiTimeCnt=0;//时间计数器清零
ET0=1;//开启定时中断
led_dr=1;//让LED亮
ucLedStep=1;//切换到下一个步骤
}
break;
case1:
if(uiTimeCnt>=const_time_level)//时间到
{
ET0=0;//禁止定时中断
uiTimeCnt=0;//时间计数器清零
ET0=1;//开启定时中断
led_dr=0;//让LED灭
ucLedStep=0;//返回到上一个步骤
}
break;
}
}
/*注释三:
*C51的中断函数格式如下:
*void函数名()interrupt中断号
*{
*中断程序内容
*}
4.累计定时中断次数使LED灯闪烁
18
![](https://csdnimg.cn/release/download_crawler_static/10689833/bg13.jpg)
*函数名可以随便取,只要不是编译器已经征用的关键字。
*这里最关键的是中断号,不同的中断号代表不同类型的中断。
*定时中断的中断号是1.至于其它中断的中断号,大家可以查找
*相关书籍和资料。大家进入中断时,必须先清除中断标志,并且
*关闭中断,然后再写代码,最后出来时,记得重装初始值,并且
*打开中断。
*/
voidT0_time()interrupt1
{
TF0=0;//清除中断标志
TR0=0;//关中断
if(uiTimeCnt<0xffff)//设定这个条件,防止uiTimeCnt超范围。
{
uiTimeCnt++;//累加定时中断的次数,
}
TH0=0xf8;//重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1;//开中断
}
voiddelay_long(unsignedintuiDelayLong)
{
unsignedinti;
unsignedintj;
for(i=0;i<uiDelayLong;i++)
{
for(j=0;j<500;j++)//内嵌循环的空指令数量
{
;//一个分号相当于执行一条空语句
}
}
}
voidinitial_myself()//第一区初始化单片机
{
4.累计定时中断次数使LED灯闪烁
19
![](https://csdnimg.cn/release/download_crawler_static/10689833/bg14.jpg)
/*注释四:
*单片机有几个定时器,每个定时器又有几种工作方式,
*那么多种变化,我们记不了那么多,怎么办?
*大家记住鸿哥的话,无论一个单片机有多少内置资源,
*我们做系统框架的,只需要一个定时器,一种工作方式。
*开定时器越多这个系统越不好。需要哪种定时工作方式呢?
*就需要响应定时中断后重装一下初始值继续跑那种。
*在51单片机中就是工作方式1。其它的工作方式很少项目能用到。
*/
TMOD=0x01;//设置定时器0为工作方式1
/*注释五:
*装定时器的初始值,就像一个水桶里装的水。如果这个桶是空桶,那么想
*把这个桶灌满水的时间就很长,如果是里面已经装了大半的水,那么想
*把这个桶灌满水的时间就相对比较短。也就是定时器初始值越小,产生一次
*定时中断的时间就越长。如果初始值太小了,每次产生定时中断
*的时间分辨率太粗,如果初始值太大了,虽然每次产生定时中断的时间分辨率很
细,
*但是太频繁的产生中断,不但会影响主函数main()的执行效率,而且累记中断
次数
*的时间误差也会很大。凭鸿哥多年的江湖经验,
*我觉得最大初始值减去2000是比较好的经验值。当然,大一点小一点没关系。
不要走
*两个极端就行。
*/
TH0=0xf8;//重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
led_dr=0;//LED灭
}
voidinitial_peripheral()//第二区初始化外围
{
EA=1;//开总中断
ET0=1;//允许定时中断
TR0=1;//启动定时中断
}
总结陈词:
4.累计定时中断次数使LED灯闪烁
20
剩余1484页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_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/4a6d6a5251ce451cb65bc806a9538a97_hpu_zhn.jpg!1)
hpu_zhn
- 粉丝: 249
- 资源: 5
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决Eclipse配置与导入Java工程常见问题
- 真空发生器:工作原理与抽吸性能分析
- 爱立信RBS6201开站流程详解
- 电脑开机声音解析:故障诊断指南
- JAVA实现贪吃蛇游戏
- 模糊神经网络实现与自学习能力探索
- PID型模糊神经网络控制器设计与学习算法
- 模糊神经网络在自适应PID控制器中的应用
- C++实现的学生成绩管理系统设计
- 802.1D STP 实现与优化:二层交换机中的生成树协议
- 解决Windows无法完成SD卡格式化的九种方法
- 软件测试方法:Beta与Alpha测试详解
- 软件测试周期详解:从需求分析到维护测试
- CMMI模型详解:软件企业能力提升的关键
- 移动Web开发框架选择:jQueryMobile、jQTouch、SenchaTouch对比
- Java程序设计试题与复习指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](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)