[理学]MCS51指令系统与程序设计

上传人:痛*** 文档编号:143368975 上传时间:2022-08-26 格式:DOC 页数:35 大小:240.50KB
收藏 版权申诉 举报 下载
[理学]MCS51指令系统与程序设计_第1页
第1页 / 共35页
[理学]MCS51指令系统与程序设计_第2页
第2页 / 共35页
[理学]MCS51指令系统与程序设计_第3页
第3页 / 共35页
资源描述:

《[理学]MCS51指令系统与程序设计》由会员分享,可在线阅读,更多相关《[理学]MCS51指令系统与程序设计(35页珍藏版)》请在装配图网上搜索。

1、2.2.1 立即数寻址采用这种方式时,指令中直接给出了参与操作的8 位或16位二进制常数,并在此常数前面加“#”作为标志。例如:MOV A,#30H第2 章 MCS-51 指令系统与程序设计执行完这条指令后,A 中的值是确定的,就是十六进制数30H。在形式上,立即数前面总有一个“#”符号作为标志。2.2.2 直接寻址在直接寻址方式中,指令直接给出操作数所在的存储单元地址。例如:MOV A,20H其功能是把内部RAM 中地址为20H 的单元中的数送到A 中。执行完这条指令后,A中的值并不确定,但可以肯定它一定与地址为20H 的单元中的值相同。在形式上,20H 前面没有“#”符号。2.2.3 寄存

2、器寻址寄存器寻址就是操作数存放在寄存器中,因此,指定了寄存器就能得到操作数。例如:MOV A,R0其功能就是把寄存器R0 的内容传送到累加器A 中。指令执行后,累加器A 中的内容与R0中的内容相同。2.2.4 寄存器间接寻址首先考虑这样一个问题:如何从片内RAM 的20H 单元开始,连续取10 个数,依次送入累加器A 中。显然,要从20H 单元取数,可以用指令MOV A, 20H;然后取21H 单元中的数,可以用MOV A, 21H。依次类推,取10个数就要用10条类似的指令,这样的做法显然不聪明。出现这种情况的原因是把地址的具体数值写在指令中了,或者说,每条指令中的地址值是一个常数,它不能改

3、变。如果能把单元地址用一个变量来表示,其值可增可减,那么问题即可简便地解决。寄存器间接寻址的方式就是用于解决这种问题的。它是以指令中给出的某一寄存器的内容作为操作数的存放单元地址,从而获得操作数。在这种寻址方式下,寄存器前面要用符号“”作为标志。例如:MOV A, R0因为R0 前面有一个“”,所以R0 中的内容就被看做是地址。要改变R0 的内容,就可以用这条指令操作到不同地址单元中的数据。于是上面的问题就可以得到解决。首先将R0 的内容设定为20H,然后用指令MOV A, R0 读取R0 指向的单元中的数据,再将R0 的内容加1,重复操作10 次即可完成任务。重复可以利用循环来进行。示例代码

4、如下。MOV R2, #0AH ;用R2存放循环次数MOV R0, #20H ;R0指向起始单元LOOP:MOV A, R0 ;将R0所指向的单元中的内容送到A中INC R0 ;将R0中的值加1DJNZ R2, LOOP ;将R2中的值减1,如果不等于0,则跳到LOOP处继续执行,否则结束循环2.2.5 变址寻址变址寻址方式是将基址寄存器(DPTR或PC)的内容加上变址寄存器(只能是A)的内容作为操作数的地址。这类指令经常用于查表、换码程序的编写,DPTR或PC指向一个表的首地址,A中的内容是相对于基址DPTR或PC的一个偏移量。例如:MOV A, A + DPTRMOV A, A + PC该

5、指令的功能是先用DPTR 或PC 的内容加上A 的内容形成一个新的地址,然后再把相应的存储单元的内容送入A 中。 2.2.6 相对寻址相对寻址方式是为实现程序的相对转移而设计的,所寻找的地址用相对于本条指令所在地址的偏移量来表示,用于指定程序转移的目的地址。如:JC relrel 是一个带符号的8 位二进制数,所能表示的范围是-128+127,它决定了相对转移距离的范围。转移的目的地址可用以下公式计算:目的地址=转移指令所在地址+转移指令字节数 + rel但在一般的编程过程中,通常会用一个标号来代替偏移量,程序可自动根据该标号得到偏移量,不需要人工计算相对地址的值。如:JC NEXT2.2.7

6、 位寻址位寻址方式中的操作数不再是整个字节,而是某一个位,指令中给出的是位地址。例如:MOV C, 20H该指令的功能是将位地址20H 单元的内容送入C 中。注意:字节地址和位地址并不相同。如指令MOV A, 20H 中的20H 是字节地址,因为目的操作数A 是8 位的;而在指令MOV C, 20H 中的20H 是位地址,它其实是字节地址24H 单元中的D0 位,因为目的操作数在CY 中,是1 位二进制数。2.3 指 令 系 统对于MCS-51系列单片机的指令系统,按指令功能的不同可以将全部的111 条指令分为5大类即数据传送类、算术运算类、逻辑运算类、控制转移类、位操作类指令。Rn:当前选中

7、的工作寄存器组R0R7 共8 个。工作寄存器共有4 组,默认使用的是第0组,也可以用标志寄存器(PSW)中两个位(RS1 和RS0)的组合来选定其中的任意一组。Ri:当前选中的工作寄存器中可以作为地址指针(间址寄存器)的两个工作寄存器(R0 和R1)。direct:片内RAM 或特殊功能寄存器(SFR)的地址,为8 位。#data:8 位立即数,即指令中直接给出的8位常数,如#12H。#data16:16 位立即数,即指令中直接给出的16 位常数,如#1234H。addr16:16 位的地址,如1000H。addr11:11 位的地址。bit:片内RAM 或特殊功能寄存器的直接寻址位地址。:在

