单片机原理与接口技术教学设计193_第1页
单片机原理与接口技术教学设计193_第2页
单片机原理与接口技术教学设计193_第3页
单片机原理与接口技术教学设计193_第4页
单片机原理与接口技术教学设计193_第5页
已阅读5页,还剩197页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

·PAGE2··PAGE3·第1章单片机概述教学设计本章为课堂讲授,2学时。作为本课程的第一次课,应使学生明确本课程的性质、学时,教材、学习目的以及学习方法和基本要求。这对提高学生学习本课程的兴趣十分重要。教师应通过丰富的单片机应用具体实例的介绍,真正提高学生学习本课程的兴趣。虽然本章仅仅是介绍有关单片机的知识、基本概念以及应用的基本情况,但是对教师的要求较高,需要较宽的知识面。可谓“要给别人一碗水,自己首先要有一桶水!”,需要教师多做了解调查,多阅读即时的期刊资料,下功夫讲好这第一次课,要注重介绍本课程的特点,即课程的应用性及实践性,但同时也要使学生明确掌握好基本知识、基本概念对学习本课程的重要性,。1.1什么是单片机重点:弄清楚什么是单片机?单片机与通用计算机的差别。尤其是要注意单片机并不是CPU,这是学生初学单片机最容易搞错的问题。注意:单片机的另外两个称谓“嵌入式控制器”、“微控制器”,通过这两个称谓,真正理解单片机的具体应用,尤其是其嵌入式的特征。实际上国外都称“嵌入式控制器”,这是比较贴切的表达。国内工程技术人员称其为“”单片机“是源于“单片微计算机”这一名词,比较直白、通俗。但是一定使学生熟知“嵌入式控制器”、“微控制器”这两个别称。关于嵌入式系统概念的介绍,教师可结合当前的各种嵌入式系统的应用,比较单片机、DSP、嵌入式微处理器的具体应用,初步了解嵌入式系统。1.2单片机的发展历史重点:单片机的发展历史,学生基本了解即可。但对于世界上常用的一些8位机型、16位机型,应该使学生了解。16位单片机、32位单片机也得到广大用户的青睐。1.3单片机的特点注意:强调嵌入式应用的特点。由于单片机体积小,很容易地嵌入到系统之中,以实现各种方式的检测、计算或控制,在这一点上,一般的微型计算机根本做不到。为什么应用如此广泛?单片机为核心的的应用系统具有的特点,应使学生了解。1.4单片机的应用学生应基本了解单片机在各个领域的应用。1.5单片机的发展趋势最重要的趋势是外围电路内装化,系统的单片化。1.6MCS-51系列与AT89C5x系列单片机8051单片机的称呼。重点在8051内核。了解8051单片机的基本发展过程。把MCS-51系列单片机与8051单片机,基本型、增强型、扩展型的基本概念介绍清楚,明确美国ATMEL公司的AT89S51与MCS-51系列之间的关联。应使学生明确AT89C51与AT89S51的差别,主要差别在ISP、看门狗等,尤其是ISP要讲解清楚。1.7其它的8051单片机注意了解高集成度的其他的8051单片机。例如:ADμC812、C8051Fxxx系列、台湾华邦公司(Winbond)的W78系列和W77系列(增强型)对具有我国自主知识产权的STC单片机应给予介绍。1.8AVR系列单片机与PIC系列单片机非8051单片机,主要介绍目前使用较为广泛的PIC、AVR等机种。以拓宽学生的视野。同时对16位的MSP430以及PIC系列中的16位、32位也作以介绍1.9各类嵌入式处理器简介重点:各类嵌入式处理器为核心的嵌入式系统的应用,已经成为当今电子信息技术应用的一大热点。全世界嵌入式处理器的品种总量已经超过1000多种,按体系结构主要分为:嵌入式微控制器(单片机)、嵌入式数字信号处理器(DSP)嵌入式微处理器。对课程中两个软件开发平台KeilµVision3与Proteus,本次课要做十分简要介绍,要求学生自学来掌握这两个开发平台,要求能够熟练使用这两个软件开发平台来进行单片机应用系统的软硬件虚拟设计调试与仿真。教师要列出相应的可供学生自学的有关参考资料。拓展资源提供了两个视频文件,学生在课下可通过观看视频,来了解掌握Proteus的基本特性及具体使用,重点放在ISIS(智能原理图输入)的使用上。KeilµVision3的使用参考张毅刚教授编写出版的相关教材。本章小结:由于本章是对单片机及其应用进行概括性的介绍,要使学生了解由于单片机是发展最快、品种最多、数量最大的嵌入式系统。目前,国内外公认的嵌入式控制器标准体系结构是Intel的MCS-51系列,其中8051已被世界多家芯片厂商作为基核,推出了众多的与8051兼容的增强型扩展型的SoC产品,据国内一家杂志对市场的调查,结果8051体系结构的单片机仍占有整个嵌入式微处理器/微控制器市场的较大份额。同时由于8051结构清晰,易学、易掌握,已经成为初学者学习单片机技术的首选的入门机型,这也是为什么本课程仍旧学习8051体系结构的单片机AT89S51的原因。

第2章AT89S51单片机片内硬件结构教学设计课堂讲授4学时。导学:本章介绍AT89S51单片机的硬件结构。通过学习,应牢记AT89S51单片机的片内硬件结构以及片内硬件资源,了解片内外设的功能,重点掌握AT89S51单片机的存储器结构、特殊功能寄存器的基本作用以及复位电路和时钟电路的设计,同时也介绍了低功耗节电模式。本章的学习目的是为应用系统的硬件设计打下基础。单片机应用的特点是编写程序来控制硬件电路,应先应熟知并掌握AT89S51单片机片内硬件基本结构和特点。2.1AT89S51单片机的硬件组成AT89S51片内的基本结构依旧是CPU加上外围芯片的传统微型计算机结构模式,但CPU对各种外围部件的控制是采用特殊功能寄存器SFR(SpecialFunctionRegister)的集中控制方式。重点:掌握AT89S51单片机的片内硬件组成结构与资源。主要包括:CPU、数据存储器(片内容量与片外的最多外扩)、程序存储器FlashROM(片内容量与片外的最多外扩)、中断系统、定时器/计数器、串行口、4个8位的并行口、26个特殊功能寄存器(SFR)、看门狗定时器WDT。AT89S51与AT89C51相比,更突出的优点5点要掌握。2.2AT89S51的引脚功能基本要求:掌握DIP方式的40只引脚功能。熟知40只引脚每一个引脚的功能,对AT89S51单片机应用系统的硬件电路设计十分重要。重点:掌握引脚按功能,尤其要掌握控制引脚的功能。引脚分3类:电源及时钟引脚;控制引脚;I/O口引脚。2.2.1电源及时钟引脚1.电源引脚:(1)VCC(40脚):+5V;(2)VSS(20脚):数字地。2.时钟引脚(1)XTAL1(19脚);(2)XTAL2(18脚)。注意:连接外部时钟源时,两个时钟引脚的接法要注意。2.2.2控制引脚重点讲解其功能:/

