《[工学]第四章-汇编语言程序设计课件.ppt》由会员分享,可在线阅读,更多相关《[工学]第四章-汇编语言程序设计课件.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/11/20231第第章章汇汇编编语语言言程程序序设设计计 本章内容本章内容Single Chip Microcomputer4-04-0概述概述4-2 运算程序设计运算程序设计4-3 数据的拆拼和转换数据的拆拼和转换4-1 循环程序设计循环程序设计4-5 查表程序查表程序4-6 散转程序设计散转程序设计4-7 I/O端口控制程序端口控制程序4-8 子程序调用时的参数传递子程序调用时的参数传递1/11/20232概 述最早人们只能用最早人们只能用机器语言机器语言(二进制)编写程序;(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写为了方便记忆,人们开始用助记符形式的汇编语言
2、编写程序,称为程序,称为低级语言低级语言。然后再用汇编系统将其翻译成机。然后再用汇编系统将其翻译成机器语言,该过程称为器语言,该过程称为汇编汇编;为了用更接近人的语言编写程序,程序设计师们发明了为了用更接近人的语言编写程序,程序设计师们发明了高级语言高级语言,如:,如:BASIC、FORTRAN、PASCAL、然后再用编译系统将其翻译成机器语言,该过程称为然后再用编译系统将其翻译成机器语言,该过程称为编编译译;机器只能识别机器语言。所以必须用编译系统将高级语机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编言编写的源程序编译成机器语言,用汇编系统将
3、用汇编语言编写的源程序汇编成机器语言;语言编写的源程序汇编成机器语言;由低级或高级语言构成的程序称为由低级或高级语言构成的程序称为源程序源程序,由机器语言,由机器语言构成的程序称作构成的程序称作目标程序目标程序;一、设计语言1/11/20233 源程序源程序 目标程序目标程序 低级语言低级语言机器语言机器语言汇编汇编高级语言高级语言机器语言编译编译1/11/20234二、程序设计方法二、程序设计方法一、程序设计 利用计算机能够接受的语言把解决问题的方法和步骤利用计算机能够接受的语言把解决问题的方法和步骤描述出来,也就是编制计算机的程序,人们常说的软件设描述出来,也就是编制计算机的程序,人们常说
4、的软件设计。计。对于单片机应用程序,我们可以把它看成是操作系统对于单片机应用程序,我们可以把它看成是操作系统和应用软件的集合。和应用软件的集合。二、程序设计步骤二、程序设计步骤 用汇编语言编写一个程序的过程大致可分为以下几用汇编语言编写一个程序的过程大致可分为以下几个步骤:个步骤:1 1、分析问题,明确所要解决问题的具体要求。、分析问题,明确所要解决问题的具体要求。1/11/20235 2 2、确定算法。根据实际问题的要求和指令系统的、确定算法。根据实际问题的要求和指令系统的特点,决定所要采用的计算公式和计算方法,这就是常特点,决定所要采用的计算公式和计算方法,这就是常说的算法。算法是进行程序
5、设计的依据,它决定了程序说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的质量。的正确性和程序的质量。3 3、制定程序框图。根据算法,制定出运算步骤的顺、制定程序框图。根据算法,制定出运算步骤的顺序,再把运算过程画成流程图。序,再把运算过程画成流程图。4 4、确定数据格式,分配工作单元,将程序框图进一、确定数据格式,分配工作单元,将程序框图进一步细化。步细化。5 5、根据流程图和指令系统,编写出汇编语言源程序。、根据流程图和指令系统,编写出汇编语言源程序。6 6、程序测试。由于单片机没有自开发功能,因而、程序测试。由于单片机没有自开发功能,因而必须借助仿真器,以单步、断点、连续方
6、式调试程序,必须借助仿真器,以单步、断点、连续方式调试程序,直到完全正确为止。特别地,对于有硬件的应用系统,直到完全正确为止。特别地,对于有硬件的应用系统,必须将软件和硬件结合起来调试,直到软件、硬件能协必须将软件和硬件结合起来调试,直到软件、硬件能协调一致,浑然一体为止。调一致,浑然一体为止。1/11/20236 7 7、程序优化。、程序优化。这一环节很容易被广大设计人员所这一环节很容易被广大设计人员所忽略。它是指从程序结构上对程序加以调整,精减一忽略。它是指从程序结构上对程序加以调整,精减一些冗余指令,以加快程序的执行速度,节省程序存储些冗余指令,以加快程序的执行速度,节省程序存储空间,从
7、而提高系统的可靠性。空间,从而提高系统的可靠性。1/11/202374-1 4-1 循环程序设计循环程序设计一、循环程序结构一、循环程序结构开开 始始N结结 束束Y循环结束控制循环结束控制修改控制变量修改控制变量循环工作部分循环工作部分置初值置初值 在单片机应用程序设计中,在单片机应用程序设计中,循环程序的使用非常广泛。单循循环程序的使用非常广泛。单循环的结构如下图所示:环的结构如下图所示:其主体为循环体,由循环其主体为循环体,由循环工作部分和修改控制变量构成。工作部分和修改控制变量构成。同其他语言一样,循环程同其他语言一样,循环程序可以实现嵌套,构成多重循序可以实现嵌套,构成多重循环。但切不
8、可形成交叉。只能环。但切不可形成交叉。只能将整个循环程序作为外循环的将整个循环程序作为外循环的循环体。循环体。1/11/20238二、循环程序设计举例二、循环程序设计举例例例1、延时程序设计、延时程序设计DELAYDELAY:MOVMOVR7R7,#200#200;1 1个机器周期个机器周期DE1DE1:MOVMOVR6R6,#123#123;1 1NOPNOP;1 1DE2DE2:DJNZDJNZR6R6,DE2DE2;2 2DJNZDJNZR7R7,DE1DE1;2 2RETRET;2 2如晶体振荡器频率为如晶体振荡器频率为12MHz12MHz,则其延时时间为:则其延时时间为:1+1+(1
9、+1+2*123+21+1+2*123+2)*200+2=50.003ms 200+2=50.003ms (机器周期机器周期1 1s)s)这是一个这是一个50ms50ms的精确延时程序。的精确延时程序。DELAY.ASM1/11/20239 在在RAM中,从中,从50H开始连续存放开始连续存放N个单字节无符号数,个单字节无符号数,N存放在存放在R2中,中,试编程求这试编程求这N个数的和,结果放在个数的和,结果放在R4R3中。程序清单如下:中。程序清单如下:NSUM:MOV R0,#50H MOV R3,#00H;清零清零 MOV R4,#00HLOOP:MOV A,R3ADDA,R0MOV R
10、3,ACLRAADDC A,R4MOV R4,AINCR0DJNZ R2,LOOPRET例例2 2、数据求和、数据求和1/11/2023104-2 运算程序设计一、多字节加法一、多字节加法 例例4-3-1 4-3-1 设有两个设有两个4 4字节的二进制数字节的二进制数2F5BA7C3H2F5BA7C3H和和14DF35B8H14DF35B8H,分别放在以分别放在以40H40H和和50H50H为起始地址的单元中(低为起始地址的单元中(低位在低地址),试编程求这个数之和,结果放在以位在低地址),试编程求这个数之和,结果放在以40H40H为起为起始地址的单元中。始地址的单元中。ORG 0000HLJ
11、MP JAFAORG 0100HJAFA:MOV R0,#40HMOV R1,#50HMOV R2,#04HLCALL JASUB LJMP$以上为主程序以上为主程序JASUB:CLRCJASUB1:MOVA,R0 ADDCA,R1 MOVR0,A INCR0 INCR1 DJNZ R2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,RiADDC A,#data1/11/202311 本程序适合于本程序适合于N N个字节的两数求和,个字节的两数求和,但并不严密,当最后一次加法有进位时但并不严密,当最后一次加法有进位时并没有相应处理,实际应用时应根据实并没
12、有相应处理,实际应用时应根据实际情况稍作修改。际情况稍作修改。1/11/202312例例例例2 2 2 2:有两组有两组BCDBCD码码分别存放在分别存放在23H23H、22H22H单元和单元和33H33H、32H32H单元,单元,求它们的和并送入求它们的和并送入43H43H、42H42H单元中去。单元中去。(高位在前,低位在后高位在前,低位在后)分析分析:32H32H33H33H42H42HA A22H22H23H23H43H43H00111000011001010001000110000111BCD码83HBCD码11H多字节多字节多字节多字节BCDBCD码加法码加法码加法码加法1/11/
13、202313例例例例2 2 2 2:有两有两 组组BCDBCD码(如:码(如:1183H1183H和和5678H5678H),分别存放在),分别存放在23H23H、22H22H单元和单元和33H33H、32H32H单元,求它们的和,并送入单元,求它们的和,并送入43H43H、42H42H单元中去。单元中去。(高位在前,低位高位在前,低位在后在后)解:解:流程图流程图(框图框图)如何如何?请同学们自己绘制流请同学们自己绘制流程图。程图。开始(22H)A(32H)+AA十进制调整(33H)+AA A(43H)结束 A(42H)(23H)A 十进制调整1/11/202314 ORG 0000HORG
14、 0000H MOV A MOV A,22H22H ADD A ADD A,32H32H DA A DA A MOV 42H MOV 42H,A A MOV A MOV A,23H23H ADDC A ADDC A,33H33H DA A DA A MOV 43H MOV 43H,A A SJMP$SJMP$END END 此条加法指令可否此条加法指令可否改用带进位的改用带进位的(ADDC)?(ADDC)?开始(22H)A(32H)+AA十进制调整(33H)+AA A(43H)结束 A(42H)(23H)A 十进制调整1/11/202315 ORG 2000H ORG 2000H CLR C
15、CLR C MOV A MOV A,22H22H ADDC A ADDC A,32H32H DA A DA A MOV 42H MOV 42H,A A MOV A MOV A,23H23H ADDC A ADDC A,33H33H DA A DA A MOV 43H MOV 43H,A A END END32H32H33H33H42H42HA A22H22H23H23H43H43H1000 00110101 01100001 00010111 10001000 00110111 1000+1111 10110110 00010001 00010101 01100110 01110110 100
16、0PCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCPC1111 10110110 0001PCPC0110 1000PCPC0110 01111/11/202316多字节多字节BCDBCD码加法码加法(P53)(P53)与与多多字节加法程序类似,但需在加法字节加法程序类似,但需在加法指令后加一条十进制加法调整指令。指令后加一条十进制加法调整指令。主程主程序与前面相同。序与前面相同。DADD:CLRDADD:CLRC CJAD1:JAD1:MOVMOVA,R0A,R0ADDCADDCA,R1A,R1DADAA AMOVMOVR0,AR0,AINCINCR0R0INCINCR1
17、R1DJNZDJNZR2,JAD1R2,JAD1RETRETORG 0000HLJMP JABCDORG 0100HJABCD:MOV R0,#40HMOV R1,#50HMOV R2,#04HLCALL DADDLJMP$以上为主程序以上为主程序以上为主程序以上为主程序BCDADD.ASM1/11/202317二、多字节减法二、多字节减法多字节减法程序和多字节加法程序类似,多字节减法程序和多字节加法程序类似,只需将加法指令换为减法指令即可。只需将加法指令换为减法指令即可。例例:在在43H40H依次存放被减数依次存放被减数443ADD7BH;在;在53H50H中依次存放减中依次存放减数数14D
18、F35B8H,试编程求二者之差,试编程求二者之差1/11/202318ORGORG0000H0000HLJMPLJMPJIANJIANORGORG0100H0100HJIANJIAN:MOVMOVR0R0,#40H#40HMOVMOVR1R1,#50H#50HMOVMOVR2R2,#04H#04HLCALL JIANSUBLCALL JIANSUBLJMPLJMP$以上为主程序以上为主程序JIANSUBJIANSUB:CLRCLRC CJIAN1JIAN1:MOVMOVA,R0A,R0 SUBB SUBBA,R1A,R1 MOV MOVR0,AR0,A INC INCR0R0 INC INCR
19、1R1 DJNZ R2,JIAN1 DJNZ R2,JIAN1 RET RET END END此程序也可以推广到此程序也可以推广到N N个字节的情个字节的情况。况。1/11/202319四、多字节数乘法四、多字节数乘法 MCS-51MCS-51系列单片机指令系统仅能提供系列单片机指令系统仅能提供8 8位乘法指令位乘法指令若需进行若需进行8 8位以上的乘法运算,则需通过编程实现。位以上的乘法运算,则需通过编程实现。设设(R4)(R3)(R4)(R3)中为十六位被乘数,中为十六位被乘数,R2R2中为中为8 8位乘数,其位乘数,其积存放在积存放在R7R6R5R7R6R5中。中。由于由于(R4)(R3
20、)*(R2)=(R4)*256+(R3)*(R2)(R4)(R3)*(R2)=(R4)*256+(R3)*(R2)=(R4)*(R2)*256+(R3)*R2 =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2(R4)*(R2)*256(R3)*(R2)1/11/202320CHENFA:MOV A,R2 MOV B,R3MUL AB;(R3)*(R2)MOV R5,AMOV R6,BMOV A,R2MOV B,R4MUL AB;(R2)*(R4)ADDA,R6MOV R6,AMOV A,BADDCA,#00H;加进位位加进位位MOV R7,ARET1/11/202
21、321五、多字节除法五、多字节除法 51指令系统提供一条指令系统提供一条8位的除法指令,位的除法指令,但要想用于多位除法运算则较为困难。因但要想用于多位除法运算则较为困难。因此,在进行多字节除法运算时,多采用手此,在进行多字节除法运算时,多采用手工算法相同的思路。工算法相同的思路。1/11/2023224-3 4-3 数据的拆拼和转换数据的拆拼和转换 在实际应用中,经常会遇到实际需要的数据格式同得在实际应用中,经常会遇到实际需要的数据格式同得到的数据格式不完全相符的情况,如采集到的数据、运算到的数据格式不完全相符的情况,如采集到的数据、运算的结果、输出的数据等,这就需要对其进行适当的转换,的结
22、果、输出的数据等,这就需要对其进行适当的转换,以符合实际情况的要求。这就是通常所说的数据拆拼和转以符合实际情况的要求。这就是通常所说的数据拆拼和转换。换。一、数据的拆拼一、数据的拆拼BBCD:MOV A,7CHANLA,#0FHMOV R5,AMOV A,7CHANLA,#0F0HSWAP AMOV R6,ARET例例:转换前转换前 7CH中为压缩中为压缩BCD码码XY程序清单:程序清单:0Y0X 转换后转换后 R6R5中为非压缩中为非压缩BCD码码1/11/202323例例4-4-24-4-2 拆拼前拆拼前 (20H)=X7X6X5X4X3X2X1X0 拆拼后拆拼后 (21H)=X0X1X2
23、X3X4X5X6X7DESORT:MOV A,20HDESORT:MOV A,20H MOV MOVR6,AR6,A MOV MOVR7,#08HR7,#08HRESO:CLRRESO:CLRC C MOV MOVA,R6A,R6 RLC RLCA A MOV MOVR6,AR6,A MOV MOVA,21HA,21H RRC RRCA A MOV MOV21H,A21H,A DJNZ DJNZR7,RESOR7,RESO RET RETA5A0 0A2 A1A4 A3A60000000A7A7A400A1 A0A3 A2A5A7000000A6A61/11/202324补充内容补充内容例例例
24、例1 1 1 1:将将20H20H单元的两个压缩单元的两个压缩BCDBCD码拆开变成码拆开变成ASCIIASCII码,存入码,存入21H21H、22H22H单元。单元。(假设假设20H20H中的中的BCDBCD码为码为00110100)00110100)什么是什么是BCDBCD码?码?什么是什么是ASCIIASCII码?码?BCDBCD码与码与ASCIIASCII码码关系关系 20H20H21H21H22H22HA AB B0011压缩BCD码0011 0011 0100低四位ASII码高四位ASII码压缩压缩BCDBCD码拆开变成码拆开变成ASCIIASCII码码1/11/202326方法方
25、法1 1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或或,即成为ASCII码。方法方法2 2:利用半字节交换指令来实现。1/11/202329二、数据的转换二、数据的转换 在计算机内部,任何数据都是以二进制的形式存在计算机内部,任何数据都是以二进制的形式存储,但是,当我们在作储,但是,当我们在作I/OI/O操作时,往往需要其它形式操作时,往往需要其它形式的数据格式,如的数据格式,如ASCIIASCII码、码、BCDBCD码、八进制数等,这就码、八进制数等,这就需要做一些数据格式的互换操作。需要做一些数据格式的互换操作。1 1、ASCIIASCII码到二
26、进制数的相互转换码到二进制数的相互转换二进制与二进制与ASCII码的相互关系为:码的相互关系为:数字数字09对应的对应的ASCII码为码为30H39H,即加即加30H字母字母AF对应的对应的ASCII码为码为41H46H,即加即加37H(1)ASCII(1)ASCII到二进制的转换到二进制的转换通过以上介绍的二者之间的关系,不难画出流程图:通过以上介绍的二者之间的关系,不难画出流程图:1/11/202330开始开始取操作数取操作数清进位标志清进位标志减减30H差差9?转换正确转换正确结束结束减减07HY转换正确转换正确NASCTOHEX:MOVA,R2CLRCSUBBA,#30HMOVR2,A
27、 CJNE A,#0AH,NEXTNEXT:JCTOKSUBBA,#07HMOVR2,ATOK:RET例例4-4-3 4-4-3 转换前转换前 R2R2为为ASCIIASCII码码,转换后转换后 R2R2为二进制为二进制1/11/202331(2)(2)二进制到二进制到ASCIIASCII码码当二进制数当二进制数(R0)-(R0)计数初值计数初值 3-(R7)3-(R7)初值送结果单元初值送结果单元 0-(R3)0-(R3)(R0)-(R2)(R0)-(R2)(R3R2)*10-(R3R2)(R3R2)*10-(R3R2)(R0)-1-(R0)(R0)-1-(R0)(R3R2)+(R0)+(C
28、y)-(R3R2)(R3R2)+(R0)+(Cy)-(R3R2)(R7)-1=0?(R7)-1=0?结束结束YN3615=3*103+6*102+1*10+5 =(3*10+6)*10+1*10+5R3R23H6H1H5H43H42H41H40HR01/11/202334MOVMOVR0,#43HR0,#43H;指向高位指向高位MOVMOVR3,#00HR3,#00H;结果单元清零结果单元清零MOVMOVA,R0A,R0MOVMOVR2,AR2,A;转换初值送转换初值送R2R2ML10:ML10:MOVMOVA,R2A,R2MOVMOVB,#0AHB,#0AHMULMULABAB;R2;R2乘
29、乘1010MOVMOVR2,AR2,A;暂存暂存R2*10R2*10低位低位MOVMOVA,BA,BXCHXCHA,R3A,R3;暂存暂存R2*10R2*10高位高位MOVMOVB,#0AHB,#0AHMULMULABAB;R3*10;R3*10ADDADDA,R3A,R3;R3*10;R3*10低位加低位加MOVMOVR3,AR3,A;为什么不处理为什么不处理B BBCDHEX:BCDHEX:MOVMOVR7,#03HR7,#03H;计数初值计数初值1/11/202335MOVMOVA,R0A,R0ADDADDA,R2A,R2;结果与低单元相加结果与低单元相加MOVMOVR2,AR2,AMO
30、VMOVA,R3A,R3ADDCADDC A,#00HA,#00H;加低位进位位加低位进位位MOVMOVR3,AR3,A;保存结果保存结果DJNZDJNZR7,ML10R7,ML10RETRET 由于二位压缩由于二位压缩BCDBCD码的表示范围为码的表示范围为0999909999,其对应二进制为其对应二进制为0270H0270H,不会超过两个字节不会超过两个字节,因因而不必考虑而不必考虑R3*10R3*10的高位。的高位。JAFA:JAFA:DECDECR0R0;指向下一位指向下一位1/11/202336例例:如下图所示如下图所示(2)二进制到二进制到BCD的转换的转换15H36HR3R2二进
31、制数二进制数3H8H4H5H43H42H41H40H非压缩非压缩BCD码码1H44H 如上图所示,双字节二进制数的表示范围为如上图所示,双字节二进制数的表示范围为065535,因而需要,因而需要5个个BCD码位来表示。从二进制到码位来表示。从二进制到BCD码,我们采用连减的办法,其原理如下:码,我们采用连减的办法,其原理如下:待转换的二进制数待转换的二进制数-104够减,万位加够减,万位加1,再减,再减不够减,恢复余数,再减不够减,恢复余数,再减103以此类推,直到得到个位为止。1/11/202337104=2710H103=03E8H 102=0064H10 =0AHBBCD:MOV R0,
32、#44H;数据指针数据指针MOV R7,#04H;计数初值计数初值MOV DPTR,#PWTABMOV R6,#00H;偏移量偏移量BBC1:MOV A,R6MOVC A,A+DPTRMOV R4,A;查幂值表低位查幂值表低位INCR6MOV A,R6MOVC A,A+DPTRMOV R5,A;查幂值高位查幂值高位INCR6MOV R0,#00H1/11/202338MOV A,R2SUBB A,R4;减低位减低位MOV R2,AMOV A,R3SUBB A,R5;减高位减高位MOV R3,AJCBBC3;不够减则恢复余数不够减则恢复余数INCR0;够减则结果单元加够减则结果单元加1SJMP
33、BBC2BBC3:MOV A,R2ADDA,R4;恢复余数低位恢复余数低位MOV R2,AMOV A,R3ADDCA,R5;恢复余数高位恢复余数高位MOV R3,ABBC2:CLRC1/11/202339DJNZDJNZR7,BBC1R7,BBC1;未减完则继续未减完则继续MOVMOVA,R2A,R2MOVMOVR0,AR0,A;保存个位保存个位RETRETPWTAB:DBPWTAB:DB10H,27H10H,27H;10000;10000DBDB0E8H,03H0E8H,03H;1000;1000DBDB64H,00H64H,00H;100;100DBDB0AH,00H0AH,00H;10;
34、10DECDECR0R0;指向下一单元指向下一单元1/11/2023404-5 查表程序查表程序查表程序中一种常用的非数值运算程序,查表程序中一种常用的非数值运算程序,应用非常广泛。使用查表程序可以完成数应用非常广泛。使用查表程序可以完成数据的补偿、计算、转换等各种功能,具有据的补偿、计算、转换等各种功能,具有程序简单、执行速度快、精度高等优点,程序简单、执行速度快、精度高等优点,而这正是单片机在测控场合或智能化仪表而这正是单片机在测控场合或智能化仪表中所需要的。中所需要的。1/11/202341一、以一、以DPTRDPTR为基地址的查表程序为基地址的查表程序 MOVCA,A+DPTR1 1、
35、其操作步骤如下:、其操作步骤如下:初始化初始化DPTR:将表格的首地址放入将表格的首地址放入DPTR中,中,作为基地址。作为基地址。初始化初始化ACC:A中应该放所要查询的数据在中应该放所要查询的数据在表格中的顺序号。表格中的顺序号。执行结果执行结果:在执行该指令后,在执行该指令后,A中存放的是中存放的是在表格中查到的数据。在表格中查到的数据。1/11/202342注意事项注意事项在查询表格时,若所要查询的数据是双字在查询表格时,若所要查询的数据是双字节的,则在初始化节的,则在初始化A中的数应为顺序号的中的数应为顺序号的2倍,且应执行两次本指令。倍,且应执行两次本指令。对于单字节表格而言,表项
36、的个数应不大对于单字节表格而言,表项的个数应不大于于256个,若大于个,若大于256时,则应适当修改时,则应适当修改DPTR的值。的值。表格的存放位置。表格的存放位置。1/11/202343二、以二、以PC为基地址的查表指令为基地址的查表指令MOVC A,A+PC表格存放地址表格存放地址=PC+偏移量偏移量+X(表项表项)1/11/2023441、操作步骤、操作步骤(1)将待查表的项数送给将待查表的项数送给ACC。(2)叠加偏移量叠加偏移量,表头和当前表头和当前PC的地址偏移的地址偏移量加到表项上。量加到表项上。(3)执行结果。执行结果。1/11/2023452 2、注意事项、注意事项(1)对
37、于双字节表格,其处理方法与以对于双字节表格,其处理方法与以DPTR为基地址的情况相同。为基地址的情况相同。(2)对于单字节表格而言,其项数应不大于对于单字节表格而言,其项数应不大于256。(3)对于双字节表格而言,其项数应不大于对于双字节表格而言,其项数应不大于128。1/11/202346三、两种方式的比较三、两种方式的比较1、PC仅能对所谓本地表格操作,即表格项仅能对所谓本地表格操作,即表格项数不得大于数不得大于256,且偏移量可能随程序的变,且偏移量可能随程序的变化而变化,计算较为麻烦,其优点是少用化而变化,计算较为麻烦,其优点是少用寄存器。寄存器。2、DPTR使用起来非常灵活,表项数不
38、受限使用起来非常灵活,表项数不受限制,且表格可以放在制,且表格可以放在64K的任意地方。的任意地方。1/11/202347例例:在一个温度测量装置中,测出的电压与温在一个温度测量装置中,测出的电压与温度为非线性关系。设测得的电压为度为非线性关系。设测得的电压为X X,用,用1010位二进制数表示。现要求采用查表法实现位二进制数表示。现要求采用查表法实现线性化处理。线性化处理。VTT1V1非线形非线形V1=KT11/11/202348分分 析析10位二进制位的表示范围为位二进制位的表示范围为01023,因而,因而有有1024个电压值,从而可以建立一个表格,个电压值,从而可以建立一个表格,其项数为
39、其项数为1024个。个。存放温度值存放温度值Y的单元地址的单元地址=表首地址表首地址+(X*2)设测得的电压值已存放在设测得的电压值已存放在20H,21H中,中,(20H为高字节为高字节),查表后的温度值存放在,查表后的温度值存放在22H,23H中,中,(22H为高字节为高字节)。1/11/202349例例:程序清单程序清单LTB2:MOV DPTR,#TAB2MOV A,21H;(20H21H)*2CLRCRLCA ;低八位低八位*2MOV 21H,A;MOV A,20H;表首表首+(20H21H)*2 RLCA ;高八位高八位*2+CYMOV 20H,AMOV A,21HADDA,DPLM
40、OV DPL,AMOV A,20HADDCA,DPH;为什么带进位加为什么带进位加MOV DPH,A;完成地址计算完成地址计算测得的电压值测得的电压值存放存放(20H21H)中中(20H为高字节为高字节),查表后的温,查表后的温度值存放在度值存放在(22H23H)中中(22H为高字节为高字节)1/11/202350例例:程序清单程序清单(续续)CLR A;查表查表 为什么清为什么清A?MOVCA,A+DPTRMOV22H,AINC DPTRCLRAMOVCA,A+DPTR MOV23H,A RETTAB2:DW.;温度表值温度表值DW.1/11/2023514-6 散转程序设计散转程序设计在程
41、序设计中,不外有三种情况:在程序设计中,不外有三种情况:顺序顺序、循环和条件分支程序循环和条件分支程序。其。其中顺序程序设计最为简单,而循中顺序程序设计最为简单,而循环程序设计在前面已经学习过。环程序设计在前面已经学习过。分支程序分支程序(如下图所示如下图所示)又可分为又可分为两大类:两大类:字节条件和位条件字节条件和位条件,即,即CJNECJNE和和JCJC、JBJB、JZJZ类指令。位条类指令。位条件转移指令很容易实现简单条件件转移指令很容易实现简单条件转移,当要实现多分支转移时,转移,当要实现多分支转移时,可以通过可以通过CJNECJNE来实现,这就是所来实现,这就是所谓散转程序设计,但
42、实现起来则谓散转程序设计,但实现起来则较为麻烦。较为麻烦。(A)=0?YYY(A)=1?N(A)=2?NN1/11/202352例例:测试测试P1口输入的口输入的100个数中个数中09各各数的概率分布程序数的概率分布程序(A)=0?YYY(A)=1?N(A)=2?NN操作操作0操作操作1操作操作2终点终点1/11/202353 MOV 40H,#100 MOV P1,#0FFH;准备输入准备输入READ:MOV A,P1CHK0:CJNE A,#0,CHK1 INC 30H DJNZ 40H,READ SJMP EENDCHK1:CJNE A,#1,CHK2 INC 31H DJNZ 40H,
43、READ SJMP EENDCHK2:CJNE A,#2,CHK3 INC 32H DJNZ 40H,READ SJMP EENDCHK3:CJNE A,#3,CHK4 INC 33H DJNZ 40H,READ SJMP EENDCHK4:CJNE A,#4,CHK5 INC 34H DJNZ 40H,READ SJMP EENDCHK5:CJNE A,#5,CHK6 INC 35H DJNZ 40H,READ SJMP EEND 程序清单程序清单1/11/202354CHK6:CJNE A,#6,CHK7 INC 36H DJNZ 40H,READ SJMP EENDCHK7:CJNE A
44、,#7,CHK8 INC 37H DJNZ 40H,READ SJMP EENDCHK8:CJNE A,#8,CHK9 INC 38H DJNZ 40H,READ SJMP EENDCHK9:INC 39H DJNZ 40H,READEEND:SJMP$利用条件转移类利用条件转移类利用条件转移类利用条件转移类指令来实现分支,程指令来实现分支,程指令来实现分支,程指令来实现分支,程序较为简单,容易实序较为简单,容易实序较为简单,容易实序较为简单,容易实现,但应特别注意的现,但应特别注意的现,但应特别注意的现,但应特别注意的是是是是:在分析问题时,一在分析问题时,一在分析问题时,一在分析问题时,一
45、定要逻辑严密,充分定要逻辑严密,充分定要逻辑严密,充分定要逻辑严密,充分判断出各种可能出现判断出各种可能出现判断出各种可能出现判断出各种可能出现的条件标志。的条件标志。的条件标志。的条件标志。1/11/202355二、利用转移指令来实现的程序散转二、利用转移指令来实现的程序散转JMPA+DPTR其执行过程可以分为三步:其执行过程可以分为三步:(1)将转移表首地址送入将转移表首地址送入DPTR作为基地址。作为基地址。(2)将条件标志单元内容装入将条件标志单元内容装入A中作为变址,在中作为变址,在装入前,还应根据转移表项内容作相应变化。装入前,还应根据转移表项内容作相应变化。(3)实现转移实现转移
46、。我们可以根据转移表的不同来分为三种散转程我们可以根据转移表的不同来分为三种散转程序:序:1/11/2023561、采用、采用转移指令表转移指令表的散转程序设计的散转程序设计这类散转程序的核心部分这类散转程序的核心部分转移表部分转移表部分由无条件转移指令由无条件转移指令AJMP或或LJMP构成。构成。其转移范围分别为其转移范围分别为64K或或2KBytes。1/11/202357例例:要求根据要求根据R7的内容转向各个操的内容转向各个操作程序作程序。即(即(R7)=0,转向,转向OPR0即(即(R7)=1,转向,转向OPR1即(即(R7)=2,转向,转向OPR2即(即(R7)=n,转向,转向O
47、PRn1/11/202358程序清单程序清单JUMP1:MOV DPTR,#JPTAB1MOV A,R7ADD A,R7;(R7)*2(A)JNC NOAD;判断是否有进位判断是否有进位INCDPH;有加到高字节地址;有加到高字节地址NOAD:JMP A+DPTRJPTAB1:AJMPOPR0AJMPOPR1.AJMPOPRn1/11/202359 注意事项注意事项(1)在本例中,由于)在本例中,由于AJMP指令的指令长度为指令的指令长度为2个个字节,因而在散转时采用自加的方法使变址实现字节,因而在散转时采用自加的方法使变址实现乘乘2;若改用;若改用LJMP指令,由于其指令长度为指令,由于其指
48、令长度为3字字节,因而应使变址乘节,因而应使变址乘3来修下正。当修正产生进位来修下正。当修正产生进位时,要将进位加到时,要将进位加到DPH中。中。(2)由于由于R7是单字节,因而散转点不能大于是单字节,因而散转点不能大于256个。为了克服此局限性,我们考虑:通过修改个。为了克服此局限性,我们考虑:通过修改DPTR的办法来增加散转点,使这最大散转点的办法来增加散转点,使这最大散转点N可可达到达到N=(最大存储容量最大存储容量散转表首地址散转表首地址)/3。1/11/202360例例:要求根据要求根据R6R7中的数据转向对中的数据转向对应的操作程序应的操作程序JUMP2:MOV DPTR,#JPT
49、AB2MOV A,R6MOV B,#03H;(R6)*3(BA)MULABADDA,DPHMOV DPH,A1/11/202361例例续MOV A,R7MOV B,#03HMUL ABXCH A,BADD A,DPHMOV DPH,A;XCH A,B;恢复低位恢复低位JMP A+DPTRJPTAB2:LJMPOPR0LJMPOPR1.LJMPOPRn1/11/2023622、采用、采用转向地址偏移量表转向地址偏移量表散转程序散转程序本方法的关键在于建立一个转向地址偏移本方法的关键在于建立一个转向地址偏移量表,需要程序员认真计算,否则会产生量表,需要程序员认真计算,否则会产生错误。错误。1/11
50、/202363例例:要求按要求按R7的内容转向的内容转向5个操作程序。个操作程序。JUMP3:MOV A,R7MOV DPTR,#TAB3MOVC A,A+DPTRJMPA+DPTRTAB3:DBOPR0-TAB3DBOPR1-TAB3.DBOPR4-TAB3OPR0:OPR1:OPR2:本例的散转范围小于本例的散转范围小于256,同上例一样,本例也可通过,同上例一样,本例也可通过变通的方法,使这能在变通的方法,使这能在64K范围内实现散转。范围内实现散转。1/11/2023644-7 I/O端口控制程序端口控制程序通过前面的学习,我们知道单片机有通过前面的学习,我们知道单片机有3232个个I