Transcript Document
第3章 单片机汇编程序设计 第3章 单片机汇编程序设计 3.1 MCS-51系列单片机汇编指令格式及标识 指令是使计算机完成基本操作的命令。一种计算机 能够执行的全部指令的集合,称为这种计算机的指令系 统。单片机的指令系统与微型计算机的指令系统不同, MCS-51系列单片机指令系统共有: 111条指令;42种指令助记符。 49条1字节指令; 45条2字节指令; 17条3字节指令。 64条为1机器周期指令; 45条为2机器周期指令; 2条为4机器周期指令(乘、除法)。 这些指令在存储空间和运算速度上,效率都比较高。 第3章 单片机汇编程序设计 MCS-51系列单片机指令系统功能强、 指令短、执行快。 从功能上可分成五大类: 1、数据传送指令; 2、算术运算指令; 3、逻辑操作指令; 4、控制转移指令; 5、位操作指令。 第3章 单片机汇编程序设计 3.1.1 指令格式 [标号:] 操作码助记符 [目的操作数][,源操作数] [;注释] (1)操作码助记符表明指令的功能,不同的指令有不同的指 令助记符,它一般用说明其功能的英文单词的缩写形式表示。 (2)操作数用于给指令的操作提供数据、数据的地址或指令 的地址,操作数往往用相应的寻址方式指明。MCS-51单片机 指令系统的指令按操作数的多少可分为无操作数、单操作数、 双操作数和三操作数四种情况。 (3)标号是该指令的符号地址,后面须带冒号。它主要为转 移指令提供转移的目的地址。 (4)注释是对该指令的解释,前面须带分号。它们是编程 者根据需要加上去的,用于对指令进行说明,对于指令本身 功能而言是可以不要的。 第3章 单片机汇编程序设计 3.1.2 指令中用到的标识符 为便于后面的学习,在这里先对指令中用到的一些符号的约 定意义作以下说明: (1)Ri和Rn:表示当前工作寄存器区中的工作寄存器。 i取0或1,表示R0或R1。n取0~7,表示R0~R7。 (2)#data:表示包含在指令中的8位立即数。 (3)#data16:表示包含在指令中的16位立即数。 (4)rel:以补码形式表示的8位相对偏移量,范围为-128~+127, 主要用在相对寻址的指令中。 (5)addr16和addr11:分别表示16位直接地址和11位直接地址。 (6)direct:表示直接寻址的地址。 (7)bit:表示可位寻址的直接位地址。 (8)(X):表示X单元中的内容。 (9)((X)):表示以X单元的内容为地址的存储器单元内容,即(X) 作地址,该地址单元的内容用((X))表示。 (10)/ 和→符号:“/”表示对该位操作数取反,但不影响该位的 原值。“→”表示操作流程,将箭尾一方的内容送入箭头所指一方的 单元中去。 第3章 单片机汇编程序设计 3.2 MCS-51系列单片机寻址方式 MCS-51单片机的寻址方式按操作数的类型,可分为: ①数的寻址; ②指令寻址。 ①数的寻址有: 常数寻址(立即寻址); 寄存器数寻址(寄存器寻址); 存储器数寻址: 直接寻址方式; 寄存器间接寻址方式; 变址寻址方式。 位寻址。 ②指令的寻址有: 绝对寻址; 相对寻址。 第3章 单片机汇编程序设计 3.2.1 常数寻址(立即寻址) 操作数是常数,使用时直接出现在指令中,紧跟在 操作码的后面,作为指令的一部分。与操作码一起存放 在程序存储器中,可以立即得到并执行,不需要经过别 的途径去寻找。常数又称为立即数,故又称为立即寻址。 在汇编指令中,立即数前面以“#”符号作前缀。在程序 中通常用于给寄存器或存储器单元赋初值,例如: MOV A,#20H 其功能是把立即数20H送给累加器A,其中源操作数 20H就是立即数。指令执行后累加器A中的内容为20H。 第3章 单片机汇编程序设计 3.2.2 寄存器数寻址(寄存器寻址) 操作数在寄存器中,使用时在指令中直接提供寄存器的 名称,这种寻址方式称为寄存器寻址。在MCS-51系统中,这 种寻址方式针对的寄存器只能是R0~R7 8个通用寄存器和部 分特殊功能寄存器(如累加器A、寄存器B、数据指针DPTR 等)中的数据,对于其它的特殊功能寄存器中的内容的寻址 方式不属于它。在汇编指令中,寄存器寻址在指令中直接提 供寄存器的名称,如R0、R1、A、DPTR等。例如: MOV A,R0 其功能是把R0寄存器中的数送给累加器A,在指令中, 源操作数R0为寄存器寻址,传送的对象为R0中的数据。如指 令执行前R0中的内容为20H,则指令执行后累加器A中的内 容为20H。 第3章 单片机汇编程序设计 3.2.3 存储器数寻址 存储器数寻址针对的数据是存放在存储器 单元中,对于存储器单元的内容通过提供存储 器单元地址使用。 根据存储器单元地址的提供方式,存储器 数的寻址方式有: 1、直接寻址; 2、寄存器间接寻址; 3、变址寻址。 第3章 单片机汇编程序设计 1.直接寻址 直接寻址是指数据在存储器单元中,在指令中直接提供存储器单元 的地址。在MCS-51系统中,这种寻址方式针对的是片内数据存储器和 特殊功能寄存器。在汇编指令中,指令中直接以地址数的形式提供存储 器单元的地址。例如: MOV A,20H 其功能是把片内数据存储器20H单元的内容送给累加器A。如指令 执行前片内数据存储器20H单元的内容为30H,则指令执行后累加器A 的内容为30H。指令中20H是地址数,它是片内数据存储单元的地址。 在MCS-51中,数据前面不加“#”是存储单元地址而不是常数,常数前 面要加符号“#”。 对于特殊功能寄存器,在指令中使用时往往通过特殊功能寄存器 的名称使用,而特殊功能寄存器名称实际上是特殊功能寄存器单元的 符号地址,因此它们是直接寻址。例如: MOV A,P0 其功能是把P0口的内容送给累加器A。P0是特殊功能寄存器P0口 的符号地址,该指令在翻译成机器码时,P0就转换成直接地址80H。 第3章 单片机汇编程序设计 2.寄存器间接寻址 寄存器间接寻址是指数据存放在存储单元中,而存储单元地址存 放在寄存器中,在指令中通过提供存放存储单元地址的寄存器来使用 对应的存储单元。形式为:@寄存器名。 例如:MOV A,@R1 该指令的功能是将以工作寄存器R1中的内容为地址的片内RAM单 元的数据传送到累加器A中去。指令的源操作数是寄存器间接寻址。 若R1中的内容为 80H,片内RAM地址为 80H的单元中的内容为 20H,则执行该指令后, 累加器A的内容为20H。 R1 80H 80H A 20H 20H 在MCS-51单片机中,寄存器间接寻址用到的 寄存器只能是通用寄存器R0、R1和数据指针寄存 器DPTR,它能访问的数据是片内数据存储器和片 外数据存储器。其中,片内数据存储器只能用R0 和R1作指针间接访问;片外数据存储器,低端的 256字节单元,既可以用两位十六进制地址以R0或 R1作指针间接访问,也可用四位十六进制地址以 DPTR作指针间接访问,而高端的字节单元则只能 以DPTR作指针间接访问。对于片内RAM和片外 RAM的低端256字节都可以用R0和R1作指针访问, 它们之间用指令来区别。片内RAM访问用MOV指 令,片外RAM访问用MOVX指令。 第3章 单片机汇编程序设计 3.变址寻址 变址寻址是指操作数的地址由基址寄存器的地址加上变址寄存器 的地址得到。在MCS-51系统中,它是以数据指针寄存器DPTR或程序 计数器PC为基址,累加器A为变址,两者相加得存储单元的地址,所 访问的存储器为程序存储器。 例如:MOVC A,@A+DPTR DPTR 2000H + A 05H A 30H 2005H 30H 其功能是将数据指针 寄存器DPTR的内容和累加 器A中的内容相加作为程序 存储器的地址,从对应的 单元中取出内容送累加器A 中。指令中,源操作数的 寻址方式为变址寻址,设 指令执行前数据指针寄存 器DPTR的值为2000H,累 加器A的值为05H,程序存 储器2005H单元的内容为 30H,则指令执行后,累 加器A中的内容为30H。示 意图如左图所示。 第3章 单片机汇编程序设计 3.2.4 位寻址 位寻址是指操作数是二进制位的寻址方式。在MCS-51 单片机中有一个独立的位处理器,有多条位处理指令,能够 进行各种位运算。在MCS-51系统中,位处理的操作对象是 各种可位寻址位。对于它们的访问是通过提供相应的位地址 来处理。 指令给出位地址。一位数据在存储器位寻址区。 (1)内部RAM低128单元中的位寻址区: 位地址为00H~07FH共128位(字节地址为20H~2FH); (2)内部RAM高128单元中的专用寄存器的可寻址位: SFR中11个有位地址寄存器中的83位。 第3章 单片机汇编程序设计 在MCS-51系统中,位地址的表示可以用以下几 种方式: 1.直接使用位地址(00H~07FH+83位)。 例如:PSW的位6可表示为0D6H(位地址)。 2.字节地址带位号。 例如:PSW的位6可表示为0D0H.6; 20H.3表示20H单元的3位。 3.特殊功能寄存器名带位号。 例如: PSW的位6可表示为PSW.6 ; P0.1表示P0口的1位。 4.位符号地址。 例如: PSW的位6可表示为AC; TR0是定时/计数器T0的启动位。 第3章 单片机汇编程序设计 例: MOV C,40H ;CY(位地址40H) 设指令执行前 CY=1,位地址40H存储器单元 如图,执行指令后,CY= ? 0 位寻址区 29H 28H 01100010 11010110 第3章 单片机汇编程序设计 3.2.5 指令寻址 一、绝对寻址 绝对寻址是在指令的操作数中直接提供目的位置的 地址或地址的一部分。 在MCS-51系统中: 长转移和长调用提供目的位置的16位地址; 绝对转移和绝对调用提供目的位置的16位地址的低11位。 它们都为绝对寻址。 第3章 单片机汇编程序设计 二、相对寻址 相对寻址是以当前程序计数器PC值加上指令中给出的偏移量 rel得到目的位置的地址。在MCS-51系统中,相对转移指令的操作 数属于相对寻址。 在使用相对寻址时要注意以下两点: (1)当前PC值是指转移指令执行时的PC值,它等于转移指令 的地址加上转移指令的字节数。实际上是转移指令的下一条指令的 地址。例如:若转移指令的地址为2010H,转移指令的长度为2字 节,则转移指令执行时的PC值为2012H。 (2)偏移量rel是8位有符号数,以补码表示,它的取值范围为 -128~+127。当为负值时,向前转移,当为正数时向后转移。 相对寻址的目的地址为: --(前) 目的地址=转移指令的地址+转移指令的字节数+rel =当前PC+rel PC +(后) 第3章 单片机汇编程序设计 3.3 MCS-51系列单片机指令系统 3.3.1 数据传送指令 数据传送指令有29条,是指令系统中 数量最多、使用也最频繁的一类指令。 这类指令可分为三组: 普通传送指令; 数据交换指令; 堆栈操作指令。 第3章 单片机汇编程序设计 一、普通传送指令 普通传送指令以助记符MOV为基础。分成片内 数据存储器传送指令、片外数据存储器传送指令和 程序存储器传送指令。 1.片内数据存储器传送指令MOV 指令格式:MOV 目的操作数,源操作数 其中:源操作数可以为A、Rn、@Ri、direct、 #data,目的操作数可以为A、Rn、@Ri、direct, 组合起来总共16条。 第3章 单片机汇编程序设计 按目的操作数的寻址方式划分为五组: (1)以A为目的操作数 MOV A,Rn ;A←Rn MOV A,direct ;A←(direct) MOV A,@Ri ;A←(Ri) MOV A,#data ;A← #data (2)以Rn为目的操作数 MOV Rn,A ;Rn←A MOV Rn,direct ;Rn←(direct) MOV Rn,#data ;Rn←#data (3)以直接地址direct为目的操作数 MOV direct,A ;(direct)←A MOV direct,Rn ;(direct)←Rn MOV direct,direct ;(direct)←(direct) MOV direct,@Ri ;(direct)←(Ri) MOV direct,#data ;(direct)← #data 第3章 单片机汇编程序设计 (4)以间接地址@Ri为目的操作数 MOV @Ri,A ;(Ri)←A MOV @Ri,direct ;(Ri)←(direct) MOV @Ri,#data ;(Ri)← #data (5)以DPTR为目的操作数 MOV DPTR,#data16 ;DPTR← #data16 注意: 源操作数和目的操作数中的Rn和@Ri不能相互配 对。如不允许有“MOV Rn,Rn”,“MOV @Ri, Rn”这样的指令,在MOV指令中,不允许在一条指令 中同时出现工作寄存器,无论它是寄存器寻址还是寄 存器间接寻址。 例:顺序执行下列指令序列,求每一步执行结果。 MOV MOV MOV MOV MOV A,#30H 4FH,A R0,#20H @R0,4FH 21H,20H ;A=30H ;(4FH)=30H ;R0=20H ;(20H)=30H ;(21H)=30H 练习题:用两种寻址方式实现,将片内RAM 60H单元的数据传送给累加器A。 解: MOV A,#60H(×) MOV R0,60H MOV A,@R0 (×) 解: MOV A,60H (√) 结果A=32H MOV R0,#60H(√) MOV A,@R0 地址 内容 … 32H 58H … 60H 32H 说 明: 第3章 单片机汇编程序设计 1、一条指令中不能同时出现两个工作寄存器。 非法指令: MOV R1,R2 MOV R2,@R0 2、间址寄存器只能使用 R0、R1。 非法指令: MOV A,@R2 3、 SFR区只能直接寻址,不能用寄存器间接寻址。 非法指令: MOV R0,#80H MOV A,@R0 4、指令表(P287):关注表中指令字节数和机器周期数 只有指令表中的指令才有对应指令代码,计算机 才能执行。编程时,不能随意创造发明指令。 第3章 单片机汇编程序设计 2.片外数据存储器传送指令MOVX 在MCS-51系统中只能通过累加器A与片外数据存储器进行数据 传送,访问时,只能通过@Ri和@DPTR以间接寻址方式进行。 MOVX指令共有四条: ①DPTR作16位数据指针,寻址64KB片外RAM空间: MOVX A,@DPTR ;A←(DPTR) (读) MOVX @DPTR,A ;(DPTR)←A (写) ② Ri作8位数据指针,寻址256B片外RAM空间(页内寻址): MOVX A,@Ri ;A←(P2Ri) (读) MOVX @Ri,A ;(P2Ri)←A (写) 其中前两条指令通过DPTR间接寻址,可以对整个64KB片外数 据存储器访问。后两条指令通过@Ri间接寻址,只能对片外数据存储 器的低端的256字节访问,访问时将低8位地址放于Ri中。 第3章 单片机汇编程序设计 例:实现片外数据存储器数据传送(2000H) →(2100H)。 MOV MOVX MOV MOVX DPTR→ DPTR→ DPTR,#2000H A,@DPTR DPTR,#2100H @DPTR,A 片外 RAM 地址 内容 2000H X … 2100H X ;DPTR=2000H ;A=X ;DPTR=2100H ;(2100H)=X 片外数据存储器不能直接寻址。 下列为非法指令: MOVX A,2000H MOVX 2100H,2000H 思考题:为什么对DPTR的数据传送使用内部传送指令? 习题:将片外RAM 0000H单元的数据传送到片内RAM的60H单元。 第3章 单片机汇编程序设计 3.程序存储器传送指令MOVC 程序存储器传送指令只有两条,一条用DPTR基址变址寻址。 一条用PC基址变址寻址。这两条指令通常用于访问表格数据,因 此以称为查表指令。 ① DPTR为基址寄存器: MOVC A,@A+DPTR ;A(A+DPTR) (读) 查表范围为 64KB 程序存储器任意空间, 称为远程查表指令。 ② PC为基址寄存器: MOVC A,@A+PC ;A(A+PC) (读) 常数表只能在查表指令后256B范围内, 称为近程查表指令。 特点: MOVC A,@A+DPTR指令可访问整个ROM的64KB空间,表格可放在ROM 的任何位置,与MOVC指令无必然的关系。 MOVC A,@A+PC指令优点:不改变PC的状态,根据A的内容取表格常数。 缺点:(1)表格只能存放在查表指令以下的256个单元内。 (2)当表格首地址与本指令间有其它指令时,须用调整偏移量,调整量为下 一条指令的起始地址到表格首址之间的字节数。 第3章 单片机汇编程序设计 例如:查表指令MOVC A,@A+PC所在的地址为2000H,表格的起始 单元地址为2035H,表格的第4个元素(位移量为03H)的内容为45H, 则查表指令的处理过程如下: MOV A,#03H;表格元素相对于表首的位移量送累加器A ADD A,#34H;当前程序计数器PC相对于表首的差值加到累加器A中 MOVC A,@A+PC;查表,查得第4个元素内容45H送累加器A 注意:查表指令的长度为1个字节,当前程序计数器PC的值应为 查表指令的地址加1。 PC→ 地址 内容 2000H MOVC 2001H … … … 2035H 表格 2036H … 2037H 45H 第3章 单片机汇编程序设计 【例3-1】写出完成下列功能的程序段。 (1)将R0的内容送R6中程序为: MOV A,R0 MOV R6,A (2)将片内RAM 30H单元的内容送片外60H单元中程序为: MOV A,30H MOV R0,#60H MOVX @R0,A (3)将片处RAM 1000H单元的内容送片内20H单元中程序为: MOV DPTR,#1000H MOV A,@DPTR MOV 20H,A (4)将ROM 2000H单元的内容送片内RAM的30H单元中程序为: MOV A,#0 MOV DPTR,#2000H MOVC A,@A+DPTR MOV 30H,A 第3章 单片机汇编程序设计 二、数据交换指令 普通传送指令实现将源操作数的数据传送到目 的操作数,指令执行后源操作数不变,数据传送是 单向的。数据交换指令数据作双向传送,传送后, 前一个操作数原来的内容传送到后一个操作数中, 后一个操作数原来的内容传送到前一个操作数中。 数据交换指令要求第一个操作数须为累加器A, 共有5条。 XCH A,Rn ;A←→Rn XCH A ,direct ;A←→(direct) XCH A,@Ri ;A←→(Ri) XCHD A,@Ri ;A0~3←→(Ri)0~3 SWAP A ;A0~3←→A4~7 【例3-2】若R0的内容为30H,片内RAM 30H单元的 内容为23H,累加器A的内容为45H,则执行 XCH A,@R0 指令后片内RAM 30H单元的内容为45H,累加器A 中的内容为23H。 若执行SWAP A指令,则累加器A的内容为54H。 例:设A=29H,执行指令 XCH A,2AH后, A= ? 29H 38H ,(2AH)= ? 片内 RAM XCH 60H,61H; 不对!! ←对吗? 地址 20H … 2AH 2BH 习题:将片内RAM60H单元与61H单元的数据交换。 内容 38H 29H 35H 例:将片内RAM 2AH和2BH单元中的ASCII码转换成压缩式 BCD码存入20H单元。 单字节 BCD 0000 千位 0000 百位 0000 十位 0000 个位 MOV A,#0 压缩式BCD 码 千位 百位 十位 个位 A 00000000 片内 RAM 地址 内容 2BH 35H 2AH 38H … 20H 58H 00H MOV R0,#2AH @R0 00111000 38H MOV R1,#2BH @R1 00110101 35H 00110000 30H 00110000 30H XCHD A,@R1 A 00000101 05H @R1 SWAP A XCHD A,@R0 A 01010000 50H A 01011000 58H @R0 20H 01011000 58H XCH A,20H 习题:交换片内RAM 40H单元和 41H单元的低半字节。 第3章 单片机汇编程序设计 三、堆栈操作指令 堆栈是在片内RAM中按“先进后出,后进先出”原则设置的 专用存储区。数据的进栈和出栈由指针SP统一管理。在MCS-51 系统中,堆栈操作指令有两条: PUSH direct ;SP←(SP+1),(SP)←(direct) POP direct ;(direct)←(SP),(SP)←(SP-1) 其中PUSH指令入栈,POP指令出栈。操作时以字节为单位。 入栈时SP指针先加1,再入栈。出栈时内容先出栈,SP指针再减1。 用堆栈保存数据时,先入栈的内容后出栈;后入栈的内容先出栈。 【例3-3】若入栈保存时入栈的顺序为: PUSH A PUSH B 则出栈的顺序为: POP B POP A 第3章 单片机汇编程序设计 入栈指令:PUSH direct ;SP←SP+1,(SP)←(direct) 出栈指令:POP direct ;(direct)←(SP),SP←SP-1 “先加后压” “先弹后减” 例:设 A=02H,B=56H,执行下列指令后, 56H 。 SP= ? 30H ,A= ? 02H ,B= ? SBR:MOV SP,#30H ;设栈底 PUSH A PUSH B MOV A,#00H MOV B,#01H … POP B POP A 00H A 02H A 02H A 00H 01H BB 56H 56H 片内 RAM × 34H × × 33H × 56H SP→ 32H 56H SP→ × × 02H SP→ 31H 02H × × SP→ 30H × 第3章 单片机汇编程序设计 练习: 说明程序执行过程中,SP的内容及堆栈中内 容的改变过程。 程序如下: MOV SP,#30H ;SP=30H ;A=20H MOV A,#20H ;B=30H MOV B,#30H ;SP=31H (31H)=20H PUSH A ;SP=32H (32H)=30H PUSH B …… …… ;A=30H SP=31H POP A ;B=20H SP=30H POP B 第3章 单片机汇编程序设计 习题:找出指令错误并改正: 1.MOV A,#1000H ;A←1000H(A装1个字节数) 2.MOVX A,1000H ;A←(1000H)片外RAM(DPTR、Ri) 3.MOVC A,1000H ;A←(1000H)片外ROM(DPTR、PC) 4.MOVX 60H,A ;片外RAM(60H)←A(应为MOV) 5.MOV R0,60H ;片内RAM:(61H)←(60H) MOV 6. XCH 61H,@R0 R1,R2 (片内RAM可直接寻址) ;R1 R2(必须有A参加) 7. MOVX DPTR,#2000H ;DPTR←2000H(应为MOV) 8. MOVX 60H,@DPTR ;片内RAM←片外RAM (必须有A参加) 第3章 单片机汇编程序设计 3.3.2 算术运算指令 一.加法指令 1.一般的加法指令ADD ADD A,Rn ;A←A + Rn ADD A,direct ;A←A +(direct) ADD A,@Ri ;A←A +(Ri) ADD A,#data ;A←A + #data 2.带进位加指令ADDC ADDC A,Rn ;A←A+Rn+C ADDC A,direct ;A←A +(direct)+ C ADDC A,@Ri ;A←A +(Ri)+ C ADDC A,#data ;A←A + #data + C 3.加1指令 INC A ;A←A+1 INC Rn ;Rn←Rn+1 INC direct ;(direct)←(direct)+ 1 INC @Ri ;(Ri)←(Ri)+ 1 INC DPTR ;DPTR←DPTR+1 其中,ADD 和ADDC指令在 执行时要影响CY、 AC、OV和P标 志位。而INC指 令除了INC A要 影响P标志位外, 对其它标志位都 没有影响。 在MCS-51单片 机中,常用ADD 和ADDC配合使 用实现多字节加 法运算。 第3章 单片机汇编程序设计 【例3-4】试把存放在R1R2和R3R4中的两个16 位数相加,结果存于R5R6中。 处理时,R2和R4用一般的加法指令ADD,结 果放于R6中,R1和R3用带进位的加法指令ADDC, 结果放于R5中,程序如下: MOV A,R2 ADD A,R4 C MOV R6,A R1 R2 MOV A,R1 R3 R4 + ADDC A,R3 ADDC ADD MOV R5,A C R5 R6 第3章 单片机汇编程序设计 二.减法指令 1.带借位减法指令SUBB SUBB A,Rn ;A←A - Rn - C SUBB A,direct ;A←A -(direct)- C SUBB A,@Ri ;A←A -(Ri)- C SUBB A,#data ;A←A - #data - C 2.减1指令DEC DEC A ;A←A - 1 DEC Rn ;Rn←Rn - 1 DEC direct ;direct←(direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1 第3章 单片机汇编程序设计 在MCS-51单片机中,只提供了一种带借位的 减法指令,没有提供一般的减法指令,一般的减法 操作可以通过先对CY标志清零,然后再执行带借 位的减法来实现。其中,SUBB指令在执行时要影 响CY、AC、OV和P标志位。而DEC指令除了DEC A要影响P标志位外,对其它标志位都没有影响。 【例3-5】求R3←R2 - R1。 程序为: MOV A,R2 CLR C SUBB A,R1 MOV R3,A 第3章 单片机汇编程序设计 3.乘法指令MUL 在MCS-51单片机中,乘法指令只有一条: MUL AB 该指令执行时将对存放于累加器A中的无符号被 乘数和放于B寄存器中的无符号乘数相乘,积的高字 节存于B寄存器中,低字节存于累加器A中。 指令执行后将影响CY和OV标志,CY复位,对 于OV:当积大于255时(即B中不为0),OV为1; 否则,OV为0。 第3章 单片机汇编程序设计 4.除法指令DIV 在MCS-51单片机中,除法指令也只有一条: DIV AB 该指令执行时将用存放在累加器A中的无符号被 除数与存放在B寄存器中的无符号除数相除,除得的 结果,商的存于累加器A中,余数存于B寄存器中。 指令执行后将影响CY和OV标志,一般情况CY和 OV都清0,只有当B寄存器中的除数为0时,CY和OV 才被置1。 第3章 单片机汇编程序设计 5.十进制调整指令 在MCS-51单片机中,十进制调整指令只有一条: DA A 它只能用在ADD或ADDC指令后面,用来对两个二位 的压缩的BCD码数通过用ADD或ADDC指令相加后存于累 加器A中的结果进行调整,使得它得到正确的十进制结果。 通过该指令可实现两位十进制BCD码数的加法运算。 它的调整过程为: (1)若累加器A的低四位为十六进制的A~F或辅助进 位标志AC为1,则累加器A中的内容作加06H调整。 (2)若累加器A的高四位为十六进制的A~F或进位标 志CY为1,则累加器A中的内容作加60H调整。 第3章 单片机汇编程序设计 例如:求BCD码48+69=?117 0100 1000 B + 0110 1001 B 1011 0001 B + 0110 0110 B 加6修正 1 0001 0111 B ①低4位向高4位进位,表明低位和大于9,需加6修正; ②高位由于获得进位而出现非法码,因此也需要加6修正。 修正后,结果为117,正确。 思考:BCD码减法,如何修正?(求减数对9A的补码) 9A的原码为1 110 0110 B=66H。 第3章 单片机汇编程序设计 【例3-6】在R3中有十进制数67,在R2中有 十进制数85,用十进制运算,运算的结果放于 R5中。 程序为: (R3)=67=0110 0111 B MOV A,R3 ;(R3)=67 (R2)=85=1000 0101 B + (A)=1110 1100 B=ECH ADD A,R2 ;(R2)=85,(A)=0ECH DA A ;(A) =52H ECH=1110 1100B MOV R5,A ;(R5)=52H 0110 0110B + 程序中DA指令对ADD指令运算出来的放于 1 0101 0010B 累加器A中的结果进行调整,调整后,累加器A 1=(C) 52H=(A) 中的内容为52H,CY为1,则结果为152,最后 放于R5中的内容为52H(十进制数52)。 跳过或进入6个无效编码区,结果就会出错。 第3章 单片机汇编程序设计 3.3.3 逻辑操作指令 一.逻辑与指令ANL ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data ANL direct,A ANL direct,#data 二.逻辑或指令ORL ORL A,Rn ORL A,direct ORL A,@Ri ORL A,#data ORL direct,A ORL direct,#data ;A←A Rn ;A←A (direct) ;A←A ((Ri)) ; A←A data ;(direct)←(direct) A ;(direct)←(direct) data ;A←A Rn ;A←A (direct) ;A←A ((Ri)) ;A←A data ;(direct)←(direct) A ;(direct)←(direct) data 第3章 单片机汇编程序设计 三.逻辑异或指令XRL XRL A,Rn ;A← A Rn XRL A,direct ;A← A (direct) XRL A,@Ri ; A← A ((Ri)) XRL A,#data ;A← A data XRL direct,A ;(direct)← (direct) A XRL direct,#data ;(direct)← (direct) data 在使用中,逻辑与用于实现对指定位清0,其余位不变; 逻辑或用于实现对指定位置1,其余位不变;逻辑异或用于实 现指定位取反,其余位不变。 【例3-7】写出完成下列功能的指令段。 1.对累加器A中的1、3、5位清0,其余位不变 ANL A,#11010101B 2.对累加器A中的2、4、6位置1,其余位不变 ORL A,#01010100B 3.对累加器A中的0、1位取反,其余位不变 XRL A,#00000011B 第3章 单片机汇编程序设计 四.清零和求反指令 1.清零指令:CLR A ;A← 0 2.求反指令:CPL A ;A← Ā 在MCS-51系统中,只能对累加器A中的内容进行 清零和求反,如要对其它的寄存器或存储单元进行清零 和求反,则须放在累加器A进行,运算后再放回原位置。 【例3-8】写出对R0寄存器内容求反的程序段。 程序为: MOV A,R0 CPL A MOV R0,A 第3章 单片机汇编程序设计 五.循环移位指令 MCS-51系统有四条对累加器A的循环移位指令, 前两条只在累加器A中进行循环移位,后两条还要带进 位标志CY进行循环移位。每一次移一位。分别如下: 1)8位循环指令: RL A ;A循环左移一位 RR A A ;A循环右移一位 A 2)9位循环指令: RLC A ;带CY循环左移一位 C A RRC A ;带CY循环右移一位 C A 【例3-9】若累加器A中的内容为10001011B,CY=0,则执 行RLC A指令后累加器A中的内容为00010110,CY=1。 用9位循环指令实现多字节移位: 例:编程将寄存器 R6R5中的双字节数X左移一位。 CLR MOV RLC MOV MOV RLC MOV C A,R5 A R5,A A,R6 A R6,A ;CY=0,设 R6=55H,R5=0AAH ;R6=01010101B,R5=10101010B,CY=0 ;R5=01010100B,CY=1 ;R6=01010101B,R5=01010100B,CY=1 CY 0 R6 CY 1 R5 ;R6=10101011B,R5=01010100B,CY=0 思考题:如何将寄存器R6R5中的双字节数X右移一位。 第3章 单片机汇编程序设计 3.3.4 控制转移指令 共有17条,包括: 无条件转移指令; 条件转移指令; 子程序调用及返回指令。 一、无条件转移指令 无条件转移指令是指当执行该指令后, 程序将无条件地转移到指令指定的地方去。 无条件转移指令包括长转移指令、绝对转 移指令、相对转移指令和间接转移指令。 第3章 单片机汇编程序设计 一、无条件转移指令 指令:LJMP,AJMP,SJMP,JMP——4条 LJMP addr16 长跳转指令 ——可在64KB范围内跳转 AJMP addr11 绝对跳转指令 ——可在指令所在的2KB范围内跳转 SJMP rel 相对跳转指令 ——可在当前PC-128与+127范围内跳转 JMP @A+DPTR 间接长跳转指令 ——可在以DPTR为基址+A为偏移量之 和所指向的64KB程序范围内跳转 第3章 单片机汇编程序设计 1.长转移指令LJMP 指令格式:LJMP addr16 ;PC←addr16 指令后面带目的位置的16位地址,执行时直 接将该16位地址送给程序指针PC,程序无条件 地转到16位目标地址指明的位置去。指令中提供 的是16位目标地址,所以可以转移到64KB程序 存储器的任意位置,故得名为“长转移”。该指 令不影响标志位,使用方便。 缺点是:执行时间长,字节数多。 第3章 单片机汇编程序设计 2.绝对转移指令 指令格式:AJMP addr11 ;PC10~0 ← addr11 AJMP指令后带的是目的位置的低11位直接地址,执行时,先将 程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地 址addr11送给程序指针PC的低11位,而程序指针的高5位不变,执行 后转移到PC指针指向的新位置。 由于11位地址addr11的范围是00000000000~11111111111,即 2KB范围,而目的地址的高5位不变,所以程序转移的位置只能是和当 前PC位置(AJMP指令地址加2)在同一2KB范围内。转移可以向前也 可以向后,指令执行后不影响状态标志位。 【例3-10】若AJMP指令地址为3000H。AJMP后面带的11位地址 addr11为123H,则执行指令AJMP addr11后转移的目的位置是多少? AJMP指令的PC值加2 =3000H+2=3002H=00110 000 00000010B 指令中的addr11=123H=001 00100011B 转移的目的地址为 00110 001 00100011B=3123H 第3章 单片机汇编程序设计 3.相对转移指令 指令格式:SJMP rel ;PC ← PC+2+rel SJMP指令后面的操作数rel是8位带符号补码数, 执行时,先将程序指针PC的值加2(该指令长度为2 字节),然后再将程序指针PC的值与指令中的位移量 rel相加得转移的目的地址。即: 转移的目的地址= SJMP指令所在地址+2+rel 因为8位补码的取值范围为-128~+127,所以该指 令的转移范围是: 相对PC当前值向前128字节,向后127字节。 --(前) PC +(后) 第3章 单片机汇编程序设计 注意:在单片机程序设计中,通常用到一条SJMP指令: SJMP $ 该指令的功能是在自己本身上循环,进入等待状态。其 中符号 $ 表示转移到本身,它的机器码为80 FEH。在程序 设计中,程序的最后一条指令通常用它,使程序不再向后执 行以避免执行后面的内容而出错。 例:求原地踏步指令的指令代码: HERE:SJMP HERE(或SJMP $) 相对偏移量=[2000H-(2000H+2)]补=FEH, rel=FEH 求出指令代码为:80 FEH 第3章 单片机汇编程序设计 【例3-11】在2100H单元有SJMP指令, 若rel = 5AH(正数),则转移目的地址为215CH(向后转); 若rel = F0H(负数),则转移目的地址为20F2H(向前转)。 用汇编语言编程时,指令中的相对地址rel往往用目的位置的 标号(符号地址)表示。机器汇编时,能自动算出相对地址值; 但手工汇编时,需自己计算相对地址值rel。rel的计算方法如下: rel = 目的地址-(SJMP指令地址+2) 如目的地址等于2013H,SJMP指令的地址为2000H,则相对 地址rel为11H。 问题思考: (1)由偏移量rel计算目的地址; (2)由目的地址计算偏移量rel。 例:计算转移指令的目的地址。 (1) 835AH SJMP 35H 解: rel=35H=0011 0101B 为正数,因此程序向后转移。 目的地址=(PC)+rel =(835AH+02H)+[35H]补=8391H (2) 835AH SJMP 0E7H 解: rel=0E7H=1110 0111B 为负数,因此程序向前转移。 目的地址=835AH+02H+[0E7H]补 = 835CH-19H=8343H 例:计算转移指令的相对偏移量 rel,并判断是否超出转移范围? 指令地址 源程序 2130H SJMP NEXT … 2150H NEXT:MOV A,R2 相对偏移量rel=2150H-(2130H+2) =001EH=+30D(未超出转移范围) rel=1EH 求出指令机器码:80 1EH 第3章 单片机汇编程序设计 习题:计算程序中转移指令的相对偏移量rel, 并判断是否超出转移范围。 地址 源程序 2130H LOOP: … … 21B0H SJMP LOOP 相对偏移量=[2130H –(21B0H+2)]补=(-130)补 rel已超出转移范围(-126D~+129D)。 第3章 单片机汇编程序设计 4.间接转移指令 指令格式:JMP @A+DPTR ;PC ← A+DPTR 它MCS-51系统中唯一一条间接转移指令,转移的目的地址是 由数据指针DPTR的内容与累加器A中的内容相加得到,指令执行后 不会改变DPTR及A中原来的内容。数据指针DPTR的内容一般为基 址,累加器A的内容为相对偏移量,在64 KB范围内无条件转移。 该指令的特点是转移地址可以在程序运行中加以改变。DPTR 一般为确定值,根据累加器A的值来实现转移到不同的分支。在使 用时往往与一个转移指令表一起来实现多分支转移。 【例3-12】下面的程序能根据累加器A的值0、2、4、6转移 到相应的TAB0~TA6分支去执行。 MOV DPTR,#TABLE ;表首地址送DPTR JMP @A+DPTR ;根据A值转移 TABLE:AJMP TAB0 ;当(A)=0时转TAB0执行 AJMP TAB2 ;当(A)=2时转TAB2执行 AJMP TAB4 ;当(A)=4时转TAB4执行 AJMP TAB6 ;当(A)=6时转TAB6执行 第3章 单片机汇编程序设计 二、条件转移指令 条件转移指令是指当条件满足时,程序转移到指 定位置,条件不满足时,程序将继续顺次执行。在 MCS-51系统中,条件转移指令有三种:累加器A判零 条件转移指令、比较转移指令、减1不为零转移指令。 1.累加器A判零条件转移指令 判0指令:JZ rel ;若A=0,则PC←PC+2+rel,否则,PC←PC+2 判非0指令:JNZ rel ;若A0,则PC←PC+2+rel,否则,PC←PC+2 第3章 单片机汇编程序设计 【例3-13】把片外RAM的30H单元开始的数据块传送 到片内RAM的40H开始的位置,直到出现零为止。 片内、片外数据传送以累加器A过渡。每次传送一个 字节,通过循环处理,直到处理到传送的内容为0结束。 程序如下: MOV R0,#30H MOV R1,#40H LOOP: MOVX A,@R0 MOV @R1,A INC R1 INC R0 JNZ LOOP SJMP $ 第3章 单片机汇编程序设计 2.比较转移指令 比较转移指令用于对两个数作比较,并根据比较情况进 行转移,比较转移指令有四条: CJNE A,#data,rel ;若A=data,则PC←PC+3,不转移,继续执行 若A>data,则C=0,PC←PC+3+rel,转移 若A<data,则C=1,PC←PC+3+rel,转移 CJNE Rn,#data,rel ;若(Rn)=data,则PC←PC+3,不转移,继续执行 若(Rn)>data,则C=0,PC←PC+3+rel,转移 若(Rn)<data,则C=1,PC←PC+3+rel,转移 CJNE @Ri,#data,rel ;若((Ri))=data,则PC←PC+3,不转移,继续执行 若((Ri))>data,则C=0,PC←PC+3+rel,转移 若((Ri))<data,则C=1,PC←PC+3+rel,转移 CJNE A,direct,rel ;若A=(direct),则PC←PC+3,不转移,继续执行 若A>(direct),则C=0,PC←PC+3+rel,转移 若A<(direct),则C=1,PC←PC+3+rel,转移 第3章 单片机汇编程序设计 3.减1不为零转移指令 这种指令是先减1后判断,若不为零则转移。 指令有两条: DJNZ Rn,rel (2字节指令,2周期指令) ;先Rn中的内容减1, 再判断Rn中的内容是否等于零, 若不为零,则转移。 DJNZ direct,rel ( 3字节指令,2周期指令) ;先(direct)中的内容减1, 再判断(direct)中的内容是否等于零,若不为 零,则转移。 第3章 单片机汇编程序设计 在MCS-51系统中,通常用DJNZ指令来构造 循环结构,实现重复处理。 循环结构包括 初始化 循环体 控制变量的修改 循环次数的控制 循环控制方法: 计数控制; 特征标志控制。 第3章 单片机汇编程序设计 例:利用DJNZ指令设计循环延时程序,已知fosc=12MHz。 T=12/12MHz=1µs 1) 单循环延时: DELAY: MOV R7,#10 ;1T DJNZ R7,$ ;2T △t=2×1µs×10+1×1µs=21µs 2) 双重循环延时: DELAY: MOV R7,#0AH ;1T DL: MOV R6,#64H ;1T DJNZ R6,$ ;2T DJNZ R7,DL ;2T △t=(2µs×100+2+1)×10+1=2031µs 第3章 单片机汇编程序设计 3) 三重循环延时: DELAY:MOV R7,#10 DL2: MOV R6,#200 DL1: MOV R5,#250 DJNZ R5,$ DJNZ R6,DL1 DJNZ R7,DL2 △t=(((2us×250+2+1) ×200)+2+1) ×10+1 = 1006031µs ≈1秒 N N Y Y N Y 第3章 单片机汇编程序设计 例:设单片机的晶振频率为6MHz,编写一段延时程序约100ms 的子程序。 Delay: MOV R7,#64H 1T;设循环计数器初值(100次) LOOP: MOV R6,#0FAH 1T ;循环250次(250×4=1ms) DJNZ R6,$ 2T ;循环控制 DJNZ R7,LOOP 2T RET 2T T=12/6 MHz=2µs t=2µs+100×(2µs+1ms+2×2µs)+4µs =100.606 ms 习题:当循环计数器初值为0,循环次数有多少? 第3章 单片机汇编程序设计 【例3-14】统计片内RAM中30H单元开始的20个 数据中0个数,放于R7中。 用R2作循环变量,最开始置初值为20;作R7作计 数器,最开始置初值为0;用R0作指针访问片内RAM 单元,最开始置初值为30H;用DJNZ指令对R2减1转 移进行循环控制,在循环体中用指针R0依次取出片内 RAM中的数据,判断,如为0,则R7中的内容加1。 程序: MOV R0,#30H MOV R2,#20 MOV R7,#0 LOOP: MOV A,@R0 CJNE A,#0,NEXT INC R7 NEXT: INC R0 DJNZ R2,LOOP 第3章 单片机汇编程序设计 三、子程序调用及返回指令 这类指令有四条。两条子程序调用指令,两条返回指令。 1.长调用指令 指令格式:LCALL addr16 执行过程: (PC)←(PC)+ 3 (SP)←(SP)+ 1 (SP)←(PC)7~0 (SP)←(SP)+ 1 (SP)←(PC)15~8 (PC)← addr16 该指令执行时,先将当前的PC(指令的PC加指令的字节 数3)值压入堆栈保存,入栈时先低字节,后高字节。然后转 移到指令中addr16所指定的地方执行。由于后面带16位地址, 因而可以转移到程序存储空间的任一位置(64KB)。 第3章 单片机汇编程序设计 2.绝对调用指令 指令格式:ACALL addr11 执行过程: (PC)←(PC)+ 2 (SP)←(SP)+ 1 (SP)←(PC)7~0 (SP)←(SP)+ 1 (SP)←(PC)15~8 (PC)10~0 ← addr11 该指令执行过程与LCALL指令类似,只是该指令与 AJMP一样只能实现2KB范围内转移,执行的最后是将指 令中的addr11送给PC指针的低11位。 对于LCALL和ACALL两条子程序调用指令,在汇编 程序中,指令后面通常带转移位置的标号,用LCALL指 令调用,转移位置可以是程序存储空间的任一位置,用 ACALL指令调用,转移位置与ACALL指令的下一条指令 必须在同一个2KB内,即它们的高5位地址相同。 第3章 单片机汇编程序设计 3.子程序返回指令 指令格式:RET 执行过程: (PC)15~8 ← ((SP)) (SP)←(SP)-1 (PC)7~0 ← ((SP)) (SP)←(SP)- 1 执行时将子程序调用指令压入堆栈的地址出栈,第一次出 栈的内容送PC的高8位,第二次出栈的内容送PC的低8位。执 行完后,程序转移到新的PC位置执行指令。由于子程序调用指 令执行时压入的内容是调用指令的下一条指令的地址,因而 RET指令执行后,程序将返回到调用指令的下一条指令执行。 该指令通常放于子程序的最后一条指令位置,用于实现返 回到主程序。另外,在MCS-51程序设计中,也常用RET指令 来实现程序转移,处理时先将转移位置的地址用两条PUSH指 令入栈,低字节在前,高字节在后,然后执行RET指令,执行 后程序转移到相应的位置去执行。 第3章 单片机汇编程序设计 4.中断返回指令 指令格式:RETI 执行过程: (PC)15~8 ← ((SP)) (SP)←(SP)-1 (PC)7~0 ← ((SP)) (SP)←(SP)- 1 该指令的执行过程与RET基本相同,只是RETI在 执行后,在转移之前将先清除中断的优先级触发器。 该指令用于中断服务子程序后面,作为中断服务子程 序的最后一条指令,它的功能是返回主程序中断的断 点位置,继续执行断点位置后面的指令。 在MCS-51系统中,中断都是硬件中断,没有软 件中断调用指令,硬件中断时,由一条长转移指令使 程序转移到中断服务程序的入口位置,在转移之前, 由硬件将当前的断点地址压入堆栈保存,以便于以后 通过中断返回指令返回到断点位置后继续执行。 例:设计节日灯,通过P1.0~P1.7 控制8个发光二极管,先亮1灯, 隔1秒闪烁10次,然后左移1位闪 10次,如此循环。 分析:流程图,程序如下: MAIN: MOV A,#01H ;P1.0先亮 LOOP1:MOV R2,#10 LOOP2:MOV P1,A ACALL DELAY MOV P1,#00H ACALL DELAY DJNZ R2,LOOP2 RL A AJMP LOOP1 DELAY:1秒延时子程序(略) RET MCS-51 P1.0 P1.1 … … P1.6 P1.7 N Y 第3章 单片机汇编程序设计 3.3.5 位操作指令 在MCS-51系统中,有17条位处理指令,可以 实现位传送、位逻辑运算、位控制转移等操作。 一.位传送指令 位传送指令有两条,用于实现位运算器C与一 般位之间的相互传送。 MOV C,bit ;C←(bit) MOV bit,C ;(bit)←C 指令在使用时必须有位运算器C参与,不能直 接实现两位之间的传送。如果进行两位之间的传送, 可以通过位运算器C来传送。 【例3-15】把片内RAM中位寻址区的20H位的 内容传送到30H位。 程序:MOV C,20H MOV 30H,C 第3章 单片机汇编程序设计 二.位逻辑操作指令 位逻辑操作指令包括位清0、置1、取反、位与 和位或,总共10位指令。 1.位清0 CLR C ;C←0 CLR bit ;(bit)←0 2.位置1 SETB C ;C←1 SETB bit ;(bit)←1 3.位取反 CPL C ;C← CPL bit ;(bit)←(bit) 4.位与 ANL C,bit ;C←C∧(bit) ANL C,/bit ;C←C∧(/bit) 5.位或 ORL C,bit ;C←C∨(bit) ORL C,/bit ;C←C∨(/bit) 第3章 单片机汇编程序设计 利用位逻辑运算指令可以实现各种各样的逻辑功能。 【例3-16】利用位逻辑运算指令编程实现下面硬件逻辑 电路的功能。 P1.0 P1.1 程序: 与 或 P1.2 与 P1.3 P1.4 或 P1.5 MOV C,P1.0 ANL C,P1.1 CPL C ORL C,/P1.2 MOV 0F0H,C MOV C,P1.3 ORL C,P1.4 ANL C,0F0H CPL C MOV P1.5,C 第3章 单片机汇编程序设计 三.位转移指令 位转移指令有以C为条件的位转移指令和以 bit为条件的位转移指令,共5条。 1.以C条件的位转移指令 JC rel ;若C=1,则转移,PC←PC+2+rel; 否则程序继续执行 JNC rel ;若C=0,则转移,PC←PC+2+rel; 否则程序继续执行 第3章 单片机汇编程序设计 2.以bit为条件的位转移指令 JB bit,rel ; 若(bit)=1,则转移,PC←PC+3+rel;否则程序继续执行 JNB bit,rel ; 若(bit)=0,则转移,PC←PC+3+rel;否则程序继续执行 JBC bit,rel ; 若(bit)=1,则转移,PC←PC+3+rel,且(bit)←0; 否则程序继续执行 利用位转移指令可进行各种测试。 第3章 单片机汇编程序设计 【例3-17】从片外RAM中30H 单元开始有100个数据,统计当中 正数、0和负数的个数,分别放于 R5、R6、R7中。 设用R2作计数器,用DJNZ 指令对R2减1转移进行循环控制, 在循环体外设置R0指针,指向片 外RAM 30H单元,对R5、R6、 R7清零,在循环体中用指针R0依 次取出片外RAM中的100个数据, 判断: 如大于0,则R5中的内容加1; 如等于0,则R6中的内容加1; 如小于0,则R7中的内容加1。 程序: MOV R2,#100 MOV R0,#30H MOV R5,#0 MOV R6,#0 MOV R7,#0 LOOP:MOVX A,@R0 CJNE A,#0,NEXT1 INC R6 SJMP NEXT3 NEXT1:CLR C SUBB A,#0 JNC NEXT2 INC R5 SJMP NEXT3 NEXT2:INC R7 NEXT3:INC R0 DJNZ R2,LOOP SJMP $ 第3章 单片机汇编程序设计 四.空操作指令 NOP ;PC ← PC+1 这是一条单字节指令。执行时,不作任何 操作(即空操作),仅将程序计数器PC的内容 加1,使CPU指向下一条指令继续执行程序。它 要占用一个机器周期,常用来产生时间延迟,构 造延时程序。 第3章 单片机汇编程序设计 扩展I/O口:MCS-51单片机将I/O看作外RAM的一个特殊单 元,与片外RAM统一编址,提供16位寻址能力,寻址范围也是 64KB,但需要注意的是,为区别于外RAM地址,扩展I/O口一 般用高端地址。 访问I/O口指令使用说明: 1、可以按口寻址,进行字节操作; 如:MOV Pm,A 可以按口线寻址,进行位操作。 如:MOV Pm.n,C 2、没有专门的输入/输出指令,均使用MOV传送指令来完成: 输入:用MOV指令把各口线的引脚状态读入; 输出:用MOV指令把输出数据写入各口线电路的锁存器。 3、在进行引脚数据输入操作之前,必须先向电路中的锁存器写 入“1”,使FET截止,以避免锁存器为“0”状态时对引脚读 入的干扰。 第3章 单片机汇编程序设计 3.4 MCS-51系列单片机汇编程序常用伪指令 伪指令是放在汇编语言源程序中用于指示汇编程序 如何对源程序进行汇编的指令,它不同于指令系统中的 指令,指令系统中的指令在汇编程序汇编时能够产生相 应的指令代码,而伪指令在汇编程序汇编时不会产生代 码,只是对汇编过程进行相应的控制和说明。 伪指令通常在汇编语言源程序中用于定义数据、分 配存储空间、控制程序的输入输出等。MCS-51汇编语 言源程序相对于一般的微型计算机汇编语言源程序结构 简单,伪指令数目少,常用的伪指令只有几条。 第3章 单片机汇编程序设计 1.ORG伪指令 格式:ORG 地址(十六进制表示) 这条伪指令放于一段源程序或数据的前面,汇编时 用于指明程序或数据从程序存储空间什么位置开始存放。 ORG伪指令后的地址是程序或数据的起始地址。 【例3-18】 ORG 1000H START:MOV A,#7FH · · · 指明后面的程序从程序存储器的1000H单元开始存放。 第3章 单片机汇编程序设计 2.DB伪指令 格式:[标号:] DB 项或项表 DB伪指令用于定义字节数据,可 以定义一个字节,也可定义多个字节, 字义多个字节时,两两之间用逗号间隔, 定义的多个字节在存储器中是连续存放 的。定义的字节可以是一般常数,也可 以为字符,还可以是字符串,字符和字 符串以引号括起来,字符数据在存储器 中以ASCII码形式存放。 在定义时前面可以带标号,定义的 标号在程序中是起始单元的地址。 【例3-19】 ORG 3000H TAB1: DB 12H,34H DB '5','A','abc' 汇编后,各个数据在存储单元中的 存放情况如右: 3000H 3001H 3002H 3003H 3004H 3005H 3006H 12H 34H 35H 41H 61H 62H 63H 第3章 单片机汇编程序设计 3.DW伪指令 格式:[标号:] DW 项或项表 这条指令与DB相似,但用于定义字 数据。项或项表指所定义的一个字在存 储器中占两个字节。汇编时,机器自动 按低字节在前,高字节在后,即低字节 存放在低地址单元,高字节存放在高地 址单元。 【例3-20】 ORG 3000H TAB2:DW 1234H,5678H 汇编后,各个数据在存储单元中的 存放情况如右: 3000H 3001H 3002H 3003H 34H 12H 78H 56H 第3章 单片机汇编程序设计 4.DS伪指令 格式:[标号:] DS 数值表达式 该伪指令用在存储器中保留一定数量 的字节单元。保留存贮空间主要为以后存 放数据。保留的字节单元数由表达式的值 决定。 【例3-21】 ORG 3000H TAB1: DB 12H,34H DS 4H DB '5' 汇编后,存储单元中的分配情况如右: 3000H 12H 3001H 34H 3002H -3003H -3004H -3005H -3006H 35H 第3章 单片机汇编程序设计 5.EQU伪指令 格式:符号 EQU 项 该伪指令的功能是将指令中的项的值赋予EQU前 面的符号。项可以是常数、地址标号或表达式。以后可 以通过使用该符号使用相应的项。 【例3-22】 TAB1 EQU 1000H TAB2 EQU 2000H 汇编后TAB1、TAB2分别等于1000H、2000H。程 序后面使用1000H、2000H的地方就可以用符号TAB1、 TAB2替换。 用EQU伪指令对某标号赋值后,该符号的值在整 个程序中不能再改变。 第3章 单片机汇编程序设计 6.bit伪指令 格式:符号 bit 位地址 bit该伪指令用于给位地址赋予符号,经 赋值后可用该符号代替bit后面的位地址。 【例3-23】 PLG bit F0 AI bit P1.0 定义后,在程序中位地址F0、P1.0就可 以通过FLG和AI来使用。 第3章 单片机汇编程序设计 7.END伪指令 格式:END 该指令放于程序最后位置,用于指明汇 编语言源程序的结束位置,当汇编程序汇编 到END伪指令时,汇编结束。END后面的指 令,汇编程序都不予处理。一个源程序只能 有一个END命令,否则就有一部分指令不能 被汇编。 第3章 单片机汇编程序设计 3.5 MCS-51系列单片机汇编程序设计 汇编语言程序的结构: 1、程序设计的基本步骤 一般步骤为: (1)分析题意,明确要求; (2)建立思路,确定算法; (3)编制框图,绘出流程; (4)编写程序,上机调试。 显然,算法和流程是至关重要的。程序结构有 简单顺序、分支、循环和子程序等几种基本形式。 第3章 单片机汇编程序设计 2、画流程图 画流程图是指用各种图形、符号、指向线等来说明程序 设计的过程。国际通用的图形和符号说明如下: 椭圆框:起止框,在程序的开始和结束时使用。 矩形框:处理框,表示要进行的各种操作。 菱形框:判断框,表示条件判断,以决定程序的流向。 指向线:流程线,表示程序执行的流向。 圆 圈:连接符,表示不同页之间的流程连接。 各种几何图形符号如下图所示。 第3章 单片机汇编程序设计 3.5.1 运算程序 【例3-24】多字节无符号数加法。 设从片内RAM30H单元和40H单元有两个16字 节数,把它们相加,结果放于30H单元开始的位置 处(设结果不溢出)。 处理过程:用R0作指针指向30H单元,用R1作 指针指向40H单元,用R2为循环变量,初值为16, 在循环体中用ADDC指令把R0指针指向的单元与R1 指针指向的单元相加,加得的结果放回R0指向的单 元,改变R0、R1指针指向下一个单元,循环16次, 在第一次循环前应先将CY清零。 第3章 单片机汇编程序设计 开始 程序: #30R0 #40HR1 #16R2 @R0+@R1@R0 R0+1R0 R1+1R1 R2-1R2 R2=0? 是 结束 否 ORG MOV MOV MOV CLR LOOP:MOV ADDC MOV INC INC DJNZ END 1000H R0,#30H R1,#40H R2,#16 C A,@R0 A,@R1 @R0,A R0 R1 R2,LOOP 第3章 单片机汇编程序设计 【例3-26】两字节无符号数乘法。 设被乘数的高字节放在R7中,低字节放于R6中;乘数的高 字节放于R5中,低字节放于R4中。乘得的积有4个字节,按由低 字节到高字节的次序存于片内RAM中以ADDR为首址的区域中。 由于MCS-51单片机只有一条单字节无符号数乘法指令MUL, 而且要求参加运算的两个字节须放于累加器A和B寄存器中,而乘 得的结果高字节放于B寄存器中,低字节放于累加器A中。因而两 字节乘法须用四次乘法指令来实现,即R6R4、R7R4、R6R5 和R7R5,设R6R4的结果为B1A1,R7R4结果为B2A1, R6R5的结果为B3A3,R7R5的结果为B4A4,乘得的结果须按 下面的关系加起来。 + B4 C4 B2 B3 A4 C3 R7 R5 B1 A2 A3 R6 R4 A1 C2 C1 第3章 单片机汇编程序设计 即乘积的最低字节C1只由A1这部分得到,乘积的第二字节C2 由B1、A2和A3相加得到,乘积的第三字节C3由B2、B3、A4以及 C2部分的进位相加得到,乘积的第四字节C4由B4和低字节的进位 相加得到。由于在计算机内部不能同时实现多个数相加,因而我们 用累加的方法来计算C2、C3和C4部分,用R3寄存器来累加C2部 分,用R2寄存器来累加C3部分,用R1寄存器来累加C4部分,另外 用R0作指针来依次存放C1、C2、C3、C4入存储器。程序如下: ORG MOV MUL1: MOV MOV MUL MOV MOV MUL2:MOV MOV MUL ADD MOV 0100H R0,#ADDR A,R6 B,R4 AB ;R6R4 @R0,A ;结果的低字节直接存入积的第一字节单元 R3,B ;结果的高字节存入R3中暂存起来 A,R7 B,R4 AB ;R7R4 A,R3 ;结果的低字节与R3相加后,再存入R3中 R3,A MOV A,B ADDC A,#00 MOV R2,A MUL3: MOV A,R6 MOV B,R5 MUL AB ADD A,R3 INC R0 MOV @R0,A MOV A,R2 ADDC A,B MOV R2,A MOV A,#00 ADDC A,#00 MOV R1,A MUL4: MOV A,R7 MOV B,R5 MUL AB ADD A,R2 INC R0 MOV @R0,A MOV A,B ADDC A,R1 INC R0 MOV @R0,A END ;结果的高字节加上进位位后存入R2中暂存起来 ;R6R5,结果的低字节与R3相加存入积的第二字节单元 ;结果的高字节加R2再加进位位后,再存入R2中 ;相加的进位位存入R1中 ;R7R5,结果的低字节与R2相加存入积的第三字节单元 ;结果的高字节加R1再加进位位后存入积的第四字节单元 第3章 单片机汇编程序设计 【例3-27】多字节求补运算。 设在片内RAM 30H单元开 始有一个8字节数据,对该数据 求补,结果放回原位置。 在MCS-51系统中没有求补 指令,只有通过取反未位加1得 到。而当未位加1时,可能向高 字节产生进位。因而在处理时, 最低字节采用取反加1,其余字 节采用取反加进位,通过循环来 实现。 程序: ORG 0100H MOV R2,#08H MOV R0,#30H MOV A,@R0 CPL A ADD A,#01 MOV @R0,A DEC R2 LOOP:INC R0 MOV A,@R0 CPL A ADDC A,#00 MOV @R0,A DJNZ R2,LOOP END 第3章 单片机汇编程序设计 3.5.2 数据的拼拆和转换。 【例3-28】设在30H和31H单元中各有一个8位数据: (30H)=x7x6x5x4x3x2x1x0 (31H)=y7y6y5y4y3y2y1y0 现在要从30H单元中取出低5位,并从31H单元中取出低3位完 成拼装,拼装结果送40H单元保存,并且规定: (40H)=y2y1y0x4x3x2x1x0 利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过 程:将30H单元的内容高3位屏蔽;31H单元内容的高5位屏蔽,高 低四位交换,左移一位;然后与30H单元的内容相或,拼装后放到 40H单元。 程序如下: ORG 0100H MOV A,30H ANL A,#00011111B MOV 30H,A MOV A,31H ANL A,#00000111B SWAP A RL A ORL A,30H MOV 40H,A END 第3章 单片机汇编程序设计 【例3-29】设片内RAM的20H单 元的内容为: (20H)=x7x6x5x4x3x2x1x0 把该单元内容反序后放回20H 单元,即为: (20H)=x0x1x2x3x4x5x6x7 可以通过先把原内容带进位位 右移一位,低位移入CF中,然后左 移一位,CF中的内容移入,通过8 次处理即可,由于8次过程相同,可 以通过循环完成,移位过程当中必 须通过累加器来处理。设20H单元 原来的内容先通过R3暂存,结果先 通过R4暂存,R2作循环变量。 程序如下: ORG 0200H MOV R3,20H MOV R4,#0 MOV R2,#8 LOOP: MOV A,R3 RRC A MOV R3,A MOV A,R4 RLC A MOV R4,A DJNZ R2,LOOP MOV 20H,R4 END 另外,由于片内RAM的20H单元在位寻址区, 这一问题还可以通过位处理方式来实现。 第3章 单片机汇编程序设计 【例3-30】一位十六进制数转换成ASC1I码。 一位十六进制数有十六个符号0~9、A、B、C、D、E、F。 其中,0~9的ASCII码为30H~39H,A~F的ASCII码为41H~46H, 转换时,只要判断十六进制数是在0~9之间还是在A~F之间,如 在0~9之间,加30H,如在A~F之间,加37H,就可得到ASCII码。 设十六进制数放于R2中,转换的结果放于R2中。 程序如下: ORG 0200H MOV A,R2 CLR C SUBB A,#0AH;减去0AH,判断在0~9之间,还是在A~F之间 MOV A,R2 JC ADD30 ;如在0~9之间,直接加30H ADD A,#07H ;如在A~F之间,先加07H,再加30H ADD30:ADD A,#30H MOV R2,A END 例:以查表方法把累加器A中的十六进制 数转换为ASCII码,并送回累加器中。 程序如下: 指令地址 2000 2001 2002 源程序 ORG 2000H HBA:INC A MOVC A,@A+PC RET 十六进制与ASCII码对应 十六进制 ASCII码 30H 0 1 31H ... ... E F DB DB DB 30H 31H 32H DB DB 45H 46H …… 2011 2012 46H 外部ROM PC 2003 2004 2005 45H PC 2000H INC A 2001H MOVC 2002H RET 2003H 30H 2004H 31H 2005H 32H ... 2012H 46H ... 第3章 单片机汇编程序设计 小结: 1、对有规律可循的运算: (1)找规律写算法,编程序; (2)利用查表指令编程序。 2、对无规律可循的: 只能利用查表指令编程序,别无它法。 第3章 单片机汇编程序设计 【例3-31】一位十六进制数转换8段式数码管显示码。 一位十六进制数0~9、A、B、C、D、E、F的8段式数码管的共阴极显 示码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、 77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通 过运算得到,只能通过查表方式得到。 设数放在R2中,查得的显示码也放于R2中,用 MOVC A,@A+DPTR查表。 程序如下: ORG 0200H CONVERT: MOV DPTR,#TAB ;DPTR指向表首址 MOV A,R2 ;转换的数放于A MOVC A,@A+DPTR ;查表指令转换 MOV R2,A RET TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;共阴极显示码表 在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换, 如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低 位,第二次取得高位。 第3章 单片机汇编程序设计 【例3-32】在一温度控制系统中,温度0~100C每一个温度值都已经通过温度 传感器测得一个两字节的标准电压值。现在R2中给出一个0~100C的温度值,取 得它的标准电压值放于R3、R4中,低字节放在R3中,高字节放在R4中。 通过用MOVC A,@A+DPTR查表,两个字节分两次取得,由DPTR指向表 首,由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器 A中,由于每一个电压值为两个字节,位移量须用R2中的温度值乘以2得到。第 一次取得低字节,第二次位移量加1后查表取得高字节,分别放于R3、R4中。 程序如下: ORG 0300H CHECK: MOV DPTR,#TAB ;指向表首 MOV A,R2 ;温度值送A RL A ;乘2得位移量 MOV R1,A ;位移量暂存于R1中 MOVC A,@A+DPTR MOV R3,A ;第一次查得内容送R3 MOV A,R1 ;取出暂存的位移量送A INC A ;指向高字节 MOVC A,@A+DPTR MOV R4,A ;第二次查得内容送R4 RET TAB: DW 0056H,0059H,0067H,0076H……;电压值表 0℃ 1℃ 2℃ 3℃ …… 例:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中, 要求查表求Y,存入片内RAM 21H单元。 内部RAM ... 方法1: 20H X(变量) 21H Y(结果) ... X Y A A 程序: ORG 1000H SQU: MOV DPTR,#3000H ;确定表首地址(基地址) MOV A,20H ;取 X(变量:偏移量) MOVC A,@A+DPTR ;查表求Y=X2 PC MOV 21H,A ;保存Y(结果) RET ;子程序结束 … ;其它程序段 DPTR ORG 3000H ;常数表格首地址 TAB: DB 00,01,04,09,… ,225 ;平方表 END 外部ROM 1000H 90H 00H 30H ... 3000H 3001H 00 01 ... 225 ... 例:查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H单元中, 要求查表求Y,存入片内RAM 21H单元。 外部ROM 内部RAM 方法2: ... 20H X(变量) 21H Y(结果) ... 指令地址 1000H 1002H 1004H 1005H 1007H 1008H 100BH SQU: TAB: 源程序 ORG 1000H MOV A,20H ADD A,#3 MOVC A,@A+PC MOV 21H,A RET DB 00,01,04 … DB 09,… ,225 X A Y A PC 1000H E5H 20H ... PC 1008H 1009H 00 01 ... ;程序起始地址 225 ;取X ... ;修正偏移量 ;查表求Y=X2 (PC=1005H) ;存结果 ;子程序结束 ;平方表 思考题:当0≤X≤255时,如何用查表法编程求Y=X2。 第3章 单片机汇编程序设计 远程和近程查表指令比较: 特点: 1、MOVC A,@A+DPTR 指令可访问整个ROM的64KB空间,表格可放在 ROM的任何位置,与MOVC指令无必然的关系。 2、MOVC A,@A+PC 优点:不改变PC的状态,根据A的内容取表格常数。 缺点: (1)表格只能存放在查表指令以下的256个单元内。 (2)当表格首地址与本指令间有其它指令时,须用 调整偏移量,调整量为下一条指令的起始地址到表格 首址之间的字节数。 第3章 单片机汇编程序设计 3.5.3 多分支转移(散转)程序 一、用多分支转移指令:用多分支转移指令JMP @A+DPTR 实现多分支转移程序。 利用查地址表法:按分支号转移 【例3-33】现有128路分支,分支号分别为0~127, 要求根据R2中的分支信息转向各个分支的程序。即当 (R2)=0,转向OPR0; (R2)=1,转向OPR1; … (R2)=127,转向OPR127。 [例]有BR0、BR1、BR2和BR3共4个分支程序段,各 分支程序段的功能依次是从内部RAM256B范围取 数、从外部RAM低256B范围取数、从外部 RAM4KB范围取数和从外部RAM64KB范围取数。 并假定R0中存放取数地址低8位地址,R1中存 放高8位地址,R3中存放分支序号值。 假定以BRTAB作差值表首地址, BR0_BRTAB ~ BR3_BRTAB为差值。 分析:差值表=分支入口地址-该表首址 程序: MOV A,R3 MOV DPTR,#BRTAB MOVC A,@A+DPTR JMP @A+DPTR BRTAB: DB BR0_BRTAB DB BR1_BRTAB DB BR2_BRTAB DB BR3_BRTAB 入口地址: 3010H BR0: MOV SJMP 3020H BR1: MOVX SJMP 3040H BR2: MOV ANL ANL ORL MOVX SJMP 3060H BR3: MOV MOV MOVX BRE: SJMP A,@R0 BRE A,@R0 BRE A,R1 A,#0FH P2,#0F0H P2,A A,@R0 BRE DPL,R0 DPH,R1 A,@DPTR $ ;分支转移值送A(如R3=2) ;差值表首址(BRTAB=3000H) ;查表[A+DPTR=3002H,(A)=40H ] ;转移(A+DPTR=3040H) ;差值表(=10H) (=20H) (=40H) 首址 (=60H) DPTR 3000H 10H ;从内部RAM取数 ;从外部RAM256B取数 3001H 3002H 3003H 20H 40H 60H ;从外部RAM4KB取数 ;高位地址取低4位 ;清P2口低4位 ;发高位地址 ;从外部RAM64KB取数 差值表=分支入口地址-该表首址 二、用查转移指令表法:用分支转移指令AJMP与LJMP 对AJMP指令应将分支序号乘以2, 转移范围为2KB; 对LJMP指令应将分支序号乘以3, 转移范围为64KB。 先用无条件转移指令(“AJMP”或“LJMP”)按顺序构 造一个转移指令表,执行转移指令表中的第n条指令,就可以 转移到第n个分支,将转移指令表的首地址装入DPTR中,将 R2中的分支信息装入累加器A形成变址值。然后执行多分支转 移指令JMP @A+DPTR实现转移。 程序清单如下: MOV A,R2 RL A ;分支信息乘2 MOV DPTR,#TAB ;DPTR指向转移指令表首址 JMP @A+DPTR ;转向形成的散转地址 TAB:AJMP OPR0 ;转移指令表 AJMP OPR1 … AJMP OPR127 转移指令表中的转移指令是由AJMP指令构成。 AJMP指令的转移范围不超出2KB字节空间,如各分支 程序比较长,在2KB范围内无法全部存放,应改为LJMP (指令长度为3字节)。 程序如下: ORG 0200H MOV DPTR,#TAB ;DPTR指向转移指令表首址 MOV A,R2 ;分支信息放累加器A中 MOV B,#3 MUL AB ;分支信息乘3 XCH A,B ADD A,DPH ;高字节调整到DPH中 MOV DPH,A XCH A,B JMP @A+DPTR ;转向形成的散转地址 TAB:LJMP OPR0 ;转移指令表 LJMP OPR1 LJMP OPR2 … LJMP OPR127 第3章 单片机汇编程序设计 如分支数大于128个,那么由分支信息得到的变址 值大于一个字节,这时应将高字节调整到DPH中去。 ORG 0200H MOV DPTR,#TAB MOV A,R2 RL A JNC NEXT INC DPH NEXT: JMP @A+DPTR TAB: LJMP OPR0 LJMP OPR1 LJMP OPR2 … LJMP OPR127 ;DPTR指向转移指令表首址 ;分支信息放累加器A中 ;分支信息乘2 ;高字节调整到DPH中 ;转向形成的散转地址 ;转移指令表 转移指令表中的转移指令是由LJMP指令构成。 键功能 读数据 键值 处理程序 01 DS 02 XS 03 CR [例]假定键盘上有3个操作键,功能说明如下表: … 写数据 MOV DPTR,#3000H ;3000H为基址 插 入 ;进位位C清“0” CLR C RLC A ;A带进位位循环左移 JMP @A+DPTR ;转操作键处理程序 首址 3000H DPTR 3000H 3001H 3001H 3002H AJMP DS ;转读数据程序 3002H 3003H 3003H 3004H AJMP XS ;转写数据程序 3004H 3005H 3005H 3006H AJMP CR ;转插入程序 3006H … 3007H AJMP DS AJMP XS AJMP CR 第3章 单片机汇编程序设计 三、采用RET指令实现多分支程序 利用堆栈操作法:使用RET指令 用RET指令实现多分支程序的方法 是:先把各个分支的目的地址按顺序组 织成一张地址表,在程序中用分支信息 去查表,取得对应分支的目的地址,按 先低字节,后高字节的顺序压入堆栈, 然后执行RET指令,执行后则转到对应 的目的位置。 设分支号已存入A。把分支程序入口地址存放在表中。 MTJS:MOV SP,#30H MOV DPTR,#TAB ;取分支入口地址表首地址 CLR C ;分支号×2 如:DPTR=3000H RLC A A=2 MOV R2,A MOVC A,@A+DPTR ;取分支地址低位 PUSH A ;入栈保存 A ROM 内部RAM MOV A,R2 低位地址 3004H ★★ ★★ 31H INC A 3005H ※※ ※※ 32H 高位地址 MOVC A,@A+DPTR ;取分支地址高位 PUSH A ;入栈保存 RET ;分支地址→PC,转移 TAB: DW addr0 ;分支程序入口地址表 PC ※※ ★★ DW addr1 … addr0: … ; 程序段0 … addr1: … ;程序段1 … addr1: … ;程序段2 … ※※ ★★ 【例3-34】用RET指令实现根据R2中的分支信息转到各个分支程序的多分 支转移程序。 设各分支的目的地址分别为addr0、addr1、addr2、…、addr127。 程序如下: MOV DPTR,#TAB3 ;DPTR指向目的地址表 MOV A,R2 ;分支信息放累加器A中 RL A ;分支信息乘2 JNC NEXT INC DPH ;高字节调整到DPH中 NEXT: MOV R3,A ;变址放于R3中暂存 MOVC A,@A+DPTR ;取目的地址低8位 PUSH ACC ;低8位地址入栈 MOV A,R3 ;取出R3中变址到累加器A INC A ;加1得到目的地址高8位单元的变址 MOVC A,@A+DPTR ;取转向地址高8位 PUSH ACC ;高8位地址入栈 RET ;转向目的地址 TAB3: DW addr0 ;目的地址表 DW addr1 … DW addr127 上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。 第3章 单片机汇编程序设计 应用控制流程设计 控制流程设计的基本方法: 在单片机的控制系统中,为了实现 系统的自动控制,必须将控制现场的信 息输入到单片机,经过计算机的处理以 后以被控对象能够接受的形式输出到执 行机构,实现对现场的控制。 第3章 单片机汇编程序设计 例:电机的简单起停控制。其框图如下页图 a 所示。 (1)分析:简单的电机起动停止控制,其控制的示意图及 I/O分配如图 b 所示。 输入信号:启动按钮SB1、停止按钮SB2; 输出信号:继电器KA。 假定:按下按钮,相应的接口信号为低电平(P1.1=0)时: 若程序使 P1.3=1,即KA = 1时,则电机启动。 SB1 启动 SB2 停止 第3章 单片机汇编程序设计 (2)按照上述控制思路,流 程图如右图所示。 ORG STR:MOV WT1:JB SETB WT2:JB CLR SJMP END 1000H P1,#00000110B P1.1,WT1 ;启动? P1.3 ;电机启 P1.2,WT2 ;停止? P1.3 ;电机停 WT1 例:某机床动力头,其行程如图a所示,SQ1、SQ2为左、右行程开关。 要求:(1)每次按SB1启动,工作3个来回后停止,等待下次启动; (2)每次按SB2按钮,在完成当前进给后,停在初始位SQ1处, 等待下次启动。 R0=0 分析: ①硬件原理图, 如图b所示, 其中: 输入信号: 启动按钮P1.0; 停止P1.1; 左右行程开关 P1.2、P1.3。 输出信号: 前进LED灯P1.7; 后退LED灯P1.6。 ②控制流程: 如图c。 前进 LED亮 左限位 右限位 启动 停止 后退LED 前进LED 后退 LED亮 第3章 单片机汇编程序设计 WT1: R0=0 ③汇编程序: LOOP: WT2: WT3: MAIN:MOV MOV WT1: JB LOOP:SETB WT2:JB CLR LCALL SETB INC WT3: JB CLR JNB CJNE MOV AJMP R0,#00H P1,#0FH P1.0,WT1 P1.7 P1.3,WT2 P1.7 DIR ;延时 P1.6 R0 P1.2,WT3 P1.6 P1.1,WT1 R0,#3,LOOP R0,#00H WT1 DIR为延时子程序。 第3章 单片机汇编程序设计 例:试编制十字路口交通灯控制程序, 控制时序如下: 绿灯闪烁3次 绿灯闪烁 分析:在仿真实验板上,采用双色灯模拟交通灯,并通过反相驱动芯 片74LS240带动,发光控制如下图: 当P1口的某个引脚为低电平时,发 光二极管变亮,当P1口的某个引脚 为高电平时,发光二极管熄灭。 西 北 南 东 1) 硬件接线如图,分配如下: HL1:P1.0、P1.4 HL2:P1.1、P1.5 HL3:P1.2、P1.6 HL4:P1.3、P1.7 可以通过向P1口写入一个8位 二进制数来改变每个管脚的电 平状态,而向P1口写入数据可 以通过相应指令来实现。 绿 灯 HL1 北 HL2 西 HL3 东 HL4 南 红 灯 P1.1、P1.2 (绿灯) (红灯) (1) 硬件接线如图,分配如下: 绿灯闪烁 HL1:P1.0、P1.4(北) P1.5、P1.6 HL2:P1.1,P1.5(西) HL3:P1.2,P1.6(东) P1.4、P1.7 HL4:P1.3,P1.7(南) P1.0、P1.3 (2)控制程序: 绿灯闪烁 ORG 1000H START: MOV R0,#0 MOV R1,#0 MOV P1,#01101001B ;东西绿灯,南北红灯 ACALL DL5S SS1: MOV P1,#01101111B ;南北红灯 ACALL DL1S MOV P1,#69H(69H=01101001B) ;东西绿灯闪 ACALL DL1S INC R0 CJNE R0,#03H,SS1 MOV P1,#10010110B ;南北绿灯,东西红灯 ACALL DL5S SS2: MOV ACALL MOV ACALL INC CJNE SJMP DL5S: MOV DL2: MOV DL1: MOV DJNZ DJNZ DJNZ RET DL1S: (略) RET END P1,#10011111B ;东西红灯 DL1S P1,#96H(96H=10010110B) ;南北绿灯闪 DL1S R0 R0,#03H,SS2 START R7,#50 ;5秒延时 R6,#200 R5,#250 R5,$ R6,DL1 R7,DL2 ;1秒延时 第3章 单片机汇编程序设计 本章小结 1、基本概念:寄存器寻址、寄存器间接寻址、直接寻址、位寻址、 基寄存器加变址寄存器间接寻址。 2、数据传送指令、算术运算指令、逻缉运算指令、位操作指令、 控制转移指令。 重点:寻址方式和指令系统,简单程序阅读。 难点:寻址方式,控制转移指令中相对地址计算,堆栈操作,以 及简单汇编程序阅读。 3、程序设计基本概念: (1)标号、操作码、操作数、注解; (2)伪指令:ORG、DB、DW、EQU; (3)程序状态字PSW。 4、简单程序设计、循环程序设计、分支程序设计、查表程序设计、 应用程序设计。 重点:汇编程序结构、控制流程设计,汇编程序阅读、设计,应 用程序设计。 难点:汇编程序结构、控制流程,应用程序设计。 第3章 单片机汇编程序设计 常用程序结构:顺序结构、分支结构、循环结构 (1)顺序程序:直线程序或简单程序 单重分支 (2)分支程序 多次使用条件转移指令 多重分支 地址表法 按分支号转移 转移指令表法 通过堆栈操作 (3)循环程序: 构成:初始化、循环体、控制变量的修改、循环次数的控制。 延时; 记数控制 控制 特征标志控制 第3章 单片机汇编程序设计 Have a Break