VPP;ALE/;2.2.3并行I/O口引脚重点:P0口与其它3个口的功能的差异。准双向I/O口与双向I/O口的差异P0口也可作为通用I/O口使用(不要误认为只能做总线口),但需加上拉电阻,这时为准双向口。注意:P1.5/MOSI、P1.6/MISO和P1.7/SCK也可用于对片内Flash存储器串行编程和校验,它们分别是串行数据输入、串行数据输出和移位脉冲引脚。P2口作为高8位地址总线用,输出高8位地址;P3口的第二功能定义应熟记。问题:为什么P0与P1口、P2口、P3口3个准双向口相比,多了一个高阻输入的“悬浮”态?2.3AT89S51的CPU由运算器和控制器构成。2.3.1运算器要点:运算器的功能、累加器A的作用、程序状态字寄存器PSW各个位的功能。注意:RS1位、RS0位与4组工作寄存器区的对应关系。2.3.2控制器要点:控制器的主要任务、控制器包括的部件。程序计数器PC的基本工作过程、注意:PC内容的变化轨迹决定了程序的流程,而2.4AT89S51单片机存储器的结构要点:哈佛结构。AT89S51单片机的存储器空间可划分4类:程序存储器空间;数据存储器空间;特殊功能寄存器;位地址空间。2.4.1程序存储器空间用途:用于存放程序和表格之类的固定常数。片内程序存储器为4KB的Flash存储器,地址范围为0000H~0FFFH。要点:整个程序存储器空间可分为片内和片外两部分。某些单元被固定用于各中断源的中断服务程序的入口地址。5个特殊单元对应的5个中断源的中断入口。复位入口的概念。2.4.2数据存储器空间要点:数据存储器空间分为片内与片外两部分。1.片内数据存储器片内数据存储器的结构。4组通用工作寄存器区的位置;堆栈区;位寻址区。2.片外数据存储器片内RAM,访问时使用不同的指令,所以不会发生数据冲突。2.4.3特殊功能寄存器SFR的名称及其分布。可位寻址的SFR的特点。与AT89C51相比,新增加了5个SFR。1.堆栈指针SP与堆栈注意:复位后,SP最好重新初始化设置堆栈的目的。子程序调用或中断服务子程序调用时,堆栈的两种操作情况。2.寄存器B要点:乘、除法操作要使用寄存器B。不执行乘、除法的情况下,可作为一个普通寄存器来使用。3.AUXR寄存器AUXR的格式与各位的功能。4.数据指针DPTR0和DPTR1要点:格式与各位的功能注意:如何选用DPTR0和DPTR1,复位时的选择的情况。5.AUXR1寄存器要点:格式与各位的功能6.看门狗定时器WDT要点:看门狗定时器的用途。,如何把看门狗清0.2.4.4位地址空间字节地址。2.5AT89S51单片机的并行I/O端口要点:4个双向的8位并行I/O端口P0~P3的片内位电路结构。端口P0~P3电路的差别。难点:双向口与准双向口的概念。2.5.1P0口1.P0口的工作原理(1)P0口用作系统的地址/数据总线用(双向口)(2)P0口用作通用I/O口使用(准双向口),加上拉电阻P0口的两种读入方式:“读锁存器”和“读引脚”。2.P0口总结综上所述,P0口具有如下特点:(1)当P0口用作地址/数据总线口使用时,是一个真正的双向口。(2)当P0口用作通用I/O口使用时,P0口各引脚需要在片外接上拉电阻。2.5.2P1口要点:P1口位电路结构与P0口位电路结构的差别。1.P1口的工作原理P1口只能作为通用I/O口使用;P1口分别作为输出口、输入口时的工作原理。难点:“读锁存器”和“读引脚”两种方式。2.P1口总结P1口由于有内部上拉电阻,没有高阻抗输入状态,故为准双向口。P1口“读引脚”输入时,必须先向端口锁存器写入1。2.5.3P2口要点:P2口为双功能口,字节地址,位地址。P2口某一位的位电路结构。1.P2口的工作原理(1)P2口用作地址总线口的工作原理。(2)P2口用作通用I/O口的工作原理。2.P2口总结作为地址输出线使用时,P2口可以输出外部存储器的高8位地址,与P0口输出的低8位地址一起构成16位地址,共可寻址64KB的地址空间。当P2口作为高8位地址输出口时,输出锁存器的内容保持不变。作为通用I/O口使用时,P2口为一个准双向口。2.5.4P3口要点:P3口电路中增加了引脚的第二功能,牢记第二功能定义1.P3口的工作原理:P3口可作第二输入/输出功能;P3口也用作第一功能—通用I/O口功能。2.P3口总结要点:P3口内部有上拉电阻,不存在高阻抗输入状态,故为准双向口。注意:用户不需要进行任何设置。2.6时钟电路与时序时钟电路用于产生AT89S51单片机工作时所必需的控制信号。2.6.1时钟电路设计时钟电路两种方式:内部时钟方式,外部时钟方式。1.内部时钟方式片内有一个用于构成振荡器的高增益反相放大器,输入端XTAL1,输出端为XTAL2。这两个引脚外部跨接石英晶体振荡器和微调电容,构成一个稳定的自激振荡器。2.外部时钟方式使用现成的外部振荡器来产生单片机运行所需的时钟脉冲信号,常用于多片AT89S51单片机同时工作,以便于多片AT89S51单片机之间的同步。2.6.2机器周期、指令周期与指令时序1.时钟周期时钟信号的周期。2.机器周期CPU完成一个基本操作所需的时间称为机器周期。执行一条指令的过程需要几个机器周期。每个机器周期完成一个基本操作1个机器周期包括12个时钟周期,分为6个状态:S1~S6。每个状态又分为两拍:P1和P2。因此,一个机器周期中的12个时钟周期表示为S1P1、S1P2、S2P1、S2P2…S6P2。3.指令周期要点:执行一条指令所需的时间。2.7复位操作和复位电路要点:复位是单片机的初始化操作,只需给复位引脚RST加上大于2个机器周期(即24个时钟振荡周期)的高电平就可使AT89S51单片机复位。2.7.1复位操作重点:(非常重要)2.7.2复位电路设计重点:AT89S51典型的复位电路,包括上电复位和按键复位。2.8看门狗定时器(WDT)的使用重点:看门狗的功能;看门狗的工作原理。看门狗的使用。“看门狗”技术就是使用一个计数器来不断计数,监视程序的运行。当看门狗定时器启动运行后,为防止看门狗定时器的不必要溢出而引起非正常的复位,在程序正常运行过程中,应定期地把看门狗定时器清0,以保证看门狗定时器不溢出。2.9低功耗节电模式要点:AT89S51单片机有两种低功耗节电工作模式:downmode)。2.9.1空闲模式要点:1.空闲模式的进入;2.空闲模式的退出2.9.2掉电运行模式要点:1.掉电模式的进入;2.掉电模式的退出3.掉电和空闲模式下的WDT

