初学者进.如何进入机器人的世界
大家好!我是Lamp,机器人爱好者中的一员。
我在ROBOTDIY上发表过一篇《机器人DIY》后收到很多网友来信,希望我能教大家
制作机器人,本人由于有工作在身兼又有一些开发任务,所以不能一一回信望大家
原谅!为了弥补我的错误,我决定重新写一本通俗易懂的《机器人DIY》.
好开始讲课,本人随想随写,不到之处请大家原谅!
第一课 制作机器人的基础
在论坛上经常可以看到有人说:“我是菜鸟,制作机器人需要什么基础?”。其
实我可以回答大家:“基础就是你首先要学好数理化”,怎么样很意外吧!现在
我来给大家讲讲为什么这么说。机器人制作综合性很强,它涉及机械制造、计
算机、电子技术等很多领域,每一个领域都是以我们的数理化为基础的,还有就
是要充分利用互联网的资源自我学习。
以下是我在论坛发过的一篇贴子,希望大家用心体会。
高手的秘诀
1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么。当你自己想 出来
再参考别人的提示,你就知道自己和别人思路的差异。
2.别小家子气,买本书几十块都舍不得,你还学个P。为了省钱看电子书,浪费的时间绝对
超过书的价值。当然如果查资料,只能看PDF。
3.学习新的开发软件时,一定要看帮助手册。买的书不够全面。刚接触一个软件,什么都不
懂,就盲目的问东问西,让人看起来很幼稚。
4.不要蜻蜓点水,得过且过,细微之处往往体现实力。
5.把时髦的技术挂在嘴边,还不如把过时的技术记在心里。
6.看得懂的书,请仔细看;看不懂的书,请硬着头皮看。
.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍。
7.多实践,去焊板子、调试,去写去调,只用软件模拟,是永远成不了高手的。
8.保存好你做过的所有的源程序、PCB、原理图等----那是你最好的积累之一。
9.对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会
自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就 能找到很多相
关资料,别老是等待别人给你希望,看的出你平时一定也很懒!
10 到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就
有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己的帖子没人回
的。
11,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果你
总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的才有讨论的说
法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。
什么样的人是浮躁的人?
浮躁的人容易问:我到底该学什么;
----踏踏实实的学点基本的吧?单片机不知道是什么就想去学ARM?
c语言不会想搞LINUX?别老是好高骛远。
浮躁的人容易问:谁有xxx源码?--(你给人家多少钱啊?自己的劳动白送你?)
浮躁的人容易说:跪求xxx ---(就算网络也要点尊严吧?)
浮躁的人容易说:紧急求救---(其实只是个简单的课程设计)
浮躁的人容易说:有没有xxx中文资料?---一个字:懒。别说别的。E文不行?谁不是从
ABC学起的啊?
浮躁的人容易说:求xxx,我的email是xxx@xxx.com,然后消失 ---- 你以为你是大爷啊,人
家请你吃饭,还要喂到你口里不成?
浮躁的人容易问:做单片机有钱途吗----只是为了钱,搞不好技术的,你去抢银行好了。
浮躁的人容易说:哪里有xxx芯片资料?(其实大部分资料网络上都有,但是偏偏来找人
问,懒!)
浮躁的人分两种:只观望而不学的人;只学而不坚持的人;
浮躁的人永远不是一个高手。
lamp
看完后明白了吧,恭喜!你已经迈出了第一步。
楼主最近还看过
第二课 机器人的组成
机器人一般是由以下模块组成:
1.语音模块
用于语音对话、语音控制。
2.灯光表达模块
用于机器人状态显示、感情表达(喜、怒、哀、乐)
3.控制模块
I/O+决策,即机器人的大脑,其控制能力及AI由编程者的水平决定。
4.传感器模块
对外界环境的的感知。
5.电源模块
为机器人提供能源,常用有3v、5v、6v、9v、12v。
6.减速电机
常用于机器人行走驱动,根据需要选择变比。
7.驱动模块
机器人的执行机构,常选用行模中的舵机。
8.视频模块
机器人的眼
9.机械模块
10.无线通讯模块
11.控制软件
一个简单的机器人是由单片机电路、红外传感器、减速电机+程序这是大多数人
认同的,但是我要向大家说这种认识是错误的,真正的机器人不是几片单机和
几台电脑就可以解决,关键就是‘机器人’中这个‘人’字,还需要我们一代代
的努力。
以上讲的有点简单,先写出。
好了,看到这里,我说一句:
你要真想修炼成机器人高手,那你必备的工具是少不了的.起码你得有点儿投入吧.
清单:
1,电烙铁,2,焊锡,3,钳子,4,面包板,5,空电路板(什么没有,买去吧).6,电阻,电线,电容,电感(没有,就拆吧,就当练手了.)
7,各种塑料板,铁片,钳子,改锥,锤子.(没有,去收废品吧)
8,游标卡尺,千分尺.直角尺(桂林广陆)精密工具,最好电子的吧.没有这东西,你能行吗?买吧
9,万用表.电子的不是很贵.必须的.
10,示波器.唉,这个淘个二手吧.用的着的,都说是研究必用.
11,各种书籍.要这个你都舍不得买的话,转身出门吧.这个地方不适合你.d8更适合你.
12,电脑,能上网的.
好了,就说到这里吧,话说打字好累的.
第三课 机器人的工作原理
机器人是机器有人的特点,我们可以从人自身出发就容易理解他的工作原理了.
简单的讲就是传感器将得到的信息送到处理器决策执行驱动器的动作。
就讲这么多,到后面有实例大家就明白了。
哈哈,这小子太^&%**
第四课 常用工具的使用
1.电源插座
电源插座买的时候要选插口多的那种,否则在以后的使用中你会发现插口不够用,把电烙铁和可调稳压电源的插头插上。
2.电烙铁的使用
电烙铁是进行无线电制作不可缺少的工具之一,电烙铁是用来焊锡的,为方便使用,通常做成“焊锡丝”,焊锡丝内一般都含有助焊的松香。松香是一种助焊剂,可以帮助焊接,可到药店购买。松香可以直接用,也可以配置成松香溶液,就是把松香碾碎,放入小瓶中,再加入酒精搅匀。注意酒精易挥发,用完后记得把瓶盖拧紧。瓶里可以放一小块棉花,用时就用镊子夹出来涂在印刷板上或元器件上。注意市面上有一种焊锡膏(有称焊油),这可是一种带有腐蚀性的东西,是用在工业上的,不适合电子制作使用。还有市面上的松香水,并不是我们这里用的松香溶液。新的电烙铁不能拿来就用,需要先给烙铁头镀上一层焊锡。方法:给电烙铁通电,待温度升高以后,再用焊锡丝融化在烙铁头上,使烙铁头上镀上一层焊锡,烙铁头镀上焊锡,不但能保护烙铁头不被氧化,而且使烙铁头传热快,吃锡容易,焊接质量也容易得到保证。电烙铁使用时间长了以后,烙铁头会变黑或变得不平,这时候可以用锉刀锉平,然后再镀上焊锡。最好买一个烙铁架,平时电烙铁不用时可以将电烙铁放在烙铁架上。使用烙铁时,烙铁的温度太低则熔化不了焊锡,或者使焊点未完全熔化而成不好看、不可靠的样子。太高又会使烙铁不能蘸上锡。 另外也要控制好焊接的时间,电烙铁停留的时间太短,焊锡不易完全熔化、接触好,形成“虚焊”,而焊接时间太长又容易损坏元器件,或使印刷电路板的铜箔翘起。一般一两秒内要焊好一个焊点,若没完成,宁愿等一会儿再焊一次。焊接时电烙铁不能移动,应该先选好接触焊点的位置,再用烙铁头的搪锡面去接触焊点。
3.万用表的使用
万用表的使用的注意事项
a在使用万用表之前,应先进行“机械调零”,即在没有被测电量时 ,使万用表指针指在零电压或零电流的位置上。
(2)在使用万用表过程中,不能用手去接触表笔的金属部分 ,这样一方面可以保证测量的准确,另一方面也可以保证人身安全。
(3)在测量某一电量时,不能在测量的同时换档,尤其是在测量高电压或大电流时 ,更应注意。否则,会使万用表毁坏。如需换挡,应先断开表笔,换挡后再去测量。
(4)万用表在使用时,必须水平放置,以免造成误差。同时, 还要注意到避免外界磁场对万用表的影响。
(5)万用表使用完毕,应将转换开关置于交流电压的最大挡。如果长期不使用 ,还应将万用表内部的电池取出来,以免电池腐蚀表内其它器件。
欧姆挡的使用
一、选择合适的倍率。在欧姆表测量电阻时,应选适当的倍率,使指针指示在中值附近。最好不使用刻度左边三分之一的部分,这部分刻度密集很差。
二、使用前要调零。
三、不能带电测量。
四、被测电阻不能有并联支路。
五、测量晶体管、电解电容等有极性元件的等效电阻时,必须注意两支笔的极性。
六、用万用表不同倍率的欧姆挡测量非线性元件的等效电阻时,测出电阻值是不相同的。这是由于各挡位的中值电阻和满度电流各不相同所造成的,机械表中,一般倍率越小,测出的阻值越小。
万用表测直流时
一、进行机械调零。
二、选择合适的量程档位。
三、使用万用表电流挡测量电流时,应将万用表串联在被子测电路中,因为只有串连接才能使流过电流表的电流与被测支路电流相同 。测量时,应断开被测支路 ,将万用表红、黑表笔串接在被断开的两点之间 。特别应注意电流表不能并联接在被子测电路中 ,这样做是很危险的,极易使万表烧毁。
四、注意被测电量极性。
五、正确使用刻度和读数。
六、当选取用直流电流的2.5A挡时,万用表红表笔应插在2.5A测量插孔内 ,量程开关可以置于直流电流挡的任意量程上。
七、如果被子测的直流电流大于2.5A,则可将2.5A挡扩展为5A挡 。方法很简单,使用者可以在“2.5A”插孔和黑表笔插孔之间接入一支0.24欧姆的电阻 ,这样该挡位就变成了5A电流挡了。接入的0.24A电阻应选取用2W以上的线绕电阻 ,如果功率太小会使之烧毁。
_________________
初学单片机必备设备,初学者不可不备的工具及软件
一.学单片机需要的设备
这是一个很多想学单片机的人都比较关心的问题,我不希望花很多钱的代价学单片
机
1,要有一台电脑,最好在486或者586以上
2,要有一个编程器,最好Windows界面,用来把编译好的程序写入单片机的
ROM里面,把写好后的芯片插到试验板上面进行试验。
本站可提供:AT51串口编程器, AT51pro编程器能够对ATMEL公司的
AT89c52/51/2051/1051单片机进行全面的编程操作,包括写入、擦除、等。编程
器采用串口与PC联接,安装简便。只要你将编程器用串口电缆联到PC的COM1或
COM2端口,无需什么设置。操作软件为Windows中文,可以工作在
Windows95/97/98/98se/98me/xp/2k操作系统;适合单片机开发、学习、产品生产
使用。
3,要有一个硬件单片机试验板,作为单片机的试验
4,要有几个用来试验的单片机芯片,比如应用的比较广泛的89C51,2051
5 由于AT89C单片机具有可反复烧写的特点,在设计程序时可反复修改原程序、
编译、并烧写到单片机,若程序稍复杂点再配合软件仿真排错,直至完成设计,
完全没必要再使用昂贵的仿真器。
二、软件准备:一些常用软件是必须具备的。
51单片机集成开发系统MedWin 见软件讲座
c51eva c51eva是keil的c51开发环境,我们经常会在网上见到这个软件。其实
他同样可以用汇编以及PL/M等语言进行开发。见软件讲座
软件仿真8051debug适应于与8051完全兼容的单片机,如AT89C51系列。
51 Hex--bin转换工具
51 bin--Hex转化工具
51波特率初值设定软件
LED--encode数码管编码器
绘图用的protel99
目前开发单片机的应用软件比较杂乱,使初学者无所适从;这里我们推荐万利公
司的Medwin或Keil公司的c51eval,这两个均为集成系统,所谓集成,是指将原程
序编写、汇编/编译/连接、调试等开发单片机所要用到的程序集合到一个软件中
。目前Medwin有免费中文版,很适合初学者使用。
单片机的组成
单片机要自动完成计算,它应该具有哪些最重要的部分呢?
我们以打算盘为例计算一道算术题。例:36+163×156-166÷34。现在要
进行运算,首先需要一把算盘,其次是纸和笔。我们把要计算的问题记录下来,
然后第一步先算163×156,把它与36相加的结果记在纸上,然后计算166÷34,再
把它从上一次结果中减去,就得到最后的结果。
现在,我们用单片机来完成上述过程,显然,它首先要有代替算盘进行运算
的部件,这就是“运算器”;其次,要有能起到纸和笔作用的器件,即能记忆原
始题目、原始数据和中间结果,还要记住使单片机能自动进行运算而编制的各种
命令。这类器件就称为“存贮器”。此外,还需要有能代替人作用的控制器,它
能根据事先给定的命令发出各种控制信号,使整个计算过程能一步步地进行。但
是光有这三部分还不够,原始的数据与命令要输入,计算的结果要输出,都需要
按先后顺序进行,有时还需等待。如上例中,当在计算163×156时,数字36就不
能同时进入运算器。因此就需要在单片机上设置按控制器的命令进行动作的“门
”,当运算器需要时,就让新数据进入。或者,当运算器得到最后结果时,再将
此结果输出,而中间结果不能随便“溜出”单片机。这种对输入、输出数据进行
一定管理的“门”电路在单片机中称为“口”(Port)。在单片机中,基本上有
三类信息在流动,一类是数据,即各种原始数据(如上例中的36、163等)、中间
结果(如166÷34所得的商4、余数30等)、程序(命令的集合)等。这样要由外
部设备通过“口”进入单片机,再存放在存贮器中,在运算处理过程中,数据从
存贮器读入运算器进行运算,运算的中间结果要存入存贮器中,或最后由运算器
经“出入口”输出。用户要单片机执行的各种命令(程序)也以数据的形式由存
贮器送入控制器,由控制器解读(译码)后变为各种控制信号,以便执行如加、
减、乘、除等功能的各种命令。所以,这一类信息就称为控制命令,即由控制器
去控制运算器一步步地进行运算和处理,又控制存贮器的读(取出数据)和写(
存入数据)等。第三类信息是地址信息,其作用是告诉运算器和控制器在何处去
取命令取数据,将结果存放到什么地方,通过哪个口输入和输出信息等。
存贮器又分为只读存贮器和读写存贮器两种,前者存放调试好的固定程序和
常数,后者存放一些随时有可能变动的数据。顾名思义,只读存贮器一旦将数据
存入,就只能读出,不能更改(EPROM、E2PROM等类型的ROM可通过一定的方法来
更改、写入数据——编者注)。而读写存贮器可随时存入或读出数据。
实际上,人们往往把运算器和控制器合并称为中央处理单元——CPU。单片机
除了进行运算外,还要完成控制功能。所以离不开计数和定时。因此,在单片机
中就设置有定时器兼计数器,其基本结构与本连载之(二)中的举例类似。到这
里为止,我们已经知道了单片机的基本组成,即单片机是由中央处理器(即CPU中
的运算器和控制器)、只读存贮器(通常表示为ROM)、读写存贮器(又称随机存
贮器通常表示为RAM)、输入/输出口(又分为并行口和串行口,表示为I/O口)等
等组成。实际上单片机里面还有一个时钟电路,使单片机在进行运算和控制时,
都能有节奏地进行。另外,还有所谓的“中断系统”,这个系统有“传达室”的
作用,当单片机控制对象的参数到达某个需要加以干预的状态时,就可经此“传
达室”通报给CPU,使CPU根据外部事态的轻重缓急来采取适当的应付措施。
现在,我们已经知道了单片机的组成,余下的问题是如何将它们的各部分连
接成相互关联的整体呢?实际上,单片机内部有一条将它们连接起来的“纽带”
,即所谓的“内部总线”。此总线有如大城市的“干道”,而CPU、ROM、RAM、
I/O口、中断系统等就分布在此“总线”的两旁,并和它连通。从而,一切指令、
数据都可经内部总线传送,有如大城市内各种物品的传送都经过干道进行。
单片机指令系统与汇编语言程序
前面已经讲述了单片机的几个主要组成部分,这些部分构成了单片机的硬件。所
谓硬件(Hardware),就是看得到,摸得到的实体。但是,光有这样的硬件,还
只是有了实现计算和控制功能的可能性。单片机要真正地能进行计算和控制,还
必须有软件(Software)的配合。软件主要指的是各种程序。只有将各种正确的
程序“灌入”(存入)单片机,它才能有效地工作。单片机所以能自动地进行运算和控制,正是由于人把实现计算和控制的步骤一步步地用命令的形式,即一条
条指令(Instruction)预先存入到存贮器中,单片机在CPU的控制下,将指令一
条条地取出来,并加以翻译和执行。就以两个数相加这一简单的运算来说,当需
要运算的数已存入存贮器后,还需要进行以下几步:
第一步:把第一个数从它的存贮单元(Location)中取出来,送至运算器。
第二步:把第二个数从它所在的存贮单元中取出来,送至运算器;
第三步:相加;
第四步:把相加完的结果,送至存贮器中指定的单元。
所有这些取数、送数、相加、存数等等都是一种操作(Operation),我们把
要求计算机执行的各种操作用命令的形式写下来,这就是指令。但是怎样才能辨
别和执行这些操作呢?这是在设计单片机时由设计人员赋予它的指令系统所决定
的。一条指令,对应着一种基本操作;单片机所能执行的全部指令,就是该单片
机的指令系统(Iustruction Set),不同种类的单片机,其指令系统亦不同。
使用单片机时,事先应当把要解决的问题编成一系列指令。这些指令必须是
选定的单片机能识别和执行的指令。单片机用户为解决自己的问题所编的指令程
序,称为源程序(Source Program)。指令通常分为操作码(Opcode)和操作数
(Operand)两大部分。操作码表示计算机执行什么操作,即指令的功能;操作数
表示参加操作的数或操作数所在的地址(即操作数所存放的地方编号)。因为单
片机是一种可编程器件,只“认得”二进码(0、1)。要单片机运作,单片机系
统中的所有指令,都必须以二进制编码的形式来表示。例如,在Intel公司的MCS
-51系列单片机中,从存贮器中取出一数到CPU中的累加器(在运算器中,参与运
算、存放运算结果的专用寄存器)的指令代码为74H,累加器内容加立即数的代码
为24H,再加上立即数代码,累加器送数到内部RAM存贮器的代码为F6H~F7H等。
这些指令是用十六进制表示二进制的机器码。MCS-51单片机的字长为8位,有时
,要完成某些操作用一个字节尚不能充分表达。所以,在指令系统中有单字节指
令,也有多字节指令。机器码是由一连串的0和1组成,没有明显的特征,不好记
忆,不易理解,易出错。所以,直接用它来编写程序十分困难。因而,人们就用
一些助记符(Mue monic)——通常是指令功能的英文缩写来代替操作码,如MCS
-51中数的传送常用MOV(Move的缩写)、加法用Add(Addition的缩写)来作为助
记符。这样,每条指令有明显的动作特征,易于记忆和理解,也不容易出错。用
助记符来编写的程序称为汇编语言程序。但是,助记符编写的程序便于人理解,
可单片机却只认识二进制机器代码,因此,为了让单片机能“读懂”汇编语言程
序必须再转换成由二进制机器码构成的程序,这种转换过程,就称为“汇编”.
汇编可借助于人工查表法来实现,也可借助PC机通过所谓“交叉汇编程序”来完
成。由机器码构成的用户程序一旦“进入”了单片机,再“启动”单片机,就可
让它执行输入程序所规定的任务。
MCU--51 CPU和存储器
单片机8051的CPU由运算器和控制器组成。
一、运算器
运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个八位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器ACC往 往在运算前暂存一个操作数(如被加数),而运算后又保存其结果(如代数和) 。寄存器B主要用于乘法和除法操作。标志寄存器PSW也是一个八位寄存器,用来 存放运算结果的一些特征,如有无进位、借位等。其每位的具体含意如下所示。 PSW CY AC FO RS1 RS0 OV - P对用户来讲,最关心的是以下四位。
1进位标志CY(PSW7)。它表示了运算是否有进位(或借位)。如果操作 结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。
2辅助进位标志AC。又称半进位标志,它反映了两个八位数运算低四位是否 有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。
3溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。
4奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1.PSW的其它位,将在以后再介绍。由于PSW存放程序执行中的状态,故又叫程序状态字?运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。其功能在介绍位指令时再说明。
二、控制器
控制器是CPU的神经中枢,它包括定时控制逻辑电路、指令寄存器、译码器.地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由16位寄存器构成的计数器。要单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器PC。当单片机开始执行程序时,给PC装入第一条指令所在地址,它每取出一条指令(如为多字节指令,则每取出一个指令字节),PC的内容就自动加1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时(后面将介绍),PC才转到所需要的地方去。8051 CPU碢C指定的地址,从ROM相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在CPU内部协调寄存器之间的数据传输、运算等操作。
三、存储器
存储器是单片机的又一个重要组成部分,图6给出了一种存储容量为256个单
元的存储器结构示意图。其中每个存储单元对应一个地址,256个单元共有256个
地址,用两位16进制数表示,即存储器的地址(00H~FFH)。存储器中每个存储
单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的
内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。
一、程序存储器
程序是控制计算机动作的一系列命令,单片机只认识由“0”和“1”代码构
成的机器指令。如前述用助记符编写的命令MOV A,#20H,换成机器认识的代码
74H、20H:(写成二进制就是01110100B和00100000B)。在单片机处理问题之前
必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,
该存储器称为程序存储器。程序存储器可以放在片内或片外,亦可片内片外同时
设置。由于PC程序计数器为16位,使得程序存储器可用16位二进制地址,因此,
内外存储器的地址最大可从0000H到FFFFH。8051内部有4k字节的ROM,就占用了由
0000H~0FFFH的最低4k个字节,这时片外扩充的程序存储器地址编号应由1000H开
始,如果将8051当做8031使用,不想利用片内4kROM,全用片外存储器,则地址编
号仍可由0000H开始。不过,这时应使8051的第{31}脚(即EA脚)保持低电平。当
EA为高电平时,用户在0000H至0FFFH范围内使用内部ROM,大于0FFFH后,单片机
CPU自动访问外部程序存储器。
二、数据存储器
单片机的数据存储器由读写存储器RAM组成。其最大容量可扩展到64k,用于
存储实时输入的数据。8051内部有256个单元的内部数据存储器,其中00H~7FH为
内部随机存储器RAM,80H~FFH为专用寄存器区。实际使用时应首先充分利用内部
存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。
因为将来在学习指令系统和程序设计时会经常用到它们。8051内部数据存储器地
址由00H至FFH共有256个字节的地址空间,该空间被分为两部分,其中内部数据
RAM的地址为00H~7FH(即0~127)。而用做特殊功能寄存器的地址为80H~FFH。
在此256个字节中,还开辟有一个所谓“位地址”区,该区域内不但可按字节寻址
,还可按“位(bit)”寻址。对于那些需要进行位操作的数据,可以存放到这个
区域。从00H到1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0~R7。
究竟选用那一组寄存器,由前述标志寄存器中的RS1和RS0来选用。在这两位上放
入不同的二进制数,即可选用不同的寄存器组,如附表1所示。
三、特殊功能寄存器
特殊功能寄存器(SFR)的地址范围为80H~FFH。在MCS-51中,除程序计数
器PC和四个工作寄存器区外,其余21个特殊功能寄存器都在这SFR块中。其中5个
是双字节寄存器,它们共占用了26个字节。各特殊功能寄存器的符号和地址见附
表2。其中带*号的可位寻址。特殊功能寄存器反映了8051的状态,实际上是8051
的状态字及控制字寄存器。用于CPU PSW便是典型一例。这些特殊功能寄存器大体
上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。与芯片引脚
有关的特殊功能寄存器是P0~P3,它们实际上是4个八位锁存器(每个I/O口一个
),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。MCS
-51共有P0~P3四个这样的并行口,可提供32根I/O线,每根线都是双向的,并且
大都有第二功能。其余用于芯片控制的寄存器中,累加器A、标志寄存器PSW、数
据指针DPTR等的功能前已提及,而另一些寄存器的功能在后面有关部分再作进一
步介绍
单片机的指令系统和寻址方式
单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由CPU执行该程序。程序是由指令组成的,指令的基本组成是操作码和操作数。单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有指令代码也各不相同,因此,必须对所选单片机的全部指令,也就是所谓“指令系统”,有足够的了解。各个系列的单片机虽然有不同的指令系统,但也有其共同性。掌握一种单片机的指令系统,对其它系列单片机可以起到触类旁通的作用。MCS-51单片机应用广泛,派生品种多,具有代表性,所以,这里以MCS-51系列的指令系统为例 说明“指令”的组成和应用。
1、MOV A,#20H
这条指令表示把20H这个数送入累加器A中(一个特殊功能寄存器)。
2、ADD A,70H
这条指令表示把累加器A中的内容(在上例中送入的#20H)和存贮器中地址为70H单元中的内容(也是一个数字),通过算术逻辑单元(英文缩写为ALU)相加,并将结果保留在A中。这里MOV、ADD等称为操作码,而A、#20H、70H等均称为操作数。在汇编语言程序中,操作码通常由英文单词缩写而成,这样有助于记忆,所以又称助记符。如MOV就是英文单词MOVE的缩写,含有搬移的意思;而ADD即为英文单词,其意为相加。因此,对于略懂英语的用户,掌握单片机指令的含意是较为方便的。操作数有多种表示法,如以上的#20H称为立即数,即20H就是真正的操作数。而70H是存贮器中某个单元的地址,在该单元中,放着操作数(比如说是3AH),ADD A,70H不是将70H和A中的内容相加,而是从存贮器70H单元中将3AH取出和A中的内容相加。由上可知,要找到实际操作数,有时就要转个弯,甚至转几个弯,这个过程称为寻址,MCS-51共有7种寻址方式,现介绍如下:
一、立即寻址:操作数就写在指令中,和操作码一起放在程序存贮器中。把“#”号放在立即数前面,以表示该寻址方式为立即寻址,如#20H。
二、寄存器寻址:操作数放在寄存器中,在指令中直接以寄存器的名字来表示操作数的地址。例如MOV A,R0就属于寄存器寻址,即将R0寄存器的内容送到累加器A中。
三、直接寻址:操作数放在单片机的内部RAM某单元中,在指令中直接写出该单元的地址。如前例的ADD A,70H中的70H。
四、寄存器间接寻址:操作数放在RAM某个单元中,该单元的地址又放在寄存器R0或R1中。
如果RAM的地址大于256,则该地址存放在16位寄存器DPTR(数据指针)中,此时在寄存器名前加@符号来表示这种间接寻址。如MOV A,@ R0。其它还有变址寻址、相对寻址、位寻址等,待以后再详细介绍。可能有人会问,在指令中直接给出实际操作数,不是简单、明了吗?为什么还要用其它几种寻址方式呢?这是因为在编制程序时很难一下子就给出操作数。如用单片机控制温度时,时时需要将给定的控制温度(如20℃)减去环境温度,而环境温度时时有变化,显然无法在程序指令中给出,只有通过一定方式,将其送入某个输入/输出口,再存放在某个寄存器中,这就必须用到寄存器寻址。又如要进行算术运算,要计算每班学员各科成绩的平均值,如果把每个学员的各科都编一个程序,在程序中直接给出该学员各科成绩,再求平均值,显然太麻烦。这里可以编一个求平均成绩的通用程序,把每位学员的成绩送入存贮器的各个单元中,这时可采取直接寻址,一个程序可供每个学员用,不是更方便吗?所以,寻址方式越多,编制程序就越方便、灵活,适用范围就越广。寻址有如找人,如被找的人有手机、BP机、座机电话等多种联系方式则就容易找到他,单片机也是如此,寻址方式越多,找操作数越方便,单片机的功能就越强。前面介绍51系列单片机的寻址方式时,常遇到单片机内部的一些寄存器、累加器A、通用寄存器R0~R7、数据指针DPTR和存贮器等。在以后介绍指令时,数据就要在这些寄存器、存贮器之间传送,或者进行运算。因此,编制程序就需熟悉单片机的内部结构。
8051单片机的内部总体结构其基本特性如下:
8位CPU、片内振荡器
4k字节ROM、128字节RAM
21个特殊功能寄存器
32根I/O线
可寻址的64k字节外部数据、程序存贮空间
2个16位定时器、计数器
中断结构:具有二个优先级、五个中断源
一个全双口串行口
位寻址(即可寻找某位的内容)功能,适于按位进行逻辑运算的位处理器。除128字节RAM、4k字节ROM和中断、串行口及定时器模块外,还有4组I/O口P0~P3,余下的就是CPU的全部组成。把4kROM换为EPROM就是8751的结构,如去掉ROM/EPROM部分即为8031的框图,如果将ROM置换为Flash存贮器或EEPROM,或再省去某些I/O,即可得到51系列的派生品种,如89C51、AT89C2051等单片机的框图。
单片机各部分是通过内部的总线有机地连接起来的
单片机MCS-51系列指令快速记忆法
随着微电子技术和超大规模集成电路技术的发展,单片微型计算机以其体积小、性价比高、功能强、可靠性高等独有的特点,在各个领域(如工业控制、家电产品、汽车电子、通信、智能仪器仪表)得到了广泛的应用。学习、使用单片机的人越来越多,而生产单片机的厂家很多,单片机种类繁杂,不知如何选择。据统计,八位单片机占全球单片机销量的65%。在八位单片机中,Intel公司的8051单片机内核已成为8位单片机事实上的标准。因此,对初学者而言,选择8051单片机来学习不失为明智的选择。学习单片机,除了搞清单片机内部功能、存储空间分配及I/O接口外,还应掌握其指令系统。MCS-51共有111条指令,现介绍我们总结出的快速记忆MCS-51指令的方法,供大家参考。
大家都知道,汇编语言指令由操作码、操作数两部分组成。MCS-51使用汇编语言指
令,它共有44个操作码助记符,33种功能,其操作数有#data、direct、Rn、@Ri等。这里先介绍指令助记符及其相关符号的记忆方法。
一、助记符号的记忆方法
1表格列举法
把44个指令助记符按功能分为五类,每类列表记忆。此处从略,请读者自己总结。
2英文还原法
单片机的操作码助记符是该指令功能的英文缩写,将缩写还原成英语原文,再对照汉语有助于理解其助记符含义,从而加强记忆。例如:
增量 INC-Incremect 减量 DNC-Decrement
短转移 SJMP-Short jump 长转移 LJMP-Long jump
比较转移 CJNE-Compare jump not equality
绝对转移 AJMP-Absolute jump 空操作 NOP-No operation
交换 XCH-Exchange 加法 ADD-Addition
乘法 MUL-Multiplication 除法 DIV-Division
左环移 RL-Rotate left 进位左环移 RLC-Rotate left carry
右环移 RR-Rotate right 进位右环移RRC-Rotate right carry
3功能模块记忆法
单片机的44个指令助记符,按所属指令功能可分为五大类,每类又可以按功能相似原则为2~3组。这样,化整为零,各个击破,实现快速记忆。
1)数据传送组。 2)加减运算组
MOV 内部数据传送 ADD 加法
MOVC 程序存储器传送 ADDC 带进位加法
MOVX 外部数据传送 SUBB 带进位减法
3)逻辑运算组。 4)子程序调用组。
ANL 逻辑与 LCALL 长调用
ORL 逻辑或 ALALL 绝对调用
XRL 逻辑异或 RET 子程序返回
二、指令的记忆方法
1指令操作数的有关符号
MCS-51的寻址方式共有六种:立即数寻址、直接寻址、寄存器寻址、寄存器间址、变址寻址、相对寻址。我们必须掌握其表示的方法。
1)立即数与直接地址。
。ata表示八位立即数,#data16表示是十六位立即数,data或direct表示直接地址。
2)Rn(n=0-7)、A、B、CY、DPTR寄存器寻址变量。
3)@R0、@R1、@DPTR、SP表示寄存器间址变量。
4)DPTR+A、PC+A表示变址寻址的变量。
5)PC+rel(相对量)表示相对寻址变量。
记住指令的助记符,掌握不同寻址方式的指令操作数的表示方法,为我们记忆汇编指令打下了基础。MCS-51指令虽多,但按功能可分为五类,其中数据传送类28条,算术运算类24条,逻辑操作类25条,控制转移类17条,布尔位操作类17条。在每类指令里,根据其功能,抓住其源、目的操作数的不同组合,再辅之以下方法,是完全能记住的。
我们约定,可能的目的操作数按(#data/direct/A/Rn/@Ri)顺序表示。
对于MOV指令,其目的操作数按A、Rn、direct、@Ri的顺序书写,则可以记住MOV的15条指令。例如以累加器A为目的操作数,可写出如下4条指令。
MOV A,#data/direct/A/Rn/@Ri
以此类推,写出其它指令。
MOV Rn,#data/direct/A
MOV direct,#data/direct/A/Rn/@Ri
MOV @Ri,#data/direct/A
2指令图示记忆法
图示记忆法是把操作功能相同或相似、但其操作数不同的指令,用图形和箭头将目的、源操作数的关系表示出来的一种记忆方法。例如:由助记符MOV、MOVX、MOVC组成的送数组指令,可以用图1、2帮助记忆。
由助记符CJNE形成的四条指令,也可以用图示法表示,如图3。
CJNE A,#data,rel CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
另外,对于由(ANL、ORL、ARL)形成的18条逻辑操作指令,有关A的四条环移指令
,也可以用图示法表示,请读者自行画出记忆。
3相似功能归类法
在MCS-51指令中,我们发现部分指令其操作码不同,但功能相似,而操作数则完全一样。相似功能归类法就是把具有这样特点的指令放在一起记忆,只要记住其中的一条,其余的也就记住了。如加、减法的十二条指令,与、或、非的十八条指令,现列举如下。
ADD/ADDC/SUBB A,#data/direct/Rn/@Ri
ANL/ORL/XRL A,#data/direct/Rn/@Ri
ANL/ORL/XRL direct,#data/a
上述每一排指令,功能相似,其操作数都相同。其它的如加1(INC)、减1
(DEC)指令也可照此<此处内容被屏蔽>。
4口诀记忆法
对于有些指令,我们可以把相关的功能用精练的语言编成一句话来记忆。如PUSH direct和POP direct这两条指令。初学者常常分不清堆栈SP的变化情况,为此编成这样一句话:(SP的内容)加1(direct的内容)再入栈,(SP的内容)弹出(到direct单元)SP才减1。又如乘法指令中积的存放,除法指令中被除数和除数以及商的存放,都可以编成口诀记忆如下。
MUL AB 高位积(存于)B,低位积(存于)A。
DIV AB A除以B,商(存于)A余(下)B。
上面介绍了几种快速记忆单片机指令的方法,希望能起到抛砖引玉的作用,相信读者在学习单片机的过程中能找到适合自己的方法来记忆。但是,有了好的方法还不够,还需要实践,即多读书上的例题和别人编写的程序,自己再结合实际编写一些程序。只有这样,才能更好更快地掌握单片机指令系统。
单片机自学教材之用单片机做流水灯(一)
第一节
第一步:制作硬件电路
流水灯电原理图如下图,图中用一片AT89C2051单片机及少量外围元件组成。
图中,R1~R8为LED1~8的限流电阻;R9、C3为单片机的简易上电复位电路;C1、C2、T1组成单片机的时钟电路;
工作原理:在上电后由于C3、R9的作用,使单片机的RST复位脚电平先高后低,从而达到复位;之后,在C1、C2、T1以及单片机内部时钟电路的作用下,单片机依程序将P1.0~P1.7引脚拉低或抬高;拉低的引脚对应的LED点亮,抬高的引脚对应的LED熄灭。电路制作时,AT89C2051的位置应安装20脚的IC座,以便使单片机可以从电路板中拿下去烧写程序。电路中的元件无太苛刻的要求,若LED为高亮度的,R1~R8可加大到1k;C3漏电不要太大;否则会造成单片机无法复位。
下一步的准备:
1、下载汇编编译器 ASM51 ,这里先以DOS下的ASM51为例,因为它编译汇编程序时不产生辅助代码,所以较适合初学理解其产生的代码。
2、准备一片AT89C2051或AT89C1051;一般电子商场即可购到,当然,如果有旧片只要是好的也行
3、准备一台可以烧写AT89C2051和 1051的编程器;
4、电脑一台;噢对啦!你现在正使用的这台就行。
第二步:软件的编写
现在,我们假设单片机可以听懂我们的汉语,那么想让LED1点亮,就说“P1.0变低”;(单片机在上电初始后,其各端口输出为高电平)LED1就点亮啦!想让LED1灭,LED2亮,就说“P1.0升高,P1.1变低”;LED1就熄灭LED2随后既点亮
若用汉语编写的流水灯程序应该是:
程序部分 ;解释部分用“;”分号与程序部分隔开
开始: ;“开始:”为标号
P1.0低
P1.0高
P1.1低
P1.1高
P1.2低
P1.2高
P1.3低
P1.3高
P1.4低
P1.4高
P1.5低
P1.5高
P1.6低
P1.6高
P1.7低
P1.7高
返回到开始 ;返回到“开始:”处继续循环
结束 ;说明程序到此结束
这样,LED1~LED8便会不停的流动点亮熄灭,从而产生流水效果。然而单片机听不懂汉语,只能接受二进制的“10......”代码,但要用二进制代码编写流水灯程序,其意思与上述的“汉语程序”基本相同,只是“汉语”改为二进制代码罢啦。为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。这里的“程序语言”目前主要有汇编和C两种;“翻译”软件有好多种,一般依所使用的“程序语言”不同而不同,汇编语言用“宏汇编”,如上面让你下载的ASM51,C语言用FC或KC(以后会学到,现在你不必关心)。在这里我们所说的“翻译”软件,行话叫编译器,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
现在让我们将上面的“汉语”语言程序改写为汇编语言程序:
“汉语”语言 汇编语言
开始: star:
P1.0低 clr p1.0
P1.0高 setb p1.0
P1.1低 clr p1.1
P1.1高 setb p1.1
P1.2低 clr p1.2
P1.2高 setb p1.2
P1.3低 clr p1.3
P1.3高 setb p1.3
P1.4低 clr p1.4
P1.4高 setb p1.4
P1.5低 clr p1.5
P1.5高 setb p1.5
P1.6低 clr p1.6
P1.6高 setb p1.6
P1.7低 clr p1.7
P1.7高 setb p1.7
返回到开始 ljmp star
结束 end
这里用到了四条汇编指令:clr、 setb、 ljmp 、end;
clr 是将其后面指定的位清为0;
setb 是将其后面指定的位置成1;
ljmp 是无条件跳转指令,意思是:跳转到指定的标号处继续运行。
end 是一条告诉编译器:程序到此结束的伪指令。伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。
这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则:
1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件;
2、源程序的扩展名应是 *.ASM;
3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。
4、每行的格式应为:
标号: 命令 参数 ;注释
即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要使用标号时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。
标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编ASM51中标号的长度不受限制,但标号中不能包含‘:’或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数用(如标号作转移地址),在命令后面出现时,必须舍去‘:’(如上面程序中的 LJMP STAR中的 STAR 是不能再有:)。每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。
源程序中的字母不区分大小写,也就是说 star 和 STAR 是一样的,请不要用大小写方式去区分不同的标号。
好拉!现在来看看前面我们编写的源程序该怎样处理,为便于以后叙述,也便于你对源程序的学习与管理,请在C盘下建立一个McuCai目录,将下载的MASM51和你编写的程序均放到这里。下面均认为你已建立了这个目录。编写源程序:先将上面的汇编源程序在Windows的记事本中依原样输入,之后保存为 Test.asm。由于ASM51为汉化版,需要中文环境,在进入DOS模式后请在命令行键入 pdos95回车 既进入中文环境;要退出中文环境,只要在命令行键入 quit 即可。
编译:在命令行键入: asm51 test.asm 回车
如果你编写的源程序有错误,编译时编译器会提示你那一句错啦;若想详细查看编译结果,可用“记事本”打开编译后产生的test.lst列表文件。我们最后需要的便是编译后产生的 test.hex 文件
烧写:回到Windows;将编程器与电脑连接好并接通电源(这里以本站介绍的AT51编程器为例),启动编程器程序,在“器件”菜单中选择“AT89C2051”;从“文件”菜单中“打开HEX文件”打开C:\McuCai\Test.hex文件;在编程器上装入AT89C2051芯片,先擦除,后写入。好拉,到此我们已将第一个流水灯程序编写、编译、烧写进行完啦,再下来就是将烧写好的AT89C2051从编程器上取下,安装到前面制作的电路板中通电让LED1~LED8“流水”。
说明:由于单片机的时钟高达12MHz,8个LED发光与熄灭的时间很短,实际实验结果凭我们的眼是看不到“流水”效果的!哪怎样才能让我们肉眼看到“流水”效果呢?请继续学习下节课.
第二节 单片机自学教材之用单片机做流水灯(二)
第二节
上一节的实验最后没有得到“流水”效果,主要是单片机执行每条指令的时间
很短,我们肉眼无法看到LED的熄灭与点亮;
单片机内部能按部就班的自动工作,正是在系统时钟的作用下,内部各逻辑硬
件产生各种所需脉冲信号而实现的。这个时钟信号(既晶体振荡信号)的周期称
“振荡周期”。我们这个实验中晶体使用的是12MHZ.
在单片机中,要处理最短周期的一条指令需要由12个振荡周期(既晶振振荡周
期)组成的,这个叫“机器周期”。
8051核的单片机,大多数指令只用一个机器周期(既单周期),也有双周期和
四周期的指令。本实验中用到的SETB P.x和CLR P.x均属于单周期指令,也就是说
,执行一句 SETB P.x 用时仅1uS(微秒),CLR P.x 也是1uS;难怪我们前面的程
序不能看到流水效果。
现在,将程序改动一下,在每点亮一个LED后,让程序干点别的事,也就是让
它等一会再将该LED熄灭,继续执行下面的程序: