版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第章汇编语言程序设计,本章内容,Single Chip Microcomputer,4-0概述,4-2 运算程序设计,4-3 数据的拆拼和转换,4-1 循环程序设计,4-5 查表程序,4-6 散转程序设计,4-7 I/O端口控制程序,4-8 子程序调用时的参数传递,概 述,最早人们只能用机器语言(二进制)编写程序; 为了方便记忆,人们开始用助记符形式的汇编语言编写程序,称为低级语言。然后再用汇编系统将其翻译成机器语言,该过程称为汇编; 为了用更接近人的语言编写程序,程序设计师们发明了高级语言,如: BASIC、FORTRAN、PASCAL、 然后再用编译系统将其翻译成机器语言,该过程称为编译;
2、 机器只能识别机器语言。所以必须用编译系统将高级语言编写的源程序编译成机器语言,用汇编系统将用汇编语言编写的源程序汇编成机器语言; 由低级或高级语言构成的程序称为源程序,由机器语言构成的程序称作目标程序;,一、设计语言,源程序 目标程序,低级语言,机器语言,汇编,高级语言,机器语言,编译,二、程序设计方法,一、程序设计,利用计算机能够接受的语言把解决问题的方法和步骤描述出来,也就是编制计算机的程序,人们常说的软件设计。对于单片机应用程序,我们可以把它看成是操作系统和应用软件的集合。,二、程序设计步骤,用汇编语言编写一个程序的过程大致可分为以下几个步骤:,1、分析问题,明确所要解决问题的具体要求
3、。,2、确定算法。根据实际问题的要求和指令系统的特点,决定所要采用的计算公式和计算方法,这就是常说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的质量。,3、制定程序框图。根据算法,制定出运算步骤的顺序,再把运算过程画成流程图。,4、确定数据格式,分配工作单元,将程序框图进一步细化。,5、根据流程图和指令系统,编写出汇编语言源程序。,6、程序测试。由于单片机没有自开发功能,因而必须借助仿真器,以单步、断点、连续方式调试程序,直到完全正确为止。特别地,对于有硬件的应用系统,必须将软件和硬件结合起来调试,直到软件、硬件能协调一致,浑然一体为止。,7、程序优化。这一环节很容易被广大设计
4、人员所忽略。它是指从程序结构上对程序加以调整,精减一些冗余指令,以加快程序的执行速度,节省程序存储空间,从而提高系统的可靠性。,4-1 循环程序设计,一、循环程序结构,开 始,N,结 束,Y,在单片机应用程序设计中,循环程序的使用非常广泛。单循环的结构如下图所示:,其主体为循环体,由循环工作部分和修改控制变量构成。 同其他语言一样,循环程序可以实现嵌套,构成多重循环。但切不可形成交叉。只能将整个循环程序作为外循环的循环体。,二、循环程序设计举例,例1、延时程序设计,DELAY:MOVR7,#200;1个机器周期 DE1:MOVR6,#123;1 NOP;1 DE2:DJNZR6,DE2;2 D
5、JNZR7,DE1;2 RET;2,如晶体振荡器频率为12MHz,则其延时时间为: 1+(1+1+2*123+2)*200+2=50.003ms (机器周期1s) 这是一个50ms的精确延时程序。,DELAY.ASM,在RAM中,从50H开始连续存放N个单字节无符号数,N存放在R2中,试编程求这N个数的和,结果放在R4R3中。程序清单如下: NSUM:MOVR0,#50H MOVR3,#00H;清零 MOVR4,#00H LOOP:MOVA,R3 ADDA,R0 MOVR3,A CLRA ADDC A,R4 MOVR4,A INCR0 DJNZR2,LOOP RET,例2、数据求和,4-2 运
6、算程序设计,一、多字节加法,例4-3-1 设有两个4字节的二进制数2F5BA7C3H和14DF35B8H,分别放在以40H和50H为起始地址的单元中(低位在低地址),试编程求这个数之和,结果放在以40H为起始地址的单元中。,ORG0000H LJMPJAFA ORG0100H JAFA:MOV R0,#40H MOVR1,#50H MOVR2,#04H LCALL JASUB LJMP$ 以上为主程序,JASUB: CLRC JASUB1:MOVA,R0 ADDCA,R1 MOVR0,A INCR0 INCR1 DJNZ R2,JASUB1 RET END,ADDCA,Rn ADDCA,dir
7、ect ADDCA, Ri ADDCA,#data,本程序适合于N个字节的两数求和,但并不严密,当最后一次加法有进位时并没有相应处理,实际应用时应根据实际情况稍作修改。,例2:有两组BCD码分别存放在23H、22H单元和33H、32H单元,求它们的和并送入43H、42H单元中去。(高位在前,低位在后),分析:,0011,1000,0110,0101,0001,0001,1000,0111,BCD码83H,BCD码11H,多字节BCD码加法,例2:有两 组BCD码(如:1183H和5678H),分别存放在23H、22H单元和33H、32H单元,求它们的和,并送入43H、42H单元中去。(高位在前
8、,低位在后) 解:,流程图(框图)如何? 请同学们自己绘制流程图。,ORG 0000H MOV A,22H ADD A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A SJMP $ END,此条加法指令可否改用带进位的(ADDC)?,ORG 2000H CLR C MOV A,22H ADDC A,32H DA A MOV 42H,A MOV A,23H ADDC A,33H DA A MOV 43H,A END,1000 0011,0101 0110,0001 0001,0111 1000,1000 0011,0111 1000,
9、1111 1011,0110 0001,0001 0001,0101 0110,0110 0111,0110 1000,PC,PC,PC,PC,PC,PC,PC,PC,PC,1111 1011,0110 0001,PC,0110 1000,PC,0110 0111,多字节BCD码加法(P53),与多字节加法程序类似,但需在加法指令后加一条十进制加法调整指令。主程序与前面相同。,DADD:CLRC JAD1:MOVA,R0 ADDCA,R1 DAA MOVR0,A INCR0 INCR1 DJNZR2,JAD1 RET,ORG0000H LJMPJABCD ORG0100H JABCD: MOV
10、R0,#40H MOVR1,#50H MOVR2,#04H LCALL DADD LJMP$ 以上为主程序,BCDADD.ASM,二、多字节减法,多字节减法程序和多字节加法程序类似,只需将加法指令换为减法指令即可。 例: 在43H40H依次存放被减数443ADD7BH;在53H50H中依次存放减数14DF35B8H,试编程求二者之差,ORG0000H LJMPJIAN ORG0100H JIAN:MOVR0,#40H MOVR1,#50H MOVR2,#04H LCALL JIANSUB LJMP$ 以上为主程序,JIANSUB: CLRC JIAN1: MOVA,R0 SUBBA,R1 MO
11、VR0,A INCR0 INCR1 DJNZ R2,JIAN1 RET END 此程序也可以推广到N个字节的情况。,四、多字节数乘法,MCS-51系列单片机指令系统仅能提供8位乘法指令若需进行8位以上的乘法运算,则需通过编程实现。 设(R4)(R3)中为十六位被乘数,R2中为8位乘数,其积存放在R7R6R5中。 由于(R4)(R3)*(R2)=(R4)*256+(R3)*(R2) =(R4)*(R2)*256+(R3)*R2,(R4)*(R2)*256,(R3)*(R2),CHENFA:MOVA,R2 MOVB,R3 MULAB;(R3)*(R2) MOVR5,A MOVR6,B MOVA,R
12、2 MOVB,R4 MULAB;(R2)*(R4) ADDA,R6 MOVR6,A MOVA,B ADDCA,#00H;加进位位 MOVR7,A RET,五、多字节除法,51指令系统提供一条8位的除法指令,但要想用于多位除法运算则较为困难。因此,在进行多字节除法运算时,多采用手工算法相同的思路。,4-3 数据的拆拼和转换,在实际应用中,经常会遇到实际需要的数据格式同得到的数据格式不完全相符的情况,如采集到的数据、运算的结果、输出的数据等,这就需要对其进行适当的转换,以符合实际情况的要求。这就是通常所说的数据拆拼和转换。,一、数据的拆拼,BBCD:MOVA,7CH ANLA,#0FH MOVR5
13、,A MOVA,7CH,ANLA,#0F0H SWAPA MOVR6,A RET,程序清单:,例4-4-2 拆拼前 (20H)=X7X6X5X4X3X2X1X0 拆拼后 (21H)= X0X1X2X3X4X5X6X7,DESORT: MOV A,20H MOVR6,A MOVR7,#08H RESO: CLRC MOVA,R6 RLCA MOVR6,A MOVA,21H RRCA MOV21H,A DJNZR7,RESO RET,补充内容,例1:将20H单元的两个压缩BCD码拆开变成ASCII码,存入21H、22H单元。(假设20H中的BCD码为00110100),什么是BCD码? 什么是AS
14、CII码?BCD码与ASCII码关系,0011,压缩BCD码,0011,0011,0100,低四位ASII码,高四位ASII码,压缩BCD码拆开变成ASCII码,二进制与ASCII码的相互关系为: 数字09对应的ASCII码为30H39H,即加30H 字母AF对应的ASCII码为41H46H,即加37H,方法1:将BCD码除以10H,恰好是将BCD码分别移到了A、B的低4位。然后再各自与30H相或,即成为ASCII码。,方法2:利用半字节交换指令来实现。,ORG 0000H MOV A,20H MOV B,#10H DIV AB ORL B,#30H MOV 22H,B ORL A,#30H
15、MOV 21H,A SJMP $,简单程序例1-方法1,源程序如下:,0011,0100,PC,PC,PC,0011 0100,0001 0000,PC,0011,0000,0000 0100,PC,0011 0100,PC,PC,PC,0011,PC,ORG 0000H MOV R0,#20H MOV A,#30H XCHD A,R0 MOV 22H,A MOV A,R0 SWAP A ORL A , #30H MOV 21H, A SJMP $,简单程序例1-方法2,PC,PC,PC,PC,PC,PC,PC,PC,PC,源程序如下:,0011,0010 0000,0011,0100,000
16、0,0100,0011,0100,0011,0000,0011,0000,0011,PC,0011,二、数据的转换,在计算机内部,任何数据都是以二进制的形式存储,但是,当我们在作I/O操作时,往往需要其它形式的数据格式,如ASCII码、BCD码、八进制数等,这就需要做一些数据格式的互换操作。,1、ASCII码到二进制数的相互转换,二进制与ASCII码的相互关系为: 数字09对应的ASCII码为30H39H,即加30H 字母AF对应的ASCII码为41H46H,即加37H,(1)ASCII到二进制的转换 通过以上介绍的二者之间的关系,不难画出流程图:,ASCTOHEX: MOVA,R2 CLRC
17、 SUBBA,#30H MOVR2,A CJNE A,#0AH,NEXT NEXT: JCTOK SUBBA,#07H MOVR2,A TOK: RET,例4-4-3 转换前 R2为ASCII码,转换后 R2为二进制,(2)二进制到ASCII码,当二进制数0AH时,加30H即得相应的ASCII,当二进制数介于0AH、0FH之间(包括0AH、0FH),则加37H即得到相应的ASCII。,2、BCD码与二进制的相互转换,(1)BCD到二进制的转换,3615=3*103+6*102+1*10+5 =(3*10+6)*10+1*10+5,由压缩BCD码到非压缩BCD码的转换较为简单,在前面我们已经涉及
18、,在此不再重复。,例: 如下图所示,非压缩BCD码,1FH,0EH,R3,R2,二进制数,3615=3*103+6*102+1*10+5 =(3*10+6)*10+1*10+5,R3R2,R0,MOVR0,#43H;指向高位 MOVR3,#00H;结果单元清零 MOVA,R0 MOVR2,A;转换初值送R2 ML10:MOVA,R2 MOVB,#0AH MULAB;R2乘10 MOVR2,A;暂存R2*10低位 MOVA,B XCHA,R3 ;暂存R2*10高位 MOVB,#0AH MULAB;R3*10 ADDA,R3;R3*10低位加 MOVR3,A;为什么不处理B,BCDHEX:MOVR
19、7,#03H;计数初值,MOVA,R0 ADDA,R2;结果与低单元相加 MOVR2,A MOVA,R3 ADDCA,#00H;加低位进位位 MOVR3,A;保存结果 DJNZR7,ML10 RET,由于二位压缩BCD码的表示范围为09999,其对应二进制为0270H,不会超过两个字节,因而不必考虑R3*10的高位。,JAFA:DECR0;指向下一位,例: 如下图所示,(2) 二进制到BCD的转换,如上图所示,双字节二进制数的表示范围为065535,因而需要5个BCD码位来表示。从二进制到BCD码,我们采用连减的办法,其原理如下:,待转换的二进制数-104,不够减,恢复余数,再减103,以此类
20、推,直到得到个位为止。,104=2710H103=03E8H 102=0064H10 =0AH,BBCD:MOVR0,#44H;数据指针 MOVR7,#04H;计数初值 MOVDPTR,#PWTAB MOVR6,#00H;偏移量 BBC1:MOVA,R6 MOVC A,A+DPTR MOVR4,A;查幂值表低位 INCR6 MOVA,R6 MOVC A,A+DPTR MOVR5,A;查幂值高位 INCR6 MOVR0,#00H,MOVA,R2 SUBBA,R4;减低位 MOVR2,A MOVA,R3 SUBBA,R5;减高位 MOVR3,A JCBBC3;不够减则恢复余数 INCR0;够减则结
21、果单元加1 SJMPBBC2 BBC3:MOVA,R2 ADDA,R4;恢复余数低位 MOVR2,A MOVA,R3 ADDCA,R5;恢复余数高位 MOVR3,A,BBC2:CLRC,DJNZR7,BBC1;未减完则继续 MOVA,R2 MOVR0,A;保存个位 RET PWTAB:DB10H,27H;10000 DB0E8H,03H;1000 DB64H,00H;100 DB0AH,00H;10,DECR0;指向下一单元,4-5 查表程序,查表程序中一种常用的非数值运算程序,应用非常广泛。使用查表程序可以完成数据的补偿、计算、转换等各种功能,具有程序简单、执行速度快、精度高等优点,而这正是
22、单片机在测控场合或智能化仪表中所需要的。,一、以DPTR为基地址的查表程序,MOVCA,A+DPTR 1、其操作步骤如下: 初始化DPTR: 将表格的首地址放入DPTR中,作为基地址。 初始化ACC: A中应该放所要查询的数据在表格中的顺序号。 执行结果: 在执行该指令后,A中存放的是在表格中查到的数据。,注意事项,在查询表格时,若所要查询的数据是双字节的,则在初始化A中的数应为顺序号的2倍,且应执行两次本指令。 对于单字节表格而言,表项的个数应不大于256个,若大于256时,则应适当修改DPTR的值。 表格的存放位置。,二、以PC为基地址的查表指令,MOVCA,A+PC 表格存放地址=PC+
23、偏移量+X(表项),1、操作步骤,(1) 将待查表的项数送给ACC。 (2) 叠加偏移量,表头和当前PC的地址偏移量加到表项上。 (3) 执行结果。,2、注意事项,(1) 对于双字节表格,其处理方法与以DPTR为基地址的情况相同。 (2) 对于单字节表格而言,其项数应不大于256。 (3) 对于双字节表格而言,其项数应不大于128。,三、两种方式的比较,1、PC仅能对所谓本地表格操作,即表格项数不得大于256,且偏移量可能随程序的变化而变化,计算较为麻烦,其优点是少用寄存器。 2、DPTR使用起来非常灵活,表项数不受限制,且表格可以放在64K的任意地方。,例:,在一个温度测量装置中,测出的电压
24、与温度为非线性关系。设测得的电压为X,用10位二进制数表示。现要求采用查表法实现线性化处理。,分 析,10位二进制位的表示范围为01023,因而有1024个电压值,从而可以建立一个表格,其项数为1024个。 存放温度值Y的单元地址=表首地址+(X*2) 设测得的电压值已存放在20H,21H中,(20H为高字节),查表后的温度值存放在22H,23H中,(22H为高字节)。,例: 程序清单,LTB2:MOVDPTR,#TAB2 MOVA,21H; (20H21H)*2 CLRC RLCA ;低八位*2 MOV21H,A; MOVA,20H;表首+ (20H21H)*2 RLCA ;高八位*2+CY
25、 MOV20H,A MOVA,21H ADDA,DPL MOVDPL,A MOVA,20H ADDCA,DPH;为什么带进位加 MOVDPH,A;完成地址计算,测得的电压值存放(20H21H)中(20H为高字节),查表后的温度值存放在(22H23H)中(22H为高字节),例: 程序清单(续),CLR A;查表 为什么清A? MOVCA,A+DPTR MOV22H,A INCDPTR CLRA MOVCA,A+DPTR MOV23H,A RET TAB2:DW.;温度表值 DW.,4-6 散转程序设计,在程序设计中,不外有三种情况:顺序、循环和条件分支程序。其中顺序程序设计最为简单,而循环程序设
26、计在前面已经学习过。分支程序(如下图所示)又可分为两大类:字节条件和位条件,即CJNE和JC、JB、JZ类指令。位条件转移指令很容易实现简单条件转移,当要实现多分支转移时,可以通过CJNE来实现,这就是所谓散转程序设计,但实现起来则较为麻烦。,例:,测试P1口输入的100个数中09各数的概率分布程序,MOV 40H,#100 MOV P1, #0FFH;准备输入 READ:MOV A,P1 CHK0: CJNE A,#0,CHK1 INC 30H DJNZ 40H,READ SJMP EEND CHK1: CJNE A,#1,CHK2 INC 31H DJNZ 40H,READ SJMP EE
27、ND CHK2: CJNE A,#2,CHK3 INC 32H DJNZ 40H,READ SJMP EEND,CHK3: CJNE A,#3,CHK4 INC 33H DJNZ 40H,READ SJMP EEND CHK4: CJNE A,#4,CHK5 INC 34H DJNZ 40H,READ SJMP EEND CHK5: CJNE A,#5,CHK6 INC 35H DJNZ 40H,READ SJMP EEND,程序清单,CHK6: CJNE A,#6,CHK7 INC 36H DJNZ 40H,READ SJMP EEND CHK7: CJNE A,#7,CHK8 INC 37
28、H DJNZ 40H,READ SJMP EEND CHK8: CJNE A,#8,CHK9 INC 38H DJNZ 40H,READ SJMP EEND,CHK9: INC 39H DJNZ 40H,READ EEND: SJMP $,利用条件转移类指令来实现分支,程序较为简单,容易实现,但应特别注意的是:在分析问题时,一定要逻辑严密,充分判断出各种可能出现的条件标志。,二、利用转移指令来实现的程序散转,JMPA+DPTR 其执行过程可以分为三步: (1)将转移表首地址送入DPTR作为基地址。 (2) 将条件标志单元内容装入A中作为变址,在装入前,还应根据转移表项内容作相应变化。 (3)实
29、现转移。 我们可以根据转移表的不同来分为三种散转程序:,1、采用转移指令表的散转程序设计,这类散转程序的核心部分转移表部分由无条件转移指令AJMP或LJMP构成。 其转移范围分别为64K或2KBytes。,例: 要求根据R7的内容转向各个操作程序。,即(R7)=0,转向OPR0 即(R7)=1,转向OPR1 即(R7)=2,转向OPR2 即(R7)=n,转向OPRn,程序清单,JUMP1:MOVDPTR,#JPTAB1 MOVA,R7 ADDA,R7;(R7)*2(A) JNCNOAD;判断是否有进位 INCDPH;有加到高字节地址 NOAD:JMPA+DPTR JPTAB1:AJMPOPR0
30、 AJMPOPR1 . AJMPOPRn,注意事项,(1)在本例中,由于AJMP指令的指令长度为2个字节,因而在散转时采用自加的方法使变址实现乘2;若改用LJMP指令,由于其指令长度为3字节,因而应使变址乘3来修下正。当修正产生进位时,要将进位加到DPH中。 (2) 由于R7是单字节,因而散转点不能大于256个。为了克服此局限性,我们考虑:通过修改DPTR的办法来增加散转点,使这最大散转点N可达到N=(最大存储容量散转表首地址)/3。,例: 要求根据R6R7中的数据转向对应的操作程序,JUMP2:MOVDPTR,#JPTAB2 MOVA,R6 MOVB,#03H;(R6)*3(BA) MULA
31、B ADDA,DPH MOVDPH,A,例续,MOVA,R7 MOVB,#03H MULAB XCHA,B ADDA,DPH MOVDPH,A; XCHA,B;恢复低位 JMPA+DPTR JPTAB2:LJMPOPR0 LJMPOPR1 . LJMPOPRn,2、采用转向地址偏移量表散转程序,本方法的关键在于建立一个转向地址偏移量表,需要程序员认真计算,否则会产生错误。,例: 要求按R7的内容转向5个操作程序。,JUMP3:MOVA,R7 MOVDPTR,#TAB3 MOVC A,A+DPTR JMPA+DPTR TAB3:DBOPR0-TAB3 DBOPR1-TAB3 . DBOPR4-TAB3 OPR0: OPR1: OPR2: ,本例的散转范围小于256,同上例一样,本例也可通过变通的方法,使这能在64K范围内实现散转。,4-7 I/O端口控制程序,通过前面的学习,我们知道单片机有32个I/O口可供编程者使用。由于结构上的原因,I/O口作为输出时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- AI在马克思主义中国化研究中的应用
- 2025年辽宁鞍山(国家)高新技术产业开发区招聘急需紧缺国有企业3人笔试历年参考题库附带答案详解
- 2025年贵州毕节市织金县人力资源开发服务有限公司公开招聘工作人员13人笔试历年参考题库附带答案详解
- 2025年航天科工二院春季校园招聘来袭笔试历年参考题库附带答案详解
- 2025年玉屏永昇国有资产投资管理有限公司公开招聘工作人员笔试历年参考题库附带答案详解
- 2025年湖北三宁化工股份有限公司招聘150人笔试历年参考题库附带答案详解
- 2025年泰和城投控股集团有限公司及下属子公司面向社会公开招聘20人笔试历年参考题库附带答案详解
- 2025年武汉地铁集团招聘工作人员若干人笔试历年参考题库附带答案详解
- 2025年恩施市福牛物业有限公司公开招聘湖北硒恩城市建设集团有限公司劳务派遣人员18名笔试历年参考题库附带答案详解
- 2025年度河南能源集团校园招聘1102名工作人员笔试历年参考题库附带答案详解
- 临床大面积下肢皮肤脱套伤伴全身多处骨折合并失血性休克患者护理
- 跨越电力线路施工规范详细解析
- 保险消保工作汇报
- 中国农业大学《电子电路基础》2023-2024学年第一学期期末试卷
- 医院科研诚信培训课件
- DB5107∕T 059-2018 莴笋周年绿色高效生产技术规范
- 企事业单位住房指标转让合同范本
- DB11-T 1014-2021 液氨使用与储存安全技术规范
- 知识点2、化学式和化合价-2022年浙江省中考科学一轮复习化学部分
- T 3034-2022化工过程安全管理导则知识培训
- DB13-T 5871-2023 矿山地质环境恢复治理工程资料管理规程
评论
0/150
提交评论