第3章AT89S51单片机的指令系统教学设计是CPU按照人们的意图来完成某种操作的命令,它以英文名称或缩写形式作为助记符。用助记符、符号地址、标号等表示的书写程序的语言。学习的目的意义:系统地掌握和熟知指令系统的各类汇编语言指令是AT89S51单片机应用程序设计的基础。3.1指令系统概述使用8051的指令系统。基本指令共111条。按所占程序存储器的字节来分,分三种:(1)单字节指令49条;(2)双字节指令45条;(3)三字节指令17条。按指令的执行时间来分,可分三种:(1)1个机器周期(12个时钟振荡周期)的指令64条;(2)2个机器周期(24个时钟振荡周期)的指令45条;(3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。3.2指令格式指令格式:指令的表示方法操作码和操作数:一条指令通常由两部分组成:操作码和操作数。操作码用来规定指令进行什么操作,而操作数则是指令操作的对象。操作码和操作数在单字节指令、双字节指令和三字节指令中的格式。(1)单字节指令:只有一个字节,操作码和操作数同在一个字节中。(2)双字节指令:两个字节,其中一个字节为操作码,另一个字节是操作数。(3)三字节指令:其中,操作码占一个字节,操作数占二个字节。3.3指令系统的寻址方式寻址方式:在指令中说明操作数所在地址的方法。一般来说,寻址方式越多,单片机的功能就越强,灵活性则越大,指令系统也就越复杂。寻址方式所要解决的主要问题:就是如何在整个存储器和寄存器的寻址空间内,灵活方便、快速地找到指定的操作数或地址单元。共有7种寻址方式:1.寄存器寻址方式寄存器寻址方式,就是指令中的操作数为某一寄存器的内容。例如:MOV A,Rn;(Rn)→A,n=0~7寻址范围包括:(1)4组通用工作寄存区,但只对当前工作寄存器区寻址;(2)部分特殊功能寄存器,如累加器A、寄存器B以及数据指针寄存器DPTR等。2.直接寻址方式指令中直接给出操作数的单元地址,该单元地址中的内容就是操作数。例如:MOV A,40H注意:直接寻址方式是对片内所有特殊功能寄存器访问的唯一寻址方式,也是访问内部RAM的128个单元一种寻址方式。3.寄存器间接寻址方式在寄存器中存放的是操作数的地址,即先从寄存器中找到操作数的地址,再按该地址找到操作数。由于操作数是通过寄存器间接得到的,因此称为寄存器间接寻址。为了区别寄存器间接寻址和寄存器寻址,应在寄存器名称前面加前缀标志“@”。例如:MOV A,@Ri;i=0或14.立即数寻址方式直接在指令中给出操作数也叫立即数。为了与直接地址加以区别,需在操作数前面加前缀标志“#”。例如指令:MOVA,#40H表示把立即数数40H送给A。5.基址寄存器加变址寄存器间址寻址方式以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,并以两者内容相加形成的16位地址作为目的地址进行寻址的方式。指令只有3条:MOVC A,@A+DPTRMOVC A,@A+PCJMP @A+DPTR前两条指令用于读程序存储器中固定的数据。例如,表格参数,在程序运行中由A的动态参量来确定读取对应的表格参数。第3条指令为散转指令,A中的内容为程序运行后的动态结果,执行该指令,可根据A中的不同内容,实现跳向不同程序入口的跳转。6.相对寻址方式为程序跳转而设置。重点掌握相对偏移量(rel)。转移的目的地址可用下式来计算:目的地址=转移指令所在的地址+转移指令字节数+rel偏移量rel是单字节的带符号的8位二进制数补码数。它表示的数的范围是–128~+127。因此,程序的转移范围是以转移指令的下条指令首地址为基准地址,相对偏移在–128~+127单元之间。 编写程序时,只需在转移指令中直接写上要转向的地址标号就可以了。例如: SJMP LOOP“LOOP”即为要转向的目的地址标号。程序汇编时,由汇编程序自动计算和填入偏移量。但是手工汇编时,偏移量的值需编程人员手工计算。7.位寻址方式对内部RAM和特殊功能寄存器具有位寻址功能的某位内容进行置“1”和清“0”操作。位地址一般以直接位地址给出,例如指令:MOV C,40H就是把位地址为40H的值送到进位位C。问题:如何来确定指令的寻址方式?例如指令:MOVA,#40H,它究竟是属于立即数寻址还是还是寄存器寻址?这要看以哪个操作数作为参照系。因为操作数可分为源操作数和目的操作数。对于源操作数“#40H”来说,是“立即数寻址”方式,但对目的操作数“A”来说,是属于“寄存器寻址”方式。一般而言,寻址方式指的是源操作数,所以此例为立即数寻址方式。指令系统的7种寻址方式概括如表3-1所示,应了解。表3-17种寻址方式及其寻址空间序号寻址方式寻址空间1寄存器寻址R0~R7、A、B、C(位)、DPTR等2直接寻址内部128字节RAM、特殊功能寄存器3寄存器间接寻址片内数据存储器、片外数据存储器4立即数寻址程序存储器中的立即数5基址寄存器加变址寄存器间接寻址读程序存储器固定数据和程序散转6相对寻址程序存储器相对转移7位寻址内部RAM中的可寻址位、SFR中的可寻址位3.4AT89S51指令系统分类介绍111条指令,按功能可分为下面五大类:(1)数据传送类(28条)(2)算术运算类(24条)(3)逻辑操作类(25条)(4)控制转移类(17条)(5)位操作类(17条)分类介绍前,先掌握指令中一些符号的含义:Rn,Ri,direct,#data,#data16,rel,DPTR,bit,C或Cy,addr11,addr16,@,(X),((X))。3.4.1数据传送类指令使用最频繁的一类指令。助记符“MOV”,通用格式如下:MOV<目的操作数>,<源操作数>数据传送类指令就是把源操作数传送到目的操作数。操作属“复制”性质,而不是“搬家”。数据传送类指令不影响标志位,但不包括检验累加器的奇偶标志位P。1.以累加器为目的操作数的指令MOV A,Rn ;(Rn)→A,n=0~7MOV A,@Ri ;((Ri))→A,i=0,1MOV A,direct ;(direct)→AMOV A,#data ;#data→A功能:是把源操作数的内容送入累加器A,源操作数有寄存器寻址、直接寻址、间接寻址和立即数寻址等方式,例如指令:MOV A,R6 ;(R6)→A,寄存器寻址MOV A,@R0 ;((R0))→A,间接寻址MOV A,70H ;(70H)→A,直接寻址MOV A,#78H ;78H→A,立即数寻址2.以Rn为目的操作数的指令MOV Rn,A ;(A)→Rn,n=0~7MOV Rn,direct ;(direct)→Rn,n=0~7MOV Rn,#data ;#data→Rn,n=0~73.以直接地址direct为目的操作数的指令MOV direct,A ;(A)→directMOV direct,Rn ;(Rn)→direct,n=0~7MOV direct1,direct2 ;(direct2)→direct1MOV direct,@Ri ;((Ri))→direct,i=0,1MOV direct,#data ;#data→direct4.以寄存器间接地址为目的操作数的指令MOV @Ri,A ;(A)→(Ri),i=0,1MOV @Ri,direct ;(direct)→(Ri),i=0,1MOV @Ri,#data ;#data→(Ri),i=0,15.16位数传送指令MOV DPTR,#data16 ;#data16→DPTR注意:AT89S51设有两个DPTR,通过设置特殊功能寄存器AUXR1中的DPS位来选择。DPTR既是一个16位的数据指针,又可分为DPH和DPL两个8位的寄存器进行操作,十分灵活方便。设有两个DPTR后,就可避免频繁的出入堆栈操作。6.堆栈操作指令堆栈:在AT89S51内部RAM中可以设定一个后进先出(LIFO,LastInFirstOut)的区域。注意:堆栈只能设在内部RAM,不能设在外部RAM。堆栈指针SP(特殊功能寄存器)指定堆栈的栈顶位置。堆栈操作有进栈和出栈两种,两条堆栈操作指令。(1)进栈指令PUSH direct功能:先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示的内部RAM单元中。例如:当(SP)=60H,(A)=30H,(B)=70H时,执行下列指令PUSH Acc ;(SP)+1=61H→SP,(A)→61HPUSH B ;(SP)+1=62H→SP,(B)→62H结果为(61H)=30H,(62H)=70H,(SP)=62H。(2)出栈指令POP direct功能:这条指令的功能是,将栈指针SP指示的栈顶(内部RAM单元)内容送入direct字节单元中,栈指针SP减1。例如:当(SP)=62H,(62H)=70H,(61H)=30H时,执行下列指令POP DPH ;((SP))→DPH,(SP)-1→SPPOP DPL ;((SP))→DPL,(SP)-1→SP结果为(DPTR)=7030H,(SP)=60H。7.累加器A与外部数据存储器RAM/IO传送指令MOVX A,@DPTR ;((DPTR))→A,读外部RAM/IOMOVX A,@Ri ;((Ri))→A,读外部RAM/IOMOVX @DPTR,A ;(A)→((DPTR)),写外部RAM/IOMOVX @Ri,A ;(A)→((Ri)),写外部RAM/IO注意:助记符在MOV的后面加“X”,“X”的含义解释清楚。难点:所以在执行前两条指令时,(P3.7)有效;执行后两条指令时,(P3.6)有效,要牢记。8.查表指令共两条单字节指令:(1)第一条查表指令:MOVC A,@A+PC以PC作为基址寄存器,A的内容作为无符号整数和PC的当前值(下一条指令的起始地址)相加后得到一个新的16位地址,把该地址指定的程序存储单元的内容送到累加器A。例如:当(A)=30H时,执行地址1000H处的指令1000H:MOVC A,@A+PC该指令占用一个字节,下一条指令的地址为1001H,(PC)=1001H再加上A中的30H,得1031H,结果是将程序存储器中1031H的内容送入累加器A。优点:不改变特殊功能寄存器及PC的状态,根据A的内容就可以取出表格中的常数。缺点:表格只能存放在该条查表指令所在地址的+256个单元之内,表格的大小受到限制,而且表格只能被一段程序所利用。(2)第二条查表指令:MOVCA,@A+DPTR以DPTR作为基址寄存器,A的内容作为无符号数和DPTR的内容相加得到一个16位地址,把由该地址指定的程序存储器单元的内容送到累加器A。例如:(DPTR)=8100H,(A)=40H,执行指令MOVC A,@A+DPTR结果是将程序存储器中8140H单元内容送入累加器A中。注意:这条查表指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址及常数表格存放的地址无关,因此表格的大小和位置可以在64KB程序存储器空间中任意安排,一个表格可以为各个程序块公用。MOV的后面加“C”,“C”的含义?执行上述两条指令时,单片机的引脚信号(程序存储器读)有效,要牢记。9.字节交换指令XCH A,Rn ;(A)(Rn),n=0~7XCH A,direct ;(A)(direct)XCH A,@Ri ;(A)((Ri)),i=0,1功能:将累加器A的内容和源操作数的内容相互交换。源10.半字节交换指令XCHD A,@Ri功能:累加器的低4位与内部RAM低4位交换。3.4.2算术运算类指令单字节加、减、乘、除法指令,都是针对8位二进制无符号数。算术运算的结果将使PSW中的进位(Cy)、辅助进位(Ac)、溢出(OV)3种标志位置“1”或清“0”,但是增1和减1指令不影响这些标志。1.加法指令4条加法运算指令:ADDA,Rn ;(A)+(Rn)→A,n=0~7ADDA,direct ;(A)+(direct)→AADDA,@Ri ;(A)+((Ri))→A,i=0,1ADDA,#data ;(A)+#data→A注意:使用加法指令时,要累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则进位标志Cy置“1”,否则Cy清“0”。(2)如果位3有进位,辅助进位标志Ac置“1”,否则Ac(Ac为PSW寄存器中的一位)清“0”。(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有进位,则溢出标志位OV置“1”,否则OV清“0”。溢出标志位OV的状态,只有进行带符号数加法运算时才有意义。当两个带符号数相加时,OV=1,表示加法运算超出了累加器A所能表示的带符号数的有效范围(-128~+127),即产生了溢出,表示运算结果是错误的,否则运算是正确的,即无溢出产生。【例3-1】(A)=53H,(R0)=FCH,执行指令ADD A,R001010011111111000101001111111100+)101001111结果为(A)=4FH,Cy=1,Ac=0,OV=0,P=1(A中“1”的位数为奇数)。注意:在上面的运算中,由于位6和位7同时有进位,所以标志位OV=0。【例3-2】(A)=85H,(R0)=20H,(20H)=AFH,执行指令ADDA,@R010000101101011111000010110101111+)100110100结果为(A)=34H,Cy=1,Ac=1,OV=1,P=1。注意:由于位7有进位,而位6无进位,所以标志位OV=1。2.带进位加法指令特点:是进位标志位Cy参加运算,因此带进位的加法运算是三个数相加。指令共4条:ADDCA,Rn ;(A)+(Rn)+C→A,n=0~7ADDCA,direct ;(A)+(direct)+C→AADDCA,@Ri ;(A)+((Ri))+C→A,i=0,1ADDCA,#data ;(A)+#data+C→A注意:如果位7有进位,则进位标志Cy置“1”,否则Cy清“0”;如果位3有进位输出,则辅助进位标志Ac置“1”,否则Ac清“0”;如果位6有进位而位7没有进位,或者位7有进位而位6没有进位,则溢出标志OV置“1”,否则标志OV清“0”。【例3-3】(A)=85H,(20H)=FFH,Cy=1,执行指令ADDC A,20H运算式为结果为

(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位数为奇数)。3.增1指令共有5条增1指令:INCAINCRn ;n=0~7INCdirectINC@Ri ;i=0,1INCDPTR这组增1指令的功能是把指令中所指出的变量增1,且不影响程序状态字PSW中的任何标志。若变量原来为FFH,加1后将溢出为00H(仅指前4条指令),标志也不会受到影响。第5条指令“INC DPTR”,是16位数增1指令。指令首先对低8位指针DPL的内容执行加1操作,当产生溢出时,就对DPH的内容进行加1操作,并不影响标志Cy的状态。4.十进制调整指令注意:本十进制调整指令具有一定难度,需加深理解。十进制调整指令指令格式为:DA A功能:是对压缩的BCD码(一个字节存放2位BCD码)的加法结果进行十进制调整。两个BCD码按二进制相加之后,须经本指令的调整才能得到正确的压缩BCD码的和数。(1)十进制调整问题二进制数的加法运算原则上并不能适用于十进制数的加法运算,有时会产生错误结果。例如:0011+)0011+) 011010010111+)

