手把手教你单片机程序框架

上传人:s9****2 文档编号:544773120 上传时间:2023-05-29 格式:DOCX 页数:660 大小:828.10KB
返回 下载 相关 举报
手把手教你单片机程序框架_第1页
第1页 / 共660页
手把手教你单片机程序框架_第2页
第2页 / 共660页
手把手教你单片机程序框架_第3页
第3页 / 共660页
手把手教你单片机程序框架_第4页
第4页 / 共660页
手把手教你单片机程序框架_第5页
第5页 / 共660页
点击查看更多>>
资源描述

《手把手教你单片机程序框架》由会员分享,可在线阅读,更多相关《手把手教你单片机程序框架(660页珍藏版)》请在金锄头文库上搜索。

1、第一节:吴坚鸿谈初学单片机的误区。(1) 很难记住繁杂的寄存器?寄存器不用死记硬背,鸿哥我行走江湖多年,连一个寄存器都 记不住。需要配置寄存器的时候,直接在网上或者书本上参考别人现成的配置程序是上策, 查找芯片数据手册是中策,死记硬背寄存器是最最下策。(2) 很难记住繁杂的汇编语言指令?除非是在校学生要应付考试或者少数工作中绕不开汇编 否则学汇编就是浪费时间。鸿哥我行走江湖多年,从来就没有用汇编帮客户做过一个项目。(3) C语言很难学?你不用学指针,你不用学带形参的函数,你不用学结构体,你不用学宏 定义,你不用学文件操作,你也不用死记繁琐的数据类型。你只要会:5条指令语句switch语句,if

2、 else语句,while语句,for语句,=赋值语句。7个运算符+,-,*,/,|,&,!。4个逻辑关系符|,&,!=,=.3 个数据类型 unsigned char, unsigned int,unsigned long。3个进制相互转化,二进制,十六进制,十进制。1个void函数。1 个一维数组 code(或 const) unsigned char array。那么世界上任何一种逻辑功能的单片机软件你都能做出来。鸿哥我当年刚毕业出来工作的时候才知道可以用C语言开发单片机,一开始只用if 语句就把项目做出来了,没有用指针,没有用带形参的函数等复杂的功能。再到后来才慢慢 开始用C语言其他的

3、高级功能,但是我发现C语言其他的高级功能,本质上都是用我前面列 举出来的最基本功能集合而成,只是书写更加简单方便了一点,编译后的机器码都大同小异。 所以不会指针等高级功能你不用自卑,恰恰相反,当你会最简单的几个语句,就把这些高级 功能的程序都做出来了,你才发现你对底层了解得更加透切,再学那些高级功能轻而易举。 当你裸机跑的程序都能够协调得很好的时候,你才发现所谓高深的操作系统也不过如此,只 要给你时间和金钱你也可以写个操作系统来玩玩。(4) 很难记住精确时间的计算公式?经常看到时间公式等于晶振,时钟周期,执行指令次数 他们之间的乘除关系式。鸿哥我认为这些都是浮云,不用纠结也不用去记,大概了解一

4、下就 可以了。不管你对公式掌握得有多精确,你都不可能做出非常精确的时间。想用单片机做一 个非常精确的时间这种想法一开始就是错的,不可能的。真想做一个比较精确的时间,应该 用外围时钟芯片或者FPGA和CPLD,而不是单片机。(5) 很难记住繁杂的各种通信协议?什么IIC,SPI,232串通讯,CAN,USB等等。这些都是 浮云,你不用记那么多,你只要理解两种通讯方式就够了,那就是串行通讯方式和并行通讯 方式。不管世界上有多少种通讯协议,物理世界上只有这两种通讯方式,其他各种名称的通 讯协议都基于此两种方式演变而来。(6) 很难写短小精悍的程序?初学者不要纠结于此。做项目开发,程序容量不是刻意追求

5、的 目标,程序多一点少一点没关系,现在大容量的单片机品种非常多,容量不会是寸土寸金的 事情,我们更加要关注程序的运行效率,可读性和可修改性。既然鸿哥列出了那么多误区,那么什么才是初学者关注的核心?预知详情,请听下回分解一一delay()延时实现LED灯的闪烁。(未完待续,下节更精彩,不要走开哦)第二节:delay ()延时实现LED灯的闪烁。开场白: 上一节鸿哥列出了初学者七大误区,到底什么才是初学者关注的核心?那就是裸机奔跑 的程序结构。一个好的程序结构,本身就是一个微型的多任务操作系统。鸿哥教给大家的就 是如何编写这个简单的操作系统。在main函数循环中用switch语句实现多任务并行处理

6、的 任务切换,再外加一个定时器中断,这两者的结合就是鸿哥多年来所有实战项目的核心。鸿 哥的程序结构看似简单,实际上就是那么简单。大家不用着急,本篇连载文章现在才正式开 始,这一节我要教会大家两个知识点: 第一点:鸿哥首次提出的“三区一线”理论。此理论把程序代码分成三个区,一个延时分割 线。第二点:delay()延时的用途。(1) 硬件平台:基于朱兆祺51单片机学习板。(2) 实现功能:让一个LED闪烁。3)源代码讲解如下: view plaincopy to clipboardprint?#include REG52.Hvoid initial_myself();void initial_pe

