资源描述
第,2,章,C8051F,单片机的结构与原理,2.1 C8051F,系列单片机总体结构,2.2 C8051F020,存贮器组织,2.3 CIP-51,指令介绍,2.4,中断系统,2.5,端口输入,/,输出,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第五章 汇编 语言程序设计,1 程序设计方法,2 顺序程序,3 分支程序,4 循环程序,5 子程序,6 算术运算程序,第五章 汇编语言程序设计,5-1-2 汇编语言程序设计步骤,一.,分析问题。,二.,确定算法。,三.,制定程序流程图:表示程序结构和程序功能,四.,编制源程序,1.合理分配存储器单元和了解,I/O,接口地址。,2.按功能设计程序,,明确各程序之间的相互关系。,3.用注释行说明程序,,便于阅读和修改调试和修改。,五.,程序调试。,开始,1,Y,N,?,第五章 汇编语言程序设计,5,-1-3,评价程序质量的标准,(1)程序的执行时间。,(2)程序所占用的内存字节数。,(3)程序的逻辑性、可读性。,(4)程序的兼容性、可扩展性。,(5),程序的可靠性。,5-2 顺序程序,直线程序又称简单程序,程序走向只有一条路径。,例1 双字节变补程序(设数据在,R4 R5,中),双字节变补程序(设数据在,R4R5,中):,MOV A,R5;,取低字节,CPL A,ADD A,#1;,低字节变补,MOV R5,A,MOV A,R4;,取高字节,CPL A,ADDC A,#0;,高字节变补,MOV R4,A,第五章 汇编语言程序设计,第五章 汇编语言程序设计,例2 压缩式,BCD,码分解成为单字节,BCD,码。,MOV R0,#40H;,设指针,MOV A,R0;,取一个字节,MOV R2,A;,暂存,ANL A,#0FH;,清0高半字节,INC R0,MOV R0,A ;,保存数据个位,MOV A,R2,SWAP A ;,十位换到低半字节,ANL A,#0FH,INC R0,MOV R0,A;,保存数据十位,十 个,第五章 汇编语言程序设计,例5-1,假设两个双字节无符号数,分别存放在,R1R0,和,R3R2,中,高字节在前,低字节在后。编程使两数相加,和数存放回,R2R1R0,中。,ORG 1000h,CLR C,MOV A,,,R0,;,取被加数低字节至,A,ADD A,,,R2,;,与加数低字节相加,MOV R0,,,A,;,存和数低字节,MOV,A,,,Rl,;,取被加数高字节至,A,ADDC A,,,R3,;,与加数高字节相加,MOV,Rl,,,A,;,存和数高字节,MOV A,,,#0,ADDC A,,,#0,;,加进位位,MOV R2,,,A,;,存和数进位位,SJMP$,;,原地踏步,END,条件满足?,N,影响条件,处理段,Y,N,第五章 汇编语言程序设计,5-3 分支程序,由条件转移指令构成程序判断框部分,形成程序分支结构。,5-3-1单重分支程序,一个判断决策框,程序有两条出路。两种分支结构。,例1 求,R2,中补码绝对值,正数不变,负数变补。,MOV A,R2,JNB ACC.7,NEXT ;,为正数?,CPL A ;,负数变补,INC A,MOV R2,A,NEXT:SJMP NEXT ;,结束,第五章 汇编语言程序设计,5-3-2 多重分支程序,多次使用条件转移指令,形成两个以上判断框。,例5-7,设30,H,单元存放的是一元二次方程,ax,2,+bx+c=0,根的判别式=,b,2,-4ac,的值。,解:值为有符号数,有三种情况,即大于零、等于零、小于零。,第五章 汇编语言程序设计,编程:,ORG 1000H,START:MOV A,30H ;,值送,A,JNB ACC.7,YES ;=0,转,YES,MOV 31H,#0 ;0,转,TOW,MOV 31H,#1 ;=0,有相同实根,SJMP FINISH,TOW:MOV 31H,#2 ;,有两个不同实根,FINISH:SJMP$,第五章 汇编语言程序设计,5-3-3,N,路分支程序,N,路分支程序是根据前面程序运行的结果,可以有,N,种选择,并能转向其中任一处理程序。,第五章 汇编语言程序设计,例5-10 128路分支程序。,功能:根据,R3,的值(00,H7FH),转到128个目的地址。,参考程序:,JMPl28:MOV A,R3,RL A,;(A)2,MOV DPTR,#PRGTBL,;,散转表首址送,DPTR,JMP A+DPTR ;,散转,PRGTBL:AJMP ROUT00,AJMP ROUT01,AJMP ROUT7F,;128,个,AJMP,指令占256个字节,第五章 汇编语言程序设计,例,5-11 256,路分支程序,功能:根据,R3,的值转移到,256,个目的地址;,入口条件:,(,R3)=,转移目的地址代号,(00,H,FFH),;,出口条件:转移到相应分支处理程序入口。,解:,JMP256:MOV A,R3,;,取,N,值,MOV DPTR,#PRGTBL,;,指向分支地址表首址,CLR C,RLC A,;(A)2,JNC LOWl28,;,是前128个分支程序,则转移,INC DPH,;,否则基址加256,第五章 汇编语言程序设计,LOWl28,:,MOV,TEMP,,,A,;,暂存,A,INC A,;,指向地址低,8,位,MOVC A,,,A+DPTR,;,查表,读分支地址低,8,位,PUSH ACC,;,地址低,8,位入栈,MOV A,,,TEMP,;,恢复,A,,,指向地址高,8,位,MOVC A,,,A+DPTR,;,查表,读分支地址高,8,位,PUSH ACC,;,地址高,8,位入栈,RET,;,分支地址弹入,PC,实现转移,PRGTBL:DW ROUT00,;,占用512个字节,DW ROUT01,第五章 汇编语言程序设计,例,5-12,大于,256,路分支转移程序,功能:根据入口条件转向,n,个分支处理程序,入口条件:,(,R7R6)=,转移目的地址代号;,出口条件:转移到相应分支处理程序入口。,程序散转表中有,N,条,LJMP,指令,每条,LJMP,指令占3个字节,因此要按入口条件将址代号乘以3,用乘积的高字节加,DPH,,乘积的低字节送,A(,变址寄存器)。,PRGTBL,:,LJMP ROUT0,LJMP ROUT1,LJMP ROUT2,第五章 汇编语言程序设计,参考程序:,JMPN,:,MOV DPTR,,,#PRGTBL,;,DPTR,指向表首址,MOV A,,,R7,;,取地址代号高,8,位,MOV B,,,#3,;,MUL AB,;,3,ADD A,,,DPH,;,MOV DPH,,,A,;,修改指针高,8,位,MOV A,,,R6,;,取地址代号低,8,位,MOV B,,,#3,;,3,MUL AB,;,XCH A,,,B,;,交换乘积的高低字节,ADD A,,,DPH,;,乘积的高字节加,DPH,MOV DPH,,,A,XCH A,,,B,;,乘积的低字节送,A,JMP A+DPTR,;,散转,第五章 汇编语言程序设计,5-4 循环程序,包含多次重复执行的程序段,循环结构使程序紧凑。,5-4-1循环程序的导出,各个环节任务:,一初始化部分,循环准备工作。,如:清结果单元、设指针、设循环控制变量初值等。,二循环体,循环工作部分:,需多次重复处理的工作。,循环控制部分:,1.修改指针和循环控制变量。,2.检测循环条件:满足循环条件,继续循环,否则退出循环。,三.结束部分,处理和保存循环结果。,1)已知循环次数 2)循环次数未知,允许0次循环的循环结构:在循环工作之前检测循环条件。,循环控制?,循环工作,循环结束,循环初始化,Y,N,N,Y,第五章 汇编语言程序设计,单重循环,简单循环结构:循环体中不套循环。,例:,求,n,个单字节数据的累加,设数据串已在43,H,起始单元,数据串长度在42,H,单元,累加和不超过2个字节。,SUM:MOVR0,#42H;,设指针,MOVA,R0,MOVR2,A,;,循环计数器,R2n,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,#0FFH,NEXT1;,是否为数表结尾?,SJMP DONE ;,循环结束,NEXT1:CJNE A,B,NEXT2 ;,比较,NEXT2:JNCNEXT ;Cy=1,则,AB,MOVB,A ;,保存较小值,SJMP NEXT,DONE:SJMP DONE,第五章 汇编语言程序设计,5-4-2 多重循环,循环体中套循环结构。以双重循环使用较多。,例:将内存一串单字节无符号数升序排序。,步骤:,每次取相邻单元的两个数比较,,决定是否需要交换数据位置。,第一次循环,比较,N-1,次,取数据表中最大值。,第二次循环,比较,N-2,次,取到次大值。,第,N-1,次循环:比较一次,排序结束。,内循环控制?,循环工作,循环结束,外循环控制?,内循环初始化,开始,外循环初始化,N,N,Y,Y,第五章 汇编语言程序设计,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,N,Y,N,Y,N,Y,第五章 汇编语言程序设计,软件延时程序,用循环程序将指令重复多次执行,实现软件延时。,试计算延时程序的执行时间。,源程序指令周期(,M),指令执行次数,DELAY:MOV R6,#64H1,I1:MOV R7,#0FFH 1,I2:DJNZ R7,I2 2,DJNZ R6,I1 2,RET 2,延时时间计算:(设时钟,f=12MHz),t=(11+1100+2100255+2100+21)M=51.3 ms,1,100,100,255,100,1,第五章 汇编语言程序设计,5.5.2,编写循环程序应注意的问题,1)循环体前应注意安排循环初始化;,2)内外循环间不应相互交叉。,第五章 汇编语言程序设计,5-5 查表程序,例,5-19,一个十六进制数存放在,HEX,单元的低四位,将其转换成,ASCII,码并送回,HEX,单元。,编程:,ORG 0100H,HEX EQU 30H,HEXASC,:,MOV,A,HEX,ANL A,,,#00001111B,ADD A,,,#3,;,变址调整,MOVC A,,,A+PC,MOV HEX,,,A,;,2,字节,RET,;,1,字节,ASCTAB,:,DB30H,,,3lH,,,32H,,,33H,DB34H,,,35H,,,36H,,,37H,DB38H,,,39H,,,41H,,,42H,DB43H,,,44H,,,45H,,,46H,END,第五章 汇编语言程序设计,5-6 子程序设计,子程序:能完成某项特定功能的独立程序段,可被反复调用。,优点:,(1),不必重复书写同样的程序,提高编程效率;,(2),程序的逻辑结构简单,便于阅读;,(3),缩短了源程序和目标程序的长度,节省了程序存储器空间;,(4),使程序模块化、通用化,便于交流,共享资源;,(5),便于按某种功能调试。,第五章 汇编语言程序设计,1.子程序结构,一子程序入口用标号作为子程序名。,二调用子程序之前设置好堆栈。,三用返回指令,RET,结束子程序,并保证堆栈栈顶为调,用程序的返回地址。,四.子程序嵌套须考虑堆栈容量。,五.提供足够的调用信息:,如:,子程序名、子程序功能、入口参数和出口参数、,子程序占用的硬件资源、子程序中调用的其他子程序名。,第五章 汇编语言程序设计,2.参数传递,入口参数:调用子程序之前,需要传给子程序的参数。,出口参数:子程序送回调用程序的结果参数。,(1)子程序无须传递参数,第五章 汇编语言程序设计,(2)用累加器和工作寄存器传递参数,例,5-24,双字节求补子程序,CPLD,。,解,入口参数:,(,R7R6)=16,位数,出口参数:,(,R7R6)=,求补后的,16,位数,CPLD,:,MOV A,,,R6,CPL A,ADD A,,,#1,MOV R6,,,A,MOV A,,,R7,CPL A,ADDC A,,,#0,MOV R7,,,A,RET,第五章 汇编语言程序设计,(3)通过操作数地址传递参数,例,5-25,n,字节求补子程序。,解,入口参数:,(,R0)=,求补数低字节指针,,(,R7)=n-1,出口参数:,(,R0)=,求补后的高字节指针,CPLN,:,MOV A,,,R0,CPL A,ADD A,,,#1,MOVR0,,,A,NEXT,:,INC R0,MOV A,,,R0,CPL A,ADDC A,,,#0,MOV R0,,,A,DJNZ R7,,,NEXT,RET,第五章 汇编语言程序设计,(4)通过堆栈传递参数,例,5-26,在,HEX,单元存放两个十六进制数,将它们分别转换,成,ASC,码并存入,ASC,和,ASC+1,单元。,解,由于要进行两次转换,故可调用查表子程序完成。,主程序:,MAIN,:,PUSH HEX,;,取被转换数,LCALLHASC,;,转子,*,PC POP ASC,;,ASCLASC,MOV A,,,HEX,;,取被转换数,SWAP A,;,处理高四位,PUSH ACC,LCALL HASC,;,转子程序,POP ASC+1,;,ASCH ASC+1,第五章 汇编语言程序设计,子程序:,HASC,:,DEC SP,DEC SP ;,修改,SP,指向,HEX,POPACC ;,弹出,HEX,ANL A,,,#0FH,;,屏蔽高四位,ADD A,,,#5,;,变址调整,MOVCA,,,A+PC ;,查表,PUSHACC ;,结果入栈,(2,字节,),INCSP ;,(1,字节,),INCSP ;,修改,SP,指向断点位置,(1,字节,),RET,;,(1,字节,),ASCTAB,:,DB 0 1,2.7,DB 8 9 A,.,F,第五章 汇编语言程序设计,3.现场保护,推入与弹出的顺序应按“先进后出”,或“后进先出”的顺序,才能保证现场的恢复。,例:十翻二子程序的现场保护。,BCDCB,:,PUSH ACC,PUSH PSW,PUSH DPL,;,保护现场,PUSH DPH,POP DPH,POP DPL,POP PSW,;,恢复现场,POP ACC,RET,第五章 汇编语言程序设计,4.设置堆栈,调用子程序时,主程序的断点将自动入栈;,转子后,现场的保护都要占用堆栈工作单元,尤其多重转子或子,程序嵌套,需要,使栈区有一定的深度,。,由于,MCS-51,的堆栈是由,Sp,指针组织的内部,RAM,区,仅有,128,个,地址空间,,,堆栈并非越深越好,深度要恰当。,第五章 汇编语言程序设计,5.6.3,子程序的调用及嵌套,1,子程序调用,2,子程序嵌套,第五章 汇编语言程序设计,2,子程序嵌套,断点入栈,断点出栈,
展开阅读全文