100011111001+)

10001

0001上述的BCD码运算中:(a)运算结果正确。(b)运算结果不正确,因为十进制数的BCD码中没有1111这个编码。(c)运算结果也不正确,正确结果应为17,而运算结果却是11。情况表明,二进制数加法指令不能完全适用于BCD码十进制数的加法运算,因此要对结果做有条件的修正,这就是所谓的十进制调整问题。(2)出错原因和调整方法出错原因在于BCD码是4位二进制编码,共有16个编码,但BCD码只用了其中的10个,剩下6个没用到。这6个没用到的编码(1010,1011,1100,1101,1110,1111)为无效编码。BCD码加法中,凡结果进入或者跳过无效编码区时,其结果就是错误的。因此1位BCD码加法运算出错的情况有以下两种:①相加结果大于9,说明已经进入无效编码区。②相加结果有进位,说明已经跳过无效编码区。无论哪一种出错情况,都是因为6个无效编码造成的。因此,只要出现上述两种情况之一,就必须进行调整。调整的方法是把运算结果加6调整,即所谓的十进制调整修正。十进制调整的修正方法如下:①累加器低4位大于9或辅助进位位Ac=1,则进行低4位加6修正。②累加器高4位大于9或进位位Cy=1,则进行高4位加6修正。③累加器高4位为9,低4位大于9,则高4位和低4位分别加6修正。上述十进制调整修正,是通过执行指令“DAA”来自动实现的。【例3-4】(A)=56H,(R5)=67H,把它们看作两个压缩的BCD数,进行BCD数加法。执行指令:ADD A,R5DA A由于高4位和低4位分别大于9,所以“DAA”指令要分别加6,来对结果进行修正。010101100101011001100111+)1011110101100110+)1