8、寄存器间接寻址方式中,作为间址寄存器的前缀,如Ri、DPTR。/:在位操作指令中,表示对该位先取反再参与运算,但并不影响该位的原值。(x):x 表示某一寄存器或存储单元的地址,加上括号表示该寄存器或存储单元中的内容。:将箭头左边的内容送入箭头右边的单元中,表示的是数据传送方向。2.3.2 数据传送类指令数据传送类指令是MCS-51 单片机指令系统中最基本的,也是在编程时使用最频繁的一类指令。其基本功能是把源操作数传送到目的操作数中。执行完指令后,源操作数不变,目的操作数等于源操作数;或者是源操作数与目的操作数互换,即源操作数变成目的操作数,目的操作数变成源操作数。数据传送指令不影响标志C、AC

9、 和OV,但可能会对奇偶标志P有影响。1. 以累加器A为目的操作数的指令(4条)这4条指令的作用是把源操作数指向的内容送到累加器A 中。有直接寻址、立即数寻址、寄存器寻址和寄存器间接寻址共4 种寻址方式。MOV A,direct ;(direct)(A), 将直接寻址单元中的内容送到累加器A中MOV A,#data ;#data(A), 将立即数送到累加器A中MOV A,Rn ;(Rn)(A), 将Rn中的内容送到累加器A中MOV A,Ri ;(Ri)(A), 将Ri所指地址单元中的内容送到累加器A中2. 以寄存器Rn为目的操作数的指令(3条)这3 条指令的功能是把源操作数指定的内容送到所选定

10、的工作寄存器Rn 中。有直接寻址、立即寻址和寄存器寻址方式。MOV Rn,direct ;(direct)(Rn), 将直接寻址单元中的内容送到寄存器Rn中MOV Rn,#data ;#data (Rn), 将立即数直接送到寄存器Rn中MOV Rn,A ;(A)(Rn), 将累加器A中的内容送到寄存器Rn中3. 以直接地址为目的操作数的指令(5条)这5 条指令的功能是把源操作数指定的内容送到由直接地址data 所选定的片内RAM中。有直接寻址、立即寻址、寄存器寻址和寄存器间接寻址4 种寻址方式。MOV direct1,direct2 ;(direct2)(direct1), 将直接寻址地址单元

11、中的内容送到直接寻址单元中MOV direct,#data ;#data (direct), 将立即数送到直接寻址单元中MOV direct,A ;(A) (direct), 将累加器A中的内容送到直接寻址单元中MOV direct,Rn ;(Rn)(direct), 将寄存器Rn中的内容送到直接寻址单元中MOV direct,Ri ;(Ri)(direct), 将寄存器Ri中的内容所指地址单元中的数据送到直接寻址单元中4. 以间接地址为目的操作数的指令(3条)这组指令的功能是把源操作数指定的内容送到以Ri 中的内容为地址的片内RAM 中。有直接寻址、立即寻址和寄存器寻址3 种寻址方式。MOV

12、 Ri,direct ;(direct)(Ri), 将直接寻址单元中的内容送到以Ri中的内容为地址的RAM单元中MOV Ri,#data ;#data (Ri), 将立即数送到以Ri中的内容为地址的RAM单元中MOV Ri,A ;(A)(Ri), 将累加器A中的内容送到以Ri中的内容为地址的RAM单元中5. 16位数据传送指令(1条)这条指令的功能是把16位常数送入数据指针寄存器中。MOV DPTR,#data16 ;#dataH(DPH),#dataL(DPL)DPTR 有DPH(存放高八位)与DPL(存放低八位)6. 累加器A 与程序存储器(ROM)传送指令(两条)这组指令也称为查表指令,

13、其功能主要是对存放于程序存储器(ROM)中的数据表格进行查找传送,使用变址寻址方式。MOVC A,A + DPTR ;(A)+(DPTR)(A),将累加器A与DPTR内容之和看作地址,然后把改地址单元的内容送到累加器A中MOVC A,A + PC ;(PC)+1(A),(A)+(PC)(A)将累加器A与DPTR内容之和看作地址,然后把改地址单元的内容送到累加器A中【例2.1】 把程序存储器2000H单元的内容送R0 中。MOV A,#00HMOV DPTR,#2000HMOVC A,A + DPTR /将DPTR的值加上A的值形成一个新的地址,然后把相应的储存单元送到A中MOV R0,A片内任

14、何寄存器或存储单元要与程序存储器(ROM)交换数据都必须要经过累加器A。7. 累加器A 与片外数据存储器(RAM)传送指令(4条)这4条指令的作用是累加器A 与片外RAM 间传送数据。使用寄存器寻址方式。MOVX DPTR,A ;(A)(DPTR), 将累加器A中的内容送到数据指针指向的片外RAM地址单元中MOVX A,DPTR ;(DPTR)(A), 将数据指针指向片外RAM地址单元中的内容送到累加器A中MOVX A,Ri ; (Ri)(A), 将寄存器Ri指向片外RAM地址单元中的内容送到累加器A中MOVX Ri,A ;(A)(Ri), 将累加器A中的内容送到寄存器Ri指向的片外RAM地址

15、单元中MOVX 指令专门用于MCS-51 芯片内部与片外数据存储器(RAM)之间的数据交换,这种交换必须要经过累加器A,且外部RAM 不能像内部RAM 那样有各种寻址方式,因此对外部RAM 的操作不如对内部RAM 的操作方便,很多运算必须要借助于内部RAM才能进行。例2.2 将片外RAM 20H 单元的内容送入片内RAM 30H 单元中。MOV DPTR,#20HMOVX A,DPTRMOV 30H, A上面用到的数据指针DPTR 为16 位,可以寻址64KB 的范围。因为20H 处于低256B的区间中,所以这里也可以不用DPTR,而使用8 位的间址寄存器R0或R1。如果片外RAM的地址高于F

