2019独角兽企业重金招聘Python工程师标准>>>
单片机入门教程 (转)
来自:http://home.eeworld.com.cn/my/space.php?uid=78216&do=blog&id=131052009-01-07 10:51
请允许我假设你已经掌握基本的模拟与数字电路知识、基本的计算机理论知识(比如知道二进制是怎么回事,RAM和ROM是什么东西)与操作知识(比如会装载与使用应用软件)、明白C语言的基本规则与语句。同时,我默认你有一本经典51教材(哪个版本都可以)、一本51单片机应用教材(内容为给出硬件电路和源程序的单片机开发实例)、一块51单片机实验板(含一条串口线)、一块具有ISP(在系统编程)功能的单片机、某个版本的KEIL软件、某个版本的ISP烧写软件、一台性能一般的PC电脑。
如果不具备上述任何一项,请不要继续阅读本教程,收起你的书本,回家吧,你无法学会单片机。知识方面的欠缺请自己尽快弥补。教材与应用书籍可以借阅,但是我建议各买一本,因为它们属于工具书,需要随时翻看,版本我就不推荐了,各种版本内容基本都一样,这个投资需要数十元。实验板可以使用我提供的这一款,硬件功底好的也可以自制,成本在100元以内,网上有很多这方面的资料,且基本配置都大同小异。具有ISP功能的51单片机我推荐使用飞利浦系列,本实验板就是针对P89C51RD2系列(价格40元左右)设计的(周立功单片机公司全面代理飞利浦单片机,可以联系邮购)。其他ISP功能的单片机也行,如华邦的W78E系列,AVR哈佛结构(不是51内核)高速系列,不过我都没有使用过。具有ISP功能的单片机虽然比AT89C51之类(10元左右)贵很多,但是配置很强(仅ROM容量就有64K,是AT89C51的16倍),而且相对于数百元的编程器或者仿真器来说,性价比还是很高的,有利于降低硬件投资给初学者造成的门槛。KEIL软件网上随处都可以下载到(搜索KEIL下载即可),当然尽量使用高版本的。ISP编程软件周立功单片机的网站可以下载,名称为ZLGISP,飞利浦的WINISP也可以。不算PC电脑的话,200元的投资足够开始学习51单片机了(实验板+串口线+单片机+教材)。
OK,这是一份面向对单片机一无所知的初学者的入门教程。单片机技术就如同一张窗户纸,这份肤浅的教程就是来戳穿它的,呵呵。就如同你来到一个陌生的城市,我送你一张地图——不是我水平高,是我比你来得早,就这么点优势,呵呵。它的作用仅仅是帮助你在茫然的情况下顺利上手,至于上手之后的进展,就全靠你自己的辛勤钻研了。你要明白,没有任何路标能够代替你走完脚下的路。显然,我不想你们再像我一样在入门上花费过多宝贵时间。你们当然会感谢我,这是可以理解的,因为我也曾感谢过在我入门的时候给过我帮助的朋友。
好了,我们开始学习单片机的旅程。
第一章:单片机开发的基本流程
不是所有人都学过地理,但是几乎每个人都能找到回家的路,学习单片机也是如此。我们先不要看什么教材,我们直接进入开发过程的介绍与学习,争取在最短的时间内获得最多的感性认识。千万不要像学英语那样学单片机,就像背了十年单词却没见着一回老外——看一年教材也没见过单片机什么样的话,那就不可能学会了。
针对我们前言中的软硬件,基本开发流程是这样的:
1、在PC电脑上安装并启动KEIL软件,建立一个单片机工程项目,调整设置,使项目输出时生成HEX格式(INTERL公司规定的一种二进制格式)烧写文件。具体操作详见第二章。
2、新建程序文件,将其加入项目。用汇编或者C51语言编写一个程序,编译,纠错,再编译,再纠错,直到错误全部消失,编译成功,系统会自动生成HEX格式文件,保存在项目所在的文件夹里。
3、在实验板断电的情况下(如果带电容易击穿PC机串口),用串口线连接单片机与PC机串口。接通实验板电源,选择ISP编程(红色发光管亮),复位,进入编程状态。启动ISP编程软件ZLGISP,选择需要擦除的FLASH块(初学编程代码不会很大,擦除第一块BLOCK8K足够)。点击设置选项,VECTOR为FC不要改动,STATUS改为00,点击写入。然后点击读出,确认VECTOR确实为FC,而STATUS确实为00,如果不是,重新写入,然后退出ISP状态,则设置完成。也就是说每次退出ISP功能之前,必须确认向量为FC,否则下次将无法进入ISP状态,就好比你把钥匙放在屋子里却从外边锁上了门一样。因为VECTOR和STATUS是同时被改写的,所以改写STATUS的时候VECTOR可能发生误码或丢失等错误,一旦发生这种情况,只能使用支持P89C51RD2的并行编程器将VECTOR的入口地址FC重新烧入,等于破门而入拿钥匙,比较麻烦了。注意,这一步非常关键,STATUS不为00程序将不能正常运行程序,原理下文再做介绍。打开编译好的HEX格式烧写文件。点击编程选项,不必做任何选择,等待编程自动结束。
4、切换到运行状态(绿色发光管亮),按下复位键。此时程序开始运行,实验板的器件会有相应的反应。至此一次完整的单片机开发流程成功结束。
第二章:KEIL软件使用方法
如何安装与启动KEIL软件我就不说了,这个软件的功能有三个:编辑程序源代码,编译源程序为目标文件(目标文件就是翻译过来的机器码),软件仿真运行结果。作为初学者,你要明白编辑和编译的区别——就像你要明白秘书和翻译的区别一样。
启动软件以后,点击PROJECT(工程),在下拉菜单中选择NEW(新建),在对话框中设置项目文件的保存位置,具体位置随你便了。给该工程项目命名,随你便,但是要把扩展名设为.UV2,比如可以命名为LED.UV2,保存。此时弹出单片机设备选择对话框,针对我们的实验板请选择ATMEL公司的AT89C51或者PHILIPS公司的8XC51RD2,点击确定。
点击FILE(文件)中的NEW,此时会出现一个文本界面,点击FILE中的SAVE(保存),在对话框中设置保存路径(最好与刚才的工程文件在一个文件夹中)。给该源程序文件命名,扩展名要根据你使用的编程语言确定,如果使用汇编语言,就命名为.ASM,如果使用C51语言,就命名为.C。对于没有学过C51的初学者来说,应使用.ASM,比如LED.ASM,保存。
在左面的工程窗口里用右键点击TARGET1,选择OPTIONS FOR TARGET ‘TARGET 1’ ,在对话框中选择OUTPUT选项,在CREAT HEX FILE选项前打勾,点击确定,这样编译之后,在工程项目所在的文件夹中就能够生成HEX格式的烧写文件了。
点击TARGET1前面的加号,用右键点击SOURSE GROUP 1,选择ADD FILES TO GROUP ‘SOURSE GROUP 1’ ,将刚才新建的源程序文件加入。此时SOURSE GROUP 1之前也有加号了,点击会看到你新建的文件。
双击进入你建立的文件,现在可以编写你的第一个程序了。
第三章:你的第一个单片机程序
源程序如下:
ORG 00H
MOV P0 , #55H
LOOP: SJMP LOOP
END
什么?这么简单?!是不是在搞笑?!没错,虽然简单,但这就是一个完整的单片机程序。具体语句我先不作解释,你要先把这个程序在实验板上跑起来才行。点击编译按钮(项目窗口上面那三个蛋糕一样的按钮中间或者右边那个),也可以选择PROJECT选项中的BUILD TARGET选项,编译就自动开始。如果有错误或者警告,下面的编译输出栏将会显示,如果你编译过C语言的程序,就会比较熟悉,所以要求你具有一定的C语言基础。如果没有错误和警告,系统将显示代码量,DATA表示占用内部RAM空间的大小,XDATA表示占用外部RAM空间的大小,CODE表示占用片内ROM空间的大小。P89C51RD2HBP本身有1K内部数据存储器RAM,64K内部程序存储器ROM,本实验板没有扩展外部RAM,所以暂时不能做有关外部RAM存储的实验。至于你使用AT89C51+编程器的话,资源就比较少了,只有128B(1字节=8位)RAM和4K大小的ROM,不过对于初学者,足够使用了。
好的,对于你这样一个一点成就感都没有的初学者来说,激动人心的时候就要到了:我们要把这个程序固化到单片机的ROM里了。连接好串口线,写入STATUS为00(切记!写一次就行了,频繁擦写有可能导致向量丢失,那麻烦就大了),擦除,固化,复位——哈,程序运行了吗?8个LED发光管隔一个亮一个吗?如果是的话,恭喜你啊!你已经成为一名单片机的开发人员啦!呵呵,虽然这个程序没有什么实用价值,你也不明白语句的意义,但是它给你带来了成就感和自信心,这才是作为初学者最最需要的,有了信心与兴趣,一切都不再成为负担和难题。
是不是开始跃跃欲试了?好的,我们继续讲下去。
第四章:程序解释与软件仿真功能的介绍
现在我们回过头来解释这个程序。
ORG是一个伪指令。不懂?呵呵,正常,当初我也不懂。伪指令就是一条没有真正操作的指令,说白了就是什么活也不干,耍耍嘴皮子而已。ORG是个定位伪指令,告诉系统程序从00地址开始执行,至于执行什么,怎么执行,它不管。就像一次扫雪任务,一个领导来了,指着脚下说:从这里开始扫。至于具体怎么扫,那是你的事情,呵呵。还有几条伪指令,去看教材。
MOV P0 , #55H是这个程序的核心指令,工作全部都是它做的。参照教材,它的意思是将十六进制数55输出给寄存器P0,而P0口的状态由8个LED显示。我知道你会对这个十六进制数字感到糊涂,因为我们长了10手指头。这里的55不是十进制转换来的,它实际是二进制数字的一种压缩写法,写成二进制就是01010101,这样P0口接的8个LED就会隔一个亮一个。55屁股后面的H表示它是十六进制数,如果去掉H就表示55是十进制数了。十进制数55转换为十六进制数是37,二进制数是00110111,就不是01010101了,不信可以试试看,去掉55后面的H。为了明确输出状态,你可以将55H写成01010101B,这个B表示是二进制数,显示结果一样,我写输出一般都使用二进制写法。你必须明白十进制、二进制、十六进制之间的转换方法,各种计算机书里都有的。以后你就不要用十进制思考了,二进制是一种重要思维方式,你务必熟悉。具体计算你不要动手,那很傻哦——PC机的附件里不是有个很好的计算器吗?可以非常方便的转换多种数制,编程的时候同时打开就行了。
现在来解释那个很有趣味的软件仿真,你不用烧写芯片就可以看到运行结果,神奇吧!我当初都不知道有这么好的软件,为了改变一个简单的程序会白白烧片十几次,简直是傻瓜。现在我使你避免成为傻瓜,你是不是应该感谢我呢?呵呵。编译成功后点击DEBUG(调试或者叫除错,因为BUG是错误的意思)选项里的STARTSTOP DEBUG SESSION,工具栏里也有这个快捷图标(有个带红色B字母的放大镜)。点击PERIPHERAL(外设)选项,选择需要察看的部分,这里我们选择P0口。点击左上角文件下面的RET复位,然后点击RET右面的带下箭头的小方块来运行程序,这时可以看到P0口状态变为01010101,表明运行成功。想要退出运行中的程序,点击那个圆形的红色叉。要回到编辑界面请再次点击DEBUG的快捷图标。
现在有个问题,那个LOOP : SJMP LOOP是干嘛的?这是一个死循环,指令反复跳转到本身,相信你能够看懂。你会觉得它没有什么用,你感觉很对,它的确没有什么实际的作用。那么好,让我们把它删除——编译照样通过,没有任何错误和警告,而且就算你现在把它烧写到芯片里,它也能正确运行,那为什么还要加上?你不服?好,那我们进入刚才的调试界面,运行程序,不好!系统提示出错NO ‘EXECUTE/REDA’ PERMISSION !什么原因?问题出来了吧?因为你删除了这个循环,程序就跑飞了!跑飞了是什么意思?比如你让一只小狗在广场上随便跑,你怎么知道它会跑到哪里去?这就是跑飞,结果是你丢失了这条小狗,当然你可以重新买一只,这就是复位了,哈哈。如果你让一只小狗在院子里跑,它就不会丢失啦。循环的意义就在这里,让程序掉到这个循环里,你和系统就能把它控制住。你还是不以为然吗?这是一个简单程序,也许问题不大,但是当程序复杂之后,跑飞了是件很麻烦很可怕的事情,会出现莫名其妙的错误,而且你也无法使用软件仿真功能了。要是你还不服气,那就尝试每次编程都让程序跑飞一次,如此之后你就有感觉了,我曾经被这个简单问题困扰了数周之多,现在我提示你,你要当回事。
END也是个伪指令,是个编译结束标志,编译器编译到END的时候就结束编译了,不再编译END以下的程序。
这就是软件仿真的基本过程,后面我还会介绍到仿真的其他功能。建议你每次编写程序以后都要先进行软件仿真,反复修改,反复调试,直到需要完成的功能完全仿真成功再将程序烧写到芯片,这样能够提高开发效率,延长单片机使用寿命。
第五章:关于编程器、仿真器与ISP
我建议你使用具有ISP功能的单片机完全是考虑到初学者的资金问题,因为很多人一听说学习要花钱就会放弃学习。世界上没有免费的知识,更没有免费的技能,投资是非常必要的,但是成本越低就越容易上手,所以我推荐具有ISP功能的单片机,但这并非说编程器与仿真器已经没用,这一点你们要明白。
首先说说编程器,它是干什么用的呢?程序编辑好后,并且通过编译生成了HEX格式的二进制烧写文件,就要用编程器把它烧写到单片机里面。我最初入门的时候就是使用AT89C51 +编程器的开发模式,过了半年多才在发现具有ISP功能的单片机,白花了那么多银子。编程器本身很贵的,最好的上千,好一点的数百元,最便宜的简易型的也要上百元,是个不小的投资,很多人之所以对单片机望而却步,正是在这个投资上出现了犹豫。另外编程器使用起来也比较麻烦,每一次编程都要把芯片从实验板上拔下来,烧写好了再插回去,很容易弄坏插座和管脚,为此配置零插拔力插座的话,又要花一只单片机的钱了(十多元一只)。而且如果去现场工作的话,拎着个编程器多麻烦!设备复杂的话插拔芯片也很困难,一旦弄坏了管脚或者印刷板,设备就完蛋了。但是编程器在开发产品中具有重要作用,因为产品的目标板(相当于完成指定功能的实验板)一般没有空间额外加挂串口电平转换部分的器件,所以要通过编程器编程。而且开发产品如果使用一般的51芯片,成本也会大幅度下降。对于那些不用改动程序的产品比较有利。当然如果产量非常大的话,就选择掩膜(就是把程序直接做到芯片里)生产了,编程器也不用了,成本非常低。
仿真器在高校教学、实验与复杂产品开发中可以使用。使用编程器和ISP的开发方法叫做“崩溃——烧写”模式,如果程序运行结果错误,只能改动程序后擦除芯片重新烧写,为了调试一个程序连续烧写芯片数十次是很正常的事情,但是这样不但麻烦,还会缩短芯片使用寿命,而且无法观察程序运行中的状态。仿真器正是针对这一问题,它无需烧写,通过它可以直接观察运行结果,而且可以单步运行,能够最直接的找到问题所在,所以高级产品的开发都要用到。不过初学者一般买不起仿真器,也没必要买,KEIL本身就有软件仿真功能,可以大大减少烧写次数。只要不涉及到外部扩展接口,在KEIL上仿真运行成功的程序,绝大部分烧写以后都能正常运行,下文将有说明。
ISP的意思是在系统编程,但是我不喜欢这个说法,刚入门谁能理解?我的解释就是单片机本身自带编程功能,就像把一台编程器集成到单片机上,这就很容易理解了。它本身有一个出厂时候就固化好的编程程序,放在BOOT ROM里,不可修改。这个BOOT ROM不占用系统本身的ROM空间,具体放在哪里我们不必关心,VECTOR(向量)设置为FC(针对P89C51RD2系列)就是BOOT ROM的入口的地址,不得改动。顺便解释一下,BOOT不是靴子的意思哦,是启动的意思。向量的意思我理解就是一个地址,线性代数中不是有N维向量的概念吗?其实就是一串数字,你记住是地址就行了,不要去想什么向量。对于P89C51RD2来说,PSEN脚(29脚)接地(低电平)是进入ISP功能的硬件激活条件,所以编程的时候要按下选择开关到编程端。编程结束后使PSEN脚恢复高电平,复位之后即可启动程序,但是此时STATUS(状态字)必须为00,它的意思就是程序从00地址开始启动,因为编程操作是把程序烧写到00地址开始的空间里,如果不从00启动,程序就发生错误了。有关ISP的详细资料可以从网上下载。不懂什么叫高低电平?不准确的说,低电平就是0V,高电平就是电源电压5V,低电平相当于逻辑里的0,高电平相当于逻辑里的1,数字电路教材里一定有描述,我就不说了。
我觉得开发器材的选择是这样的:当你是初学者的时候,用一块具有ISP功能的单片机学习足够;当你能够独立设计目标板进行小产品开发时,可以考虑购置编程器;当你成为专业单片机技术人员乃至嵌入式系统工程师的时候,仿真器对于高级产品的开发是必须的了。
第六章:51单片机实验板原理与功能简介
现在市面上单片机实验板种类繁多,有的非常简陋,有的相对高级,价格与外围器件扩展的程度正相关。我设计的这一款实验板个人认为不算简陋但也称不上高级,和网上的各种普及型实验板都差不多,市售价格在100元左右,非常适合初学者使用。能够把这款实验板的所有功能都开发出来的话,你的单片机开发水平就相当可以了。由于电路原理非常简单,电路原理图与PCB图我将免费公布,以利于广大初学者自制,需要者请联系向我索要。你也可以参考我板子的硬件结构,根据自己的要求自行设计。
请参照你手里的51教材中列出的单片机管脚,我将详细说明本实验板的硬件结构。
1、P0口通过74LS244(单方向8位总线驱动器)驱动8位LED发光二极管。可以实现广告灯、跑马灯、交通灯等相关实验。
2、P0同时通过74LS244驱动4位LED数码管的段选,与8位LED切换通过一只开关完成。位选由P2口前4位通过4只NPN三极管驱动完成。可以实现时间显示、秒表与计数显示等与数码管有关的实验。
3、P1.5通过一只PNP三极管驱动一只自震荡的蜂鸣器。自震荡的意思是加上一定直流电压,蜂鸣器即可发出一定频率的声音。如果想改变频率,可以使用PWM(脉宽调制,就是改变脉冲占空比)方式通过音频调制驱动。如果想实现音乐编程,更换为一般的蜂鸣器(就是音乐贺卡里的压电片)即可。可以完成与音乐发生有关的实验,也可作为报警信号输出。
4、P1.6与P1.7脚连接IIC器件,板载一只8脚DIP插座,可选AT24C02,它是一只256B的EEPROM(电可擦写存储器)。可以实现电子密码锁等需要保存数据的实验,通过实验也可以对IIC技术有个基本的了解与掌握。
5、P3.2——P3.5是51的4个中断的外部输入端,这四个管脚连接4只按键开关到地,按下按键将该管脚接地。选择P3工作于第一功能,则按键开关工作于查询方式。如果选择第二功能,就工作于中断方式。可以完成按键和中断的相关实验。此处解释一下查询与中断,如果你在睡午觉,为了防止迟到,你每隔5分钟就睁眼看一下闹钟(假设你能够准时醒来),这就是查询方式,使用闹钟叫你就是中断方式了。它们的区别很显然,选择查询方式CPU就不能干别的工作了(就像你无法连续的睡觉),选择中断的话CPU可以去做其他工作,直到中断来临,CPU再去做中断要求的工作。
6、P3.0与P3.1是单片机的串口接收与发送数据线,它们通过MAX232转换为RS-232(一种串口通讯协议)标准电平,以便与PC机的串口通讯。因为51单片机与PC机的串口电平标准不同,所以用MAX232进行一个电平转换工作,仅此而已,你不需要准确的知道RS-232的协议标准。这就如同英制与公制的转换,对于你来说1M的长度对一个英国人来说就是3.28英尺。这个串口可以实现单片机与PC或者其他具备RS-232接口的单片机的通讯实验,更为重要的是,ISP编程就是通过这个串口将程序从PC机下载到单片机的ROM里面的。对于具有ISP功能的单片机,必须有这个电平转换部分(最小系统组成部分之一),否则无法进行编程。
7、其他没有使用的管脚可以作为系统扩展使用。P0口外接上拉电阻。同时引出全部IO口线、ALE口线以及5V电源线和地线,便于扩展。晶振使用12M,选择12个时钟周期方式,机器周期为1US,选择6个时钟周期方式,机器周期为0.5US,这是飞利浦单片机的特殊功能。在ZLGISP软件编程时,点击设置,在6CLOCK前打勾即可选择6个时钟周期方式。这个方式比12个时钟周期方式速度提高不少,但是对于精确延时程序将有影响,而且大多51教材都是针对12个时钟周期所写,所以不推荐初学者使用。
8、单片机非常害怕电源极性颠倒,所以电源插口后边安装了一只全桥作为“防呆开关”(原理简单而巧妙,请自行研究),无论电源极性如何都可以直接输入,但是输入电压不得低于8.5V,也不可太高,否则稳压块LM7805功耗过大容易发热。可以使用市售收音机直流电源,推荐使用9V。至于复位开关,编程选择开关,电源稳压部分就不再赘述了。
以上简介了实验板的硬件结构,实验请参见下文设计。
第七章:51单片机常见问题解答
关于51单片机的硬件,你手里任何一本教材都写得很清楚,我没有必要重新COPY一份,但是我很少看到能够不费力气就看得懂的51教材。对于初学者来说,一堆术语加上一堆严密得让人头痛的逻辑推导不啻为一种灾难,有时候明明很简单的原理非要被描述得艰涩异常。科学的精神在于把复杂的东西表述得简单,但是我们很多教材编写者却反其道而行之,完全违背了真正的科学精神,实在是面目可憎,行而不远。这也是我花费时间撰写本教材的原因之一。下面就针对几个被教材解释得一塌糊涂的常见问题做一下通俗的解释。
1、处理能力的概念。51单片机属于8位机,8位是个什么意思呢?就是CPU处理的数据是8位的。位数的高低体现了CPU处理能力的强弱。4位的处理器已经基本淘汰了,8位的处理器占据了低端单片机的大部分市场,32位处理器是现在兴起的嵌入式系统的主流配置,我们常用的电脑大多都是32位,64位的处理器也有,但是市场份额比较少,价格也较高。所以我们学习的51单片机属于比较低级的单片机,会逐渐被新兴的嵌入式处理器所淘汰,但是51单片机成本低,学习资源最丰富,上手容易,对于初学者来说是很理想的用于学习的单片机。
2、存储器问题。51单片机有两类存储器,一类是程序存储器ROM,它断电以后数据不丢失,但是必须用编程器擦除和写入程序;另一类是数据存储器RAM,它断电以后数据会丢失,但是可以用程序改写内容。以AT89C51为例,因为它有16条地址线(P0和P2),所以它可以访问64K存储器空间(2的16次方是65535),它的ROM和RAM都是分内外的,外部存储器都需要扩展,扩展方法参见教材。但是ROM和RAM的内外执行方式不同,ROM的内外切换要用EA脚(31脚)的电平选择,而RAM的切换可以直接用不同指令MOV和MOVX分开同时访问。例如AT89C51有4K内部ROM,64K外部ROM,如果EA=1,则从内部ROM开始执行,当超出4K之后,跳转到片外4K以上的空间运行;如果EA=0,则完全在外部ROM中运行,内部ROM不再起作用。什么意思呢?就是要么运行内部4KROM要么运行外部4KROM,内外ROM的前4K不能同时运行,必须用EA切换。所以一般在没有外部ROM的情况下,EA必须接电源正极,否则程序不能运行。我曾经因为EA悬空造成程序无法运行,苦苦思索一周才找到原因,期间因为盲目测试导致3块AT89C51损坏,教训十分惨痛,望后来者吸取教训。RAM就不同了,AT89C51有128B内部RAM,可以扩展64K外部RAM,这两个部分的RAM可以同时被访问,注意选择不同指令即可,访问内部用MOV,访问外部用MOVX,外部RAM扩展方法参见教材。ROM的种类除了常见的PROM(可编程ROM),还有MASK ROM、FLASH ROM 和EEPROM等种类。MASK ROM是掩模存储器,掩模的意思就是工厂把程序直接做在芯片上了,适于不需要反复修改的大批量产品生产,成本非常低,但是用户不能更改程序,8051里就是这种ROM。我最初接触单片机的时候,去电子市场买8051,结果商家真的卖给我了一块,回家一看,里面全都是程序,根本无法修改,现在回想起来,自己简直是个傻瓜,哪有买掩模ROM的单片机做学习和开发的?!商家也不告诉我已经烧好的程序可以干什么,害的我只能拿它当8031使了!这个教训真是好笑,希望大家一定要搞明白ROM的种类区分。PROM有OTP(一次性编程)和允许反复擦写(用紫外线照射擦除)两种,87C51系列就是OTP的ROM;就现在的形势看,ROM有普及FLASH之势,那些用紫外线擦除的垃圾看来是要被淘汰了。FLASH ROM可以电擦写,但必须整块擦除,写入速度快,擦写次数在1000到10万次之间(视不同类型芯片而定),事实上89C51系列的ROM就是FLASH ROM,U盘内的ROM也是,一种NAND FLASH现在广泛用于嵌入式系统中,它的存储容量大,成本低,可以实现固态硬盘的功能;EEPROM是电可擦写存储器,它是按位擦写的,可以擦写10万次以上,但擦写速度较FLASH ROM要慢,AT24C02就是EEPROM,我们用的很多智能IC卡也是。RAM的种类有静态SRAM,动态DRAM和SDRAM之分。SRAM只要写入一次,有电数据就可以保持,单片机里就是SRAM,但是它的缺点就是太贵,所以单片机里的RAM都很小。DRAM一次写入数据之后只能保持一瞬间,必须不断重写,叫做刷新,这个过程还需要相应的逻辑电路支持,很麻烦但是很便宜。SDRAM叫做具有静态特性的动态RAM,它把逻辑刷新电路和DRAM做到了一起,它的工作方式本质是动态的,但是从外部看相当于一个SRAM,这样就不但具有静态特性而且价格便宜,我们电脑里的内存条都是SDRAM。我自己的理解是这样的,就像爬山比赛,能力强的人呢,爬上去就不会滑下来。但是能力不行的人站不住,只好滑下来再爬上去,反复这样,频率高了给人的感觉就好像他在山上一样。呵呵,反正能力强的东西总是更贵一些的。
3、IO口问题。P0口是集电极开路,所以我的实验板上给它加了上拉电阻。上拉电阻的作用就是在基本没有电流输出的情况下将管脚电位拉到5V,这样对于外部来说是逻辑1,如果没有这个电阻,管脚电位就是0。为什么?假如三极管关闭的情况下C-E间电阻为100M,如果上拉电阻为10K,则分压的结果是几乎接近5V,这就是上拉的原理。IO口的驱动能力有限,AT89C51也就不到20MA(8051连这些都没有),可以直接驱动LED(电流流入方式),但是驱动别的大电流外部设备必须加驱动电路,否则会烧毁IO口,务必注意。迄今为止,我一共烧毁了7块AT89C51,损失了一把银子之后我终于找到了原因:一个是电源问题,电源电压超过5V或者极性颠倒都会导致芯片烧毁;另一个问题就是我在单片机供电的情况下测量P0.0脚(39脚)电位时表笔不小心连通了电源正极(40脚),而此时刚好P0.0内部MOS管开通(也就是输出0),结果直接烧毁了输出MOS管。因为P0口是数据线,结果导致编程时数据无法写入。这个教训最惨痛了,务必牢记。单片机的一种绝对保密技术就是利用了这种方法,编程之后烧毁一只闲置的数据或地址管脚的输出管,造成数据无法读出,达到绝对保密的目的。还有一点需要注意,如果要读入管脚的状态,必须先向该管脚写1,然后再读该管脚方能得到正确输入。使用P3的第二功能之前,也要先向P3口写1,目的都是让IO口输出管关闭。IO口详细构造请阅读51教材相关部分。
4、有关寻址方式。相关教材中的寻址部分纯粹是找别扭,我都可以用51开发产品了,可是我现在重读这部分教材依然一头雾水,无法理解。不理解很好,说明你大脑正常,不用去管教材所说的寻址方式到底是什么意思,你学会如何使用就行了。其实就是对数字操作(所谓立即寻址)、对寄存器操作(所谓寄存器寻址)、对地址操作(所谓直接寻址)、对指针操作(有专用指针也有寄存器作为指针)和对位操作5种情况。寻址方式就是告诉你一个操作什么东西的问题,没有什么高深的。如果还是不明白就不要看这部分内容了,直接学习指令进行编程,当你编程很熟练之后,你会发现,其实它那些怪里怪气的寻址方式命名是很可笑的。
5、对中断概念的理解。我最开始看了一个使用中断的程序之后,想了好几个晚上也没有理解什么叫中断。这个程序的注释竟然说中断服务程序是这个程序的核心部分,我当时就茫然了——那主函数是什么?垃圾吗?在我的认识里,主函数才应该是一个程序的核心。忘了过了多少日子,我终于明白了中断的含义。假如你设置一只闹钟6点叫你,如果你6点准时爬起来看闹钟是不是叫你的话,那就不叫闹钟了,你成了闹钟的闹钟了。初学者很容易不明白为什么主函数里并没有跳转到中断服务函数的指令,怎么中断服务程序就自己自动执行了呢?没错,中断不需要什么指令来启动,它会自己启动,就像定时炸弹到点就会自动爆炸一样。什么时候启动由定时器、计数器或者外部中断决定,这是一个前台运行过程(谁表演谁就是前台嘛),你在后台看不到,后台是个设置中断的过程,决定什么情况下中断会叫你。比如你在车站等你女朋友,你无法准确知道她什么时候来,所以后台函数是个循环——你来回踱步,焦急的等待。当你女朋友出现的时候,她要求你停止踱步,和她去商店买衣服——这是中断服务函数。如果你女朋友还没来,你就自己跑到商店里了,那就不叫中断了。如果她来了你还在踱步——很不幸,系统不是跑飞就是崩溃了,呵呵。有关中断的具体操作与设置方法,请仔细阅读51教材相关部分。中断是单片机一个的难点,也是一个有特色之处,没有中断的话单片机就失去了全部的灵活性与实时性,变成一块用于顺序控制的数字电路了。
6、编程语言问题。你可以用汇编编程,也可以用C51语言编程。它们各有各的强项和弱点,选择哪种语言要根据你的基础和具体任务确定。有个老兄这样说:汇编挺好啊,不过你用着用着就想用C51了;C51嘛,也挺好啊,不过你用着用着就想用汇编了。呵呵,真的是这样。我个人的理解是:汇编好写不好看,C语言好看不好写。去看别人一段没有注释的汇编语言是一件很困难的事情,看不懂并不说明你编程水平差。这种情况下先不要看别人的例程,根据你自己的思路编写即可,到了关键部分或是遇到障碍再看看例程,效果很好。别人写的C语言比较好理解,因为C语言本质上就是各种各样的函数调来调去的过程,看懂了函数,程序基本就明白了。下面说说汇编和C各自的特点:汇编是个事必躬亲的战术语言,要干什么就直接干什么,什么事情都要直接操作硬件,所以累啊——系统倒不累,你累啊,呵呵,累死你换来的好处就是代码比较小,而且工作准确,操作决不会马马虎虎。C语言就不同了,是个战略语言,只抓大局,一堆基层工作全给INCLUDE了,够狠,要干什么不好好干,非要拐弯抹角——比如重新运行不让用跳转(封杀GOTO语句),非要设计一个巧妙的循环,汇编就没这么不老实。这次你不累了,但是如果智商不够就惨了,一句都写不下去,不像汇编——就算我笨,能编多少时多少,编一点是一点。当甩手掌柜自然不错,但是缺点也很明显:一来代码要大不少,系统资源一下就被搞紧张了;二来涉及到对硬件的具体操作就它就没招了,还得求人家汇编,呵呵。所以汇编和C你都要掌握,大局由C定,几处需要准确处理硬件的工作交给汇编,属于瞎子背瘸子的组合,呵呵。两手抓,两手都要硬,互相渗透,结合使用,这就是学习单片机语言的基本原则。说了一顿,和具体编程一点关系都没有,但是原则你要把握。汇编语言我就不说了,教材都会详细说明指令的意义和使用方法,下面我说一下C51。C语言的具体结构和编写方法你明白了吗?没明白赶紧看书。C51与通用C语言的区别我理解主要有两点:一是中断函数的声明与使用,二是如何在单片机里进行位操作,我的理解就这一点点,当然这与我水平比较菜有很大关系。那么C语言如何能够认识那些单片机的寄存器呢?难道每写一个程序都先要铺天盖地的定义一番?!这个我们不怕也不用管,KEIL里有自带的包含文件来解决这个问题。你在KEIL里写C51程序的话,上来先写一个#INCLUDE,这一堆问题就解决了,下面你可以直接写P0=0X00,或者SCON=0X00之类,反正C语言可以认识,还能正确编译,怎么样?战略语言确实不得了,脏活全让这个文件做了。当然想舒服就得付出资源的代价,C代码肯定比汇编大,不信你编写一个同样的汇编程序试试看。想学习C51的话,可以找一本教材,但是如果你基本明白C了,买教材就有点浪费了,因为大多数C51教材都花上很大篇幅讲C的规则,什么数据类型,什么控制语句,简直是浪费白纸,所以你借一本教材看看C51和通用C不同的地方就可以了,买一本实在不值得。借不到也可以到网络上搜索一下,有更通俗的教材,这里推荐明浩写的那个基于KEIL软件的C51教材,虽然只有几课内容,很简单,但是非常容易理解,也很实用,同时还说明了KEIL的使用方法。
常见问题就谈这么多,都是一些概括性的介绍,具体问题你要自己去解决。
第八章:实验设计
你一定很着急知道学习多长时间才具有开发产品的能力,这个过程很快,一般连续学习半年以上(注意不是三天打鱼两天晒网)即可开发简单的产品。你必须严格进行一系列实验,通过实现单片机的所有功能达到提高开发能力的目的。下面列出我自己认为需要完成的实验的名称以及实验项目的说明。
实验1:跑马灯左右循环移动的应用
实验项目:
1、学习IO口的控制技巧,掌握各种数制的转换方法。
2、第一次用取机器周期倍数的延时方法实现移动速度的设定。
3、第二次使用定时器中断的方法实现移动速度的设定。
4、第三次使用DPTR取表的方式实现移动顺序的设定。
实验2:中断的应用
实验项目:
1、第一次用多种模式实现两个定时器中断的功能,可以用LED闪烁显示,也可以让蜂鸣器发声。
2、第二次设定四个中断同时存在,两个外部中断,两个计数器中断,由四个按键作为外部输入。四个按键设定两个优先级,完成五种任务(包括后台的任务和四个中断服务程序的任务)。
实验3:布尔代数(一位机)应用
实验项目:
类似可编程逻辑控制器的使用,选择多个复杂的逻辑关系,使用指令中的逻辑语句完成相关的逻辑功能,使单片机成为一块可以完成复杂逻辑的数字电路。这个实验主要用于工业配线以及顺序生产过程。
实验4:串口应用
实验项目:
1、UART通过74LS164和74LS166实现串行扩展IO口输入输出功能。
2、两个单片机做全双工通讯实验。
3、单片机与PC机之间进行全双工通讯实验。
4、一个单片机与两个以上单片机做全双工主机从机通讯实验。
实验5:单片机音乐编程应用
实验项目:
1、该实验可以用延时的方法也可以用定时器中断的方法实现,主要学习了如何通过对频率和节拍编码表的读取进行音乐编程。
2、在此基础上,可以学习如何使用单片机产生双音频拨号音,完成单片机自动拨号实验。
实验6:直流电机与步进电机控制应用
实验项目:
1、了解直流电机驱动部分硬件原理。掌握单片机控制直流电机正反转的方法,能够使用PWM(脉宽调制)方式改变直流电机转速。
2、了解步进电机驱动部分硬件原理。掌握用脉冲分配的方法驱动步进电机正反转,并且可以通过改变脉冲分配频率来改变步进电机转速。
实验7:键盘与显示器应用
实验项目:
1、独立按键识别操作方法,BCD码转盘的使用方法。
2、扫描式按键操作方法(结合中断操作)。
3、串口扩展IO口的键盘操作方法。
4、静态LED显示操作方法。
5、动态扫描LED显示操作方法。
6、结合时钟芯片(需要扩展),设计一个电子表。
7、结合4*4键盘,设计一个计算器。
8、结合EEPROM,设计一个防掉电电子密码锁。
9、结合步进电机,设计一个可设定和显示速度的步进电机控制板。
实验8:其他显示器件应用
实验项目:
1、点矩阵LED显示器应用。使用4块8*8矩阵LED作为大屏幕,滚动显示中文字幕。
2、使用LCD显示字符与图形,掌握LCD驱动方法。
实验9:AD/DA转换应用
实验项目:
1、使用ADC0809和一种温度探头,结合LED显示制作一只数字温度计。如果温度探头成本过高,可以制作一只数字电压表。
2、使用双积分型A/D转换电路ICL7135制作数字电压表。
3、使用DAC0832制作一个多种波形的数控信号发生器。
4、使用ADC0809和DAC0832,外扩RAM(可使用32K的62256)制作简易数字录音机(录音时间为数秒钟)。
实验10:外部传感器输入与数据采集应用
实验项目:
1、利用光敏三极管采集光电信号。
2、利用红外线对管构成主动式红外线光电信号采集。
3、利用热释电红外线传感器,结合驱动电路,构成被动式红外线光电信号采集。
4、利用驻极体话筒或压电陶瓷片,结合音频锁相环技术(LM567),制作超声波距离探测器,使用LED显示距离。
5、利用霍尔元件,制作伺服电机转速控制器,由键盘设定转速,LED显示。
6、利用压力传感器制作电子秤,键盘输入,LED显示。
实验11:单片机外围扩展IC应用
实验项目:
1、8155原理与应用。
2、8255原理与应用。
3、8279原理与应用。
4、利用时钟芯片DS12887制作智能电子表。
5、利用ISD1420或者APR9600制作公共汽车报站器、汉语报时钟或会说话的万用表。
实验12:IIC技术应用
实验项目:
1、电可擦写存储器AT24C02读写实验。
2、PCF8583驱动实验,可制作电子表。
3、8位并行输入输出芯片PCF8574实验。
4、数模转换芯片PCF8591实验。
IIC技术可以节省单片机端口,有利于设计小型化和制作低成本化,但是实时性有所下降。以前的实验均可由相关IIC器件完成。
实验13:操作系统UCOS_II在单片机上的移植
实验项目:
要求单片机ROM最少要8K,一般要14K以上,外部扩展RAM最少要4K。完成在单片机上运行多个任务的操作系统的移植
如果你已经成功做完以上所列的所有实验,不要谦虚了,请删除本教材,并收下我这个徒弟,可以说在51单片机开发方面你已经走在我们这些菜鸟前面了。对于初学者,当然不必因此而泄气,能够在每个方面都实现一个基本实验就相当不错了,就算自己无法编出程序,把网上编好的程序拿来跑一跑也很不错,起码说明我们具有“移植”的能力,呵呵。别小看这个能力,复杂产品的开发基本都是这样,试问谁能为了一个产品自己开发操作系统?要是能编出来还卖产品干吗?直接卖操作系统就发财了,呵呵!所以初学者要量力而行,上述所列只不过给大家指出个学习方向,基本就这么多了,从简单的开始,一步一步做下去。当然还有一些比较高难的,比如单片机上网,单片机控制蓝牙模块、GSM模块、GPRS模块乃至GPS全球定位系统模块等等,这些暂时不是我们的学习内容,等你成为高手以后再研究吧。
后记
单片机的入门教材暂且写到这里,如果以后有新的体会再继续补充。每一个初学硬件技术的人都要明白,世界上的器件是无穷无尽的,有数以万计的技术可能你还没来得及接触就被淘汰掉了,所以不要揪住一堆知识不放,或者幻想掌握所有器件的使用方法。培养一种思维方式是最重要的——有方法没有知识随时可以学,有知识没方法的话,知识最终也会被忘掉。我们现在学习51,如果我们在学习过程中培养出了解决方法的思维方式,一旦客观需要我们使用AVR,很短的时间我们就可以搞定,哪怕我们对AVR一无所知。