00100011十进制调整,高、低4位分别加6结果为(A)=23H,Cy=1。由上可见,56+67=123,结果是正确的。5.带借位的减法指令共有4条指令:SUBB A,Rn ;(A)-(Rn)-Cy→A,n=0~7SUBB A,direct ;(A)-(direct)-Cy→ASUBB A,@Ri ;(A)-((Ri))-Cy→A,i=0,1SUBB A,#data ;(A)-#data-Cy→A是从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存放在累加器A中。如果位7需借位则Cy置“1”,否则Cy清“0”;如果位3需借位则Ac置“1”,否则Ac清“0”;如果位6需借位而位7不需要借位,或者位7需借位而位6不需借位,则溢出标志位OV置“1”,否则OV清“0”。源操作数允许有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。【例3-5】(A)=C9H,(R2)=54H,Cy=1,执行指令SUBB A,R20111010011001001011101001100100101010100-)1结果为

(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)。6.减1指令共有4条指令:DEC A ;(A)-1→ADEC Rn ;(Rn)-1→Rn,n=0~7DEC direct ;(direct)-1→directDEC @Ri ;((Ri))-1→(Ri),i=0,1功能:指定的变量减1。若原来为00H,减1后下溢为FFH,不影响标志位(P标志除外)。【例3-6】(A)=0FH,(R7)=19H,(30H)=00H,(R1)=40H,(40H)=0FFH,执行指令DEC A ;(A)-1→ADEC R7 ;(R7)-1→R7DEC 30H ;(30H)-1→30HDEC @R1 ;((R1))-1→(R1)结果为

(A)=0EH,(R7)=18H,(30H)=0FFH,(40H)=0FEH,P=1,不影响其他标志。7.乘法指令MUL AB ;A×B→BA功能:把累加器A和寄存器B中的无符号8位整数相乘,其16位积的低位字节在累加器A中,高位字节在B中。如果积大于255,则溢出标志位OV置“1”。8.除法指令DIV AB ;A/B→A(商),余数→B功能:是用累加器A中8位无符号整数(被除数)除以B中8位无符号整数(除数),所得的商(为整数)存放在累加器A中,余数存放在寄存器B中,且Cy和溢出标志位OV清“0”。如果B的内容为“0”(即除数为“0”),则存放结果的A、B中的内容不定,并溢出标志位OV置“1”。【例3-7】(A)=FBH,(B)=12H,执行指令DIV AB结果:(A)=0DH,(B)=11H,Cy=0,OV=0。3.4.3逻辑操作类指令1.累加器A字节清“0”指令CLR A功能:累加器A清“0”。不影响Cy、Ac、OV等标志位。2.累加器A字节求反指令CPL A功能:是将累加器A的内容按位逻辑取反,不影响标志位。3.左环移指令RL A功能:向左循环移位,位7循环移入位0,不包括标志位移位。如图3-1所示。图3-1左环移指令的移位示意图4.带进位左环移指令RLC A功能:将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影响其他标志位。如图3-2所示。图3-2带进位左环移指令的移位示意图5.右环移指令RR A功能:累加器A的内容向右环移一位,Acc.0移入Acc.7,不包括标志位移位。见图3-3。图3-3右环移指令的移位示意图6.带进位右环移指令RRC A功能:累加器A的内容和进位标志Cy一起向右环移一位。见图3-4。图3-4带进位右环移指令的移位示意图7.累加器半字节交换指令SWAPA功能:累加器A的高半字节与低半字节(Acc.3~Acc.0)。【例3-8】(A)=95H,执行指令SWAPA结果为

(A)=59H。8.逻辑与指令ANL A,Rn ;(A)∧(Rn)→A,n=0~7ANL A,direct ;(A)∧(direct)→AANL A,#data ;(A)∧#data→AANL A,@Ri ;(A)∧((Ri))→A,i=0~1ANL direct,A ;(direct)∧(A)→directANL direct,#data ;(direct)∧#data→direct功能:在指定的变量之间以位为基础进行“逻辑与”操作,结果存放到目的变量所在的寄存器或存储器中。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。【例3-9】(A)=07H,(R0)=0FDH,执行指令ANL A,R000000111111111010000011111111101∧)00000101结果为

(A)=05H。9.逻辑或指令ORL A,Rn ;(A)∨(Rn)→A,n=0~7ORL A,direct ;(A)∨(direct)→AORL A,#data ;(A)∨#data→AORL A,@Ri ;(A)∨((Ri))→A,i=0,1ORL direct,A ;(direct)∨(A)→directORL direct,#data ;(direct)∨#data→direct功能:是在所指定的变量之间执行以位为基础的“逻辑或”操作,结果存到目的变量寄存器或存储器中。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。【例3-10】(P1)=05H,(A)=33H,执行指令ORL P1,A0000010100110011000001010011001100110111∨)结果为

(P1)=37H。10.逻辑异或指令XRL A,Rn ;(A)⊕(Rn)→A,n=0~7XRL A,direct ;(A)⊕(direct)→AXRL A,@Ri ;(A)⊕((Ri))→A,i=0,1XRL A,#data ;(A)⊕#data→AXRL direct,A ;(direct)⊕(A)→directXRL direct,#data ;(direct)⊕#data→direct功能:是在所指定的变量之间执行以位为基础的“逻辑异或”,结果存目的变量寄存器或存储器中。操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址方式。【例3-11】(A)=90H,(R3)=73H,执行指令XRL A,R3运算式为11100011111000111001000001110011⊕)结果为

(A)=E3H。3.4.4控制转移类指令1.长转移指令LJMP addr16无条件地转向addr16指定的目的地址。目的地址可以是64KB程序存储器地址空间的任何位置。2.相对转移指令SJMP relrel为相对偏移量,所能实现的程序转移是双向的。rel如为正,则向地址增大的方向转移;rel如为负,则向地址减小的方向转移。执行该指令时,在PC加2(本指令为2B)之后,把指令的有符号的偏移量rel加到PC上,并计算出目的地址,因此目的地址可以在与该指令相邻的下一条指令的-128~+127单元之间。编写程序时,只需在相对转移指令中直接写上要转向的目的地址标号就可以了,相对偏移量由汇编程序自动计算。例如:LOOP: MOV A,R6

……

SJMP LOOP

