资源描述
,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单片机汇编语言程序设计,7.1,汇编语言基础,7.2,程序设计步骤,7.3,直线程序举例,7.4,分支程序举例,7.5,循环程序举例,7.6,子程序举例,7.1,汇编语言基础,汇编语言程序:,用汇编语言编写的、,完成特定功能的指令序列。,汇编程序:,能将汇编语言,源程序,转换成机器语言,目标,程序的系统软件。,汇编语言程序到机器语言程序的转换过程称为汇编。,1.,手工汇编,:人工查指令表汇编。用于设计短小程序或调试程序的场合。,2,.,机器汇编,:用汇编程序进行汇编。,(源)汇编程序,机器(码),程序,1)确定程序中每条汇编语言指令的指令机器码。,2)确定每条指令在存储器中的存放地址。,3)提供语法错误信息。,4)提供目标执行文件(*.,OBJ/*.HEX),和列表文件(*.,LST)。,汇编语言指令类型,1.,机器指令,:,指令系统中的全部指令,每条指令有对应的机器代码。,2,.,伪指令,:,汇编控制指令,仅提供汇编信息,没有指令代码。,3,.,宏指令,:,宏汇编功能:将需要多次反复执行的程序段定义成一个宏指令名(宏定义),编程时,可在程序中使用宏指令名来替代一段程序(宏调用)。,汇编控制指令(伪指令),常用伪指令及其功能:,1.,ORG,起始地址指令:指明程序和数据块起始地址。,指令地址 机器码源程序,ORG 2000H,2000H 78 30 MAIN:MOV R0,#30H,2002H E6 MOV A,R0,ORG 3000H,3000H 23 DB 23H,100,A,3001H 64,3002H 41,2.,DB,定义字节型常数指令。,例,:,VAR DB 12H,4.,EQU,等值。为标号或标识符赋值。,X1 EQU 2000HX2 EQU 0FH MAIN:MOV DPTR,#X1 ADD A,#X2,5.,END,结束汇编指令。,例:,START:,END START,3.,DW,定义字型常数指令。,例:,DW 1234H,5678H,7.2,汇编语言程序设计步骤,建立系统数学模型,确定制算法和操作步骤;,画程序流程图,表示程序结构和程序功能;,开始,1,Y,N,?,1.列出单片机定时器,串口,中断等资源的工作方式;,2.,列出外扩的各种总线设备的地址,以及各,I/O,口的用途。,3.合理分配存储器单元;,4.按功能设计主程序、子程序和中断服务程序,明确各程序之间的相互关系。,5.编程时用注释行说明程序,便于阅读和调试修改。,编写源程序,程序调试与优化。,7.3 常用程序结构,直线程序,直线程序又称简单程序,程序走向只有一条路径。,例:,双字节变补程序(设数据在,R5R4,中):,MOV A,R4;,取低字节,CP A,ADD A,#1;,低字节变补,MOV R4,A,MOV A,R5;,取高字节,CPL A,ADDC A,#0;,高字节变补,MOV R5,A,7.4,分支程序,由条件转移指令构成程序判断框部分,形成程序分支结构。,7.4.1单分支程序:,一个判断决策框,程序有两条出路。两种分支结构:,条件满足?,N,影响条件,Y,处理段,条件满足?,N,影响条件,Y,处理1,处理2,例:,求,R2,中补码的绝对值,(正数不变,负数取补),MOV A,R2,J1,:JNB ACC.7,NEXT;,为正数?,CPL A ;,负数变补,INC A,CJ1,:CJNE A,#80H,NORM,LJMP ERROR;-128,无法取绝对值,NORM:MOV R2,A,NEXT:SJMP NEXT ;,结束,ERROR:;,错误处理,行李计价:,当,G(40H)5,M(41H)=G3;,当,G(40H)5,M(41H)=G3+(G-5)2,FRT:MOV A,40H;,取行李重量计价单位,G,MOV B,#03H;M=G3,MUL AB,MOV R2,A;,暂存3,G,MOV A,40H;,取,G,JC:,CJNE A,#05H,L1;G5?,S:,SJMP WETC,L1:JC WETC;,是,转至,WETC,SUBB A,#05H;,否则,M=3G+2(G-5),RLC A,ADD A,R2,MOV R2,A,WETC:MOV 41H,R2;,存结果,M,RET,7.4.2 多重分支程序,一多次使用条件转移指令,,形成两个以上判断框。,例:,求符号函数,Y=SGN(X),+1,当,X0,SGN(X)=0,当,X=0,-1,当,X0,X0?,Y,取X,N,Y=0,Y=+1,开始,Y=1,X0?,N,Y,保存,Y,结束,图4-4-4求符号函数流程图,SYMB:MOV A,40H,;,取,X,J1:,JZ STOR,;X=0,Y=X,J2:,JB ACC7,MINUS,;X0,MOV A,#1,;X0,Y=+1,SJMP STOR,MINUS:MOV A,#0FFH,;X0,Y=-1,STOR:MOV 41H,A,;,保存,Y,RET,二按分支号转移,如:分支号=0,程序转移到,ADDR0,处;当分支号=1,程序转移到,ADDR1,处;。,(1)用地址表法。设分支号已存入,A。,MTJS:MOV DPTR,#TAB,;,取表首地址,CLR C,;,分支号2,RLC A,MOV R2,A,MOVC A,A+DPTR,;,取分支地址低位,PUSH ACC,;,入栈保存,MOV A,R2,INC A,MOVC A,A+DPTR,;,取分支地址高位,PUSH ACC,;,入栈保存,RET,;,分支地址,PC,,转移,TAB:DW ADDR0,;,分支地址表,DW ADDR1,ADDR0:,;,程序段0 ,A=?,0,处理一,处理二,处理,1,n,(2)转移表法。,用分支转移指令,JMP A+DPTR。,KEY:MOV DPTR,#KTAB,ADD A,A,JMP A+DPTR,KTAB:AJMP FUNC0,AJMP FUNC1,AJMP FUNC2,FUNC0:,FUNC1:,FUNC2:,处理转移变量,要求根据转移变量的值执行不同的程序段。设转移变量,X(0X0FH)。,设,X,已存入片内,A,中。,若,X=0,,则执行程序段,FUNC0,若,X=1,,则执行程序段,FUNC1,。,A=?,0,处理一,处理二,处理,1,n,7.5,循环程序,包含多次重复执行的程序段,循环结构使程序紧凑。,7.5.1循环程序的构成,各个环节任务:,一循环初始化部分,循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。,二循环体,循环工作部分:,需多次重复处理的工作。,循环控制部分:,1.修改指针和循环控制变量。,2.检测循环条件:满足循环条件,继续循环,否则退出循环。,三.结束部分,处理和保存循环结果。,允许0次循环的循环结构:在循环工作之前检测循环条件。,循环控制?,循环工作,循环结束,循环初始化,Y,N,7.5.2 单重循环,简单循环结构:循环体中不套循环。,例:求,n,个单字节数据的累加,设数据串已在43,H,起始单元,数据串长度在42,H,单元,累加和不超过2个字节。,SUM:MOV R0,#42H,;,设指针,MOVA,R0,MOVR2,42H,;,循环计数器,n,CLRA,;,结果单元清0,MOVR3,A,ADD1:INCR0,;,修改指针,ADDA,R0,;,累加,JNC NEXT,;,处理进位,INCR3,;,有进位,高字节加1,NEXT:DJNZ R2,ADD1,;,循环控制:数据是否加完,?,MOV40H,A,;,循环结束,保存结果,MOV41H,R3,RET,循环控制方法:计数控制、特征标志控制。,一.计数控制:,设循环计数器,控制循环次数。正计数和倒计数两种方式。,例:,为一串7位,ASCII,码数据的,D,7,位加上奇校验,设数据存放在片外,RAM,的2101,H,起始单元,数据长度在2100,H,单元。,MOV DPTR,#2100H,MOVX A,DPTR,MOV R2,A,NEXT:INC DPTR,MOVX A,DPTR,ORL A,#80H,JNB P,PASS,MOVX DPTR,A,PASS:DJNZ R2,NEXT,DONE:SJMP DONE,二.特征控制:设定循环结束标志实现循环控制。,例,:找正数表最小值。正数表存在片外,RAM,中以,LIST,为起始单元,用-1作为结束标志。,START:MOVDPTR,#LIST,;,数表首地址,MOVB,#127,;,预置最小值,NEXT:MOVX A,DPTR,;,取数,INCDPTR,;,修改指针,CJNE A,#-1,NEXT1,;,是否为数表结尾?,SJMP DONE,;,循环结束,NEXT1:CJNE A,B,NEXT2,;,比较,NEXT2:JNCNEXT,MOVB,A,;,保存较小值,SJMP NEXT,DONE:SJMP DONE,7.5.3,多重循环,循环体中套循环结构。以双重循环使用较多。,例:,将内存中一串单字节无符号数按地址升序排序。,实现:,每次取相邻的两个数比较,决定是否需要交换数据位置。,第一次循环,比较,N-1,次,取到数据表中最大值。,第二次循环,比较,N-2,次,取到次大值。,第,N-1,次循环:比较一次,排序结束。,内循环控制?,循环工作,循环结束,外循环控制?,内循环初始化,开始,外循环初始化,SORT:MOV A,#N-1,;N,个数据排序,MOV R4,A,;,外循环次数,LOOP1:MOV A,R4,MOV R3,A,;,内循环次数,MOV R0,#TAB,;,设数据指针,LOOP2:MOV A,R0,;,取二数,MOV B,A,INC R0,MOV A,R0,CJNE A,B,L1,;,比较,L1:JNC UNEX,;AB,,不交换,DEC R0,;,否则交换数据,XCH A,R0,INC R0,MOV R0,A,UNEX:DJNZ R3,LOOP2,;,内循环结束?,DJNZ R4,LOOP1,;,外循环结束?,RET,R3R31=0?,B(R0),A (R0+1),循环结束,外循环次数,R4,R4R41=0?,内循环次数,R3,表首,TABR0,开始,A B?,(R0)(R0+1),R0 R0+1,Y,N,软件延时程序,用循环程序将指令重复多次执行,实现软件延时。,试计算延时程序的执行时间。,源程序指令周期(,M),指令执行次数,DELAY:MOV R6,#64H1,I1:MOV R7,#0FFH1,I2:DJNZ R7,I22,DJNZ R6,I12,RET2,延时时间计算:(设时钟,f=12MHz),t=(11+1100+2100255+2100+21)M=51.303 ms,1,100,100,255,100,1,7.6 子程序,子程序:能完成某项特定功能的独立程序段,可被反复调用。,7.6.1 子程序设计,子程序入口用标号作为子程序名;,调用子程序之前设置好堆栈;,用返回指令,RET,结束子程序,并保证堆栈栈顶为调用程序的返回地址;,子程序嵌套须考虑堆栈容量;,注意子程序数据存储器的使用不要与主程序以及其它子程序冲突;,提供足够的调用信息:,如:子程序名、子程序功能、入口参数和出口参数、子程序占用的硬件资源、子程序中调用的其他子程序名。,7.6.2 子程序的类型,按子程序与主程序之间传递参数的方式分类。,入口参数:调用子程序之前,需要传给子程序的参数。,出口参数:子程序送回调用程序的结果参数。,选用不同的参数传递方式。,1.寄存器传送参数,2.存储器传送参数,3.堆栈传送参数,设计子程序应满足通用性的要求,一般不针对具体数据编程。,如:1.子程序功能为求单字节数的立方:,A,A,3,,,入口参数和输出参数为,A。,2.,子程序功能为求单字节数的,n,次方:(41,H)(42H),(40H),A,,,入口参数为(40,H),和,A,,出口参数,为(42,H)(41H)。,例:,将,R4R5R6,中三个字节数据对半分解,变成6个字节,存入显示缓冲区,(,DISMEM0DISMEM5)。,1)子程序,UFOR1,的功能:将,A,累加器中单字节数据,对半分解成两个字节,存入,R0,所指向的相邻两个单元,UFOR1:MOV R0,#0,XCHD A,R0,;,保存低半字节,INC R0,;,修改指针,MOV R0,#0,SWAP A,XCHD A,R0,;,保存高半字节,RET,2),调用子程序,UFOR1,之前,将待分解的内容送,A,,存放地址送,R0。,例:,比较两个数据串是否完全相等,若完全相等,,,A=0;,否则,A=FFH。,入口参数:,A(,数据串长度),R0(,数据串1地址),R1(,数据串2地址),出口参数:,A,PMT:MOVR2,A;,设数串长度,CHC:MOVA,R0;,各取数串中的一个数,MOVB,R1,CJNE A,B,NOM;,是否相等?不相等转移,INCR0;,相等,修改指针,INCR1,DJNZ R2,CHC;,全部比较完?,MOVA,#0;,完全相等,SJMP PEND,NOM:MOVA,#0FFH;,不完全相等,PEND:RET,例,:,查表求出数据的,ASCII,码,再以字符形式输出。,1)子程序,HEXASC,功能:取出堆栈中数据,查表将低半字节转换成,ASCII,码送累加器,A。,2),分别将待转换数据入栈,然后调用子程序,HEXASC。,MOV SP,#30H,PUSH 40H,;,入口参数入栈,LCALL HEXASC,POP A,HEXASC:DEC SP,;,跳过返回地址,DEC SP,POP A,;,取入口参数,;查表求,ASCII,码,PUSH A,;,保存出口参数,INC SP,;,指向返回地址,INC SP,RET,DB,0,,,1,,;,ASCII,码表,通过堆栈传递参数,7.6.2 51,系列应用源程序的基本格式,任一个,MCS-51,应用程序,其基本地址空间可划分为:,1.中断矢量地址空间段;,2.主程序地址空间段;,3.中断服务程序和子程序地址空间段;,4.固定常数地址空间段四部分。,除中断矢量地址空间固定外,其余均应视程序量分配地址空间,其顺序也不受此限,可见,任一个,MCS-51,系列应用软件源程序的基本格式总是由这四部分组成。,例子如下:,上例中的地址分配是为了便于示例在实际应用中应根据具体情况而定在主程序段应包含有关单元清,0,、方式选择、参数设置以及有关部分的初始化程序等。主程序是整个源程序的核心、其它程序段均从属于它。,7.7 算术运算程序,7.7.1 多字节加减运算程序,1.多字节加法子程序,,X=X+Y。(R2,中存放着字节数),ADDS:CLRC,LOOP:MOVA,R0,ADDC A,R1,;,加一字节,MOVR0,A,;,存和一字节,INCR0,;,修改指针,INCR1,DJNZ R2,LOOP,;,全部字节加完?,RET,7.7.2 多字节无符号数乘除运算,例,1 16,位数(双字节)相乘,设被乘数的高、低字节分别记为,XH,和,L,,,乘数的高、低字节分别记为,YH,和,YL,,,则二者相乘的算式为:,(,XH,28+XL)X(YH,28+YL),(XH,28+XL)X YH,28+(XH,28+XL)X YL,根据上式,两个,16,位数相乘可化为乘数的高、低字节分别与被乘数相乘,两个乘积错位一个字节相加,其和即为两个,16,位数相乘的结果。对应的程序可组织成两重循环结构,其内循环完成,8,位数与,16,位数相乘,并将乘积累加和加到结果单元计算结果需占用地址连续的,4,个字节单元,入口时,以下标号的,4,个暂存单元应装入相应的指定内容,即:,RLADR,单元:结果最低字节单元地址,,XLADR,单元:被乘数最低字节单元地址,XLADR-1,单元存放乘数高字节,YDH,单元:存放乘数高字节数据;,DL,单元:存放乘数低字节数据。,程序清单如下:,7.7.3,代码转换程序,(一)二进制数转换为,ASCII,码,(二),ASCII,码转换为二进制数,09的,ASCII,码:3039,H;AF,的,ASCII,码:4146,H。,HASC:CJNE A,#0AH,N AHEX:CLR C,N:JNC N1SUBBA,#30H,ADD A,#30HCJNEA,#0AH,N,SJMPSEN:JC N1,N1:ADD A,#37HSJMP AE,SE:RETN1:SUBB A,#11H,CJNE A,#06H,N2,N2:JNCERR,ADDA,#0AH,SJMP AE,ERR:MOVA,#0FFH,AE:RET,(三),BCD,码与二进制数之间的转换 有乘法和除法两种转换方式,。,1,BCD,码转换为二进制数,D=,d,n,-1,10,n-1,+,d,n,-2,10,n-2,+d,1,10,1,+d,0,10,0,=(,d,n,-1,10+,d,n,-2,)10+,d,n,-3,)10+d,1,)10+d,0,“,整数十翻二,”,:从最高位开始,按二进制运算法则循环,“,乘十加次低位,”,:,B=B10+b,i,。,R30,R40,10,R3,R4,+,(,R0),R3,R4,R0R0+1,2二进制数转换为,BCD,码,B=,b,n,-1,2,n-1,+,b,n,-2,2,n-2,+b,1,2,1,+b,0,2,0,=(,b,n,-1,2+,b,n,-2,)2+,b,n,-3,)2+b,1,)+b,0,“,整数二翻十,”,:从最高位开始,按十进制运算法则循环,“,乘二加次低位,”,:,D=D2+,d,i,。,除法转换式:,b,n,-1,2,n-1,+,b,n,-2,2,n-2,+,+b,0,=d,m-1,10,m-1,+d,m-2,10,m-2,+,+d,0,两边同时除基数,两边的整数或小数应该分别相等。,除基数,取出1位余数,得到的商继续除基数取余数,。,循环“除基取余”操作,得到转换进制的各位系数。,编程习题要求,1.为程序标明必要注释。,2.上机调试通过。,3.给出程序执行前设定的数据,并记录程序执行后的结果数据。,4.要求写明数据的存储单元,
展开阅读全文