16、FH,那么就只能使用DPTR,而不能使用R0 或R1 了。8. 堆栈操作类指令(两条)这类指令的作用是将直接寻址单元中的内容传送到堆栈指针(SP)所指的单元中,并把SP所指单元的内容送到直接寻址单元中。这类指令只有两条,即入栈操作指令和出栈操作指令。PUSH direct ;(SP)+1(SP),(direct)(SP), 堆栈指针首先加1,然后将直接寻址单元中的数据送到堆栈指针(SP)所指的单元中 POP direct ;(SP)(direct),(SP)-1(SP), 将堆栈指针(SP)所指单元的数据送到直接寻址单元中,然后SP再进行减1操作入栈和出栈操作是两条功能刚好相反的指令,常利用这

17、两条指令操作堆栈可保护和恢复现场。9. 交换指令(5条)这5条指令的功能是把累加器A中的内容与源操作数所指的数据相互交换。XCH A,Rn ;(A)(Rn), 累加器与工作寄存器Rn交换内容XCH A,direct ;(A)(direct), 累加器与直接寻址字节交换内容XCH A,Ri ;(A)(Ri),累加器与工作寄存器Ri所指存储单元中的内容互换XCHD A,Ri ;(A3-0)(Ri)3-0), 累加器与工作寄存器Ri所指存储单元中内容的低半字节互换SWAP A ;(A3-0)(A7-4), 累加器中内容的高、低半字节互换2.3.3 算术运算类指令算术运算指令主要是执行加、减、乘、除法

18、四则运算。另外,MCS-51 指令系统中有相当一部分是进行加、减1的操作,还有BCD 码的运算和调整,都可归为运算指令。这类指令的结果大多数都会对PSW 的进位(CY)、半进位(AC)、溢出位(OV)有影响(置位或复位),只有加1和减1 操作不影响这些标志位,这在使用中应特别注意。1. 不带进位的加法指令(4 条)这4 条指令的作用是把立即数、直接地址、工作寄存器及间接地址的内容与累加器A中的内容相加,运算结果存在A中。ADD A,#data ;(A)+#data(A),将累加器A中的内容与立即数#data相加,结果存在A中ADD A,direct ;(A)+(direct)(A),将累加器A

19、中的内容与直接寻址单元中的内容相加,结果存在A中ADD A,Rn ;(A)+(Rn)(A),将累加器A中的内容与工作寄存器Rn中的内容相加,结果存在A中ADD A,Ri ;(A)+(Ri)(A),将累加器A中的内容与工作寄存器Ri所指地址单元中的内容相加,结果存在A中可见,8 位二进制数加法运算的一个加数固定在累加器A 中,而另一个加数可由不同的寻址方式得到,相加的结果均送回累加器A中。2. 带进位的加法指令(4条)这4 条指令与ADD 的4 条指令的功能基本相同,只是在进行加法运算时还需考虑进位问题。ADDC A,direct ;(A)+(direct)+(C)(A), 将累加器A中的内容与

20、直接寻址单元中的内容连同进位位相加,结果存在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中MCS-51 单片机中的累加器A 为8 位,因此只能直接做8 位二进制的加法,如果要做双字节数的加法,则必须拆分为高字节和低字节分别做。【例2.3】 把(R2R3)和

21、(R6R7)两个双字节无符号数相加,结果送到(R4R5)中。MOV A,R3ADD A,R7 ;先对低字节做加法,无须考虑进位,但有可能产生进位MOV R5,AMOV A,R2ADDC A,R6 ;将对高字节做加法时可能产生的进位也累加进来MOV R4,A3. 带借位的减法指令(4条)这组指令是将立即数、直接地址、间接地址及工作寄存器与累加器A连同借位位C的内容相减,结果送回累加器A 中。SUBB A,direct ;(A)-(direct)-(C)(A),将累加器A中的内容与直接寻址单元中的内容连同借位位相减,结果存在A中SUBB A,#data ;(A)-#data -(C)(A),将累加

