logo资料库

从单片机基础到程序框架(全集 2019pdf版).pdf

第1页 / 共836页
第2页 / 共836页
第3页 / 共836页
第4页 / 共836页
第5页 / 共836页
第6页 / 共836页
第7页 / 共836页
第8页 / 共836页
资料共836页,剩余部分请下载后查看
从单片机基础到程序框架(2019 版) 吴坚鸿 编著 捐权声明: 该教程免费授权给所有的出版社和做单片机学习板的厂家和各 大培训机构以及全国各大院校,我本人不从中赢利也不收取任何版 权费用, 我本人也不卖书也不卖学习板也不搞线下培训。该教程的 版权无偿捐给全社会。
第一节:我的价值观。 【1.1 我的价值观。】 我 2006 年毕业,2009 年就出来做自由职业者在深圳以接单片机项目谋生,到现在我有自己的机器人技 术有限公司。目前公司的人机界面,运动算法,机器视觉,伺服驱动,ARM 单片机编程,DSP 编程,FPGA 编 程,电路板设计,上位机软件都是由我带领的研发团队在做。我只专心做技术,而市场,生产,行政,资金, 财务,采购都不用我分心去管,有我另外的合伙人雷总去打理,所以我常感恩能过上研发创作的日子,是因 为有雷总的关照。 光有经济保障还是不够的,人最重要的是要找到自己的归宿自己的位置。我最爱看老子,庄子,孔子, 王阳明的圣人书,王阳明说人人皆可成为圣人,所以我一直在追求圣人之道,我渴望成为圣人,圣人之道有 真三不朽之说,立功,立言,立德。在立功层面,我这一辈子的定位就是做技术,我想做超级宇宙技术大牛, 特别牛的那种牛,然后以我的技术协助雷总把我们的机器人公司做大做强。在立言层面,在不涉及我公司商 业机密的前提下,我的天命和归宿就是做单片机技术分享,写一辈子源源不断的技术分享连载帖,然后写一 本《从单片机基础到程序框架》的书,帮助更多单片机初学者,出书可以满足我在立言方面的追求。在立德 层面,我平时信因果,在生活中多传播正能量。 我有自知之明,我的天命就是传播单片机技术。人最宝贵的东西是生命,生命属于人只有一次,人的一 生应当这样度过:当他回首往事的时候,他不因虚度年华而悔恨,也不应碌碌无为而羞愧。在他临死的时候, 他能够这样说:我的整个生命和全部精力,都献给了世界上最壮丽的事业——为传播单片机技术而奋斗。 【1.2 坚鸿单片机私人 QQ 群。】 这个是我私人的单片机 QQ 群,主要是用来交流工作上遇到的技术问题。群号是:184876577。群规如下: (1)不许刚入群就发私信骚扰群主,有问题的请到群里聊。 (2)在群里提问问题时,不许点群主的名求解答,也不许用“@群主”的提问方式骚扰群主。比如,不 能这样问“鸿哥,上拉电阻选多大?”,而应该去掉称呼这样问“上拉电阻选多大?”。 (3)不许刚入群就问关于“前途”和“发展前景”的问题。 (4)不许刚入群就发书本习题或者试题求助。 (5)不许刚入群就贴一大段代码刷屏。 (6)不许刚入群就求某项目全套源代码。 (7)早上自愿报数的时间是 6 点到 8 点,目的是活跃群氛围,其它时间段禁止报数。 (8)技术交流不许用语音。必须用文字,方便技术传播和交流。 (9)连续潜水 90 天没发言的非金星群友将会被移出群。 (10)在群里经常愤世嫉俗者会被移出群。 【1.3 相关资料下载网址。】 下载网址:http://www.dumenmen.com
第二节:初学者的疑惑。 【2.1 单片机应用的核心技术是什么?】 单片机应用的核心技术是什么?是按键,数码管,流水灯,串口。是它们的程序框架。按键和数码管是 输入是人机界面,把它们的程序框架研究透了,以后做彩屏或者更花销的显示界面,程序框架也可以通用。 流水灯是应用程序是 APP,把它的程序框架研究透了,以后控制飞机大炮的程序框架也是一样。串口是通讯 是接口,把它的程序框架研究透了,以后搞 SPI,CAN,USB 等通讯项目时,上层的程序框架也可以通用。如 果某天你突然腰酸背痛可能是缺钙了,如果某天你第一次做项目时突然发现无从下手,你缺的可能是程序框 架。 【2.2 跟我学单片机到底是学什么?】 跟我学单片机到底是学什么?我的回答是像驾驶汽车一样驾驭单片机。我教给大家的是驾驶汽车的技术 而不是研发汽车的技术。因此每当别人问我学 51 单片机,PIC,AVR,stm32 哪个更加有前途,应该先学哪个 再学哪个时,我的回答是既然你是学驾驶技术,那么用桑塔纳车来学还是用宝马车来学有差别吗?差别很小 的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。把学单片机当作考驾照这是我常用的一个 比喻。 【2.3 单片机神奇的工作原理是什么?】 单片机神奇的工作原理是什么?初学者不用纠结这个问题,这不是我们学习的方向。考驾照只要大概知 道汽车是由四个轮,发动机,制动系统,离合器,方向盘等部分构成就够了,再深入的细节不用纠结。学单 片机只要大概知道单片机内部由运算器,寄存器,IO 口,复位电路,晶振电路等部分组成就够了,再深入的 不用纠结。说实话,我本人做单片机开发有很多年了,但是我对单片机的工作原理也很模糊,就像人为什么 能通过大脑来灵活控制双手,对于我仍然是一个迷。有这样的疑惑时咋办?我建议用“游戏规则”这个概念 去应付它。游戏规则是不需要解释的,只要遵守就可以了。在应用的技术领域,把暂时不解的东西当作游戏 规则来解读和遵守是我常用的思维方式。 【2.4 很难记住繁杂的寄存器?】 很难记住繁杂的寄存器?寄存器不用死记硬背,只要知道它大概的操作流程,有哪几类就够了。配置寄 存器时,可参考别人已经配置好的代码,这些代码都很容易通过网络或者书本获得。也可以查找芯片数据手 册,有很多单片机厂家会给出各个功能的代码范例。 【2.5 汇编语言很难学怎么办?】 汇编语言很难学怎么办?我提个建议,对于初学者,一开始就学汇编语言确实难学,不如先学 C 语言, 学会了 C 语言再学汇编,这样理解起来就容易多了。也可以把 C 语言列入必修课,汇编语言列入选修课,因 为实际工作中也是 C 语言为主。 【2.6 很难记住各种繁杂的通信协议?】 很难记住繁杂的各种通信协议?IIC,SPI,232,CAN,USB 等等。不用记那么多,你只要理解串行和并
行通讯方式的基本原理就可以了,剩下的只是不同的协议而已,工作时再根据需要去看看相关资料就可以上 手。不管世上有多少种通讯协议,物理世界上只有这两种通讯方式。 【2.7 很难写出短小精悍的程序?】 很难写出短小精悍的程序?初学者不用纠结于此。很多项目开发,程序容量不是刻意追求的目标,多一 点少一点没关系,不会是寸土寸金的事情,现在大容量的单片机品种也非常多,反而更值得关注的是程序的 运行效率,可读性和可修改性。当然,一些成本敏感的消费类电子不在此讨论范围,这类项目往往对程序容 量也要求很苛刻。
第三节:单片机最重要的一个特性。 【3.1 单片机的“一”。】 图 3.1 单片机工作的最小系统 “道生一,一生二,二生三,三生万物。”《道德经》认为,世间万物,缤纷多彩,都源自一个东西,这 个“一”的东西就是“道”。电子世界也存在“一”,这个“一”繁衍出手机,电脑,电视机,机器人等丰富 多彩的电子世界,这个“一”就是单片机最重要的一个特性:“程序下载进内存后,单片机既可以通过管脚 识别外部输入的高低电平信号,也可以通过管脚对外部输出不同时间长度的高低电平。”这句话有 5 个关键 词“程序,内存,管脚,电平,时间。”下面我详细解读每个关键词的含义,涉及到某些专用名词如果不理 解也没关系,主要是让大家有个感性的认识就足矣。 【3.2 程序。】 单片机程序有 3 种:C 程序,汇编程序,机器程序。能下载进单片机的只有机器程序,C 程序和汇编程 序都不能直接下载进单片机,所以 C 程序和汇编程序都要经过编译软件翻译成机器程序后,才能下载进单片 机。程序是语言,语言是用来交流,交流就必须存在两个对象,对象分别是程序员和单片机。程序员是人所 以用 C 或者汇编语言,单片机是机器所以用机器语言,人和机是不同的世界,两者交流就需要一个翻译家, 翻译家就是编译软件,俗称编译器,它能把 C 语言或者汇编语言翻译成单片机能识别的机器语言。机器语言 就是 0101 的代码,一般以十六进制的形式呈现。 理论上,程序员也可以抛开 C 和汇编语言,直接用机器语言做项目。我读书时老师让我们做实验就是这 么整。那时我还不知有烧录器,老师让我们先用汇编语言写好程序,然后自己充当编译器,对照汇编语言和 机器语言的指令表,人工把汇编语言翻译成十六进制的机器语言,最后把机器语言按字节一个一个的输入到 特定的实验设备来观察现象。现在回想起来,老师当时的初衷是让我们了解编程语言的本质。 既然可以直接用机器语言做项目,为什么还要 C 语言或者汇编语言?在 C 语言或者汇编语言没有诞生前, 程序员就是通过在纸带上打孔来代表 01 的机器语言,此时相当于结绳记事的原始阶段。后来人类发明了汇 编语言,通过英语单词来表示 01 机器语言特定的指令语句,此时开始诞生了汇编语言的编译器相当于进入 象形文字的阶段。再到后来人类又发明了 C 语言,通过数学符号和英语单词来表达自己的逻辑,诞生了 C 语
言的编译器相当于进入了汉字白话文阶段,从此程序员写出来的 C 程序就非常方便移植,编辑,阅读,传播, 继承。现在单片机开发的主流是 C 语言,我本人出来工作后就没有用过汇编做项目开发。C 语言是必修课, 汇编语言是选修课;C 语言是白话文简单易懂,汇编语言是文言文繁琐难读。当然汇编也有它的应用场合, 汇编的翻译效率高,往往是一句汇编语言对应一句机器语言,而一句 C 语言有可能对应几句机器语言,这样 C 程序的代码效率在很大程度上取决于编译器的水平,编译器能不能帮你翻译出高效的机器语言对于我们来 说往往像黑盒子,不像汇编语言那么可控制。所以很多嵌入式系统某段要求简洁高效的源代码往往用汇编来 写,也有少数一些很便宜的单片机不提供 C 编译器,只能用汇编语言开发。要不要学汇编,最好根据个人的 工作需求来决定。 【3.3 内存。】 单片机就像 MP3,程序代码就像歌曲,把不同的歌曲下载到 MP3 里就可以听到不同的音乐,把不同的程 序下载到单片机里,单片机就能做不同的事。能装程序的单片机必然有内存,内存由 ROM 和 RAM 组成,ROM 和 RAM 都能装东西,但各有不同。 ROM 的优点是存储的东西断电后不会丢失,缺点是存储的东西上电后不能更改,想要改变 ROM 的内容除 非重新下载程序,而且下载次数有限制,FLASH 的 ROM 最大次数通常是 10 万次,而 OTP 的 ROM 只能下载 1 次,所以平时上电工作时 ROM 存储的东西是不能更改的,某些具有 IAP 功能的高级单片机不在此讨论范围内。 而 RAM 恰好反过来,RAM 的优点是存储的东西上电后可以随时被单片机更改,更改次数没有限制,缺点是存 储的东西断电后会丢失,没有记忆功能。 ROM 和 RAM 各有特点,单片机从中各取所长。ROM 用来存储不可更改的指令代码和常量数据,ROM 的容量 往往相当于代码的容量。RAM 用来存储可以被更改的变量数据,RAM 的容量往往相当于全局变量和局部变量 的容量。不管是用 C 语言还是汇编,所写的程序代码就自然包含了指令代码、常量数据、全局变量、局部变 量,那么谁在幕后帮我们进行分类存储,谁把一个程序代码的一分为二让它们在 ROM 和 RAM 里各就各位?是 编译器软件和下载器(烧录器),编译器除了把 C 语言翻译成机器语言之外,还帮我们分好了类,分配好了存 储的地址和位置,下载器(烧录器)再根据这些信息把程序存储到内存中,这些工作一般不用程序员干预,它 们自动完成。 【3.4 管脚。】 管脚是单片机与外部电路进行能量和信息交互的桥梁。有电源,复位,晶振和 IO 口这 4 类管脚。 第一类电源管脚。是给单片机内部电路供电的接口。单片机有两种常用的供电电压,一般是 3.3V 或者 5V,有的单片机两种电压都兼容。 第二类复位管脚。单片机上电后需要外部电路给它一个瞬间高电平或者低电平的复位信号,才能启动工 作。复位电路通常是由电容和电阻组成的充电电路来实现,也有一些系统是用专门的复位芯片来实现。 第三类晶振管脚。任何单片机想要工作必须要有晶振。单片机执行程序指令是按一个节拍一个节拍来执 行的。这个节拍的时间就是由晶振产生,所以把晶振比喻成单片机的心脏是非常恰当的。现在也有很多单片 机直接把晶振集成到内部,这类单片机不用外接晶振也可以。 第四类 IO 口管脚。这是跟我们编写程序关联最密切的管脚。前面提到的电源,复位,晶振这 3 种管脚 是为了让单片机能工作,俗称单片机工作的三要素。而单片机工作的具体内容就是通过 IO 口管脚来体现的。 比如,IO 口能识别按健的输入,也能输出驱动继电器工作的开关信号,也能跟外围器件进行通信。 【3.5 电平。】 电平就是电压的两种状态,低或者高,低相当于程序里的 0,高相当于程序里的 1。单片机 IO 口管脚检
测到的电压低于或等于 0.8V 时是低电平,程序里读取到的是 0 数字。单片机 IO 口管脚检测到的电压高于或 等于 2.4V 时是高电平,程序里读取到的是 1 数字。必须注意的是,IO 口输入的最大电压不能超过单片机的 供电电压。单片机输出的低电平是 0V,单片机输出的高电平等于它的供电电压值,往往是 3.3V 或者 5V。 【3.6 时间。】 时间是单片机程序必不可少的元素。跟外围芯片通信的时序节拍需要时间,驱动发光二极管闪烁需要时 间,工控自动化的某些延时需要时间。单片机的时间来源自两方面。第一方面源自指令的周期时间。单片机 是根据节拍来执行程序指令的,每执行一条指令都要消耗一点时间,只要让程序执行的指令数量越多,产生 的时间就越长,通过调整所执行指令的数量就可以得到所需的时间长度。第二方面源自单片机内部自带的定 时器。假如设置定时器每 20 毫秒产生一次中断,现在要获取 10 秒钟的时间,只需在程序里统记 500 次定时 中断就可以了,因为 1 秒等于 1000 毫秒。指令和定时器这两者的时间最后都来源于晶振。
第四节:平台软件和编译器软件的简介。 【4.1 平台软件和编译器软件的各自分工。】 C 语言写在哪?谁来把 C 语言翻译成单片机可以识别的机器语言?这就是平台软件和编译器软件的分 工。平台软件负责编辑 C 语言,编译软件负责把 C 语言翻译成单片机可以识别的机器语言。 【4.2 每一种单片机的平台软件和编译器软件不一定是唯一的。】 C 语言在单片机的应用也是最近这些年发展起来的,早期做单片机的原厂更关注芯片硬件本身,配套的 C 语言开发软件方面涉入不深,他们往往只管把单片机芯片生产出来后,给大伙提供一个汇编语言的编译器 软件就草率了事,所以给了很多第三方商家做平台软件和 C 编译器的机会,后来单片机原厂也乐意支持和配 合这些第三方开发软件的厂商,也有一些单片机原厂直接收购这类第三方软件公司。因此,不同厂家的单片 机,它所用的平台和编译器软件可能都不一样。即使是同样一个厂家的单片机,它也有可能存在多种不同的 第三方平台软件和编译器软件,每一种单片机所用的平台软件和编译器不一定是唯一的。比如 stm8 单片机 可以用 STVD 软件平台,也可以 IAR 平台。stm32 单片机可以用 keil 平台,也可以用 IAR 平台。 【4.3 平台软件和编译器软件的宿主与寄生关系。】 平台软件选定了之后,所用的编译器软件也可能存在多种选择,并不是一种平台软件就绑定一种编译器 软件。生物学的比喻,平台软件是宿主,编译器软件是寄生在平台软件里的。一个平台软件可以嵌入多种不 同的编译器软件,平台软件和编译器软件存在一对多的关系。比如,PIC 单片机的平台软件是 MPLAB,8 位 PIC 单片机是 PICC 编译器,12 位 PIC 单片机是 PIC18 编译器,16 位 PIC 单片机是 C30 编译器。而且 MPLAB 平台软件与上述各种编译器软件都要单独一个一个分开来安装,最后运行 MPLAB 平台软件,在里面操作某个 菜单设置选项,把各种 C 编译器软件跟 MPLAB 平台软件关联起来。 【4.4 51 单片机的平台软件和编译器软件。】 我后面的讲解,51 单片机的平台软件用 keil2,编译器软件用 C51。单片机程序开发需要用到这两种软 件,但在项目开发的时候,只要跟平台软件打交道就可以了,因为编译器软件是当做一种独立配件嵌入到平 台软件里,统一接受平台软件的控制。我在用 PIC 的 8 位单片机时,需要安装一次 MPLAB 平台软件,也需要 独立再安装一次 PICC 编译器软件,然后运行 MPLAB 平台软件,在里面操作某个菜单设置选项,把 PICC 编译 器跟 MPLAB 平台软件关联起来,也就是我所说的把 PICC 编译器嵌入到 MPLAB 平台软件里,统一接受平台软 件的控制,但我平常写代码时只需要跟 MPLAB 平台软件打交道就可以了。我早期在做 51 单片机开发时,也 是需要把 keil 平台软件和 C51 软件分开安装,然后再把它们关联起来,但是现在从 keil2 版本开始,在安 装 keil 平台软件时就已经默认把 C51 安装好了,并且自动把 C51 嵌入到了 keil 平台软件。我现在用 keil2 这个版本的平台软件,只需要安装一次 keil2 平台软件就可以了,不需要像早期那样再单独安装 C51 编译器。
分享到:
收藏