单片机学习心得.docx
- 文档编号:10180609
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:84
- 大小:51.78KB
单片机学习心得.docx
《单片机学习心得.docx》由会员分享,可在线阅读,更多相关《单片机学习心得.docx(84页珍藏版)》请在冰豆网上搜索。
单片机学习心得
第一节:
跟我学单片机到底是学什么?
我的两个比喻和一个规则。
开篇第一节,我问大家一个问题,跟我学单片机到底是学什么?
我的回答是像驾驶汽车一样驾驭单片机。
我教给大家的是驾驶汽车的技术而不是研发汽车的技术。
因此每当别人问我学51单片机,PIC,AVR,stm32哪个更加有前途,应该先学哪个再学哪个时,我的回答是既然你是学驾驶技术,那么你用桑塔纳车来学还是用宝马车来学有差别吗?
差别很小的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。
把学单片机当作考驾照这是我所说的第一个比喻。
学单片机最核心的是程序,程序跟单片机芯片是什么关系?
我的回答是像歌曲跟MP3播放器的关系。
我们写的程序就像预先录制好的歌曲,单片机芯片就是一个MP3播放器。
把不同的歌曲下载到同一个MP3里就可以播放出不同的美妙音乐,当前下载的歌曲决定了MP3可以播放的音乐。
所以我们当前编写的程序下载进单片机之后,就决定了单片机能干哪些工作,“下载程序”也俗称“烧录程序”。
把单片机芯片当作MP3播放器是我第二个比喻。
单片机芯片内部细节的工作原理是什么,为什么它能实现那么神奇的功能?
我的回答是不用纠结这个问题,因为这不是我们学习的方向。
考驾照的也只能告诉你汽车是由四个轮,发动机,制动系统,离合器,方向盘等部分构成,其它内部细节的原理恐怕也不会教你,不是不想教你,而确实是两个不同的学习方向。
学单片机的也只能告诉你它内部是由运算器,寄存器,IO口,复位电路,晶振电路,程序存储器ROM,数据存储器RAM等部分组成,至于运算器的原理和构成也不是我们的学习方向。
所以尽管我搞单片机有很多年,但是我并不是完全理解它最本质的原理。
尽管我与人打交道有30多年,但是人为什么能通过大脑来灵活控制双手去活动对于我来说仍然是个迷,我只知道人是由脑袋,心脏,四肢等构成。
每当有这样疑惑的时候该怎么办?
我的回答是用“游戏规则”这个概念去应付它。
因为游戏规则是不需要解释的,只要遵守就可以了。
在应用的技术领域,把暂时不解的东西当作一种游戏规则来解读和遵守是我常用的思维方式,这个游戏规则的概念就是我所说的一个规则。
下一节预告,我眼中学习单片机的四个阶段。
第二节:
我眼中学习单片机的四个阶段。
第一阶段:
学会C语言的常用语法,熟悉51单片机开发平台软件keil的操作,了解单片机的大概原理特性,能读懂按键,数码管,跑马灯,串口的简单程序,能熟悉几个常用的外围芯片驱动。
网上这方面优秀的教程很多,我正在写的这个连载《从业十年,教你51单片机入门基础》也是属于这类入门教程之一。
第二阶段:
我认为这个阶段是四个阶段中最重要的阶段。
很多初学者完成了第一阶段的学习,真正去面对一个小项目的时候,还是无从下手。
他们不知道按键,显示,通讯,应用程序之间是如何关联起来的,他们一旦遇到多任务项目的时候不知道如何并行处理,他们最缺的是程序的框架思路。
网上有很多热心牛人分享的程序框架思想,都值得大家学习和借鉴。
我平时做项目是用状态机的思路,就是用switch语句实现多任务的切换,再外加一个定时中断产生不同的时间计时,有兴趣的朋友可以看看我去年在本论坛写的连载贴子《从业将近十年,手把手教你单片机程序框架》。
第三阶段:
大家在做项目时,除了写单片机的软件,还不可避免的要跟整个电路的硬件打交道,掌握一些常用的硬件电路知识就显得尤其重要。
电阻,电容,电感,二极管,三极管,光藕的应用,电压差和参考地的关系,两系统通信时需不需要共地的原因,隔离与非隔离的本质,常见的变压整流电路,常见的外围驱动电路等等。
这方面优秀的电子基础教程很多,大家应该主动找这方面的资料来学习学习,我过一两年后也打算写写这方面的连载贴子《从业十年,单片机常用硬件知识讲解》。
第四阶段:
有了前面三个阶段的主动学习和积累,就可以去做项目了,在项目中学习。
根据工作的需要来选择学习哪个厂家的单片机,比如PIC,AVR,stm32等单片机厂家;根据工作的需要来决定是否需要学习汇编语言,有一些台湾厂家的单片机并不能用C语言开发,只能用汇编;根据工作的需要来深入研究相关行业所需的硬件电路知识;根据工作的需要来学习相关的外围芯片驱动程序,这个阶段的学习正如郭天翔老师所讲的“缺什么补什么”。
我本人也打算过两三年后写写这方面的贴子,作为大家项目开发时的参考工具书来用,叫《从业十年,单片机常用外围驱动程序集》。
下节预告,单片机一个最重要的特性。
第三节:
单片机一个最重要的特性。
“道生一,一生二,二生三,三生万物。
”《道德经》认为,世间万物,缤纷多彩,它们都起源自一个东西,这个“一”的东西就是“道”。
电子世界也存在“一”这个东西,这个“一”繁衍出手机,电脑,电视机,机器人等丰富多彩的电子世界。
这个“一”就是单片机一个最重要的特性:
程序下载进单片机的内存后,可以识别管脚上的高低电平信号,管脚也可以输出不同时间长度的高低电平。
下面我把这句话的5个重要关健词提取出来,详细解读它的含义。
程序。
有3种,C程序,汇编程序,机器程序。
能下载进单片机的只有机器程序,C程序和汇编程序都不能直接下载进单片机,所以C程序和汇编程序最终要经过专用编译软件翻译成机器程序后,才能下载进单片机执行。
程序就是语言,语言就是用来交流的,交流就必须存在两个对象,这两个对象分别是程序员和单片机。
程序员用C语言或者汇编语言,单片机只用机器语言,他们两者交流就必需一个翻译家,这个翻译家就是编译软件,俗称编译器,它专门把C语言或者汇编语言翻译成单片机能识别的机器语言。
现在单片机开发的主流是用C语言,我本人出来工作后就从来没有用过汇编语言,所以我的观点是,C语言是必修课,汇编语言是选修课;C语言是白话文简单易懂,汇编语言是文言文繁琐难读。
当然汇编也有它的优点和不可替代的场合,汇编的翻译效率高,往往是一句汇编语言对应一句机器语言,而一句C语言有可能对应几句机器语言,所以很多嵌入式系统某段要求简洁高效的源代码都是用汇编来写的,也有少数一些很便宜的单片机不提供C编译器,只能用汇编语言开发。
所以要不要学汇编,我的建议是最好根据个人的工作需求来决定。
内存。
既然程序可下载进单片机,那么单片机必然有一个存储程序的内存。
单片机内存包括ROM和RAM两部分。
ROM的优点是掉电后存储的内容不会丢失,缺点是除非在烧录(下载)过程中,否则上电后它存储的内容也不能更改。
并且,虽然ROM在烧录(下载)过程中可以更改内容,但是更改的次数有限制,也就是烧录(下载)的次数有限制,一般最大次数是10万次,当然这里所说ROM是指FLASH的单片机,如果是OTP的单片机,那么最大次数是1次。
而RAM恰好反过来,RAM的优点是上电后存储的内容可以被程序指令随时更改,而且还没有更改次数限制,缺点是掉电后内容会丢失。
正因为ROM和RAM各有特点,所以它们的分工有所不同。
程序包括指令和数据两部分。
指令是指程序中的判断,跳转,赋值等指令,这些内容是程序烧录进单片机时就固定下来的,不可更改的,所以存储在ROM中。
数据也分两种,程序指令可更改的数据和程序指令不可更改的数据。
程序指令可更改的数据存储在RAM中,程序指令不可更改的数据存储在ROM中。
那么谁在幕后进行这些分类存储?
是编译器软件和下载器(烧录器)。
编译器除了把C语言翻译成机器语言之外,还帮我们分好了类,分配好了存储的地址和位置,下载器(烧录器)再根据这些信息把程序存储到内存中。
管脚。
它是单片机与外部电路进行能量和信息交互的桥梁。
有电源,复位,晶振和IO口这4种类型管脚。
第一种电源管脚。
是给单片机内部电路供电的接口。
单片机有两种常用的供电电压,一般不是3.3V就是5V,有的单片机两种电压都兼容。
第二种复位管脚。
单片机上电后需要外部电路给它一个瞬间高电平或者低电平的复位信号,才能启动工作。
这类外部的复位电路通常是用电容和电阻组成的充电电路来实现,也有一些系统是用专门的复位芯片来实现。
第三种晶振管脚。
任何单片机想要工作必须要有晶振。
单片机执行程序指令是按一个节拍一个节拍来执行的。
而晶振产生固定频率的脉冲就是这个节拍的基础源泉。
所以把晶振比喻成单片机的心脏是非常恰当的。
当然,现在很多单片机都把晶振集成到内部了,不用再外接晶振。
第四种IO口管脚。
这是跟我们编写程序关联最密切的管脚。
前面提到的电源,复位,晶振这3种管脚是为了让单片机能工作,俗称单片机工作的三要素。
而单片机工作的具体内容就是通过IO口管脚来体现的。
比如,IO口能识别按健的输入,也能驱动继电器的开关,也能跟外围器件进行通信。
电平。
单片机IO口管脚检测到的电压低于或等于0.8V时是低电平,程序里读取到的是0数字。
检测到的电压高于或等于2.4V时是高电平,程序里读取到的是1数字,当然IO口输入的最大电压不能超过单片机的供电电压。
单片机输出的低电平是0V,单片机输出的高电平等于它的供电电压值。
时间。
时间是单片机程序必不可少的一个元素。
跟外围芯片通信的时序节拍需要时间,驱动发光二极管闪烁需要时间,工控自动化的某些延时需要时间。
单片机的时间来源自两方面。
第一方面源自指令的周期时间。
单片机是根据节拍来执行程序指令的,所以每执行一条指令都要消耗一点时间,只要让程序执行一些无实际意义的指令,并且通过调整所执行指令的条数就可以得到所需要的时间长度。
第二方面源自单片机内部自带的定时器。
假如设置定时器每20毫秒产生一次中断,现在要获取10秒钟的时间,只需程序统记500次定时中断就可以了,因为1秒等于1000毫秒。
下节预告,平台软件和编译器软件的简介。
第四节:
平台软件和编译器软件的简介。
C语言代码写在哪里,谁负责把它翻译成Hex格式机器码?
这就涉及到编辑和编译,从而诞生了平台和编译这两种软件。
平台软件负责编辑源代码,编译软件负责把源代码翻译成Hex格式的机器码。
不同厂家的单片机,它所用的平台和编译器软件都不一样。
即使是同样一个厂家的单片机,它也有可能存在多种不同的第三方平台软件和编译器软件,下面列举的一些例子只是主流的平台和编译软件,并不是说它们是唯一的。
PIC单片机的平台软件是MPLAB,8位单片机是PICC编译器,12位单片机是PIC18编译器,16位单片机是C30编译器。
这个例子从侧面也说明了一个平台软件可以嵌入多种不同的编译器软件,平台软件和编译器软件存在一对多的关系。
51单片机的平台软件是keil,编译器是C51。
以上所述,单片机程序开发需要用到两种软件,但是实际项目开发的时候,我们只是跟平台软件打交道就可以了,因为编译器软件是当做一种独立配件嵌入到平台软件里,统一受平台软件控制。
我在用PIC的8位单片机时,需要安装一次MPLAB平台软件,也需要独立再安装一次PICC编译器软件,然后运行MPLAB平台软件,在里面操作某个菜单设置选项,把PICC编译器跟MPLAB平台软件关联起来,也就是我所说的把PICC编译器嵌入到MPLAB平台软件里,统一接受平台软件的控制,但我写代码只需要跟MPLAB平台软件打交道就可以了。
我早期在做51单片机开发时,也是需要把keil平台软件和C51软件分开安装,然后再把它们关联起来,但是现在从keil2版本开始,在安装keil平台软件时就已经默认把C51安装好了,并且自动把C51嵌入到了keil平台软件。
我现在用keil4这个版本的平台软件,只需要安装一次keil平台软件就可以了,不需要像早期那样再单独安装C51编译器。
第五节:
用keil软件新建,关闭,打开一个完整工程的操作流程。
Keil平台软件的安装我就不多讲了,网上这方面的资料很多,大家可以XX一下如何安装keil的教程。
下面开始讲解用keil软件新建,关闭,打开一个完整工程的操作流程。
第一步:
新建一个工程文件夹。
先在电脑D盘目录下新建一个文件夹,取名为“stc89c52rc”。
有2个地方需要解释:
(1)文件夹以及后面所取的文件名不要用中文,请全部用英文,数字,或者下划线这些字符。
keil软件支不支持中文名无所谓,但是在单片机这个行业,有一些单片机厂家的平台软件,某些版本是不支持中文名的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
(2)新建的文件夹请直接放在某盘的根目录下,而不要放到某个已有文件夹的目录下。
一方面是因为已有的文件名往往带有中文字,另外一方面是有一些单片机厂家的平台软件不支持嵌入层次太深的文件目录,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
第二步:
启动keil软件。
双击桌面”keiluVision4”的图标启动keil软件。
第三步:
关闭默认被打开的已有工程。
打开keil软件时,如果发现此软件默认打开了一个之前已经存在的工程,请先关闭此工程。
如果默认没有打开已有工程,这一步可以忽略跳过。
关闭已有工程的操作是这样子的:
点击上面”Project”选项,在弹出的下拉菜单中选择“CloseProject”即可。
第四步:
利用工具向导新建一个工程。
点击上面”Project”选项,在弹出的下拉菜单中选择“new uVisionProject...”,在弹出的对话框中,选择保存的目录是刚才第一步新建的文件夹“stc89c52rc”目录下,输入跟文件夹名称一样的文件名“stc89c52rc”,然后单击“保存”按键,此时会弹出一个选择单片机型号的对话框,双击”Atmel”这个厂家,在展开的下拉选项中选中“AT89C52”这个型号,然后点击“OK”,此时会弹出一个英文询问框“是否要复制STARTUP.A51这个文件到工程里?
”我们单击“否”即可。
有3个地方需要解释:
(1)以上新建的保存文件名应该跟我们第一步在D盘新建的文件夹名称一致,因为有一些单片机厂家的平台软件是有这个要求的,所以大家养成这个习惯,以后可以避免遇到一些不必要的麻烦。
(2)上面之所以选择Atmel厂家的AT89C52单片机,是因为朱兆祺51学习板所用的单片机是STC89C52RC这个单片机,而STC89C52RC跟AT89C52是兼容的。
(3)在弹出的询问框“是否要复制STARTUP.A51这个文件到工程里?
”中,STARTUP.A51这个文件有什么含义?
STARTUP.A51是一个启动程序文件,在单片机进入.c程序执行main函数之前,先去执行这个启动程序,这个启动程序是专门用来初始化RAM和设置堆栈等,如果我们选“否”不添加这个启动程序,编译器也会自动加入一段我们不能更改的默认启动程序。
如果选“是”,那么这个文件就会出现在我们工程里,我们可以根据需要进行更改。
但是大多数的情况下,我们都不会去更改这个文件的,所以无论你选“是”还是“否”,只要你不更改START.A51这个文件,对我们都是一样的。
我本人一般情况下都是选“否”。
第五步:
新建一个.c源文件。
点击上面”File”选项,在弹出的下拉菜单中选择“New ...”,会看到出来一个名字为”Text1”的文件。
再一次点击上面”File”选项,在弹出的下拉菜单中选择“Save”,会弹出一个保存的对话框,还是选择保存在第一步新建的文件夹目录下,文件名取“stc89c52rc.c”,单击“保存”。
有2个地方需要解释:
(1)以上所取的文件名必须带.c这个扩展名,表示此文件是C文件格式。
(2)第五步仅仅相当于在工程文件夹里新建了一个.c格式的C文件,此C文件目前跟工程还没有任何关联。
第六步:
把刚才新建的.c源文件添加到工程里,跟工程建立起关联的关系。
点击左边”Porject”选项框里面的”Target1”前面的“+”号(如果没有发现Project,请按以下第2条解释操作),在展开的下拉菜单下看到“SourceGroup1”。
右键单击“SourceGroup1”选项,在下拉菜单中选择“AddExistingFilestoGroup ‘SourceGroup1’...”选项,弹出一个文件选择对话框,单击选中刚才新建的.c源文件,然后单击一次“Add”按钮,此时虽然对话框没有关闭,但是已经把.c源文件添加到工程里了,这时只要再点击一次“Close”按钮即可把此对话框关闭。
这时发现左边的“SourceGroup1”前面多了一个”+”号,单击此”+”号展开,发现下面刚才我们新添加进去的.c源文件“stc89c52rc.c”。
有2个地方需要解释:
(1)以上有一个地方,我本人觉得keil软件的用户体验做得不够好,容易引起误解。
在弹出一个文件选择对话框时,先单击选中刚才新建的.c源文件,此时单击一次“Add”按钮,已经相当于把.c文件添加进工程了,但是此时keil软件并没有自动关闭对话框,这样很容易让初学者误以为.c源文件还没有被添加进去。
(2)如果没有以上操作的时候没有发现左边Project窗口,请点击左下角的Project选项来切换。
第七步:
双击打开左边被添加进工程的“stc89c52rc.c”.c源文件,就可以在此“stc89c52rc.c”文件下输入我们的C语言代码了,请把以下范例代码复制进去,然后再一次点击”File”选项,在弹出的下拉菜单中选择“Save”保存。
此时,新建一个工程的步骤已经完成。
供复制的范例代码:
1.#include"REG52.H"
2.
3.voiddelay_long(unsignedintuiDelayLong);//延时函数
4.
5.sbitled_dr=P3^5;
6.
7.voidmain()
8.{
9. while
(1)
10. {
11. led_dr=1; //LED亮
12. delay_long(100); //延时50000个空指令的时间
13. led_dr=0; //LED灭
14. delay_long(100); //延时50000个空指令的时间
15. }
16.}
17.
18.voiddelay_long(unsignedintuiDelayLong)//延时函数
19.{
20. unsignedinti;
21. unsignedintj;
22. for(i=0;i 23. { 24. for(j=0;j<500;j++); //内嵌循环的空指令数量 25. } 26.} 27. 复制代码 有1个地方需要解释: (1)把代码复制到keil4时,中文注释出现乱码怎么办? 解决办法如下: 点击左上角"Edit",在下拉菜单中选最后一项“Configuration”,在弹出的对话框中把Encoding的选项改成“ChineseGB2312(Simplified)”. 重新复制一次代码进去就恢复正常了。 第八步: 打开一个现成的工程。 前面七步已经讲解完了如何新建一个工程,现在教如何打开一个现成的工程。 先单击右上角”X”关闭整个keil软件,然后双击桌面”keiluVision4”的图标重新启动keil软件,如果发现此软件默认打开了一个之前已经存在的工程,请先按照前面第三步关闭此工程。 然后,点击上面”Project”选项,在弹出的下拉菜单中选择“OpenProject...”,在弹出的文件对话框中,找到第一步新建的工程文件夹,单击选中“stc89c52rc.uvproj”这个文件名,然后点击“打开”,就可以打开一个现有的工程文件了。 下节预告: 把.c源代码编译成.hex机器码的操作流程。 第六节: 把.c源代码编译成.hex机器码的操作流程。 第一步: 打开一个现成的工程。 双击桌面”keiluVision4”的图标启动keil软件,如果发现此软件默认打开了一个之前已经存在的工程,请点击上面”Project”选项,在弹出的下拉菜单中选择“CloseProject”先关闭当前工程。 然后,继续点击上面”Project”选项,在弹出的下拉菜单中选择“OpenProject...”,在弹出的文件对话框中,在D盘找到上一节已经建立的工程文件夹stc89c52rc,单击选中“stc89c52rc.uvproj”这个文件名,点击“打开”,就可以打开一个现有的工程了。 第二步: 设置编译环境让它允许产生.hex格式的机器码文件。 鼠标右键点击选中左边”Porject”选项框里面的”Target1”选项,在右键下拉菜单中选择“OptionsforTarget‘Target1’...”选项,弹出一个编译环境设置对话框,左键单击上面子菜单切换到“Output”窗口下,把“CreateHexFile”勾选上。 点击“OK”退出。 有1个地方需要解释: (1)这个选项很重要,必须把“CreateHexFile”选项勾上,否则后续的操作不能在工程文件夹的目录里生成.Hex的机器码文件。 对于一个工程模板,只需要设置一次就可以保存起来的,下次开电脑重新打开此工程模板时不需要再设置,这些被设置的参数都是能掉电保存起来的。 第三步: 启动编译。 在确保stc89c52rc.c源文件里面有C语言源代码的情况下,点击上面”Project”选项,在弹出的下拉菜单中点击“Rebuildalltargetfiles”编译命令,编译器开始编译工作。 第四步: 在”BuildOutput”窗口下观察编译结果。 可以在最下方的”BuildOutput”窗口下观察到编译的过程提示。 如果没有发现”BuildOutput”窗口,请把鼠标的光标移动到最下方的滑动条下边,当它呈现移动光标的形状时,按住左键往上拖动就可以看到“BuildOutput”窗口了。 当“BuildOutput”窗口提示显示“creatinghexfilefrom"stc89c52rc"..."stc89c52rc"-0Error(s),0Warning(s).”等信息时,表示翻译工程结束了。 其中0Error(s)代表编译成功,没有任何错误。 0Warning(s)代表没有任何警告。 只要有一个错误Error产生,就说明编译不通过。 如果没有任何错误Error产生,但是有几个警告Warning产生,在这种情况下很多时候都不影响程序的正常运行,只有少数情况下是会影响代码的正常运行的,因此我本人建议哪怕是一个警告,大家也不要放过它,要找到产生这个警告的原因。 查找错误的时候,只需要双击错误提示error那行内容,光标就会自动跳到源代码错误的附近,方便大家寻找语法错误。 最终观察到的BuildOutput窗口如下: 第五步: 编译后生成.hex机器码文件的目录位置。 以上编译成功后,我们只要打开电脑D盘的stc89c52rc文件夹,就可以找到.hex扩展名的机器码文件,这个文件就是我们要下载到单片机的机器码文件。 下节预告: 利用现有工程模板编译不同项目源代码的方法以及代码备份管理技巧。 第七节: 重复利用现有工程模板进行程序开发的方法以及代码备份管理技巧。 是不是每做一个新项目都要新建一个工程? 在同一个项目中,是不是每修改一次源代码都要新建一个工程? 很多情况下都不用。 这节介绍如何重复利用现有工程模板进行程序开发的方法以及代码备份管理技巧。 重复利用现有工程模板,有三个必须。 第一个必须是一个源文件的,而不是多文件编程(大家暂时不了解啥叫多文件编程也没关系)。 第二个必须是同样的厂家同样的单片机型号。 第三个必须进行代码备份管理,每完成一个项目的小进度,都要及时把源代码存储到电脑硬盘里,电脑硬盘里每个项目对应一个项目文件夹,每个项目文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 学习心得