7、ripheral();void delay_short(unsigned int uiDelayshort);void delay_long(unsigned int uiDelaylong);void led_flicker();/* 注释一:*吴坚鸿个人的命名风格:凡是输出后缀都是_dr,凡是输入后缀都是_sr。* dr代表drive驱动,sr代表sensor感应器*/sbit led_dr二P35;void main() /学习要点:深刻理解鸿哥首次提出的三区一线理论/* 注释二:* ini tial_myself()函数属于鸿哥三区一线理论的第一区,* 专门用来初始化单片机自己的寄存器

8、以及个别外围要求响应速度快的输出设备,*防止刚上电之后,由于输出10 口电平状态不确定而导致外围设备误动作,* 比如继电器的误动作等等。*/ initial_myself();/* 注释三:*此处的delay_long()延时函数属于第一区与第二区的分割线,* 延时时间一般是0.3秒到2秒之间,等待外围芯片和模块上电稳定。*比如液晶模块,AT24C02存储芯片,DS1302时钟芯片,* 这类芯片有个特点,一般都是跟单片机进行串口或并口通讯的,* 并且不要求上电立即处理的。*/delay_long(100);/* 注释四:* ini ti al_peripheral()函数属于鸿哥三区一线理论的

9、第二区,* 专门用来初始化不要求上电立即处理的外围芯片和模块.*比如液晶模块,AT24C02存储芯片,DS1302时钟芯片。* 本程序基于朱兆祺51单片机学习板。*/ initial_peripheral();/* 注释五:* while(l)主函数循环区属于鸿哥三区一线理论的第三区,* 专门用来编写被循环扫描到的非中断应用程序*/while(1) led_flicker();/LED 闪烁应用程序void led_flicker() /LED 闪烁应用程序led_dr=1; /LED 亮 delay_short(50000); /延时50000个空指令的时间/* 注释六:* delay_lo

10、ng(100)延时50000个空指令的时间,因为内嵌了一个500次的for循环 */led_dr=0; /LED 灭delay_long(100); /延时50000个空指令的时间/* 注释七:* delay_shor t(unsigned int uiDelayShor t)是小延时函数,*专门用在时序驱动的小延时,一般uiDelayShort的数值取10左右,* 最大一般也不超过100.本例为了解释此函数的特点,取值范围超过100。*此函数的特点是时间的细分度高,延时时间不宜过长。uiDelayShort数值* 的大小就代表里面执行了多少条空指令的时间。数值越大,延时越长。* 时间精度不要

11、刻意去计算,感觉差不多就行。*/void delay_short(unsigned int uiDelayShort)unsigned int i;for(i=0;iuiDelayShort;i+); /一个分号相当于执行一条空语句/* 注释八:* delay_long(unsigned int uiDelayLong)是大延时函数,* 专门用在上电初始化的大延时,*此函数的特点是能实现比较长时间的延时,细分度取决于内嵌for循环的次数,* uiDelayLong的数值的大小就代表里面执行了多少次500条空指令的时间。* 数值越大,延时越长。时间精度不要刻意去计算,感觉差不多就行。*/void

12、 delay_long(unsigned int uiDelayLong)unsigned int i;unsigned int j;for(i=0;iuiDelayLong;i+)for(j=0;j500;j+) /内嵌循环的空指令数量; /一个分号相当于执行一条空语句void initial_myself() /初始化单片机led_dr=O; /LED 灭void initial_peripheral() /初始化外围; /本例为空总结陈词: 鸿哥首次提出的“三区一线”理论概况了各种项目程序的基本分区。我后续的程序就按 此分区编写。Delay()函数的长延时适用在上电初始化。Delay (

13、)函数的短延时适用在驱动时序的脉冲延时,此时的时间不能太长,本例中暂时 没有列出这方面的例子,在后面的章节中会提到。在本例源代码中,在led_flicker()闪烁应用程序里用到的两个延时delay,它们的延 时时间都太长了,在实战项目中肯定不能用这种延时,因为消耗的时间太长了,其它任务根 本没有机会执行。那怎么办呢?我们应该如何改善?欲知详情,请听下回分解累计主循环次数使LED灯闪烁。(未完待续,下节更精彩,不要走开哦)第三节:累计主循环次数使LED灯闪烁。开场白:上一节鸿哥提到delay()延时函数消耗的时间太长了,其它任务根本没有机会执行,我们该 怎么改善?本节教大家利用累计主循环次数的

14、方法来解决这个问题。这一节要教会大家两个 知识点:第一点:利用累计主循环次数的方法实现时间延时第二点:switch核心语句之初体验。鸿哥所有的实战项目都是基于switch语句实现多任务 并行处理。(1) 硬件平台:基于朱兆祺51单片机学习板。(2) 实现功能:让一个LED闪烁。(3) 源代码讲解如下:view plaincopy to clipboardprint?#include REG52.H/* 注释一:* const_time_level是统计循环次数的设定上限,数值越大,LED延时的时间越久 */#define const_time_level 10000void initial_m

15、yself();void initial_peripheral();void delay_long(unsigned int uiDelaylong);void led_flicker();sbit led_dr二P35;/* 注释二:*吴坚鸿个人的命名风格:凡是swi tch语句里面的步骤变量后缀都是St ep.* 前缀带 uc,ui,ul 分别表示此变量是 unsigned char,unsigned int,unsigned long. */unsigned char ucLedStep=0; /步骤变量unsigned int uiTimeCnt=0; /统计循环次数的延时计数器 void main()initial_myself(); delay_long(100);initial_peripheral();while(1)led_flicker(); void led_flicker() /第三区LED闪烁应用程序switch(u

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号