22、器A中的内容与立即数连同借位位相减,结果存在A中SUBB A,Rn ;(A)-(Rn) -(C)(A),将累加器A中的内容与工作寄存器中的内容连同借位位相减,结果存在A中SUBB A,Ri ;(A)-(Ri)-(C)(A),将累加器A中的内容与工作寄存器Ri所指地址单元中的内容连同借位位相减,结果存在A中MCS-51 指令系统中的减法运算只有带借位的减法指令,而没有不带借位的减法指令。如果要进行不带借位的减法运算,可以在运算前先将CY清0,指令为:CLR C同样,MCS-51 单片机只能直接做8 位二进制的减法,如果要做双字节数的减法,必须要拆分为高字节和低字节分别做。【例2.4】 将(R2R

23、3)和(R6R7)两个双字节数相减,结果送到(R4R5)中。MOV A,R3CLR CSUBB A,R7 ;低字节的减法,不需要考虑借位,但可能产生借位MOV R5,AMOV A,R2SUBB A,R6 ;高字节的减法,将前面可能产生的借位也减去MOV R4,A4. 乘法指令(1条)这条指令的作用是把累加器A 和寄存器B中的8 位无符号数相乘,得到16位的乘积,将结果的低8位存在累加器A 中,高8 位存在寄存器B 中。乘法指令影响PSW 的状态,其中进位标志(CY)总是被清0。溢出标志位的状态与乘积有关,如果乘积小于FFH(即高8位为0),则OV清0;否则OV 置位。MUL AB ;(A)(B

24、)(A)和(B), 将累加器A中的内容与寄存器B中的内容相乘,结果的低8位存在累加器A中,高8位存在寄存器B中【例2.5】 做50H 乘以A0H 的操作。MOV A, 50H ;(A)=50HMOV B, A0H ;(B)=A0HMUL AB ;(B)=32H,(A)=00H,CY=0,OV=115. 除法指令(1条)这条指令的作用是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得到的商存在累加器A中,余数存在寄存器B中。除法运算总是使OV和进位标志位(CY)等于0。如果OV=1,则表明寄存器B中的内容为00H,执行结果为不确定值,表示有溢出。DIV AB ;(A)/(B)(A

25、)和(B),将累加器A中的内容除以寄存器B中的内容,所得商存在累加器A中,余数存在寄存器B中【例2.6】 做7除以3 的操作。MOV A,#07H ;(A)=7MOV B,#03H ;(B)=3DIV AB ;(A)=2,(B)=16. 加1 指令(5 条)这5条指令的功能是将原寄存器或单元的内容加1,结果送回原寄存器或单元中。加1指令不会对任何标志有影响,如果原寄存器的内容为FFH,则执行加1 指令后,结果就是00H。该指令有直接寻址、寄存器寻址、寄存器间址等寻址方式。INC A ;(A)+1(A), 将累加器A中的内容加1,结果存在A中INC direct ;(direct)+1(data

26、), 将直接寻址单元中的内容加1,结果送回原地址单元中INC Ri ;(Ri)+1(Ri), 将寄存器的内容所指地址单元中的内容加1,结果送回原地址单元中INC Rn ;(Rn)+1(Rn), 将寄存器Rn的内容加1,结果送回原地址单元中INC DPTR ;(DPTR)+1(DPTR), 将数据指针的内容加1,结果送回数据指针中7. 减1 指令(4 条)这组指令的作用是将原寄存器或单元的内容减1,结果送回原寄存器或单元中。若原寄存器或单元的内容为00H,则减1 后即为FFH,运算结果不影响任何标志位。该指令有直接寻址、寄存器寻址、寄存器间址等寻址方式。DEC A ;(A)-1 (A), 将累加

27、器A中的内容减1,结果送回累加器A中DEC direct ;(direct)-1(direct), 将直接寻址单元中的内容减1,结果送回直接寻址单元中DEC Ri ;(Ri)-1 (Ri), 将寄存器Ri所指地址单元中的内容减1,结果送回原地址单元中DEC Rn ;(Rn)-1 (Rn),将寄存器Rn中的内容减1,结果送回寄存器Rn中8. 二十进制调整指令(1 条)二十进制调整指令专门用于对累加器A 中的BCD 码十进制数加法计算结果进行调整。两个BCD 码二进制数相加后,必须经过本指令调整才能得到正确的计算结果。所以,该指令一般跟在ADD 或ADDC 之后。DA A例如:(1) 2 + 6

28、= 8; (2) 3 + 8 = 110 0 1 0 0 0 1 1+ 0 1 0 1 + 1 0 0 00 1 1 1 1 0 1 1其中(1)式的计算结果是正确的,(2)式的计算结果是不正确的,因为BCD 码中不存在1011 这个编码,(2)式的以上情况说明正确结果应该是00010001。,二进制数的加法指令并不完全适用于BCD 码的计算,因此计算之后必须要对结果进行修正,这就是所谓的二十进制调整问题。出错的原因在于BCD 码是4位二进制编码,4 位二进制数共有16个编码,但BCD 码只使用了其中的前10 个,剩下的6 个没有用。通常将这6 个没有用的编码(1010、1011、1100、1

29、101、1110 和1111)称为无效码。在BCD 码的加法运算中,只要结果进入或者跳过无效编码,那么就是错误的。因此一位BCD 码加法运算出错的情况有以下两种。_ 相加结果大于9,说明已进入无效编码区。_ 相加结果有进位,说明已跳过无效编码区。不管出现哪一种情况,相加结果都会比正确值小6。因此,只要BCD 码的加法运算结果出现上述两种情况之一,就必须进行调整,这样才能得到正确结果。二十进制调整的方法就是用指令DA A根据运算后A中的值和PSW中有关位的状态,自动选择一个修正值(00H、06H、60H 或66H)与原运算结果相加,以得到正确结果。【例2.7】 试写出能完成85+59 的BCD

30、加法程序。ORG 0000HAJMP MAINORG 0030HMAIN:MOV A,#85HADD A,#59HDA ASJMP $END2.3.4 逻辑运算及移位类指令逻辑运算及移位类指令包括对累加器A 的逻辑操作、对字节变量的逻辑与、或、异或操作。这类指令的操作数都是8 位数,且进行逻辑运算时都不会影响PSW 中标志位的状态。1. 对累加器A的逻辑操作指令(6条)这类指令主要包括对累加器直接清0、取反、循环和移位操作。CLR A ;0 (A),将累加器中的内容清0CPL A ;将累加器A中的内容按位取反RL A ;将累加器A中的内容左移一位RR A ;将累加器A中的内容右移一位RLC A

31、 ;将累加器A中的内容连同进位位(CY)左移一位RRC A ;将累加器A中的内容连同进位位(CY)右移一位如图2.1 所示。A7 RL A A0RLC A C A7 A0RRC A C A7 A0RR A A7 A02. 逻辑与操作指令(6 条)这组指令的作用是对两个单元中的内容执行逻辑与操作。ANL A,direct ;对A中的内容和直接寻址单元中的内容执行与操作,结果存到A中ANL A,#data ;对A中的内容和立即数执行与操作,结果存到A中ANL A,Rn ;对A中的内容和寄存器Rn中的内容执行与操作,结果存到A中ANL A,Ri ;对A中的内容和工作寄存器Ri所指的地址单元中的内容执