……程序在汇编时,转移到LOOP处的偏移量由汇编程序自动计算和填入。3.绝对转移指令AJMP addrllAJMP指令为双字节,格式如下:第1字节A10A9A800001第2字节A7A6A5A4A3A2A1A0注意:转移的目标地址必须与AJMP指令的下一条指令首地址的高5位地址码A15~A11相同,否则将引起混乱。本指令是2KB范围内的无条件跳转指令,是为了与MCS-48的JMP指令兼容而设。4.间接跳转指令JMP@A+DPTR单字节转移指令,转移的目的地址由A中8位无符号数与DPTR的16位无符号数内容之和来确定。应用举例:经常用于键盘的散转程序中以及查表的散转。5.条件转移指令重点:记住转移条件。转移条件满足,则转移;条件不满足,则顺序执行指令。目的地址在以下一条指令首地址为中心的256B范围内(-128~+127)。当条件满足时,PC装入下一条指令的第一个字节地址,再把带符号的相对偏移量rel加到PC上,计算出要转向的目的地址。JZ rel ;如果累加器内容为“0”,则执行转移JNZ rel ;如果累加器内容非“0”,则执行转移6.比较不相等转移指令CJNE A,direct,relCJNE A,#data,relCJNE Rn,#data,relCJNE @Ri,#data,rel功能:比较前面两个操作数的大小,它们的值不相等则转移,则跳转。否则往下执行。7.减1不为0转移指令把减1与条件转移两种功能结合在一起的指令。共两条:DJNZ Rn,rel ;n=0~7DJNZ direct,rel将源操作数(Rn或direct)减1,结果回送到Rn寄存器或direct中。如果结果不为0则转移。说明:本指令主要用于控制程序循环,允许程序员把寄存器Rn或direct单元用作程序循环计数器。是程序设计中经常用到的指令,要牢记。8.调用子程序指令(1)长调用指令LCALL addr16LCALL指令可以调用64KB范围内程序存储器中的任何一个子程序。(2)绝对调用指令ACALL addrll与AJMP指令类似,是为了与MCS-48中的CALL指令兼容而设。指令格式如下:第1字节A10A9A801001第2字节A7A6A5A4A3A2A1A02KB范围内的调用子程序的指令。9.子程序的返回指令RET执行本指令时((SP))→PCH,然后(SP)-1→SP((SP))→PCL,然后(SP)-1→SP功能:从堆栈中退出PC的高8位和低8位字节,把栈指针减2,从PC值处开始继续执行程序。它不影响任何标志位。10.中断返回指令RETI功能和RET指令相似,两条指令的不同之处在于该指令清除了在中断响应时被置“1”的AT89S51内部中断优先级寄存器的中断优先级状态,其他操作均与RET指令相同。注意:RETI与RET指令的差别。11.空操作指令NOPCPU不进行任何实际操作,只消耗一个机器周期的时间。3.4.5位操作类指令指令系统对位地址空间具有丰富的位操作指令。1.数据位传送指令MOV C,bitMOV bit,C功能:把由源操作数指定的位变量送到目的操作数指定的单元中。其中一个操作数必须为进位标志,另一个可以是任何直接寻址位。不影响其他寄存器或标志位。例如:MOV C,06H ;(20H).6→Cy2.位变量修改指令CLR C ;Cy位清“0”CLR bit ;bit位清“0”CPL C ;Cy位求反CPL bit ;bit位求反SETB C ;Cy位置“1”SETB bit ;bit位置“1”这组指令将操作数指定的位清“0”、求反、置“1”,不影响其他标志位。例如:CLR C ;Cy位清“0”CLR 27H ;0→(24H).7位CPL 08H ;→(21H).0位SETB P1.7 ;P1.7位置“1”3.位变量逻辑与指令ANL C,bit ;bit∧Cy→CyANL C,/bit ;∧Cy→Cy4.位变量逻辑或指令ORL C,bitORL C,/bit5.条件转移类指令JC rel ;如果进位标志位Cy=1,则转移JNC rel ;如果进位标志位Cy=0,则转移JB bit,rel ;如果直接寻址位=1,则转移JNB bit,rel ;如果直接寻址位=0,则转移JBC bit,rel ;如果直接寻址位=1,则转移,并把寻址位清“0”注意:关注注释中的转移条件。3.5AT89S51指令汇总作为指令系统的总结,表3-2列出了按功能排列的全部的AT89S51指令助记符及功能简要说明,以及指令长度、执行时间和指令代码(机器代码)。可根据指令助记符,迅速查到对应的指令代码(手工汇编)。也可根据指令代码迅速查到对应的指令助记符(手工反汇编)。由于指令条数多,不宜死记硬背,应通过在程序的编写中,多加练习,在实践中不断掌握和巩固常用的指令。应该熟练地查阅表3-2,正确理解指令的功能及特性,正确地使用指令。表3-2按功能排列的指令表助记符说明字节数执行时间(机器周期)指令代码(机器代码)1.数据传送类MOVA,Rn寄存器内容传送到累加器A11E8H~EFHMOVA,direct直接寻址字节传送到累加器21E5H,directMOVA,@Ri间接寻址RAM传送到累加器11E6H~E7HMOVA,#data立即数传送到累加器2174H,dataMOVRn,A累加器内容传送到寄存器11F8H~FFHMOVRn,direct直接寻址字节传送到寄存器22A8H~AFH,directMOVRn,#data立即数传送到寄存器2178H~7FH,dataMOVdirect,A累加器内容传送到直接寻址字节21F5H,directMOVdirect,Rn寄存器内容传送到直接寻址字节2288H~8FH,directMOVdirect1,direct2直接寻址字节2传送到直接寻址字节13285H,direct2,direct1MOVdirect,@Ri间接寻址RAM传送到直接寻址字节2286H~87H,directMOVdirect,#data立即数传送到直接寻址字节3275H,direct,dataMOV@Ri,A累加器传送到间接寻址RAM11F6H~F7HMOV@Ri,direct直接寻址字节传送到间接寻址RAM22A6H~A7H,directMOV@Ri,#data立即数数传送到间接寻址RAM2176H~77H,dataMOVDPTR,#data1616位常数装入到数据指针3290H,dataH,dataLMOVCA,@A+DPTR程序存储器代码字节传送到累加器1293HMOVCA,@A+PC程序存储器代码字节传送到累加器1283HMOVXA,@Ri外部RAM(8位地址)传送到A12E2H~E3HMOVXA,@DPTR外部RAM(16位地址)传送到A12E0HMOVX@Ri,A累加器传送到外部RAM(8位地址)12F2H~F3HMOVX@DPTR,A累加器传送到外部RAM(16位地址)12F0HPUSHdirect直接寻址字节压入栈顶22C0H,directPOPdirect栈顶字节弹到直接寻址字节22D0H,directXCHA,Rn寄存器和累加器交换11C8H~CFHXCHA,direct直接寻址字节和累加器交换21C5H,directXCHA,@Ri间接寻址RAM和累加器交换11C6H~C7HXCHDA,@Ri间接寻址RAM和累加器交换低半字节11D6H~D7HSWAPA累加器内高低半字节交换11C4H2.算术运算类ADDA,Rn寄存器内容加到累加器1128H~2FHADDA,direct直接寻址字节内容加到累加器2125H,directADDA,@Ri间接寻址RAM内容加到累加器1126H~27HADDA,#data立即数加到累加器2124H,data(续表)助记符说明字节数执行时间(机器周期)指令代码(机器代码)ADDCA,Rn寄存器加到累加器(带进位)1138H~3FHADDCA,direct直接寻址字节加到累加器(带进位)2135H,directADDCA,@Ri间接寻址RAM加到累加器(带进位)1136H~37HADDCA,#data立即数加到累加器(带进位)2134H,dataSUBBA,Rn累加器内容减去寄存器内容(带借位)1198H~9FHSUBBA,direct累加器内容减去直接寻址字节(带借位)2195H,directSUBBA,@Ri累加器内容减去间接寻址RAM(带借位)1196H~97HSUBBA,#data累加器减去立即数(带借位)2194H,dataINCA累加器增11104HINCRn寄存器增11108H~0FHINCdirect直接寻址字节增12105H,directINC@Ri间接寻址RAM增11106H~07HDECA累加器减11114HDECRn寄存器减11118H~1FHDECdirect直接寻址字节减12115H,directDEC@Ri间接寻址RAM减11116H~17HINCDPTR数据指针增112A3HMULAB累加器和寄存器B相乘14A4HDIVAB累加器除以寄存器B1484HDAA累加器十进制调整11D4H3.逻辑操作类ANLA,Rn寄存器“逻辑与”到累加器1158H~5FHANLA,direct直接寻址字节“逻辑与”到累加器2155H,directANLA,@Ri间接寻址RAM“逻辑与”到累加器1156H~57HANLA,#data立即数“逻辑与”到累加器2154H,dataANLdirect,A累加器“逻辑与”到直接寻址字节2152H,directANLdirect,#data立即数“逻辑与”到直接寻址字节3153H,direct,dataORLA,Rn寄存器“逻辑或”到累加器1148H~4FHORLA,direct直接寻址字节“逻辑或”到累加器2145H,directORLA,@Ri间接寻址RAM“逻辑或”到累加器1146H~47HORLA,#data立即数“逻辑或”到累加器2144H,dataORLdirect,A累加器“逻辑或”到直接寻址字节2242H,directORLdirect,#data立即数“逻辑或”到直接寻址字节3243H,direct,dataXRLA,Rn寄存器“逻辑异或”到累加器1168H~6FHXRLA,direct直接寻址字节“逻辑异或”到累加器2165H,direct(续表)助记符说明字节数执行时间(机器周期)指令代码(机器代码)XRLA,@Ri间接寻址RAM字节“逻辑异或”到累加器1166H~67HXRLA,#data立即数“逻辑异或”到累加器2164H,dataHXRLdirect,A累加器“逻辑异或”到直接寻址字节2162H,directXRLdirect,#data立即数“逻辑异或”到直接寻址字节3263H,direct,dataCLRA累加器清“0”11E4HCPLA累加器求反11F4HRLA累加器循环左移1123HRLCA经过进位标志位的累加器循环左移1133HRRA累加器循环右移1103HRRCA经过进位标志位的累加器循环右移1113H4.控制转移类ACALLaddrll绝对调用子程序22a10a9a810001,addr(7~0)LCALLaddr16长调用子程序3212H,addr(15~8),addr(7~0)RET子程序返回1222HRETI中断返回1232HAJMPaddrll绝对转移22a10a9a800001,addr(7~0)LJMPaddr16长转移3202H,addr(15~8),addr(7~0)SJMPrel短转移(相对偏移)2280H,relJMP@A+DPTR相对DPTR的间接转移1273HJZRel累加器为零则转移2260H,relJNZrel累加器为非零则转移2270H,relCJNEA,direct,rel比较直接寻址字节和A,不相等则转移32B5H,direct,relCJNEA,#data,rel比较立即数和A,不相等则转移32B4H,data,relCJNERn,#data,rel比较立即数和寄存器,不相等则转移32B8H~BFH,data,relCJNE@Ri,#data,rel比较立即数和间接寻址RAM,不相等则转移32B6H~B7H,data,relDJNZRn,rel寄存器减1,不为零则转移22D8H~DFH,relDJNZdirect,rel地址字节减1,不为零则转移32D5H,direct,relNOP空操作1100H(续表)助记符说明字节数执行时间(机器周期)指令代码(机器代码)5.位操作类CLRC进位标志位清“0”11C3HCLRbit直接寻址位清“0”21C2H,bitSETBC进位标志位置“1”11D3HSETBbit直接寻址位置“1”21D2H,bitCPLC进位标志位取反11B3HCPLbit直接寻址位取反21B2H,bitANLC,bit直接寻址位“逻辑与”到进位标志位2282H,bitANLC,/bit直接寻址位的反码“逻辑与”到进位标志位22B0H,bitORLC,bit直接寻址位“逻辑或”到进位标志位2272H,bitORLC,/bit直接寻址位的反码“逻辑或”到进位标志位22A0H,bitMOVC,bit直接寻址位传送到进位标志位22A2H,bitMOVbit,C进位标志位传送到直接寻址标志位2292H,bitJCrel进位标志位为1则转移2240H,relJNCrel进位标志位为零则转移2250H,relJBbit,rel直接寻址位为1则转移3220H,bit,relJNBbit,rel直接寻址位为零则转移3230H,bit,relJBCbit,rel直接寻址位为1则转移,并清除该位3210H,bit,rel3.6某些指令的说明对某些指令使用中的一些细节问题,作进一步说明。1.关于并行I/O口的“读引脚”和“读锁存器”指令的区别第2章介绍的AT89S51的并行I/O口内部结构,读并行I/O口有“读引脚”和“读锁存器”之分。以P1口为例,当P1口的P1.0引脚外接一个发光二极管LED的阳极,LED的阴极接地。若想查看一下单片机刚才向P1.0脚输出的信息是“0”还是“1”,这时不能直接从P1.0脚读取,因为单片机刚才向P1.0输出的信息如果是“1”的话,则LED导通点亮,此时P1.0引脚就为“0”电平,如果直接读引脚,结果显然是错误的。正确的做法是读D锁存器的Q端状态,那里储存的才是前一时刻送给P1.0的真实值。也就是说,凡遇“读取P1口前一状态以便修改后再送出”的情形,都应当“读锁存器”的Q端信息,而不是读取引脚的信息。当P1口外接输入设备时,要想P1口引脚上反映的是真实的输入信号,必须要设法先让该引脚内部的场效应管截止才行(见教材图2-7),否则当场效应管导通时,P1口引脚上将永远为低电平,无法正确反映外设的输入信号。让场效应管截止,就是用指令给P1口的相应位送一个“1”电平,这就是为什么读引脚之前,一定要先送出“1”的原因。指令“MOV C,P1.0”读的是P1.0引脚,同样,指令“MOVA,P1”也是读引脚指令,读引脚指令之前一定要有向P1.0写“1”的指令。而指令“CPLP1.0”则是“读锁存器”,也即“读-修改-写”指令,它会先读P1.0的锁存器的Q端状态,接着取反,然后再送到P1.0引脚上。而指令“ANLP1,A”也是“读锁存器”命令。类似的“读-修改-写”指令举例如下:INC P1XRL P3,AORL P2,AANL P1,ACPL P3.02.关于操作数的字节地址和位地址的区分问题如何区别指令中出现的字节变量和位变量?例如指令“MOVC,40H”和指令“MOVA,40H”两条指令中的助记符相同,但是指令中源操作数“40H”都是以直接地址形式给出的,“40H”究竟是字节地址还是位地址?对于助记符相同的指令,观察操作数就可看出。显然前条指令中的“40H”肯定是位地址,因为目的操作数C是位变量。而后条指令中的“40H”肯定是字节地址,因为目的操作数A是字节变量。当然,对于助记符不同的指令,从助记符的形式,就可看出其中指令究竟是“字节”操作,还是“位”操作,也就是说,从助记符的不同就可看出。3.关于累加器A与Acc的书写问题累加器可写成A,也可写成Acc,它们的区别是什么?在8051单片机汇编语言指令中是有区别的。Acc在汇编后的机器码必有一个字节的操作数是累加器的字节地址E0H,A在汇编后则隐含在指令操作码中。例如指令“INCA”的机器码,查表3-2是04H。如写成“INCAcc”后,则成了“INCdirect”的格式,再查表3-2,对应的机器码为“05HE0H”。在对累加器A的直接寻址和累加器A的某一位寻址要用Acc,而不能写成A。例如,指令“POPAcc”不能写成“POPA”;指令“SETBAcc.0”,不能写成“SETBA.0”。4.书写两位16进制数据前要加“0”在书写源程序时经常遇到必须在某些数据或地址的前面多填一个“前导”0的问题,否则在汇编成时机器语言汇编就通不过?这是汇编语言的严格性和规范性的具体体现。由于部分十六进制数是用字母来表示的,而程序内的标号也常用字母表示,为了将标号和数据区分开,几乎所有的汇编语言都规定,凡是以字母开头(对十六进制数而言,就是A~F开头)的数字量,应当在前面添加一个数字“0”。至于地址量,它也是数据量的一种,前面也应该添加“0”。例如:MOV A,#0F0H ;“F0”以字母开头的数据量MOV A,0F0H ;“F0”以字母开头的地址量如果不加“前导”0,就会把字母开头的数据量当作标号来处理,从而出错以及不能通过汇编。

