PM十流水是围棋怎么算输赢的。输赢都有算么??今天机器人和网盘流水不一样,机器人一单都没漏

查看: 1338|回复: 0
DIY机器人---一篇不错的机器人制作教材.机器人核心部分开发1
本帖最后由 51黑tt 于
14:52 编辑
第一课 制作机器人的基础
在论坛上经常可以看到有人说:“我是菜鸟,制作机器人需要什么基础?”。其
实我可以回答大家:“基础就是你首先要学好数理化”,怎么样很意外吧!现在
我来给大家讲讲为什么这么说。机器人制作综合性很强,它涉及机械制造、计
算机、电子技术等很多领域,每一个领域都是以我们的数理化为基础的,还有就
是要充分利用互联网的资源自我学习。
以下是我在论坛发过的一篇贴子,希望大家用心体会。
高手的秘诀
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芯片资料?(其实大部分资料网络上都有,但是偏偏来找人
问,懒!)
浮躁的人分两种:只观望而不学的人;只学而不坚持的人;
浮躁的人永远不是一个高手。
看完后明白了吧,恭喜!你已经迈出了第一步。
第一课就到这里,下课接着讲。
_________________
第二课 机器人的组成
机器人一般是由以下模块组成:
1.语音模块
用于语音对话、语音控制。
2.灯光表达模块
用于机器人状态显示、感情表达(喜、怒、哀、乐)
3.控制模块
I/O+决策,即机器人的大脑,其控制能力及AI由编程者的水平决定。
4.传感器模块
对外界环境的的感知。
5.电源模块
为机器人提供能源,常用有3v、5v、6v、9v、12v。
6.减速电机
常用于机器人行走驱动,根据需要选择变比。
7.驱动模块
机器人的执行机构,常选用行模中的舵机。
8.视频模块
机器人的眼
9.机械模块
10.无线通讯模块
11.控制软件
一个简单的机器人是由单片机电路、红外传感器、减速电机+程序这是大多数人
认同的,但是我要向大家说这种认识是错误的,真正的机器人不是几片单机和
几台电脑就可以解决,关键就是‘机器人’中这个‘人’字,还需要我们一代代
以上讲的有点简单,先写出。
-------------------------------
第三课 机器人的工作原理
机器人是机器有人的特点,我们可以从人自身出发就容易理解他的工作原理了.
简单的讲就是传感器将得到的信息送到处理器决策执行驱动器的动作。
就讲这么多,到后面有实例大家就明白了。
哈哈,这小子太^&%**
第四课 常用工具的使用
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以上的线绕电阻 ,如果功率太小会使之烧毁。
_________________
第五课 单片机
今天给大家讲讲单片机,跟上几课一样比较枯燥但打基础就是这样,偷不的懒。
对一个初学单片机的人来说,学习的方法和途径非常重要。如果按教科书式的学
法,上来就是指令,名词,学了半天也搞不懂,用不了几天就半途而废,本讲座
学习与实验结合实际,边学,边练,让你轻松进入单片机世界。本讲座以80C51为
主,主要以练为主,采用跟我学,学习单片机的基础知识,结构,指令,及开发
的一般方发。跟我练,学习I/O口应用,中断,定时,串行口,数/模转换,的练
习。跟我用讲实用的单片机设计。
初学单片机必备设备,初学者不可不备的工具及软件
一.学单片机需要的设备
这是一个很多想学单片机的人都比较关心的问题,我不希望花很多钱的代价学单片
1,要有一台电脑,最好在486或者586以上
2,要有一个编程器,最好Windows界面,用来把编译好的程序写入单片机的
ROM里面,把写好后的芯片插到试验板上面进行试验。
本站可提供:AT51串口编程器, AT51pro编程器能够对ATMEL公司的
AT89c52/51/单片机进行全面的编程操作,包括写入、擦除、等。编程
器采用串口与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状态,否则
3溢出标志位OV。MCS-51反映带符号数的运算结果是否有溢出,有溢出时
,此位为1,否则为0。
4奇偶标志P。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数
个1(如B,其中有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:(写成二进制就是B和B)。在单片机处理问题之前
必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,
该存储器称为程序存储器。程序存储器可以放在片内或片外,亦可片内片外同时
设置。由于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寄存器的内容送到累
三、直接寻址:操作数放在单片机的内部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个特殊功能寄存器
可寻址的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的顺序书写,则可以记住
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
也可照此办理。
  4口诀记忆法
  对于有些指令,我们可以把相关的功能用精练的语言编成一句话来记忆。如
irect和POP direct这两条指令。初学者常常分不清堆栈SP的变化情况,为此编成
句话:(SP的内容)加1(direct的内容)再入栈,(SP的内容)弹出(到direct单元)SP
。又如乘法指令中积的存放,除法指令中被除数和除数以及商的存放,都可以编
记忆如下。
  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随后既
若用汉语编写的流水灯程序应该是:
程序部分 ;解释部分用“;”分号与程序部分隔开
开始: ;“开始:”为标号
返回到开始 ;返回到“开始:”处继续循环
结束 ;说明程序到此结束
这样,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
这里用到了四条汇编指令: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熄灭,继续执行下面的程序:
star: ;程序开始
clr p1.0 ;LED1亮
调用延时子程序
setb p1.0 ;LED1灭
clr p1.1 ;换灯,同上
acall delay
acall delay
acall delay
acall delay
acall delay
acall delay
acall delay
返回到开始循环
delay: ;延时子程序
mov r1,#50
mov r2,#100
mov r3,#100
djnz r2,del1
djnz r1,del0
延时子程序结束,返回到调用处的下一句
请将上面的程序保存为 Test.asm,进行编译,并烧写到AT89C2051中,之后
将2051安装到实验板中实验,这回肯定“流水”啦!
回过头,让我们看看延时子程序是怎样工作的:
单片机内部有不少寄存器,这些寄存器在单片机通电时,你可以给他写入数据
(是单片机按你程序要求写的数据,而不是编程器写的),当第二次给他写入新
数据时,前次的数据就被新数据覆盖;当然也可以从寄存器中读取数据。当单片
机没有电源供给时,寄存器内部的数据也随即消失;这些寄存器人们叫他RAM,而
用编程器将我们编写的程序烧写到单片机中的存储器叫ROM;现在,我们应该清楚
:RAM是让程序去使用的,ROM是我们编写的程序存放的地方!
前面说过,单片机内部有不少RAM,本实验用的AT89C2051有多少寄存器?我们
现在不必关心,现在只须知道单片机内部有名叫R0~R7 的这8个寄存器。这8个寄
存器每个都由8个单独的位寄存器组成,最大存放数据为二进制的 ,十
六进制 = FF,十进制 = 255。在使用时注意不要大于其有效范围。
上面延时程序中,先用到 mov r1,#50 ,mov是移动的意思,该句是将50这个十
进制数放到r1中;50是立即数,按汇编语言要求前面要加“#”号,汇编语言还规
定,十六进制数后面要加“ H”,十六进制数的高位是字母时在字母前面还要加
“0”,例如:#0F8H;二进制数后面加“B”,例如:#B。十进制不加,
例如:#100 。延时程序的第二、三句为 mve r2,#100 ;mov r3,#100 ;这两
句意思同前。
第四句中 djnz r3,$ 的意思是将 r3 里面的数减 1 后如果 r3 不等于 0 则跳
到后面指定的程序位置,这里的“$”既要跳转的程序位置,“$”代表当前语句
处,也就是说,r3不等于 0,程序返回再次执行本句。如果r3 减 1 后等于 0,
程序结束本句,继续执行下面的语句。
延时程序的最后一句是 ret ,意思是退出本子程序,返回到调用本子程序处的
根据上面的解释,一进入延时子程序首先为 r1, r2, r3 寄存器装入我们需要
的数据,然后先对 r3 进行减数,每次减 1 ,r3 减完后减 r2 ,减 r2 时就费
事啦,因为 r2 每减 1 后不为 0 需要跳转到 del1 标号处执行下面的语句,此
时 r3 再次装入数据100,并且还要再次对 r3 进行减数......,r2 减完后减 r1
,减 r1的过程你研究研究看看。
每执行 djnz rn,rel (rn 指 r0~r7,rel 指转移地址)指令一次,需要2个机
器周期,单片机需耗时2uS(指本实验),若忽略装数等语句,延时子程序从开始
到结束,单片机共耗时100*100*50*2nS,既1000000uS=1秒!若加上装数等语句的
耗时,延时时间大于1秒。
到此,我们做的流水灯已成功,原理大致也明白啦,若你自认为这一课你完全
明白了,那请你将“流水灯”的流向改变一下,也可以改为两边向内流,内部向
外流......,我想你一定能用前面学到的方法实现这些功能。可能有些高手说,
前面的编程方法是最最笨的!,不错!但玩单片机初期不必讲究语言的简练,只
要能完成预先要求就好,这是初学者要知道的。那么还有更好的编程思路吗:有
!请继续学习
单片机自学教材之用单片机做流水灯(三)
在上节课中让 LED 流水是去逐个控制P1端口的每个位来实现的,那么我们在
程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让
这个数据向高位移动不就实现“流水”效果啦?的确如此!
可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指
令,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是
不正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据
处理过程中作用十分重要,ACC为8位。他可与片内所有单字节寄存器交换数据,
实际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据
先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以
实现“流水”效果。
程序如下:
star: ;开始
mov acc,#0ACC中先装入LED1熄灭的数据(即二进制的 )
mov p1,将ACC的数据送P1口
mov r0,#7 ;因上句送到 p1口的数据就熄灭了一位,
;所以将数据再移动7次就完成一个8位流水过程
loop: ;数据移动循环
将ACC中的数据左移一位
mov p1,把ACC移动过的数据送p1口显示
djnz r0,没有移动够7次继续移动
移动完7次后跳到开始重来,以达到循环流动效果
delay: ;延时子程序,就是上节课中的延时子程序
mov r1,#50
mov r2,#100
mov r3,#100
djnz r2,del1
djnz r1,del0
延时子程序结束,返回到调用处的下一句
本汇编程序到此结束
接下来,将上述程序编译,并烧写到前面我们的实验芯片中,流水效果与第二
节课的一样。
其实8051单片机有111条指令,这111条指令好比以前我们使用数字传呼机时的
“短语代码”一样,可以用几个“短语代码”去表示一句完整、通顺的语句段落
。有的指令常用,有的指令不常用,只要遵守语法规则,你可以用这些指令“组
合”成你想象到的任何程序。当然,有时一条指令可以替代很多条指令,这样会
使程序简捷,费码减少,在编写较大程序时可以让程序存储器放得下你需要的代
码。这也是单片机高手所追求的。当然,在程序存储器空间不成问题时,你不这
样做但也可以达到预期的功能,这也不算错。
单片机内部还有很多“部件”我们只是用到什么说什么,很不系统。但是我也
不想系统的介绍这些,因系统介绍单片机结构和指令的书很多,何况写的远比我
好,因此,希望你在看本讲座的过程中,还要结合正规的教材学习其更多的指令
和“部件”。
可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令
,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是不
正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据处
理过程中作用十分重要,ACC为8位。他可与片内所有单字节寄存器交换数据,实
际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先
放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实
现“流水”效果。
程序如下:
star: ;开始
mov acc,#0ACC中先装入LED1熄灭的数据(即二进制的 )
mov p1,将ACC的数据送P1口
mov r0,#7 ;因上句送到 p1口的数据就熄灭了一位,
;所以将数据再移动7次就完成一个8位流水过程
loop: ;数据移动循环
将ACC中的数据左移一位
mov p1,把ACC移动过的数据送p1口显示
djnz r0,没有移动够7次继续移动
移动完7次后跳到开始重来,以达到循环流动效果
delay: ;延时子程序,就是上节课中的延时子程序
mov r1,#50
mov r2,#100
mov r3,#100
djnz r2,del1
djnz r1,del0
延时子程序结束,返回到调用处的下一句
本汇编程序到此结束
第六课 传感器
传感器是用于机器人对环境的感知就象人的眼睛有视觉、皮肤有知觉一样,然后
把得到的信息转变成电信号供处理系统分析处理。
传感器种类很多,你可以根据需要选择传感器比如用在方向就用方向传感器;用
在视觉就用视觉传感器。这里只是说说实际选择起来就不这么简单了,要根据要
求、参数进行选择.
工作忙也就是懒的代名词,我这人就是这样,先写下这么多,好了下节课见.
第七课 驱动器
驱动器的种类很多,我只讲两种比较常用的驱动器。
1。减速电机(我们常在电动玩具中拆下的带齿轮箱的小马达,就是减速电机)
由拖动电动机与齿轮减速装置耦合而成, 减速装置的作用用一句话概括,就叫做
变速变扭,即增速减扭或减速增扭。为什么减速可以增扭,而增速又要减扭呢?
设电机输出的功率不变,功率可以表示为 N = wT,其中w是转动的角速度,T是扭
距。当N固定的时候,w与T是成反比的。所以增速必减扭,减速必增扭。
减速电机一般用做机器人的动力驱动,也就是机器人的腿.
2.伺服电机
微型的伺服电机在无线电业余爱好者的航模活动中使用已有很长一段历史,而且
应用最为广泛,国内亦称之为“舵机”,含义为:“掌舵人操纵的机器”。可见
,微型伺服电机主要用作运动方向的控制部件。伺服电机本质上是可定位的电机
。当伺服电机接受到一个位置指令,它就会运动到指定的位置。因此,个人机器
人模型中也常用到它作为可控的运动关节,这些活动关节我们也常称它为自由度
2.伺服电机的优点:
大扭力、控制简单、装配灵活、相对经济,但它亦有着先天的不足:首先它是一
个精细的机械部件,超出它承受范围的外力会导致其损坏,其次它内藏电子控制
线路,不正确的电子连接也会对它造成损毁,因此,很有必要在使用前先了解伺
服电机的工作原理,以免造成不必要的损失。
3.伺服电机内部结构:
一个伺服电机内部包括了一个直流电机;一组变速齿轮组;一个反馈可调电位器
;及一块电子控制板。其中,高速转动的直流电机提供了原始动力,带动变速(
减速)齿轮组,使之产生高扭力的输出,齿轮组的变速比愈大,伺服电机的输出
扭力也愈大,也就是说越能承受更大的重量,但转动的速度也愈低。
4.伺服电机的工作原理:
一伺服电机是一个典型闭环反馈系统,其原理可由下图表示:
减速齿轮组由电机驱动,其终端(输出端)带动一个线性的比例电位器作位置检
测,该电位器把转角坐标转换为一比例电压反馈给控制线路板,控制线路板将其
与输入的控制脉冲信号比较,产生纠正脉冲,并驱动电机正向或反向地转动,使
齿轮组的输出位置与期望值相符,令纠正脉冲趋于为0,从而达到使伺服电机精确
定位的目的。
5.伺服电机的控制:
标准的伺服电机有三条控制线,分别为:电源、地及控制。电源线与地线用于提
供内部的直流电机及控制线路所需的能源,电压通常介于4V—6V之间,该电源应
尽可能与处理系统的电源隔离(因为伺服电机会产生噪音)。甚至小伺服电机在
重负载时也会拉低放大器的电压,所以整个系统的电源供应的比例必须合理。输
入一个周期性的正向脉冲信号,这个周期性脉冲信号的高电平时间通常在1ms—
2ms之间,而低电平时间应在5ms到20ms之间,并不很严格.
简单的说伺服电机用在控制精度要求比较高的地方(比如机器人的手)。
_________________
第八课 用什么语言编程
很多人问我你用什么语言编程,告诉大家DEBUG、BASIC、ASM、C、C++、DELPHI
我都用,其实用什么语言并不重要,关键是你的思路和算法最重要,语言不过是一种表达方式。
机器人硬件一旦完成,要想使机器人按我们的意愿进行工作及机器人智能水平的高低都是在软件中得到体现,所以说软件编程是机器人最重要的一个环节.
不过这里还是要说一下,如果你是个入门者我推荐你从basic学起循序渐进。
好了,基础课到这就告一段落,大家可能会说我讲的不够具体没有深入细节,是的
一是我时间不太多;二是给入门者介绍下方向让他们知道以后该专攻那些方面;三是我想通过后面的实例让大家自己体会。
以上八课你没看懂,不要紧看了就行,从下节开始课跟我一起做实验,慢慢的你就都懂了。
_________________
第九课 机器DIY1
很多人想学习制作机器人,可是苦于机器人配件价格太高或者买的起但有条条框
框限制,个人发挥的空间不大。我同样也遇到了这样的问题,但是只要肯动脑就没
有解决不了的问题,是的我解决了,大家只要准备好一台586以上的电脑和买早餐
的钱就可以跟我学习制作机器人了,这是真的。
好了,开始了!
制作前先告诉大家一个秘诀:无论是用单片机还是用电脑控制机器人都是靠IO的
输入输出控制的。
好先去把要用的准备好:
1.电脑一台
3.打印机并口线一条(电脑城有卖8元)
4.发光二极管4个(电子商店有卖0.5元/个)
首先把打印机并口线按图重新焊接。
然后将并口线插在电脑打印机并口上,硬件的工做我们就完成了。
启动电脑进入WIN98后,进入DOS窗口输入DEBUG回车。
-O 387,FF
你会发现4个发光二极管都亮了。
你会发现4个发光二极管都灭了。
怎么样神奇吗?是的你已学会了机器人输出的控制,当然这比较简单,但以后我们
会逐步深入,最后完成一功能复杂的机器人.
_________________
第十课 机器DIY2
上课讲了IO的输出控制,大家一定会问怎么分别控制4个发光二极管的亮和灭?别急
这节课我就给大家讲讲怎么来做。
1。启动电脑进入WIN98后,进入DOS窗口输入DEBUG回车。
你会发现D1亮了。
你会发现D2亮了。
你会发现D3亮了。
你会发现D4亮了。
通过上述方法,你可以任意安排LED的显示方式。
以上只能手动控制LED的显示方式,现在我教大家怎么通过BASIC编程来控制LED的
请先下载basic编程软件(189k):
http://wwwxuan.nease.net/diy/QBASIC.EXE
下载后运行QBASIC.EXE,进入界面按一下ESC键后输入:
20 OUT &h378, 1
21 for a=1 to 100000:next a
30 OUT &h378, 2
31 for a=1 to 100000:next a
40 OUT &h378, 3
41 for a=1 to 100000:next a
50 OUT &h378, 4
51 for a=1 to 100000:next a
60 OUT &h378, 0
61 for a=1 to 100000:next a
输完后按F5键你就可以看到DEL依此闪亮。
10 cls ‘10是行号,CLS是清屏命令
OUT &h378, 1 ‘点亮d1
for a=1 to 100000:next a '延迟语句
end ‘结束命令
好了大家自己试一下吧,下节课我来教大家IO的输入控制.
_________________
第十一课 机器DIY3
上两课讲的是输出控制,这节课当然是讲输入控制。
1。在上次焊好的并口上在如下图焊接好
图中P为电池或引出的机内5V电源,R为限流电阻470欧姆至1K。
至此你已经拥有了一个机器人控制器的最小开发系统,我们可以在这个系统上开发
出一个强大的机器人。(怎么样没花多少钱吧!)
2。运行QBASIC.EXE,进入界面按一下ESC键后输入:
20 IF (INP(&h379) and 8 )/8=1 then print&K2是闭合的&
30 IF (INP(&h379) and 8 )/8=0 then print&K2是打开的&
40 IF (INP(&h379) and 16)/16=1 then print&K1是闭合的&
50 IF (INP(&h379) and 16)/16=0 then print&K2是打开的&
60 goto 20
输完后按F5键后,按下K1或K2你就可以在屏幕上看到结果。
_________________
第十二课 机器DIY4
上课前再向大家声明一下,此讲座是我随想随写可能有语法、掉字、错字,
内容也不够详尽,不足之处望大家见谅。
上两课分别讲了输入、输出的控制,这课就给大家讲讲一个简单的控制实例。
1。运行QBASIC.EXE,进入界面按一下ESC键后输入:
20 IF (INP(&h379) and 8 ) / 8=1 then OUT &h378, 1
30 IF (INP(&h379) and 8 ) / 8=0 then OUT &h378, 2
40 IF (INP(&h379) and 16)/16=1 then OUT &h378, 3
50 IF (INP(&h379) and 16)/16=0 then OUT &h378, 4
60 goto 20
输完后按F5键后,按下K1或K2你就可以看到LED的变化。
是的,这个程序用LED代替了屏幕的显示,也就是说你能通过输入的变化来控制LED的亮和灭,当然也就可以控制别的什么(例:控制电机、舵机等),具体怎么做请听下回分解。
_________________
第十三课 控制电机正反转
控制电机正反转是机器人制作中不可缺少的一项,今天我来制作一个电机正反转
以下是需要的材料:
1.玩具电机一只(电动玩具中都有)
2。5v继电器2个(电子商店有卖2元/个)
3。4N25光隔2个(电子商店有卖5元/个)
4。四节1.5V电池(0.5元/个)
先来做个电机正反转的实验。
电机尾部有两条引线分别把线接在电池正负极上,电机转了注意一下它的旋转方向
,然后再把电池极性换一下观察电机的旋转方向,电机反方向旋转了。
控制电机正反转的秘诀就是:电源互换极性.
明白了以上的道理,下面我们来按图把电路焊好。
运行QBASIC.EXE,进入界面按一下ESC键后输入:
20 IF (INP(&h379) and 8 ) /8=0 then OUT &h378, 1
30 IF (INP(&h379) and 16 ) /16=0 then OUT &h378, 2
40 goto 20输完后按F5键后,按下K1或K2你就可以控制电机正反转了。
下节课在此基础上教大家做个自动避障小车.
_________________
第十四课 自动避障小车
课上到这,大家是不是觉得越来越有意思了,如果我讲的好大家就顶一下,不然我
就没有继续写的动力了。
上节课我们只讲了控制一只电机还有D3、D4没有用上,是的我是有意留给大家自
己去做,你再焊一块同样的板子接到D3、D4就可以了。
把K1、K2换成触碰开关,一个自动避障小车就有了。
下面我们来看小车工作的程序.
运行QBASIC.EXE,进入界面按一下ESC键后输入:
20 IF (INP(&h379) and 8 ) /8=0 and IF (INP(&h379) and 16 ) /16=0 then OUT &h378, 5
30 IF (INP(&h379) and 8 ) /8=1 then OUT &h378, 1
40 IF (INP(&h379) and 16 ) /16=1 then OUT &h378, 8
60 goto 20
输完后按F5键小车就跑起来了。
程序说明:
1。K1、K2同时打开左右电机一起旋转。
2。K1打开左转右停.
3.K2打开右转左停.
我就教这么多剩下的就靠你自己去发挥了。
_________________
由简单到复杂
由有线到无线
由分散到集中
共同努力 成就未来
Powered by

我要回帖

更多关于 五子棋判断输赢算法 的文章

 

随机推荐