32、行与操作,结果存到A中ANL direct,A ;对直接寻址单元中的内容和A中的内容执行与操作,结果存到直接寻址单元中ANL direct,#data ;对直接寻址单元中的内容和立即数执行与操作,结果存到直接寻址单元中在单片机的编程过程中,经常要对某个单元或寄存器的一个或几个位进行置位、清0、取反等操作,但又不能影响其他位的状态。用MCS-51指令系统中的ANL、ORL、XRL 指令就可以进行以上操作。【例2.8】 将累加器A 的第0、2、5 位清0,但不能不影响其他位。分析:要将一个单元或寄存器中的某些位清0、置1 或取反等,一般的解决办法是:根据问题的具体需要,先构造一个立即数,然后对该单

33、元或寄存器的内容与立即数进行合适的逻辑操作。逻辑与的真值表如下:A B Y0 0 00 1 01 0 01 1 1可以看出,两者中只要有一个为0,那么运算结果就是0。因此,要将某些位清0,显然要构造一个立即数与其进行与运算。要将A 的哪个位清0,那么立即数中对应的位就应为0,且其他位为1。程序:ANL A,#11011010B3. 逻辑或操作指令(6 条)这组指令的作用是对两个单元中的内容执行逻辑或操作。ORL A,direct ;对A中的内容和直接寻址单元中的内容执行或操作,结果存到A中ORL direct,#data ;对直接寻址单元中的内容和立即数执行逻辑或操作,结果存在直接寻址单元中O

34、RL A,#data ;对A中的内容和立即数执行逻辑或操作,结果存在A中ORL A,Rn ;对A中的内容和寄存器Rn中的内容执行逻辑或操作,结果存到A中ORL direct,A ;对直接寻址单元中的内容和A中的内容执行逻辑或操作,结果存在直接寻址单元中ORL A,Ri ;对A中的内容和工作寄存器Ri所指的地址单元中的内容执行或操作,结果存在A中【例2.9】 将累加器A 的第1、2、4 位置位,但不能影响其他位。逻辑或的真值表如下:A B Y0 0 00 1 11 0 11 1 1可以看出,两者中只要有一个为1,那么运算结果就是1。因此,要将A 的某些位置位,就要构造一个立即数与其进行或运算。要

35、将A的哪个位置位,那么立即数中对应的位就应为1,且其他位为0。程序:ORL A,#00010110B4. 逻辑异或操作指令(6条)这组指令的作用是对两个单元中的内容执行逻辑异或操作。XRL A,direct ;对A中的内容和直接寻址单元中的内容执行异或操作,结果存在A中XRL direct,#data ;对直接寻址单元中的内容和立即数执行异或操作,结果存在直接寻址单元中XRL A,#data ;对A中的内容和立即数执行异或操作,结果存在A中XRL A,Rn ;对A中的内容和寄存器Rn中的内容执行异或操作,结果存在A中【例2.10】 将累加器A 的第1、5、7 位取反,但不能影响其他位。逻辑异或

36、的真值表如下:A B Y0 0 00 1 11 0 11 1 0可以看出,两者相等时结果为0,不等时结果为1。若用0 异或某个位,则该位原先是多少,结果就是多少,不会改变;而用1 去异或某个位,则该位原先是0,就变成1,原先是1,就变成0。因此,要将某些位置位,可以考虑构造一个立即数与其进行异或运算。要将A的哪个位取反,那么该立即数中对应的位就应为1,且其他位为0。程序:XRL A,#10100010B再看几个逻辑操作的应用程序。【例2.11】 拆字程序。把8000H 单元的内容拆开,高位送到30H 中,低位送到31H 中。ORG 0000HAJMP MAINORG 0030HMAIN:MOV

37、 DPTR,#8000H ;将8000H单元的地址送到DPTR中MOVX A,DPTR ;读出8000H单元的内容MOV B,A ;把读出的内容暂存在B中SWAP A ;交换A中高低位的内容ANL A,#0FH ;屏蔽高位MOV 30H,A ;结果送到30H(实际内容是8000H的高4位)中MOV A,B ;再读入8000H中的内容ANL A,#0FH ;屏蔽高位MOV 31H,A ;结果送到31H(实际内容是8000H的低4位)中SJMP $END【例2.12】 拼字程序。将30H、31H 单元的低位内容合并,分别送到8000H 的高低位中。ORG 0000HAJMP MAINORG 003

38、0HMAIN:MOV A,30H ;读30H单元的内容到A中ANL A,#0FH ;屏蔽A的高位SWAP A ;交换高低位MOV B,A ;暂存到B中MOV A,31H ;读31H单元的内容到A中ANL A,#0FH ;屏蔽A的高位ORL A,B ;对A和B进行或操作,效果等同于相加MOV DPTR,#8000HMOVX DPTR,A ;将结果送入8000H单元中SJMP $END2.3.5 控制转移类指令程序的执行过程中,有时候需要改变执行的流程,即不一定将指令一条接一条地顺序执行下去,而是要跳过一些指令行往下走,或者回跳到原来已执行的某些指令行重新执行。要实现这种程序的跳转,就用到控制转移