第4章AT89S51汇编语言程序设计教学设计【概要】第3章介绍了汇编语言指令系统。由于汇编语言是面向机器硬件的语言,也是能直接控制单片机硬件的编程语言。因此,要求程序设计者对AT89S51单片机具有很好的“软、硬结合”的功底。本章介绍:(1)使用AT89S51汇编语言进行程序设计的基本知识(2)如何使用汇编语言指令来进行一些基本的程序设计,重点是子程序设计、查表程序设计、循环程序设计。4.1汇编语言程序设计概述程序设计:程序是若干指令的有序集合,编写这一指令序列的过程。4.1.1单片机编程语言重点:汇编语言和高级语言的各自优缺点1.汇编语言弄清以下名词和概念。汇编语言:采用助记符(英文缩写字符)表示的指令。汇编语言源程序:用汇编语言编写的程序。汇编:汇编语言源程序转换成为二进制代码的机器语言程序的转换(翻译)过程。汇编程序:完成“翻译”工作的程序。目标程序:经汇编程序“汇编”得到的以“0”、“1”代码形式表示的机器语言程序。优点:用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此用汇编语言能编写出最优化的程序,、缺点:可读性差。汇编语言离不开具体计算机的硬件,与硬件紧密相关。因此,汇编语言是属于面向“硬件”的语言,缺乏通用性。2.高级语言优点:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。近年来在单片机的程序设计方面已经较为广泛地采用了高级语言,目前多数的51单片机用户在使用C语言来进行程序设计。用C语言进行单片机的软件开发,可大大缩短开发周期,且明显地增加软件的可读性,便于改进和补充。但在对程序空间和时间要求很高的场合,汇编语言仍是必不可少的。在这种场合下,可使用C语言和汇编语言混合编程。从某种意义上来说,掌握汇编语言并能使用汇编语言来进行程序设计,是学习和掌握单片机程序设计的基本功之一。4.1.2汇编语言语句和格式汇编语言语句分为指令语句和伪指令语句。指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。伪指令语句:伪指令语句是控制汇编(翻译)过程的一些控制命令。汇编时没有机器代码与之对应。汇编语言的四分段格式:标号字段(LABLE)操作码字段(OPCODE)操作数字段(OPRAND)注释字段(COMMENT)上述格式中,标号字段和操作码字段之间要有冒号“:”分隔;操作码字段和操作数字段间的分界符是空格;双操作数之间用逗号相隔;操作数字段和注释字段之间的分界符用分号“;”。任何语句都必须有操作码字段,其余各段为任选项。【例4-1】下面是一段汇编语言程序的四分段书写格式。标号字段操作码字段操作数字段注释字段START:MOV A,#00H ;0→A

