版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第
章
汇编语言程序设计本章内容SingleChipMicrocomputer§4-0概述§4-2运算程序设计§4-3数据的拆拼和转换§4-1循环程序设计§4-5查表程序§4-6散转程序设计§4-7I/O端口控制程序§4-8子程序调用时的参数传递第
章
汇编语言程序设计本章内容SingleCh概述最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如:BASIC、FORTRAN、PASCAL、然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言;由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;一、设计语言概述最早人们只能用机器语言(二进制)编写程序;一、设计语
源程序目标程序
低级语言机器语言汇编高级语言机器语言编译源二、程序设计方法一、程序设计
利用计算机能够接受的语言把解决问题的方法和步骤描述出来,也就是编制计算机的程序,人们常说的软件设计。对于单片机应用程序,我们可以把它看成是操作系统和应用软件的集合。二、程序设计步骤
用汇编语言编写一个程序的过程大致可分为以下几个步骤:1、分析问题,明确所要解决问题的具体要求。二、程序设计方法一、程序设计利用计算机能够接
2、确定算法。根据实际问题的要求和指令系统的特点,决定所要采用的计算公式和计算方法,这就是常说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的质量。
3、制定程序框图。根据算法,制定出运算步骤的顺序,再把运算过程画成流程图。
4、确定数据格式,分配工作单元,将程序框图进一步细化。
5、根据流程图和指令系统,编写出汇编语言源程序。
6、程序测试。由于单片机没有自开发功能,因而必须借助仿真器,以单步、断点、连续方式调试程序,直到完全正确为止。特别地,对于有硬件的应用系统,必须将软件和硬件结合起来调试,直到软件、硬件能协调一致,浑然一体为止。2、确定算法。根据实际问题的要求和指令系统的
7、程序优化。这一环节很容易被广大设计人员所忽略。它是指从程序结构上对程序加以调整,精减一些冗余指令,以加快程序的执行速度,节省程序存储空间,从而提高系统的可靠性。7、程序优化。这一环节很容易被广大设计人员所§4-1循环程序设计一、循环程序结构开始N结束Y循环结束控制修改控制变量循环工作部分置初值
在单片机应用程序设计中,循环程序的使用非常广泛。单循环的结构如下图所示:
其主体为循环体,由循环工作部分和修改控制变量构成。同其他语言一样,循环程序可以实现嵌套,构成多重循环。但切不可形成交叉。只能将整个循环程序作为外循环的循环体。§4-1循环程序设计一、循环程序结构开始N结束Y循环结二、循环程序设计举例例1、延时程序设计DELAY: MOV R7,#200 ;1个机器周期DE1: MOV R6,#123 ;1 NOP ;1DE2: DJNZ R6,DE2 ;2 DJNZ R7,DE1 ;2 RET ;2如晶体振荡器频率为12MHz,则其延时时间为:1+(1+1+2*123+2)*200+2=50.003ms(机器周期1μs)这是一个50ms的精确延时程序。DELAY.ASM二、循环程序设计举例例1、延时程序设计DELAY: MOV
在RAM中,从50H开始连续存放N个单字节无符号数,N存放在R2中,试编程求这N个数的和,结果放在R4R3中。程序清单如下:NSUM: MOV R0,#50HMOV R3,#00H;清零MOV R4,#00HLOOP: MOV A,R3 ADD A,@R0 MOV R3,A CLR A ADDCA,R4 MOV R4,A INC R0 DJNZ R2,LOOP RET例2、数据求和在RAM中,从50H开始连续存放N个单字节无§4-2运算程序设计一、多字节加法
例4-3-1设有两个4字节的二进制数2F5BA7C3H和14DF35B8H,分别放在以40H和50H为起始地址的单元中(低位在低地址),试编程求这个数之和,结果放在以40H为起始地址的单元中。 ORG 0000H LJMP JAFA ORG 0100HJAFA:MOVR0,#40H MOV R1,#50H MOV R2,#04H LCALLJASUBLJMP $
以上为主程序JASUB:CLR CJASUB1:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,@RiADDC A,#data§4-2运算程序设计一、多字节加法例4-
本程序适合于N个字节的两数求和,但并不严密,当最后一次加法有进位时并没有相应处理,实际应用时应根据实际情况稍作修改。本程序适合于N个字节的两数求和,但并不严密,例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD码83HBCD码11H多字节BCD码加法例2:有两组BCD码分别存放在23H、22H单元和33H、3例2:有两组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)解:流程图(框图)如何?请同学们自己绘制流程图。
开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A
十进制调整例2:有两组BCD码(如:1183H和5678H),分别存ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END
此条加法指令可否改用带进位的(ADDC)?开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A
十进制调整开始(22H)A(32H)+AA十进制调整(33H)+ORG2000HCLRCMOVA,22HADDCA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111·········32H33H42HA22H23H43H··多字节BCD码加法(P53)
与多字节加法程序类似,但需在加法指令后加一条十进制加法调整指令。主程序与前面相同。DADD:CLR CJAD1: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2,JAD1 RET ORG 0000H LJMP JABCD ORG 0100HJABCD:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLDADD LJMP $以上为主程序BCDADD.ASM多字节BCD码加法(P53)与多字节加法程序二、多字节减法 多字节减法程序和多字节加法程序类似,只需将加法指令换为减法指令即可。例:在43H~40H依次存放被减数443ADD7BH;在53H~50H中依次存放减数14DF35B8H,试编程求二者之差二、多字节减法 多字节减法程序和多字节加法程序类似,只需将
ORG 0000H LJMP JIAN ORG 0100HJIAN:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLJIANSUB LJMP $
以上为主程序JIANSUB:CLR CJIAN1:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JIAN1 RET END此程序也可以推广到N个字节的情况。 ORG 0000HJIANSUB:CLR C四、多字节数乘法
MCS-51系列单片机指令系统仅能提供8位乘法指令若需进行8位以上的乘法运算,则需通过编程实现。设(R4)(R3)中为十六位被乘数,R2中为8位乘数,其积存放在R7R6R5中。由于(R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2) =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2×(R4)*(R2)*256(R3)*(R2)四、多字节数乘法MCS-51系列单片机指令系CHENFA: MOV A,R2
MOV B,R3 MUL AB ;(R3)*(R2) MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ;(R2)*(R4) ADD A,R6 MOV R6,A MOV A,B ADDC A,#00H;加进位位 MOV R7,A RETCHENFA: MOV A,R2五、多字节除法
51指令系统提供一条8位的除法指令,但要想用于多位除法运算则较为困难。因此,在进行多字节除法运算时,多采用手工算法相同的思路。五、多字节除法51指令系统提供一条8位的除法§4-3数据的拆拼和转换
在实际应用中,经常会遇到实际需要的数据格式同得到的数据格式不完全相符的情况,如采集到的数据、运算的结果、输出的数据等,这就需要对其进行适当的转换,以符合实际情况的要求。这就是通常所说的数据拆拼和转换。一、数据的拆拼BBCD:MOV A,7CH ANL A,#0FH MOV R5,A MOV A,7CH
ANL A,#0F0H SWAP A MOV R6,A RET例:转换前7CH中为压缩BCD码XY程序清单:0Y0X
转换后R6R5中为非压缩BCD码§4-3数据的拆拼和转换在实际应用中,经常例4-4-2拆拼前(20H)=X7X6X5X4X3X2X1X0 拆拼后(21H)=X0X1X2X3X4X5X6X7DESORT:MOVA,20H MOV R6,A MOV R7,#08HRESO:CLR C MOV A,R6 RLC A MOV R6,A MOV A,21H RRC A MOV 21H,ADJNZ R7,RESO RET A5A00A2A1A4A3A60000000A7A7A400A1A0A3A2A5A7000000A6A6例4-4-2拆拼前(20H)=X7X6X5X4X补充内容例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是BCD码?什么是ASCII码?BCD码与ASCII码关系·········20H21H22HAB0011压缩BCD码001100110100低四位ASII码高四位ASII码压缩BCD码拆开变成ASCII码补充内容例1:将20H单元的两个压缩BCD码拆开变成ASCI二进制与ASCII码的相互关系为:数字0~9对应的ASCII码为30H~39H,即加30H字母A~F对应的ASCII码为41H~46H,即加37H二进制与ASCII码的相互关系为:方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$
开始(20H)A10HBA/B(A中为高4位BCD码,B中为低4位BCD码)B+30HBB(22H)A+30HAA(21H)结束简单程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000H开始(20H)A10HBAORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$简单程序例1---方法2
开始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)结束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011
二、数据的转换
在计算机内部,任何数据都是以二进制的形式存储,但是,当我们在作I/O操作时,往往需要其它形式的数据格式,如ASCII码、BCD码、八进制数等,这就需要做一些数据格式的互换操作。1、ASCII码到二进制数的相互转换二进制与ASCII码的相互关系为:数字0~9对应的ASCII码为30H~39H,即加30H字母A~F对应的ASCII码为41H~46H,即加37H(1)ASCII到二进制的转换通过以上介绍的二者之间的关系,不难画出流程图:二、数据的转换在计算机内部,任何数据都是以二开始取操作数清进位标志减30H差>9?转换正确结束减07HY转换正确NASCTOHEX: MOV A,R2 CLR C SUBB A,#30H MOV R2,ACJNEA,#0AH,NEXTNEXT:JC TOK SUBB A,#07H MOV R2,ATOK:
RET例4-4-3转换前R2为ASCII码,转换后R2为二进制开始取操作数清进位标志减30H差>9?转换正确结束减07HY(2)二进制到ASCII码当二进制数<0AH时,加30H即得相应的ASCII,当二进制数介于0AH、0FH之间(包括0AH、0FH),则加37H即得到相应的ASCII。(2)二进制到ASCII码当二进制数<0AH时,加30H即得2、BCD码与二进制的相互转换(1)BCD到二进制的转换3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5由压缩BCD码到非压缩BCD码的转换较为简单,在前面我们已经涉及,在此不再重复。例:如下图所示15H36H41H40H压缩BCD码3H6H1H5H43H42H41H40H非压缩BCD码1FH0EHR3R2二进制数2、BCD码与二进制的相互转换(1)BCD到二进制的转换36高位BCD码的地址->(R0)计数初值3->(R7)初值送结果单元0->(R3)((R0))->(R2)(R3R2)*10->(R3R2)(R0)-1->(R0)(R3R2)+((R0))+(Cy)->(R3R2)(R7)-1=0?结束YN3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5R3R23H6H1H5H43H42H41H40HR0高位BCD码的地址->(R0)计数初值3->(R7)初值送
MOV R0,#43H ;指向高位 MOV R3,#00H ;结果单元清零 MOV A,@R0 MOV R2,A ;转换初值送R2ML10: MOV A,R2 MOV B,#0AH MUL AB ;R2乘10 MOV R2,A ;暂存R2*10低位 MOV A,B XCH A,R3 ;暂存R2*10高位 MOV B,#0AH MUL AB ;R3*10 ADD A,R3 ;R3*10低位加 MOV R3,A ;为什么不处理BBCDHEX: MOV R7,#03H ;计数初值 MOV R0,#43H ;指向高位BCDHEX: MOV
MOV A,@R0 ADD A,R2 ;结果与低单元相加 MOV R2,A MOV A,R3 ADDC A,#00H ;加低位进位位 MOV R3,A ;保存结果 DJNZ R7,ML10 RET
由于二位压缩BCD码的表示范围为0~9999,其对应二进制为0~270H,不会超过两个字节,因而不必考虑R3*10的高位。JAFA: DEC R0 ;指向下一位 MOV A,@R0由于二位压缩BCD码的例:如下图所示(2)二进制到BCD的转换15H36HR3R2二进制数3H8H4H5H43H42H41H40H非压缩BCD码1H44H
如上图所示,双字节二进制数的表示范围为0~65535,因而需要5个BCD码位来表示。从二进制到BCD码,我们采用连减的办法,其原理如下:待转换的二进制数-104够减,万位加1,再减不够减,恢复余数,再减103以此类推,直到得到个位为止。例:如下图所示(2)二进制到BCD的转换15H36HR3104=2710H 103=03E8H 102=0064H 10=0AHBBCD:MOV R0,#44H ;数据指针 MOV R7,#04H ;计数初值 MOV DPTR,#PWTAB MOV R6,#00H ;偏移量BBC1: MOV A,R6 MOVCA,@A+DPTR MOV R4,A ;查幂值表低位 INC R6 MOV A,R6 MOVCA,@A+DPTR MOV R5,A ;查幂值高位 INC R6 MOV @R0,#00H104=2710H 103=03E8H 102=0064H
MOV A,R2 SUBB A,R4 ;减低位 MOV R2,A MOV A,R3 SUBB A,R5 ;减高位 MOV R3,A JC BBC3 ;不够减则恢复余数 INC @R0 ;够减则结果单元加1 SJMP BBC2BBC3: MOV A,R2 ADD A,R4 ;恢复余数低位 MOV R2,A MOV A,R3 ADDC A,R5 ;恢复余数高位 MOV R3,ABBC2: CLR C MOV A,R2BBC2: CLR C
DJNZ R7,BBC1 ;未减完则继续 MOV A,R2 MOV @R0,A ;保存个位 RETPWTAB:DB 10H,27H ;10000 DB 0E8H,03H ;1000 DB 64H,00H ;100 DB 0AH,00H ;10
DEC R0 ;指向下一单元 DJNZ R7,BBC1 ;未减完则继续 DEC R0 ;§4-5查表程序
查表程序中一种常用的非数值运算程序,应用非常广泛。使用查表程序可以完成数据的补偿、计算、转换等各种功能,具有程序简单、执行速度快、精度高等优点,而这正是单片机在测控场合或智能化仪表中所需要的。§4-5查表程序 查表程序中一种常用的非数值运算程序,应一、以DPTR为基地址的查表程序MOVC A,@A+DPTR1、其操作步骤如下:初始化DPTR:将表格的首地址放入DPTR中,作为基地址。
初始化ACC:A中应该放所要查询的数据在表格中的顺序号。执行结果:在执行该指令后,A中存放的是在表格中查到的数据。一、以DPTR为基地址的查表程序MOVC 注意事项在查询表格时,若所要查询的数据是双字节的,则在初始化A中的数应为顺序号的2倍,且应执行两次本指令。对于单字节表格而言,表项的个数应不大于256个,若大于256时,则应适当修改DPTR的值。表格的存放位置。注意事项在查询表格时,若所要查询的数据是双字节的,则在初始化二、以PC为基地址的查表指令MOVC A,@A+PC表格存放地址=PC+偏移量+X(表项)二、以PC为基地址的查表指令MOVC A,@A+PC1、操作步骤(1)将待查表的项数送给ACC。(2)叠加偏移量,表头和当前PC的地址偏移量加到表项上。(3)执行结果。1、操作步骤(1)将待查表的项数送给ACC。2、注意事项(1)对于双字节表格,其处理方法与以DPTR为基地址的情况相同。(2)对于单字节表格而言,其项数应不大于256。(3)对于双字节表格而言,其项数应不大于128。2、注意事项(1)对于双字节表格,其处理方法与以DPTR为三、两种方式的比较1、PC仅能对所谓本地表格操作,即表格项数不得大于256,且偏移量可能随程序的变化而变化,计算较为麻烦,其优点是少用寄存器。2、DPTR使用起来非常灵活,表项数不受限制,且表格可以放在64K的任意地方。三、两种方式的比较1、PC仅能对所谓本地表格操作,即表格项数例:
在一个温度测量装置中,测出的电压与温度为非线性关系。设测得的电压为X,用10位二进制数表示。现要求采用查表法实现线性化处理。VTT1V1非线形V1=KT1例: 在一个温度测量装置中,测出的电压与温度为非线性关系。设分析10位二进制位的表示范围为0~1023,因而有1024个电压值,从而可以建立一个表格,其项数为1024个。存放温度值Y的单元地址=表首地址+(X*2)设测得的电压值已存放在20H,21H中,(20H为高字节),查表后的温度值存放在22H,23H中,(22H为高字节)。分析10位二进制位的表示范围为0~1023,因而有10例:程序清单LTB2: MOV DPTR,#TAB2
MOV A,21H;(20H21H)*2 CLR C RLC A;低八位*2 MOV 21H,A;
MOV A,20H;表首+(20H21H)*2 RLC A;高八位*2+CY MOV 20H,A MOV A,21H ADD A,DPL MOV DPL,A MOV A,20H ADDC A,DPH;为什么带进位加 MOV DPH,A;完成地址计算测得的电压值存放(20H21H)中(20H为高字节),查表后的温度值存放在(22H23H)中(22H为高字节)例:程序清单LTB2: MOV DPTR,#TAB2测得的例:程序清单(续) CLR A ;查表
为什么清A?? MOVC A,@A+DPTR MOV 22H,A INC DPTR CLR A MOVC A,@A+DPTR MOV 23H,A RETTAB2: DW ………….. ;温度表值 DW …………..例:程序清单(续) CLR A ;查§4-6散转程序设计 在程序设计中,不外有三种情况:顺序、循环和条件分支程序。其中顺序程序设计最为简单,而循环程序设计在前面已经学习过。分支程序(如下图所示)又可分为两大类:字节条件和位条件,即CJNE和JC、JB、JZ类指令。位条件转移指令很容易实现简单条件转移,当要实现多分支转移时,可以通过CJNE来实现,这就是所谓散转程序设计,但实现起来则较为麻烦。(A)=0?YYY(A)=1?N(A)=2?NN§4-6散转程序设计 在程序设计中,不外有三种情况:顺序例: 测试P1口输入的100个数中0~9各数的概率分布程序(A)=0?YYY(A)=1?N(A)=2?NN操作0操作1操作2终点例: 测试P1口输入的100个数中0~9各数的概率分布程序( MOV40H,#100MOVP1,#0FFH;准备输入READ:MOVA,P1CHK0:CJNEA,#0,CHK1 INC30H DJNZ40H,READ SJMPEENDCHK1:CJNEA,#1,CHK2 INC31H DJNZ40H,READ SJMPEENDCHK2:CJNEA,#2,CHK3 INC32H DJNZ40H,READ SJMPEENDCHK3:CJNEA,#3,CHK4 INC33H DJNZ40H,READ SJMPEENDCHK4:CJNEA,#4,CHK5 INC34H DJNZ40H,READ SJMPEENDCHK5:CJNEA,#5,CHK6 INC35H DJNZ40H,READ SJMPEEND程序清单 MOV40H,#100CHK3:CJNECHK6:CJNEA,#6,CHK7 INC36H DJNZ40H,READ SJMPEENDCHK7:CJNEA,#7,CHK8 INC37H DJNZ40H,READ SJMPEENDCHK8:CJNEA,#8,CHK9 INC38H DJNZ40H,READ SJMPEENDCHK9:INC39H DJNZ40H,READEEND:SJMP$
利用条件转移类指令来实现分支,程序较为简单,容易实现,但应特别注意的是:在分析问题时,一定要逻辑严密,充分判断出各种可能出现的条件标志。CHK6:CJNEA,#6,CHK7CHK9:I二、利用转移指令来实现的程序散转JMP @A+DPTR其执行过程可以分为三步:(1)将转移表首地址送入DPTR作为基地址。(2)将条件标志单元内容装入A中作为变址,在装入前,还应根据转移表项内容作相应变化。(3)实现转移。我们可以根据转移表的不同来分为三种散转程序:二、利用转移指令来实现的程序散转JMP @A+DPTR1、采用转移指令表的散转程序设计 这类散转程序的核心部分——转移表部分由无条件转移指令AJMP或LJMP构成。 其转移范围分别为64K或2KBytes。1、采用转移指令表的散转程序设计 这类散转程序的核心部分——例:要求根据R7的内容转向各个操作程序。
即(R7)=0,转向OPR0 即(R7)=1,转向OPR1 即(R7)=2,转向OPR2 …………… 即(R7)=n,转向OPRn 例:要求根据R7的内容转向各个操作程序。
即(R程序清单JUMP1: MOV DPTR,#JPTAB1 MOV A,R7 ADD A,R7 ;(R7)*2(A) JNC NOAD ;判断是否有进位 INC DPH ;有加到高字节地址NOAD: JMP @A+DPTRJPTAB1: AJMP OPR0 AJMP OPR1 …………….. AJMP OPRn程序清单JUMP1: MOV DPTR,#JPTAB1
注意事项(1)在本例中,由于AJMP指令的指令长度为2个字节,因而在散转时采用自加的方法使变址实现乘2;若改用LJMP指令,由于其指令长度为3字节,因而应使变址乘3来修下正。当修正产生进位时,要将进位加到DPH中。 (2)由于R7是单字节,因而散转点不能大于256个。为了克服此局限性,我们考虑:通过修改DPTR的办法来增加散转点,使这最大散转点N可达到N<=(最大存储容量—散转表首地址)/3。注意事项(1)在本例中,由于AJMP指令的指令长度为2个例:要求根据R6R7中的数据转向对应的操作程序JUMP2: MOV DPTR,#JPTAB2 MOV A,R6 MOV B,#03H ;(R6)*3(BA) MUL AB ADD A,DPH MOV DPH,A例:要求根据R6R7中的数据转向对应的操作程序JUMP2:例续 MOV A,R7 MOV B,#03H MUL AB XCH A,B ADD A,DPH MOV DPH,A; XCH A,B;恢复低位 JMP @A+DPTRJPTAB2: LJMP OPR0 LJMP OPR1 …………….. LJMP OPRn例续 MOV A,R72、采用转向地址偏移量表散转程序 本方法的关键在于建立一个转向地址偏移量表,需要程序员认真计算,否则会产生错误。2、采用转向地址偏移量表散转程序 本方法的关键在于建立一个转例:要求按R7的内容转向5个操作程序。JUMP3: MOV A,R7 MOV DPTR,#TAB3 MOVCA,@A+DPTR JMP @A+DPTRTAB3: DB OPR0-TAB3 DB OPR1-TAB3 ……. DB OPR4-TAB3OPR0:OPR1:OPR2:……本例的散转范围小于256,同上例一样,本例也可通过变通的方法,使这能在64K范围内实现散转。例:要求按R7的内容转向5个操作程序。JUMP3: MOV§4-7I/O端口控制程序 通过前面的学习,我们知道单片机有32个I/O口可供编程者使用。由于结构上的原因,I/O口作为输出时,由于端口具有锁存功能,不需外接锁存器;但是,当把它作为输入口时,虽然具有输入缓冲器,但不具有输入锁存器,因此在CPU完成读引脚前,输入的数据必须一直保持在引脚上。为此,我们需要借助一些特定的接口电路来实现输入功能。§4-7I/O端口控制程序 通过前面的学习,我们知道单片一、BCD拨码盘与单片机的接口 如右图所示,A为公共端,当A接VCC时,拨码盘输出正逻辑,当A接GND时,拨码盘输出负逻辑。其输出范围为0000~1001,因而称之为BCD拨码盘。一、BCD拨码盘与单片机的接口 如右图所示,A为公共端,当ABCD拨码盘与单片机的接口
BCD拨码盘与单片机的接口电路如右图所示:通过读取P1口的低四位即可获得BCD拨码盘的状态信息。BCD拨码盘与单片机的接口 BCD拨码盘与单片机的接口电路如二、多片BCD拨盘与单片机的接口如图所示:通过对P1口的高四位进行扫描,使P1.4~P1.7依次为“0”,然后查询P1口低四位的状态,从而得到拨盘的状态信息。由于拨盘在控制端为“0”时选中该位,因此拨盘的输出为反码,经与非门后,读出的状态信息为正码。二、多片BCD拨盘与单片机的接口如图所示:通过对P1口的高四三、拨码输入程序将4位BCD码按千,百,十,个位依次读入,然后存放在30H_33H中。RDS: MOV R0,#30H MOV R2,#7FH;首先选中千位 MOV R3,#04HLOOP: MOVA,R2 MOV P1,A;读千位,同时低四位输出“1” MOV A,P1 ANL A,#0FH MOV @R0,A;读入低四位,保存 INC R0 MOV A,R2 RR A MOV R2,A;R2指向下一位 DJNZ R3,LOOP RET三、拨码输入程序将4位BCD码按千,百,十,个位依次读入,然§4-8子程序调用时的参数传递在进行程序设计时,为保证程序的高效、可靠的运行,增加程序的可读性、可懂性,我们提倡结构化编程,而结构化编程的重要一点就是子程序的编制。在进行程序设计时,有些程序段是被多次使用到,但每次使用时,需要对某个寄存器的内容稍作修改。为了避免多次多次重复编写同样的程序,节省存储空间,我们就可以把这样的程序段独立出来,形成一个独立的子程序,每次要使用前,先对需要修改的寄存器进行修改后,用ACALL或LCALL调用,这里修改的寄存器我们称之为入口参数,子程序执行的结果,我们称之为出口参数,参数修改方式则称之为参数传递。§4-8子程序调用时的参数传递在进行程序设计时,为保证程常通过寄存器传递参数这种方法应用最为广泛、也最易使用,它是在调用子程序之前,对需要修改的寄存器预先修改后,再来调用子程序。常通过寄存器传递参数这种方法应用最为广泛、也最易使用,它是在例:试编程对30H~3AH单元清零MAIN: ………..………… MOV R0,#30H MOV R7,#0AH LCALL SUBRT ….SUBRT: MOV A,#00HRESU: MOV @R0,A INC R0 DJNZ R7,RESU RET例:试编程对30H~3AH单元清零MAIN: ………..…第
章
汇编语言程序设计本章内容SingleChipMicrocomputer§4-0概述§4-2运算程序设计§4-3数据的拆拼和转换§4-1循环程序设计§4-5查表程序§4-6散转程序设计§4-7I/O端口控制程序§4-8子程序调用时的参数传递第
章
汇编语言程序设计本章内容SingleCh概述最早人们只能用机器语言(二进制)编写程序;为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编;为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如:BASIC、FORTRAN、PASCAL、然后再用编译系统将其翻译成机器语言,该过程称为编译;机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言;由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;一、设计语言概述最早人们只能用机器语言(二进制)编写程序;一、设计语
源程序目标程序
低级语言机器语言汇编高级语言机器语言编译源二、程序设计方法一、程序设计
利用计算机能够接受的语言把解决问题的方法和步骤描述出来,也就是编制计算机的程序,人们常说的软件设计。对于单片机应用程序,我们可以把它看成是操作系统和应用软件的集合。二、程序设计步骤
用汇编语言编写一个程序的过程大致可分为以下几个步骤:1、分析问题,明确所要解决问题的具体要求。二、程序设计方法一、程序设计利用计算机能够接
2、确定算法。根据实际问题的要求和指令系统的特点,决定所要采用的计算公式和计算方法,这就是常说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的质量。
3、制定程序框图。根据算法,制定出运算步骤的顺序,再把运算过程画成流程图。
4、确定数据格式,分配工作单元,将程序框图进一步细化。
5、根据流程图和指令系统,编写出汇编语言源程序。
6、程序测试。由于单片机没有自开发功能,因而必须借助仿真器,以单步、断点、连续方式调试程序,直到完全正确为止。特别地,对于有硬件的应用系统,必须将软件和硬件结合起来调试,直到软件、硬件能协调一致,浑然一体为止。2、确定算法。根据实际问题的要求和指令系统的
7、程序优化。这一环节很容易被广大设计人员所忽略。它是指从程序结构上对程序加以调整,精减一些冗余指令,以加快程序的执行速度,节省程序存储空间,从而提高系统的可靠性。7、程序优化。这一环节很容易被广大设计人员所§4-1循环程序设计一、循环程序结构开始N结束Y循环结束控制修改控制变量循环工作部分置初值
在单片机应用程序设计中,循环程序的使用非常广泛。单循环的结构如下图所示:
其主体为循环体,由循环工作部分和修改控制变量构成。同其他语言一样,循环程序可以实现嵌套,构成多重循环。但切不可形成交叉。只能将整个循环程序作为外循环的循环体。§4-1循环程序设计一、循环程序结构开始N结束Y循环结二、循环程序设计举例例1、延时程序设计DELAY: MOV R7,#200 ;1个机器周期DE1: MOV R6,#123 ;1 NOP ;1DE2: DJNZ R6,DE2 ;2 DJNZ R7,DE1 ;2 RET ;2如晶体振荡器频率为12MHz,则其延时时间为:1+(1+1+2*123+2)*200+2=50.003ms(机器周期1μs)这是一个50ms的精确延时程序。DELAY.ASM二、循环程序设计举例例1、延时程序设计DELAY: MOV
在RAM中,从50H开始连续存放N个单字节无符号数,N存放在R2中,试编程求这N个数的和,结果放在R4R3中。程序清单如下:NSUM: MOV R0,#50HMOV R3,#00H;清零MOV R4,#00HLOOP: MOV A,R3 ADD A,@R0 MOV R3,A CLR A ADDCA,R4 MOV R4,A INC R0 DJNZ R2,LOOP RET例2、数据求和在RAM中,从50H开始连续存放N个单字节无§4-2运算程序设计一、多字节加法
例4-3-1设有两个4字节的二进制数2F5BA7C3H和14DF35B8H,分别放在以40H和50H为起始地址的单元中(低位在低地址),试编程求这个数之和,结果放在以40H为起始地址的单元中。 ORG 0000H LJMP JAFA ORG 0100HJAFA:MOVR0,#40H MOV R1,#50H MOV R2,#04H LCALLJASUBLJMP $
以上为主程序JASUB:CLR CJASUB1:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JASUB1 RET ENDADDC A,RnADDC A,directADDC A,@RiADDC A,#data§4-2运算程序设计一、多字节加法例4-
本程序适合于N个字节的两数求和,但并不严密,当最后一次加法有进位时并没有相应处理,实际应用时应根据实际情况稍作修改。本程序适合于N个字节的两数求和,但并不严密,例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后)分析:·········32H33H42HA22H23H43H···00111000011001010001000110000111BCD码83HBCD码11H多字节BCD码加法例2:有两组BCD码分别存放在23H、22H单元和33H、3例2:有两组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前,低位在后)解:流程图(框图)如何?请同学们自己绘制流程图。
开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A
十进制调整例2:有两组BCD码(如:1183H和5678H),分别存ORG0000HMOVA,22HADDA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,ASJMP$END
此条加法指令可否改用带进位的(ADDC)?开始(22H)A(32H)+AA十进制调整(33H)+AAA(43H)结束A(42H)(23H)A
十进制调整开始(22H)A(32H)+AA十进制调整(33H)+ORG2000HCLRCMOVA,22HADDCA,32HDAAMOV42H,AMOVA,23HADDCA,33HDAAMOV43H,AEND·········32H33H42HA22H23H43H···100000110101011000010001011110001000001101111000+111110110110000100010001010101100110011101101000PCPCPCPCPCPCPCPCPC1111101101100001PC01101000PC01100111·········32H33H42HA22H23H43H··多字节BCD码加法(P53)
与多字节加法程序类似,但需在加法指令后加一条十进制加法调整指令。主程序与前面相同。DADD:CLR CJAD1: MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A INC R0 INC R1 DJNZ R2,JAD1 RET ORG 0000H LJMP JABCD ORG 0100HJABCD:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLDADD LJMP $以上为主程序BCDADD.ASM多字节BCD码加法(P53)与多字节加法程序二、多字节减法 多字节减法程序和多字节加法程序类似,只需将加法指令换为减法指令即可。例:在43H~40H依次存放被减数443ADD7BH;在53H~50H中依次存放减数14DF35B8H,试编程求二者之差二、多字节减法 多字节减法程序和多字节加法程序类似,只需将
ORG 0000H LJMP JIAN ORG 0100HJIAN:MOV R0,#40H MOV R1,#50H MOV R2,#04H LCALLJIANSUB LJMP $
以上为主程序JIANSUB:CLR CJIAN1:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0 INC R1 DJNZR2,JIAN1 RET END此程序也可以推广到N个字节的情况。 ORG 0000HJIANSUB:CLR C四、多字节数乘法
MCS-51系列单片机指令系统仅能提供8位乘法指令若需进行8位以上的乘法运算,则需通过编程实现。设(R4)(R3)中为十六位被乘数,R2中为8位乘数,其积存放在R7R6R5中。由于(R4)(R3)*(R2)=[(R4)*256+(R3)]*(R2) =(R4)*(R2)*256+(R3)*R2R4R3BAR6R5R7BA+R2×(R4)*(R2)*256(R3)*(R2)四、多字节数乘法MCS-51系列单片机指令系CHENFA: MOV A,R2
MOV B,R3 MUL AB ;(R3)*(R2) MOV R5,A MOV R6,B MOV A,R2 MOV B,R4 MUL AB ;(R2)*(R4) ADD A,R6 MOV R6,A MOV A,B ADDC A,#00H;加进位位 MOV R7,A RETCHENFA: MOV A,R2五、多字节除法
51指令系统提供一条8位的除法指令,但要想用于多位除法运算则较为困难。因此,在进行多字节除法运算时,多采用手工算法相同的思路。五、多字节除法51指令系统提供一条8位的除法§4-3数据的拆拼和转换
在实际应用中,经常会遇到实际需要的数据格式同得到的数据格式不完全相符的情况,如采集到的数据、运算的结果、输出的数据等,这就需要对其进行适当的转换,以符合实际情况的要求。这就是通常所说的数据拆拼和转换。一、数据的拆拼BBCD:MOV A,7CH ANL A,#0FH MOV R5,A MOV A,7CH
ANL A,#0F0H SWAP A MOV R6,A RET例:转换前7CH中为压缩BCD码XY程序清单:0Y0X
转换后R6R5中为非压缩BCD码§4-3数据的拆拼和转换在实际应用中,经常例4-4-2拆拼前(20H)=X7X6X5X4X3X2X1X0 拆拼后(21H)=X0X1X2X3X4X5X6X7DESORT:MOVA,20H MOV R6,A MOV R7,#08HRESO:CLR C MOV A,R6 RLC A MOV R6,A MOV A,21H RRC A MOV 21H,ADJNZ R7,RESO RET A5A00A2A1A4A3A60000000A7A7A400A1A0A3A2A5A7000000A6A6例4-4-2拆拼前(20H)=X7X6X5X4X补充内容例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100)什么是BCD码?什么是ASCII码?BCD码与ASCII码关系·········20H21H22HAB0011压缩BCD码001100110100低四位ASII码高四位ASII码压缩BCD码拆开变成ASCII码补充内容例1:将20H单元的两个压缩BCD码拆开变成ASCI二进制与ASCII码的相互关系为:数字0~9对应的ASCII码为30H~39H,即加30H字母A~F对应的ASCII码为41H~46H,即加37H二进制与ASCII码的相互关系为:方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。方法2:利用半字节交换指令来实现。方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、ORG0000HMOVA,20HMOVB,#10HDIVABORLB,#30HMOV22H,BORLA,#30HMOV21H,ASJMP$
开始(20H)A10HBA/B(A中为高4位BCD码,B中为低4位BCD码)B+30HBB(22H)A+30HAA(21H)结束简单程序例1---方法1源程序如下:·········20H21H22HAB00110100PCPCPC0011010000010000PC0011000000000100PC00110100PCPCPC0011PCORG0000H开始(20H)A10HBAORG0000HMOVR0,#20HMOVA,#30HXCHDA,@R0MOV22H,AMOVA,@R0SWAPAORLA,#30HMOV21H,ASJMP$简单程序例1---方法2
开始#20HR0#30HAA的低4位(20H)的低4位A(22H)(20H)AA的低4位A的高4位A(21H)结束A+30HAPCPCPCPCPCPCPCPCPC源程序如下:·········20H21H22HAR000110010000000110100000001000011010000110000001100000011PC0011
二、数据的转换
在计算机内部,任何数据都是以二进制的形式存储,但是,当我们在作I/O操作时,往往需要其它形式的数据格式,如ASCII码、BCD码、八进制数等,这就需要做一些数据格式的互换操作。1、ASCII码到二进制数的相互转换二进制与ASCII码的相互关系为:数字0~9对应的ASCII码为30H~39H,即加30H字母A~F对应的ASCII码为41H~46H,即加37H(1)ASCII到二进制的转换通过以上介绍的二者之间的关系,不难画出流程图:二、数据的转换在计算机内部,任何数据都是以二开始取操作数清进位标志减30H差>9?转换正确结束减07HY转换正确NASCTOHEX: MOV A,R2 CLR C SUBB A,#30H MOV R2,ACJNEA,#0AH,NEXTNEXT:JC TOK SUBB A,#07H MOV R2,ATOK:
RET例4-4-3转换前R2为ASCII码,转换后R2为二进制开始取操作数清进位标志减30H差>9?转换正确结束减07HY(2)二进制到ASCII码当二进制数<0AH时,加30H即得相应的ASCII,当二进制数介于0AH、0FH之间(包括0AH、0FH),则加37H即得到相应的ASCII。(2)二进制到ASCII码当二进制数<0AH时,加30H即得2、BCD码与二进制的相互转换(1)BCD到二进制的转换3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5由压缩BCD码到非压缩BCD码的转换较为简单,在前面我们已经涉及,在此不再重复。例:如下图所示15H36H41H40H压缩BCD码3H6H1H5H43H42H41H40H非压缩BCD码1FH0EHR3R2二进制数2、BCD码与二进制的相互转换(1)BCD到二进制的转换36高位BCD码的地址->(R0)计数初值3->(R7)初值送结果单元0->(R3)((R0))->(R2)(R3R2)*10->(R3R2)(R0)-1->(R0)(R3R2)+((R0))+(Cy)->(R3R2)(R7)-1=0?结束YN3615=3*103+6*102+1*10+5=[(3*10+6)*10+1]*10+5R3R23H6H1H5H43H42H41H40HR0高位BCD码的地址->(R0)计数初值3->(R7)初值送
MOV R0,#43H ;指向高位 MOV R3,#00H ;结果单元清零 MOV A,@R0 MOV R2,A ;转换初值送R2ML10: MOV A,R2 MOV B,#0AH MUL AB ;R2乘10 MOV R2,A ;暂存R2*10低位 MOV A,B XCH A,R3 ;暂存R2*10高位 MOV B,#0AH MUL AB ;R3*10 ADD A,R3 ;R3*10低位加 MOV R3,A ;为什么不处理BBCDHEX: MOV R7,#03H ;计数初值 MOV R0,#43H ;指向高位BCDHEX: MOV
MOV A,@R0 ADD A,R2 ;结果与低单元相加 MOV R2,A MOV A,R3 ADDC A,#00H ;加低位进位位 MOV R3,A ;保存结果 DJNZ R7,ML10 RET
由于二位压缩BCD码的表示范围为0~9999,其对应二进制为0~270H,不会超过两个字节,因而不必考虑R3*10的高位。JAFA: DEC R0 ;指向下一位 MOV A,@R0由于二位压缩BCD码的例:如下图所示(2)二进制到BCD的转换15H36HR3R2二进制数3H8H4H5H43H42H41H40H非压缩BCD码1H44H
如上图所示,双字节二进制数的表示范围为0~65535,因而需要5个BCD码位来表示。从二进制到BCD码,我们采用连减的办法,其原理如下:待转换的二进制数-104够减,万位加1,再减不够减,恢复余数,再减103以此类推,直到得到个位为止。例:如下图所示(2)二进制到BCD的转换15H36HR3104=2710H 103=03E8H 102=0064H 10=0AHBBCD:MOV R0,#44H ;数据指针 MOV R7,#04H ;计数初值 MOV DPTR,#PWTAB MOV R6,#00H ;偏移量BBC1: MOV A,R6 MOVCA,@A+DPTR MOV R4,A ;查幂值表低位 INC R6 MOV A,R6 MOVCA,@A+DPTR MOV R5,A ;查幂值高位 INC R6 MOV @R0,#00H104=2710H 103=03E8H 102=0064H
MOV A,R2 SUBB A,R4 ;减低位 MOV R2,A MOV A,R3 SUBB A,R5 ;减高位 MOV R3,A JC BBC3 ;不够减则恢复余数 INC @R0 ;够减则结果单元加1 SJMP BBC2BBC3: MOV A,R2 ADD A,R4 ;恢复余数低位 MOV R2,A MOV A,R3 ADDC A,R5 ;恢复余数高位 MOV R3,ABBC2: CLR C MOV A,R2BBC2: CLR C
DJNZ R7,BBC1 ;未减完则继续 MOV A,R2 MOV @R0,A ;保存个位 RETPWTAB:DB 10H,27H ;10000 DB 0E8H,03H ;1000 DB 64H,00H ;100 DB 0AH,00H ;10
DEC R0 ;指向下一单元 DJNZ R7,BBC1 ;未减完则继续 DEC R0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度个人借款合同风险评估与预警4篇
- 二零二五年度存量房买卖居间合同书(附房屋产权瑕疵声明)4篇
- 二零二五版木材加工企业节能减排合同4篇
- 二零二五年度文化旅游项目承包经营权合同集4篇
- 2025年度出差人员差旅费用结算及管理合同4篇
- 2025年度大棚农业休闲观光项目开发合同3篇
- 2025年度盘扣式脚手架租赁与维护保养合同范本4篇
- 2025年度个人房屋抵押贷款合同终止通知协议2篇
- 2025年度办公楼消防系统升级合同11293篇
- 2025年度智能门禁系统门面租赁合同汇编4篇
- 2024年山东省泰安市高考物理一模试卷(含详细答案解析)
- 护理指南手术器械台摆放
- 肿瘤患者管理
- 2025年中国航空部附件维修行业市场竞争格局、行业政策及需求规模预测报告
- 2025春夏运动户外行业趋势白皮书
- 《法制宣传之盗窃罪》课件
- 通信工程单位劳动合同
- 2024年医疗器械经营质量管理规范培训课件
- 零部件测绘与 CAD成图技术(中职组)冲压机任务书
- 2024年计算机二级WPS考试题库380题(含答案)
- 高低压配电柜产品营销计划书
评论
0/150
提交评论