39、类指令。这类指令可通过修改PC 的值实现以上操作。只要使PC 的值有条件或无条件地改变,就能改变程序的执行流程。有条件和无条件的跳转是实现分支程序设计、循环程序设计以及子程序设计的必要基础。MCS-51单片机有丰富的控制转移指令,包括无条件转移指令、条件转移指令、子程序调用和返回指令。1. 无条件转移指令无条件跳转指令的含义是当程序执行到该指令时,立即无条件转移到指令所指的目的地址去执行后面的程序。该类指令包括短转移指令、长转移指令、相对转移指令和间接转移指令。1) 短转移指令(1 条)AJMP addr11该指令的功能将11 位地址addr11 送到PC 的低11 位中,PC 的高5 位不变

40、。因为211B=2KB,所以利用短转移指令可以实现最大2KB范围内的“短距离”转移。2) 长转移指令(1 条)LJMP addr16该指令的功能是将16 位地址addr16 送到PC中,因为216B=64KB,所以利用长转移指令可以实现最大64B 范围内的“长距离”转移。例如,LJMP NEXT_NEXT:MOV A,#20H如果LJMP NEXT指令与NEXTMOV A, #20H 指令之间隔开的行不是很多,即这两条指令之间的“距离”(目标代码量)没有超过2KB,那么用AJMP 替换LJMP 可以实现同样的跳转功能。但是如果两条指令的“距离”太远,那么用AJMP 可能跳不到NEXT处,这时就

41、必须用LJMP 来实现“长距离”的跳转。3) 相对转移指令(1条)SJMP relrel 是一个带符号的8 位二进制数,能表示的范围是-128+127,它决定了相对转移距离的范围。转移的目的地址的计算公式为:目的地址=转移指令所在地址+转移指令字节数+ rel在编程过程中,通常会用一个标号来代替偏移量,程序可自动根据该标号得到偏移量,而不需要人工计算相对地址的值。SJMP NEXT_NEXT:MOV A,#20H简单地说,生成目标代码后,在SJMP NEXT 指令与NEXT 之间的“距离”(目标代码量)不能超过-128+127B,也就是说,SJMP 能够实现的跳转要更短些。4) 间接转移指令(

42、1条)JMP A + DPTR该指令的功能是将累加器A 中的8 位无符号数与数据指针DPTR 中的16 位数相加,其结果作为下一条指令的地址送入PC中,以使程序转移。利用这条指令可以方便地实现多分支转移程序的设计。做法就是先把DPTR 的内容固定,然后给累加器A 赋不同的值,即可实现多分支转移。2. 条件转移指令条件转移指令是指只有满足某种条件后程序才可实现转移。当条件满足时,程序按照指令提供的转移偏移量,转移到由PC 当前值与偏移量相加得到的目的地址去执行;当条件不满足时,程序顺序执行下一条指令。条件转移指令可以分为以下几类。1) 判断A中的内容是否为0的转移指令(两条)JZ rel ;若A

43、中的内容是0则转移,否则顺序执行下一条指令JNZ rel ;若A中的内容不是0则转移,否则顺序执行下一条指令指令中的rel 是一个相对于当前指令所在地址的8 位偏移量,是一个具体的数值。在实际应用中,常用下面的形式。JZ NEXT ;NEXT为一个标号JNZ NEXT编译器会自动根据标号名计算偏移量的值,至于这个值具体是多少,在一般情况下用户不必关心。2) 比较转移指令(4条)CJNE A,#data,rel ;(A)与data比较。如果A=data,则顺序执行,否则转移CJNE A,direct,rel ;(A)与(direct)比较,若相等则顺序执行,否则转移CJNE Rn,#data,r

44、el ;(Rn)与data比较,若相等则顺序执行,否则转移CJNE Ri,#data,rel ;(Ri)与data比较,若相等则顺序执行,否则转移这类指令是将指令中的前面两个操作数的值进行比较,以决定是否转移。如果两个值不相等则转移,否则顺序执行。根据前面所讲,rel 是一个相对于当前指令所在地址的8 位偏移量,是一个具体的数值,在实际使用中,会用程序中出现的一个标号来代替,编译器可自动根据标号名计算偏移量的值,因此用户一般无须关心其具体值是多少。3) 循环转移指令(两条)DJNZ Rn,rel ;先将Rn的内容减1,然后判断是否为0,如果不为0则跳转,否则顺序执行DJNZ direct,re

45、l ;先将direct所指存储器单元中的内容减1,然后判断其是否为0,如果不为0则跳转,否则顺序执行这组指令将减1 操作与条件转移这两种功能结合在一起,可以方便地设计出循环程序。【例2.13】 将片内RAM 的30H7FH 单元清0。MOV R0,#30H ;从30H单元开始清0MOV R6,#4FH ;总共有4F个单元需要清0,这就是循环次数CLEAR: MOV A,#00HMOV R0,A ;清0INC R0 ;让R0指向下一个存储器单元DJNZ R6,CLEAR ;若不到4F个字节,则跳到CLEAR处再清下一个单元SJMP $END2.3.6 位操作类指令MCS-51 单片机的内部硬件结

46、构中有一个位处理器,称为布尔处理器,其操作的对象不是字节或字,而是单个的位,且进行位操作时,以进位标志位(CY)作为位累加器。位操作的范围包括片内RAM字节地址20H2FH单元中连续的128个位(位地址为00H7FH),以及特殊功能寄存器中字节地址能被8 整除的位。1. 位传送指令(两条)MOV C,bit ;(bit)(C)MOV bit,C ;(C)(bit)这两条指令主要用于进位位(CY)与其他可寻址位之间的数据传送。值得注意的是,两个可寻址位之间不能直接进行数据传送,若要进行这种传送,需要通过C来中转。【例2.14】 将位地址30H 中的内容传送到位地址20H 中。MOV C,30HM