MOV R1,#10 ;10→R1MOV R2,#00000011B ;03H→R2LOOP: ADD A,R2 ;(A)+(R2)→ADJNZ R1,LOOP ;R1内容减1不为零,则跳LOOP处继续循环NOPHERE: SJMP HERE4个字段的作用及应遵守的基本语法规则:1.标号字段有了标号,程序中的其他标号才能访问该语句。标号的规定如下:(1)标号后必须跟冒号“:”;(2)标号由1~8个ASCII码字符组成,但第一个字符必须是字母;(3)同一标号在一个程序中只能定义一次;(4)不能使用汇编语言已经定义的符号作为标号,如指令助记符、伪指令以及寄存器的符号名称等。(5)如无其他语句访问该条语句,则该语句前不需要标号。2.操作码字段规定了语句执行的操作。注意:操作码是汇编语言指令中唯一不能空缺的部分。3.操作数字段用于存放指令的操作数或操作数地址。通常有单操作数、双操作数和无操作数三种情况。如果是双操作数,则操作数之间要以逗号隔开。需注意操作数的几种表示:(1)十六进制、二进制和十进制形式的操作数表示操作数采用十六进制形式,则需加后缀“H”;操作数采用二进制形式,则需加后缀“B”;若操作数采用十进制形式,则需加后缀“D”,也可以省略后缀“D”。若十六进制的操作数以字符A~F中的某个开头,则还需在它前面加一个“0”,以便在汇编时把它和字符A~F区别开。(2)工作寄存器和特殊功能寄存器的表示当操作数在某个工作寄存器或特殊功能寄存器中时,操作数字段允许用工作寄存器和特殊功能寄存器代号来表示。例如,工作寄存器用R7~R0,累加器用A表示。工作寄存器和特殊功能寄存器也可用其地址来表示,如累加器A可用累加器的地址E0H表示。4.注释字段用于解释指令或程序的含义,提高程序的可读性。须以分号“;”开头,一行写不下可换行写,但必须注意也要以分号“;”开头。在汇编时,汇编程序遇到“;”时,就停止“翻译”。注释字段不会产生机器代码。4.1.3伪指令重点:伪指令与指令的区别。在汇编语言源程序中应有向汇编程序发出的指示信息,告诉它如何完成汇编工作,这一任务是通过使用伪指令来实现。注意:伪指令不属于指令系统中的汇编语言指令,是汇编程序控制命令。只有在汇编前的源程序中才有伪指令。“伪”体现在汇编后,伪指令没有相应的机器代码产生。伪指令具有控制汇编程序的输入/输出、定义数据和符号、条件汇编、分配存储空间等功能。不同汇编语言的伪指令也有所不同,但一些基本内容却是相同的。8051汇编语言程序中常用的伪指令:1.ORG(ORiGin)命令在汇编语言源程序的开始,通常都用一条ORG伪指令规定程序的起始地址。如果不用ORG,则目标程序将从0000H地址开始。ORG指令指令后的地址必须由小到大排列,且不能交叉、重叠。2.

END(ENDofassembly)汇编终止命令汇编语言源程序的结束标志,作用是告诉汇编程序,将某一段源程序翻译成指令代码的工作到此为止。如果END命令出现在程序中间,则其后的源程序,将不进行汇编处理。3.EQU(EQUate)标号赋值命令该命令用于给标号赋值。赋值以后,其标号值在整个程序有效。例如:TEST EQU2000H 表示标号TEST=2000H,汇编时,凡是TEST时,均以2000H来代替。4.DB(DefineByte)定义数据字节命令用于从指定的地址开始,在程序存储器的连续单元中定义字节数据。例如:ORG 2000HDB 30H,40H,24,"C","B"汇编后(2000H)=30H(2001H)=40H(2002H)=18H(十进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)注意:后两条定义的次序,与微机8086汇编不一致。5.DW(DefineWord)定义数据字命令该命令用于从指定的地址开始,在程序存储器连续单元中定义16位的数据字。6.DS(DefineStorage)定义存储区命令 用于从指定地址开始,保留指定数目的字节单元作为存储区,供程序运行使用。 注意:DB、DW和DS命令只能对程序存储器使用,而不能对数据存储器使用。7.BIT位定义命令 用于给字符名称赋以位地址,位地址可以是绝对的位地址,也可以是符号地址。4.2汇编语言源程序的汇编汇编:把汇编语言源程序“翻译”成机器代码(指令代码)的过程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论