单元三MCS-51单片机指令系统.ppt_第1页
单元三MCS-51单片机指令系统.ppt_第2页
单元三MCS-51单片机指令系统.ppt_第3页
单元三MCS-51单片机指令系统.ppt_第4页
单元三MCS-51单片机指令系统.ppt_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

单元三 MCS-51单片机指令系统,3.1 任务二 P1口外接8只发光二极管模拟彩灯,3.2 任务三 单片机做加、减、乘、除运算,3.3 任务四 单片机做逻辑运算,3.4 任务五 按键控制灯,3.5 任务六 LED显示电路,返回主目录,3.1 任务二 P1口外接8只LED发光二极管模拟彩灯,学习目标:通过学习任务二的完成方法,掌握MCS-51单片机的数据传送指令的功能及MCS-51单片机的寻址方式。 任务描述:利用P1口外接的8只LED发光二极管模拟彩灯。常见的彩灯模式有:流水式彩灯、追逐式彩灯、累积式彩灯、开幕式与闭幕式彩灯以及将上述模式组合而成的复合式彩灯。大多数的彩灯都是采用单片机控制的,简单的彩灯单片机的控制程序也较为简单,复杂的彩灯单片机控制程序也较为复杂。,3.1.1 硬件电路,1、硬件电路,2、工作原理 当P1。0P1。7中的某端口为低电平时,对应的发光二极管亮,为高电平灭。我们只要控制P1口各位的电平状态,就可以控制8只LED的亮与灭。 例如使(P1)=01010101B=55H, D7、D5、D3、D14只LED亮,D6、D4、D2、D04只LED灭,从效果上看亮与灭是相间隔的;反之,使(P1)=10101010B=AAH,则另外4只LED亮,若反复以一定时间间隔不断从P1口轮流输出55H和AAH,则P1口上8只LED会呈现流水彩灯的效果。,1)将立即数送P1口的程序 ORG 0000H ; 定义程序从程序存贮器0000H单元开始存放 LOOP: MOV P1,#55H ; 立即数55H送P1口,4只LED亮 SJMP LOOP ; 原地踏步 END ; 程序结束 2)通过累加器A控制P1口的程序 ORG 0000H LOOP: MOV A,#0AAH ;将立即数AAH送累加器A MOV P1, A ;累加器A中的数送P1端口 SJMP LOOP ;转移到LOOP END,3.1.2 控制程序,3)流水式彩灯程序,ORG 0000H LOOP: MOV P1,#55H ;将立即数55H送P1端口 LCALL TIME ;调延时子程序TIME MOV P1,#0AAH ;将立即数AAH送P1端口 LCALL TIME ;调延时子程序TIME SJMP LOOP ;转移到LOOP TIME: MOV R6,#200 ;延时子程序TIME TIME1:MOV R7,#200 TIME2:NOP NOP NOP DJNZ R7,TIME2 DJNZ R6,TIME1 RET END,4)开幕式与闭幕式彩灯程序,ORG 0000H LJMP MAIN ;跳转到主程序 ORG 0030H MAIN: MOV R0,#8 ;R0送循环次数8 MOV DPTR,#TAB ;给数据指针赋值 LOOP: MOV A,#00H ; MOVC A, A + DPTR MOV P1,A LCALL TIME INC DPL DJNZ R0,LOOP SJMP MAIN TIME: MOV R6,#200 TIME1: MOV R7,#200 TIME2: NOP NOP NOP DJNZ R7,TIME2 DJNZ R6,TIME1 RET TAB: DB 81H,0C3H,0E7H,0FFH,18H,3CH,7EH,0FFH END,用“伟福”模拟仿真软件进行程序的编辑、编译。打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。 要解决的问题: 1、什么是数据传送操作与数据传送指令?MCS-51单片机 有哪些数据传递指令? 2、什么是指令的寻址方式? MCS-51单片机指令系统采 用了哪几种寻址方式? 3、指令在CPU内部的执行过程?,3.1.3 源程序的编辑、编译、下载,3.1.4 相关知识,1.单片机内部数据是怎样传送到端口使二极管发亮的? 单片机内部的端口寄存器与片外引脚是直接相连的,数 据通过单片机内部数据总线传送到端口寄存器(用数据 传送指令完成数据的传送),结合发光二极管硬件电 路,二极管便发亮了。 2. 什么是数据传送操作与数据传送指令?MCS-51单片机 有哪些数据传递指令? 数据传送操作:在计算机中将数据信息从源存储地址传 送到目标存储地址的操作 数据传送指令:完成数据传送的指令,MCS-51单片机的数据传送指令共有29条:,(1)以累加器A为目的操作数类指令(4条) MOV A,data ;(data)(A) 直接单元地址中的内容 送到累加器A MOV A,#data ;#data(A) 立即数送到累加器A中 MOV A,Rn ;(Rn)(A) Rn中的内容送到累加器A 中 MOV A,Ri ;(Ri)(A) Ri内容指向的地址单 元中的内容送到累加器A。 例如:任务中“累加器A控制P1口的程序”里有一条MOV A,#0AAH指令就属于此类。,(2)以寄存器Rn为目的操作数的指令(3条) 这3条指令的功能是把源操作数指定的内容送到所选定的工作寄存器Rn中。有直接、立即和寄存器寻址方式: MOV Rn,data ;(data)(Rn) 直接寻址单元中的内容送到 寄存器Rn中 MOV Rn,#data ;#data(Rn) 立即数直接送到寄存器Rn中。 MOV Rn,A ;(A)(Rn) 累加器A中的内容送到寄存器 Rn中。 例如:任务中“开幕式和闭幕式彩灯程序”里的 MOV R6,#200 MOV R7,#200 指令属于此类。,(3)以直接地址为目的操作数的指令(5条) 这组指令的功能是把源操作数指定的内容送到由直接地址data所选定的片内RAM中 MOV data,data ;(data)(data) 直接地址单元中的内容送到直接地址单元。 MOV data,#data ;#data(data) 立即数送到直接地址单元。,MOV data,A ;(A)(data) 累加器A中的内容送到直接地址单元。 MOV data,Rn ;(Rn)(data) 寄存器Rn中的内容送到直接地址单元。 MOV data,Ri ;(Ri)(data) 寄存器Ri中的内容指定的地址单元中数据送到直接地址单元。 例如:任务中“流水式彩灯程序”里的 MOV P1,#0AAH。任务中“开幕式和闭幕式彩灯程序”里MOV P1,A指令属于此类。应该注意,这里DATA是用寄存器的名字表示的。,(4)以间接地址为目的操作数的指令(3条) 这组指令的功能是把源操作数指定的内容送到以Ri中的内容为地址的片内RAM中。 MOV Ri,data ;(data)(Ri) 直接地址单元中的内容送到以Ri中的内容为地址的RAM单元。 MOV Ri,#data ;#data(Ri) 立即数送到以Ri中的内容为地址的RAM单元。 MOV Ri,A ;(A)(Ri) 累加器A中的内容送到以Ri中的内容为地址的RAM单元。,(5)查表指令(2条) 这组指令的功能是对存放于程序存储器中的数据表格进行查找传送,使用变址寻址方式: MOVC A,A+DPTR ;(A)+(DPTR)(A) 表格地址单元中的内容送到累加器A中。 MOVC A,A+PC ;(PC)+1(A),(A)+(PC)(A) 表格地址单元中的内容送到累加器A中。 例如:在任务中“开幕式闭幕式彩灯程序”里就有 MOVC A, A + DPTR 指令讲预先制好的表格数据取出来。,(6)累加器A与片外数据存储器RAM传送指令(4条) 这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式: MOVX DPTR,A ;(A)(DPTR) 累加器中的内容送到数据指针指向片外RAM地址中。 MOVX A, DPTR ;(DPTR)(A) 数据指针指向片外RAM地址中的内容送到累加器A中。 MOVX A, Ri ;(Ri)(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中。 MOVX Ri,A ;(A)(Ri) 累加器中的内容送到寄存器Ri指向片外RAM地址中。,(7)堆栈操作类指令(2条),这4类指令的作用是把直接寻址单元的内容传送到堆栈指针SP所指的单元中,以及把SP所指单元的内容送到直接寻址单元中。 PUSH data ;(SP)+1(SP),(data)(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的单元中。 POP data ;(SP)(data)(SP)-1(SP), 堆栈指针SP所指的单元数据送到直接寻址单元中,堆栈指针SP再进行减1操作。,(8)交换指令(5条) 这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。 XCH A,Rn ;(A)(Rn)累加器与工作寄存器Rn中的内容互换。 XCH A,Ri ;(A)(Ri)累加器与工作寄存器Ri所指的存储单元中的内容互换。 XCH A,data ;(A)(data)累加器与直接地址单元中的内容互换。 XCHD A,Ri ;(A3-0)(Ri)3-0)累加器与工作寄存器Ri所指的存储单元中的内容低半字节互换。 SWAP A ;(A3-0)(A7-4)累加器中的内容高低半字节互换。,(9)16位数据传送指令(1条) 这条指令的功能是把16位常数送入数据指针寄存器。 MOV DPTR,#data16 ;(data16)H(DPH);(data16)L(DPL)。16位常数的高8位送到DPH,低8位送到DPL。 3、什么是指令的寻址方式? MCS-51单片机指令系统采用了哪几种寻址方式? 寻址的“地址”即为操作数所在单元的地址,绝大部分指令执行时都需要用到操作数,那么到哪里去取得操作数呢?最易想到的就是告诉CPU操作数所在的地址单元,从那里可取得响应的操作数,这便是“寻址”之意。,操作数是指令的重要组成部分,指出了参与操作的数据或数据的地址。寻找操作数地址的方式称为寻址方式。一条指令采用什么样的寻址方式,是由指令的功能决定的。寻址方式越多,指令功能就越强。 MCS-51指令系统共使用了7种寻址方式,包括寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。,直接寻址是指把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。 例如指令:MOV A,2BH 执行的操作是将内部RAM 中地址为3AH的单元内容传送到累加器A中,其操作数3AH就是存放数据的单元地址,因此该指令是直接寻址。 设内部RAM 3AH单元的内容是88H,那么指令MOV A,2BH的执行过程如立即数寻址示意图所示。,(1)直接寻址,直接寻址示意图,寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器R0R7、累加器A、通用寄存器B、地址寄存器DPTR等。例如指令:MOV R1,A 的操作是把累加器A中的数据传送到寄存器R1中,其操作数存放在累加器A中,所以寻址方式为寄存器寻址。 如果程序状态寄存器PSW的RS1RS0=10(选中第二组工作寄存器,对应地址为10H17H),设累加器A的内容为4AH,则执行MOV R1,A 指令后,内部RAM 11H单元的值就变为4AH,如寄存器寻址示意图所示。,(2)寄存器寻址,寄存器寻址示意图,(3)寄存器间接寻址 寄存器间接寻址是指将存放操作数的内存单元的地址放在寄存器中,指令中只给出该寄存器。执行指令时,首先根据寄存器的内容,找到所需要的操作数地址,再由该地址找到操作数并完成相应操作。 在MCS-51指令系统中,用于寄存器间接寻址的寄存器有R0、R1和DPTR,称为寄存器间接寻址寄存器。 注意:间接寻址寄存器前面必须加上符号“”。例如,指令MOV A,R0 执行的操作是将R0的内容作为内部RAM的地址,再将该地址单元中的内容取出来送到累加器A中。,设R0=3AH,内部RAM 3AH中的值是65H,则指令MOV A,R0的执行结果是累加器A的值为65H,该指令的执如右图。,寄存器间接寻址示意图,(4)立即数寻址 立即数寻址是指将操作数直接写在指令中。 例如指令: MOV A,#2BH 执行的操作是将立即数3AH送到累加器A中,该指令就是立即数寻址。注意:立即数前面必须加“#”号,以区别立即数和直接地址。该指令的执行过程如立即数寻址示意图所示。,立即数寻址示意图,变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。 例如,指令MOVC A,A+DPTR执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。,(5)变址寻址,(6)变址寻址过程,设累加器A=02H,DPTR=1110H,外部ROM中,1112H单元的内容是AAH,则指令MOVC A,A+DPTR的执行结果是累加器A的内容为55H。该指令的执行过程如下图所示。,位寻址是指按位进行的寻址操作,MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。 位寻址区包括专门安排在内部RAM中的两个区域:一是内部RAM的位寻址区,地址范围是20H2FH,共16个RAM单元,位地址为00H7FH;二是特殊功能寄存器SFR中有11个寄存器可以位寻址。,(7)位寻址,例如,指令SETB 3DH执行的操作是将内部RAM位寻址区中的3DH位置1。,设内部RAM 27H单元的内容是00H,执行SETB 3DH后,由于3DH对应内部RAM 27H的第6位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图3.7所示。,相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。 例如,指令SJMP 54H执行的操作是将PC当前的内容与54H相加,结果再送回PC中,成为下一条将要执行指令的地址。,(7)相对寻址,相对寻址过程,设指令SJMP 54H的机器码80H 54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数54H相加,形成目标地址2056H,再送回PC,使得程序跳转到2056H单元继续执行。该指令的执行过程如图所示。,指令的书写必须遵守一定的规则,指令描述的约定如下。,指令系统中的符号约定,#data16,4、指令在CPU内部的执行过程,指令是以二进制的形式存放在程序存储器中的,CPU执行指令的过程是不断的从程序存储器取指令,指令译码器对指令进行译码,并发出与指令相应的微操作信号,完成指令的执行。,MCS-51单片机取指时序,5、数据传送指令应用举例,【例3.1】 在程序存储器中从而2000H单元开始依次存放置09的平方值:0、1、4、9、81,要求依据累加器A中的值(09)来查找所对应的平方值,分析下述程序的结果。 MOV DPTR,#2000H MOV A,#09H MOVC A,A+DPTR 执行结果:(DPTR)=2000H,(A)=51H。,【例3.2】 仍以上例程序存储器中 2000H单元开始存放09的平方值,以PC作为基址寄存器进行查表,设MOVC指令所在地址(PC)=1FF0F。 解:偏移量=2000H(1FF0H+1)=0FH 相应的程序如下: MOV A,#09H ADD A,#0FH MOVC A,A+PC 执行结果:(PC)=1FF1H,(A)=51H,【例3.3】 若在程序存储器中2000H单元开始依次存放09的平方值,数据指针(DPTR)=3A00H,用查一指令取出2003H单元的数据后,要求保持DPTR中的内容不变,完成以上功能的程序如下: MOV A, #03H ;(A)03H PUSH DPH ;保护DPTR高8位入栈 PUSH DPL ;保护DPTR低8位入栈 MOV DPTR,#2000H ;(DPTR)2000H MOVC A,A+DPTR ;(A)(2000H+03H) POP DPL ;弹出DPTR低8位 POP DPH ;弹出DPTR高8位,(先进后出) 执行结果:(A)=09H,(DPTR)=3A00H。,小结: 1、 MCS-51单片机指令系统有哪些数据传送指令? 2、什么是指令的寻址方式? MCS-51单片机指令系统采用了哪几种寻址方式? 3、指令在CPU内部的执行过程,思考与练习:3.1 3.5,模拟彩灯实验实训项目 功能:8只LED模拟彩灯,形成流水、追逐等效果。 要求:课外完成硬件制作、编程、仿真调试,3.2 任务三 单片机做加、减、乘、除运算,学习目标: 通过学习任务三的完成方法,掌握MCS-51单片机的算术运算指令的功能及运算指令对程序状态字的影响。 任务描述: 利用单片机的算术运算指令进行加、减、乘、除运算,并将结果送P1口发光二极管显示。,3.2.1 硬件电路,1、硬件电路,2、工作原理 利用P0口、P2口外接的拨动开关设制运算的数据,利用单片机的算术运算指令进行加、减、乘、除运算,并将结果送P1口发光二极管显示。,1)加法运算程序 ORG 0000H MOV A,P0 MOV R0,P2 ADD A,R0 MOV P1,A SJMP $ END,2)减法运算程序 ORG 0000H MOV A,P0 MOV R0,P2 SUBB A,R0 MOV P1,A SJMP $ END,3.2.2 程序设计,4)除法运算程序 ORG 0000H MOV A,P0 MOV B,P2 DIV AB MOV P1,A SJMP $ END,3)乘法运算程序 ORG 0000H MOV A,P0 MOV B,P2 MUL AB MOV P1,A SJMP $ END,用“伟福”模拟仿真软件进行程序的编辑、编译。打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。 要解决的问题: 1、什么是算术运算指令?MCS-51单片机有哪些算术运 算指令? 2、单片机运算的速度快吗? 3、指令使用的区别?,3.2.3 源程序的编辑、编译、下载,用“伟福”模拟仿真软件进行程序的编辑、编译。打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。 要解决的问题: 1、什么是算术运算指令?MCS-51单片机有哪些算术运 算指令? 2、单片机运算的速度快吗? 3、指令使用的区别?,3.2.4 相关知识,1、单片机是怎样做加、减、乘、除运算的? 在单片机CPU内部集成的算术运算部件(主要有加法器和乘法器、除法器),可以完成加、减、乘、除运算,单片机的算术运算指令经过指令译码器译码后产生的控制信号控制算术运算部件工作产生运算结果。 2、MCS-51单片机有哪些算术运算指令? MCS-51单片机算术运算指令共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。,(1)不带进位的加法指令(4条) 这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。 ADD A,#data ;(A)+#data(A) 累加器A中的内容与立即数#data相加,结果存在A中 ADD A,data ;(A)+(data)(A) 累加器A中的内容与直接地址单元中的内容相加,结果存在A中 ADD A,Rn ;(A)+(Rn)(A) 累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中,ADD A,Ri ;(A)+(Ri)(A) 累加器A中的内容与工作寄存器Ri所指向地址单元中的内容相加,结果存在A中 例如:如任务中“加法程序”里 MOV A,P0 MOV R0,P2 ADD A,R0 就是将P0口与P2口的内容相加。,(2)带进位的加法指令(4条) 这4条指令除与1功能相同外,在进行加法运算时还需考虑进位问题。 ADDC A,data ;(A)+(data)+(C)(A) 累加器A中的内容与直接地址单元的内容连同进位位相加,结果存在A中 ADDC A,#data ;(A)+#data +(C)(A) 累加器A中的内容与立即数连同进位位相加,结果存在A中 ADDC A,Rn ;(A)+Rn+(C)(A) 累加器A中的内容与工作寄存器Rn中的内容、连同进位位相加,结果存在A中 ADDC A,Ri ;(A)+(Ri)+(C)(A) 累加器A中的内容与工作寄存器Ri指向地址单元中的内容、连同进位位相加,结果存在A中,(3)带借位减法指令(4条) 这组指令包含立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C内容相减,结果送回累加器A中。 这里我们对借位位C的状态作出说明,在进行减法运算中,CY=1表示有借位,CY=0则无借位。OV=1声明带符号数相减时,从一个正数减去一个负数结果为负数,或者从一个负数中减去一个正数结果为正数的错误情况。在进行减法运算前,如果不知道借位标志位C的状态,则应先对CY进行清零操作。 SUBB A,data ;(A)-(data) - (C)(A) 累加器A中的内容与直接地址单元中的内容、连同借位位相减,结果存在A中。,SUBB A,#data ;(A)-#data -(C)(A) 累加器A中的内容与立即数、连同借位位相减,结果存在A中。 SUBB A,Rn ;(A)-(Rn) -(C)(A) 累加器A中的内容与工作寄存器中的内容、连同借位位相减,结果存在A中 SUBB A,Ri ;(A)-(Ri) -(C)(A) 累加器A中的内容与工作寄存器Ri指向的地址单元中的内容、连同借位位相减,结果存在A中。 例如:任务中“减法程序”里 MOV A,P0 MOV R0,P2 SUBB A,R0 就是将P0口与P2口的内容相减。,(4)乘法指令(1条) 这个指令的作用是把累加器A和寄存器B中的8位无符号数相乘,所得到的是16位乘积,这个结果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,说明乘积大于FFH,否则OV=0,但进位标志位CY总是等于0。 MUL AB ;(A)(B)(A)和(B) 累加器A中的内容与寄存器B中的内容相乘,结果存在A、B中。 例如:任务中“加法程序”里 MOV A,P0 MOV B,P2 MUL AB 就是将P0口与P2口的内容相乘,低字节存于A,高字节存于B。,(5)除法指令(1条) 这个指令的作用是把累加器A的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A,而余数存在寄存器B中。除法运算总是使OV和进位标志位CY等于0。 DIV AB ;(A)(B)(A)和(B) 累加器A中的内容除以寄存器B中的内容,所得到的商存在累加器A,而余数存在寄存器B中。 例如:任务中“加法程序”里 MOV A,P0 MOV B,P2 DIV AB 就是将P0口与P2口的内容相除,商存于A,余数存于B。,(6)加1指令(5条) 这5条指令的的功能均为原寄存器的内容加1,结果送回原寄存器。上述提到,加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,执行加1后,结果就会是00H。这组指令共有直接、寄存器、寄存器减间址等寻址方式: INC A ;(A)+1(A) 累加器A中的内容加1,结果存在A中。 INC data ;(data)+1(data) 直接地址单元中的内容加1,结果送回原地址单元中。,INC Ri ;(Ri)+1(Ri) 寄存器的内容指向的地址单元中的内容加1,结果送回原地址单元中 INC Rn ;(Rn)+1(Rn)寄存器Rn的内容加1,结果送回原地址单元中 INC DPTR ;(DPTR)+1(DPTR)数据指针的内容加1,结果送回数据指针中 说明:在INC data这条指令中,如果直接地址是I/O,其功能是先读入I/O锁存器的内容,然后在CPU进行加1操作,再输出到I/O上,这就是“读修改写”操作。,(7)减1指令(4条) 这组指令的作用是把所指的寄存器内容减1,结果送回原寄存器,若原寄存器的内容为00H,减1后即为FFH,运算结果不影响任何标志位。 DEC A ;(A)-1(A)累加器A中的内容减1,结果送回累加器A中 DEC data ;(data)-1(data)直接地址单元中的内容减1,结果送回直接地址单元中 DEC Ri ;(Ri)-1(Ri)寄存器Ri指向的地址单元中的内容减1,结果送回原地址单元中 DEC Rn ;(Rn)-1(Rn)寄存器Rn中的内容减1,结果送回寄存器Rn中。,(8)十进制调整指令(1条) 在进行BCD码运算时,这条指令总是跟在ADD或ADDC指令之后,其功能是将执行加法运算后存于累加器A中的结果进行调整和修正。 DA A,3、算术运算指令应用举例 【例3.4】 双字节无符号数加法(R0R1)(R2R3)(R4R5) R0、R2、R4中存放16位数的高字节,R1、R3、R5中存放低字节。由于不存在16位数加法指令,所以只能先加低8位,而在加高8位时要连低8沉位相加时产生的进位一起相加。假设其和不超过16位,其编程如下: MOV A,R1 ;取被加数低字节 ADD A,R3 ;低字节相加 MOV R5,A ;保存和低字节 MOV A,R0 ;取高字节被加数 ADDC A,R2 ;两高字节之和加低位进位 MOV R4,A ;保存和高字节,【例3.5】 双字节无符号数相减(R0R1)(R2R3)(R4R5) R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。先减低8位,后减高8位和低位减借位,所以要先清零。其编程如下: MOV A,R1 ;取被减数低字节 CLR C ;清借位位 SUBB A,R3 ;低字节相减 MOV R5,A ;保存差低字节 MOV A,R0 ;取被减法高字节 SUBB A,R2 ;两高字节之差减低位借位 MOV R4,A ;保存差高字节,小结: 1、任务三的硬件电路与工作原理 2、单片机是怎样做加、减、乘、除运算的? 3、MCS-51单片机有哪些算术指令?,思考与练习:3.14 3.15,算术运算实验实训项目 功能:加、减、乘、除运算程序。 要求:课外完成编程、使用软件和实验板进行仿真调试,3.3 任务四 单片机作逻辑运算,学习目标: 通过学习任务四的完成方法,掌握MCS-51单片机的逻辑运算指令的功能。 任务描述: 利用单片机的逻辑运算指令进行逻辑与、或、异或等逻辑运算,并将结果送P1口发光二极管显示。,3.3.1 硬件电路,1、硬件电路 硬件电路仍采用实验开发板上的电路,如图所示。,2、工作原理 通过P0口、P2口外接的拨动开关设制运算的数据,利用单片机的逻辑运算指令运算,并将结果送P1口发光二极管显示。,3.2.2 程序设计,1. 逻辑“与”运算程序 ORG 0000H MOV A,P0 ANL A,P2 MOV P1,A SJMP $ END,2. 逻辑“或”运算程序 ORG 0000H MOV A,P0 ORL A,P2 MOV P1,A SJMP $ END,3. 逻辑“异或”运算程序 ORG 0000H MOV A,P0 XRL A,P2 MOV P1,A SJMP $,用“伟福”模拟仿真软件进行程序的编辑、编译。打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。 要解决的问题: 1、什么是逻辑运算指令?MCS51有哪些逻辑运算指令? 2、取反与清零。 3、为什么单片机中要集成逻辑运算部件? 4、“与”、“或”、“异或”指令的应用技巧 ?,3.3.3 源程序的编辑、编译、下载,3.3.4 相关知识,1、单片机是怎样做逻辑运算的? 单片机CPU内部集成的逻辑运算部件(主要有与运算器、或运算器、异或运算器等),可以完成与、或、异或运算等,单片机的逻辑运算指令经过指令译码器译码后产生的控制信号控制逻辑运算部件工作产生运算结果。 2、MCS51单片机有哪些逻辑运算指令? 逻辑运算和移位指令共有25条,有与、或、异或、求反、左右移位、清0等逻辑操作,有直接、寄存器和寄存器间址等寻址方式。这类指令一般不影响程序状态字(PSW)标志。,(1)循环移位指令(4条) 这4条指令的作用是将累加器中的内容循环左或右移一位,后两条指令是连同进位位CY一起移位。 RL A ;累加器A中的内容左移一位。 RR A ;累加器A中的内容右移一位。 RLC A ;累加器A中的内容连同进位位CY左移一位。 RRC A ;累加器A中的内容连同进位位CY右移一位。,(2)累加器半字节交换指令(1条) 这条指令是将累加器中的内容高低半字节互换,这在上一节中内容已有介绍。 SWAP A ; 累加器中的内容高低半字节互换 (3)求反指令(1条) 这条指令将累加器中的内容按位取反。 CPL A ; 累加器中的内容按位取反 (4)清零指令(1条) 这条指令将累加器中的内容清0。 CLR A ; 0(A),累加器中的内容清0,(5)逻辑与操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑与操作。如果直接地址是I/O地址,则为“读修改写”操作。 ANL A,data ;累加器A中的内容和直接地址单元中的内容执行与逻辑操作。结果存在寄存器A中。 ANL data,#data ;直接地址单元中的内容和立即数执行与逻辑操作。结果存在直接地址单元中。,ANL A,#data ;累加器A的内容和立即数执行与逻辑操作。结果存在累加器A中。 ANL A,Rn ;累加器A的内容和寄存器Rn中的内容执行与逻辑操作。结果存在累加器A中。 ANL data,A ;直接地址单元中的内容和累加器A的内容执行与逻辑操作。结果存在直接地址单元中。 ANL A,Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行与逻辑操作。结果存在累加器A中。 例如:任务中的ANL A,P2 指令。,(6)逻辑或操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑或操作。如果直接地址是I/O地址,则为“读修改写”操作。 ORL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑或操作。结果存在寄存器A中。 ORL data,#data ;直接地址单元中的内容和立即数执行逻辑或操作。结果存在直接地址单元中。,ORL A,#data ;累加器A的内容和立即数执行逻辑或操作。结果存在累加器A中。 ORL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑或操作。结果存在累加器A中。 ORL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑或操作。结果存在直接地址单元中。 ORL A,Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑或操作。结果存在累加器A中。 例如:任务中的 ORL A,P2 指令。,(7)逻辑异或操作指令(6条) 这组指令的作用是将两个单元中的内容执行逻辑异或操作。如果直接地址是I/O地址,则为“读修改写”操作。 XRL A,data ;累加器A中的内容和直接地址单元中的内容执行逻辑异或操作。结果存在寄存器A中。 XRL data,#data ;直接地址单元中的内容和立即数执行逻辑异或操作。结果存在直接地址单元中。 XRL A,#data ;累加器A的内容和立即数执行逻辑异或操作。结果存在累加器A中。,XRL A,Rn ;累加器A的内容和寄存器Rn中的内容执行逻辑异或操作。结果存在累加器A中。 XRL data,A ;直接地址单元中的内容和累加器A的内容执行逻辑异或操作。结果存在直接地址单元中。 XRL A,Ri ;累加器A的内容和工作寄存器Ri指向的地址单元中的内容执行逻辑异或操作。结果存在累加器A中。 例如:任务中的 XRL A,P2 指令。,3、逻辑运算指令应用举例 【例3.9】 16位数的算术左移。16位数在内存中低8位存放在1单元,高8位存放在1+1单元。 解:所谓算术左移就是将操作数左移一位,并使最低位补充0,相当于完成 16位数的乘务员操作,故称算术左移。参考程序如下: CLR C ;进位CY清零 MOV R1,#M1 ;操作数地址M1送R1,MOV A, R1 ;低8位数送A RLC A, ;低8位左移,最低位补0 MOV R1 ,A ;低8位左移后,回送M1存放 INC R1 ;指向16位高8位地址M1+1 MOV A, R1 ;低8位送A RLC A, ;高8位带低8位进位左移 MOV R1 ,A ;高8位左移后回送M1+1存放 说明:若要对16位数进行循环移位,则应首先设法把最高位(D15)的值置入CY,然后再参照以上程序编写即可。利用以后介绍的位操作指令可以很容易地实现将某一位的值置入CY。,小结: 1、任务四的硬件电路与工作原理 2、单片机是怎样做逻辑运算的? 3、MCS-51单片机有哪些逻辑运算指令?,思考与练习: 3.20 3.21,逻辑运算实验实训项目 功能:逻辑运算程序。 要求:课外完成编程、使用软件和实验板进行仿真调试,3.4 任务五 按键控制灯,学习目标: 通过学习任务五的完成方法,掌握MCS-51单片机的控制转移指令的功能。 任务描述: 用S1S4组成的键盘分别控制P1口发光二极管发光,按住S1键红色发光二极管(假定为P1.0)亮,按住S2键黄色发光二极(P1.1)管亮,按住S3键绿色发光二极管(假定为P1.2)亮。S4 用于控制三组灯之间的切换。,3.4.1 硬件电路,硬件电路采用实验开发板上的电路,如图3.6所示。用S1S4组成的键盘分别控制P1口发光二极管发光。,3.4.2 程序设计,ORG 0000H LJMP MAIN ORG 0030H MAIN:ORL P3,#3CH MOV A,P3 ANL A,#3CH MOV R0,A CJNE A,#3CH,MAIN1 SJMP MAIN MAIN1:MOV R1,#10,PDO: LCALL DELAY DJNZ R1,PDO MOV A,P3 CJNE A,R0,DODO K_S1: JB P3.2,K_S2 LJMP KEY_1 K_S2: JB P3.3,K_S3 LJMP KEY_2 K_S3: JB P3.4,K_S4 LJMP KEY_3 K_S4: JB P3.5,DODO,3.4.2 程序设计,SPK1: CPL P3.2 LCALL DELAY DJNZ R2,SPK1 DJNZ R1,SPK2 SJMP MAIN DELAY: MOV R3,#10 DEL: MOV R4,#50 DJNZ R4,$ DJNZ R3,DEL END,LJMP KEY_4 DODO: SJMP MAIN KEY_1: MOV P1,#0FDH SJMP MAIN KEY_2: MOV P1,#0FBH SJMP MAIN KEY_3: MOV P1,#0FEH SJMP MAIN KEY_4: MOV R1,#10 SPK2: MOV R2,#50H,3.4.3 源程序的编辑、编译、下载,用“伟福”模拟仿真软件进行程序的编辑、编译。打开“ISP下载软件”将目标文件下载到ISP-4实验开发板上的AT89S51单片机芯片,观察程序运行结果。 要解决的问题: 1、MCS-51有哪些控制转移指令? 2、实验开发板上的555振荡电路起什么作用? 3、为什么计数脉冲从P3.4引脚输入? 4、如何使LED七段数码管显示字符? 5、如何实现软件延时? 6、如何使计数值按十进制进位,3.4.4 相关知识,1、如何用按键控制灯? 按键是单片机常用的输人控制设备,用于信息和命令的输人,当按键与灯的对应关系建立后,单片机程序不断轮流检测S1S4按键是否有键按下,当有某键按下时,单片机点亮相应的灯。也就是说,每个按键都对应了一个程序段,按下不同按键,程序就执行相应程序段,怎样才能实现这种转移呢?原来单片机中专门有一类控制转移类指令。,2、MCS-51单片机有哪些控制转移指令? 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。,(1)无条件转移指令(4条) 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16(PC),给程序计数器赋予新值的16位地址。 AJMP addr11 ;(PC)+2(PC),addr11(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变。,SJMP rel ;(PC)+ 2 + rel(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值。 JMP A+DPTR ;(A)+ (DPTR)(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值。 例如:任务中的 LJMP MAIN 指令,就属无条件转移指令。,2、条件转移指令(8条) 程序可利用这组丰富的指令根据当前的条件进行判断,看是否满足某种特定的条件,从而控制程序的转向。 JZ rel ; A=0,(PC)+ 2 + rel(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行。 JNZ rel ; A0,(PC)+ 2 + rel(PC),累加器中的内容不为0,则转移到偏移量所指向的地址,否则程序往下执行。 CJNE A, data, rel ; A(data),(PC)+ 3 + rel(PC),累加器中的内容不等于直接地址单元的内容,则转移到偏移量所指向的地址,否则程序往下执行。,CJNE A, #data, rel ; A#data,(PC)+ 3 + rel(PC),累加器中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。 CJNE Rn, #data, rel ; A#data,(PC)+ 3 + rel(PC),工作寄存器Rn中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。 CJNE Ri, #data, rel ; A#data,(PC)+ 3 + rel(PC),工作寄存器Ri指向地址单元中的内容不等于立即数,则转移到偏移量所指向的地址,否则程序往下执行。 DJNZ Rn, rel ; (Rn)-1(Rn),(Rn)0,(PC)+ 2 + rel(PC)工作寄存器Rn减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行。 DJNZ data, rel ; (Rn)-1(Rn),(Rn)0,(PC)+ 2 + rel(PC)直接地址单元中的内容减1不等于0,则转移到偏移量所指向的地址,否则程序往下执行。,(3)子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL addr16 ; 长调用指令,可在64kB空间调用子程序。此时(PC)+ 3(PC),(SP)+ 1(SP),(PC7-0)(SP),(SP)+ 1(SP),(PC15-8)(SP),addr16(PC),即分别从堆栈中弹出调用子程序时压入的返回地址。 例如:任务中的 LCALL DELAY指令,(4)空操作指令(1条) 这条指令将累加器中的内容清0。 NOP ; 这条指令除了使PC加1,消耗一个机器周期外,没有执行任何操作。可用于短时间的延时。,3、控制转移指令应用举例 【例3.10】 将外部数据RAM的一个数据块传送到内部数据RAM,两者的首址分别为DATA1和DATA2,遇到传送的数据为零时停止。 解:外部RAM的数据传送一定要以累加器A作为过渡,利用判零条件转移正好可以判别是否要继续传送或者终止。完成数据传送的参考程序如下: MOV R0,#DATA1 ;外部数据块首址送R0 MOV R1,#DATA2 ;内部数据块首址送R1,LOOP:MOV A, R0 ;取外部RAM数据入A HERE: JZ HERE ;数据为零则终止传送 MOV R1, A ;数据传送至内部RAM单元 INC R0 ;修改地址指针,指向下一数据地址 INC R1 SJMP LOOP ;循环取数 说明:以上程序中,写在指令SJMP LOOP 中的LOOP处的8位相对转移偏移量rel,而地址标号LOOP 表示MOVX指令的16位单元地址。,【例3.11】 将内部数据RAM中从 DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。 解:设相加结果不超过8位二进制数,则相应的程序如下: MOV R0,#0AH ;给R0置计数器初值 MOV R1,#DATA ;数据块首址送R1 CLR A ;A清零 LOOP:ADD A, R1 ;加1个数 INC R1 ;修改地址,指向下一个数 DJNZ R0,LOOP ;

温馨提示

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

评论

0/150

提交评论