47、OV 20H,C【例2.15】 试编程将00H 位中的内容和7FH 位中的内容互换。分析:可以采用01H 位作为暂存位。程序如下。ORG 0000HAJMP MAINORG 0030HMAIN:MOV C,00HMOV 01H,C ;暂存于01H位MOV C,7FH ;(7FH) CYMOV 00H,C ;存入00H位MOV C,01H ;将00H位中原来的内容送到CY中MOV 7FH,CSJMP $END2. 位修改指令(6 条)CLR C ;(0)(C)CLR bit ;(0)(bit)SETB C ;(1)(C)SETB bit ;(1)(bit)CPL C ;(C)(C),需加上划线C

48、PL bit ;(bit)(bit),需加上划线这组指令可以将进位标志位(CY)或直接寻址位清0、置位和取反,其执行结果不会影响其他标志位的状态。3. 位逻辑运算指令(4 条)ANL C,bit ;(C bit) (C)ANL C,/bit ;(C bit) (C),需加上划线ORL C,bit ;(C bit) (C)ORL /bit,C ;(C bit) (C),需加上划线4. 位条件转移指令(3 条)1) 判断CY的转移指令JC rel ;如果C=1则转移,否则顺序执行JNC rel ;如果C=0则转移,否则顺序执行2) 判断变量的转移指令JB bit,rel ;如果bit=1则转移,否

49、则顺序执行JNB bit,rel ;如果bit=0则转移,否则顺序执行3) 判断位变量且清0 的转移指令JBC bit,rel ;如果bit=1则转移,并将bit清0,否则顺序执行位条件转移指令的功能是判断进位位(CY)或直接寻址位的内容是否为1,如果是1 则跳转,否则顺序执行。需要注意的是,该指令还具备了位清0 的功能。2.3.7 常用伪指令伪指令是指仅为编译器服务而并非真正让单片机执行的指令。之所以要引入伪指令,是因为当编译器对汇编源程序进行汇编时,还要知道一些关于程序的额外信息,比如代码段从什么地址开始存放、数据存放何处等,这些额外信息就由伪指令来提供。伪指令本身不产生目标代码,但会影响

50、目标代码的映像结构。常用的伪指令如下。1. 起始地址伪指令ORG nnORG指令总是出现在每段源程序或数据块的开始,用于指明此语句后面的指令序列或数据块的起始存放地址。nn 为绝对地址或标号。例如,ORG 1000HSTART: MOV A,30HANL A,#0FHSWAP A以上经汇编得到的目标代码将在程序存储器中从起始地址1000H 开始存放。2. 字节定义伪指令标号:DB d1,d2,dn其中标号可有可无,di(i=1n)是单字节数或由EQU 伪指令定义的字符,也可以是用引号括起来的ASCII码。此伪指令的功能是把di 存入由该指令地址起始的单元中,且每个数占用1B 的空间。例如,OR

51、G 8000HDATA:DB 67H,34HDB 22H即将67H、34H、22H 三个数依次存放在8000H、8001H、8002H 地址单元中。3. 字定义伪指令标号:DW d1,d2,dnDW 的功能与DB的功能类似,只不过这里的di 要占用2B的空间。4. 数据字节赋值伪指令标号 EQU n例如:LENGTH EQU 50HORG 0000HMOV A,#LENGTH这里用符号LENGTH 来代替50H,每当编译器在代码中看到LENGTH 这个符号,就会用数字50H 来代换,20H 占用1B的空间。指令MOV A, #LENGTH 实际上是将一个8 位立即数50H 送入累加器A 中。适

52、当地使用数据赋值伪指令可以提高程序的可读性。5. 数据字赋值伪指令标号 EQW nnEQW的功能与EQU 的功能类似,只不过这个数要占用2B 而不是1B。6. 汇编程序结束伪指令END该伪指令标志着全部汇编源程序的结束,在一个源程序中只允许出现一个END 语句且必须放在整个程序的最后。2.4 汇编程序设计程序实际上是一系列计算机指令的有序集合。利用计算机的指令系统来合理地编写解决某个问题的程序的过程称为程序设计。2.4.1 延时程序在单片机的应用程序设计过程中,经常要用到延时程序。延时功能通常是利用循环程序来实现的,即通过执行一个具有固定延迟时间的循环程序来实现延时。先看一个简单的单循环延时程

53、序。MOV R1,#100LOOP:NOPDJNZ R1,LOOP这个单循环程序的循环体是一个NOP 指令,它将重复执行100 次。NOP 指令的机器周期为1,DJNZ的机器周期为2,所以每进行一次循环实际需要3 个机器周期。要计算程序的延时,首先要知道电路板上所使用的晶振频率,假设所用晶振的频率为6MHz,那么一个机器周期就为2s,一次循环的延时为6s,程序的总延时为1006s = 600s。如果改变装入R1的立即数的大小,就能改变该程序的延时。由于R1是8位寄存器,因此该程序的最长延时为2566s=1536s。可以看出,单循环延时程序的延时是比较短的。为了获得更长的延时,经常会采用多种循环

54、的方法。MOV R5,#TIME1LOOP1: MOV R4,#TIME2LOOP2: NOPDJNZ R4,LOOP2DJNZ R5,LOOP1这个程序的实际延时可以由TIME1和TIME2 这两个量来调控。2.4.2 分支程序分支结构程序可根据某种条件决定程序的不同走向。一般的分支结构程序是通过执行条件转移指令来实现的。在MCS-51 指令系统中,经常需要将各种条件转移指令结合在一起,以完成多种条件判断,如正负判断、大小判断等。【例2.16】 比较片内RAM的NUM1 和NUM2 单元中两个无符号数的大小,并将其中的较大数存入MAX 单元中。分析:MSC-51 对两个无符号数进行比较的常用

55、方法是:将两者相减,然后根据借位位(CY)的状态来判断。比如要比较两个无符号数NUM1 和NUM2 的大小,那么首先将CY清0,然后计算NUM1-NUM2。如果NUM1 大于等于NUM2,那么就不需要借位,CY 必定为0;如果NUM1 小于NUM2,那么就需要借位,CY 必定为1。程序如下。NUM1 EQU 61HNUM2 EQU 62H ?MAX EQU 63HORG 0000HAJMP MAINORG 0030HMAIN:MOV A,NUM1CLR C ;在做减法之前,需将CY清0SUBB A,NUM2JC NEXT ;当C=1时,表明产生了借位,因此A中的数较小MOV MAX,NUM1

56、JC rel ;如果C=1则转移,否则顺序执行 AJMP OVERNEXT:MOV MAX,NUM2OVER:SJMP $ END【例2.17】 已知20H 中有一个无符号数X,若它小于50,则转向LOOP1 执行;若它等于50,则转向LOOP2执行;若它大于50,则转向LOOP3执行。试编写相应程序。MOV A,20HCJNE A,#50,COMP ;若X50,则转向COMP,形成CY标志SJMP LOOP2 ;若X=50,则转向LOOP2COMP:JNC LOOP3 ;若X50,则转向LOOP3LOOP1: ;LOOP1程序段LOOP2: ;LOOP2程序段LOOP3: ;LOOP3程序段

57、END【例2.18】 设有一个温度控制器,如果温度高于25,则打开风扇;如果温度低于25,则打开加热器;如果温度刚好等于25,则关闭加热器和风扇。设温度传感器测得的温度置于累加器A中,P1.3用于控制风扇开关,置位为打开风扇,清0为关闭风扇;P1.4用于控制加热器,置位为打开加热器,清0 为关闭加热器。LOOP: CJNEA #25H,NEXT ;如果A25,则转向NEXT,形成CY标志CLR P1.3 ;关闭风扇CLR P1.4 ;关闭加热器AJMP LOOP ;循环检测温度NEXT: JC HOT ;如果C=1,即温度小于25,则转向加热CLR P1.4 ;开风扇SETB P1.3 ;关闭

58、加热器HOT: CLR P1.3 ;关闭风扇SETB P1.4 ;开加热器注意:这个程序从理论上说是正确的,但并不完全适用于实际情况。因为把温度绝对控制到一个点上在实际中是行不通的,更多的情况是温度会在一个范围内连续地波动,比如在2426之间。2.4.3 循环程序循环程序用于重复执行某种动作。在编写循环程序时,控制循环次数极为重要,具体方法依实际情况而定。循环次数已知的,可以简单地用计数器来控制;循环次数未知的,可以用某个位或某个量的状态作为条件并结合跳转语句来控制。另外,循环程序可以分为单重循环和多重循环。例如前面所讲的延时程序的设计就用到了这两种循环。【例2.19】 数据传送。把内部RAM

59、 中从30H 单元开始的连续10 个单元的内容传送到从50H 开始的连续单元中。分析:对于连续单元,一般会用间址指针来操作。程序如下。COUNT EQU 0AH ;单元个数SRCADDR EQU 30H ;源地址DESTADDR EQU 50H ;目标地址ORG 0000HAJMP MAINORG 0030HMAIN:MOV R0, #SRCADDR ;将R0当做源指针MOV R1, #DESTADDR ;将R1当做目的指针MOV R7, #COUNT ;将R7当做计数器,用于控制循环次数LOOP:MOV A, R0MOV R1, AINC R0INC R1DJNZ R7, LOOP ;将计数

60、器R7减1,若不为0则跳转SJMP $END【例2.20】 数据检索。假定数据区的首地址是内部RAM 中的20H,数据区长度为8,关键字放在2BH 单元中,检索成功的数据序号放在2CH 单元中。分析:检索开始时应把2CH 单元初始化为00H。程序执行后,如2CH 单元的内容仍然为00H,则表示没有检索到关键字;否则即检索成功,2CH 单元的内容就是关键字在数据区中的序号(从0开始)。程序如下。KEY DB 12H ;关键字6by ORG 0000H B6666AJMP MAINORG 0030HMAIN:MOV R0,#20H ;数据存储区的首地址MOV R7,#08H ;数据个数MOV 2C

61、H,#00HMOV R2,#00HMOV 2BH,#KEY ;关键字送入2BH中NEXT:INC R2MOV 2AH,R0 ;从数据区中取数CLR CMOV A,2BHSUBB A,R0 ;与关键字进行比较JZ ENDP ;当A=0时,说明检索成功,跳出循环INC R0DJNZ R7,NEXT ;继续检索MOV R2,#00HENDP:MOV 2CH,R2 ;送检索是否成功的标志SJMP $END2.4.4 地址表法散转程序散转程序实际上是一种多分支结构程序,需要用指令JMP A + DPTR 来实现。这条指令的目标地址是由累加器A 中的8 位无符号数与数据指针(DPTR)中的16 位数相加得到的。执行该指令时,将目标地址送入PC,使程序转移。一般的做法是将DPTR固定指向一张表的首地址,而给A 赋不同的值,从而实现多分支转移。键盘处理是该指令的一个典型应用。【例2.21】 设一个简易键盘有4 个按键,其功能分布见表2-1。现要求编写相应的键盘处理程序,其中的键值由其他的处理程序获得,并假设当按下某个键时,就能在累加器A中获得相应的键值。表2-1 按键信息键名 键值 处理该键的子程序标号加 00H ADDLABEL 减 01H SUBLABEL 乘 02H MULLABEL 除 03H DIVLABEL程序如下。MOV DPT

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!