《片机原理与应用技术第5节汇编语言程序的基本结构.ppt》由会员分享,可在线阅读,更多相关《片机原理与应用技术第5节汇编语言程序的基本结构.ppt(46页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、3.5 汇编语言程序的基本结构汇编语言程序的基本结构v汇编语言源程序设计通常采用结构化设计方法,任何复杂的程序都可分解为:顺序结构部分分支结构部分循环结构部分子程序部分3.5.1 顺序程序设计顺序程序设计【例】【功能】求变量X()的平方。【入口参数】X值存放在片内RAM的30H单元【出口参数】X2值存放在片内RAM的31H单元程序框图如图3.10所示。ORG1000HSTART:MOVDPTR,#2000HMOVA,30HMOVCA,A+DPTRMOV31H,ASJMP$ORG2000HTABLE:DB 00,01,04,09,16,25END特点:从第一条指令开始顺序执行,直到最后一条指令图
2、3.10顺序程序流程图3.5.2 分支程序设计分支程序设计v分支:根据某种标志改变程序执行的顺序。v一般分为单分支、多分支。v分支流程图如图3.11所示。(a)单分支(b)多分支多分支图图3.11 分支程序流程图分支程序流程图3.5.2 分支程序设计分支程序设计v1.单分支v【例】v【功能】某装置有自动/手动控制按键,按键状态由P1.0口输入;高电平为自动控制,低电平为手动控制v【入口参数】P1.0vCY:vJBP1.0,AUTOvHC:vvLJMPCYvAUTO:vvLJMPCY3.5.2 分支程序设计分支程序设计v2.多分支包括一般多分支和散转多分支。1)一般多分支【例】【功能】x、y均为
3、8位二进制数,求解:【入口参数】(R0)=x。【出口参数】(R1)=y。3.5.2 分支程序设计分支程序设计START:CJNER0,#00H,SUL1;判断R0是否为0,为0转SUL1MOVR1,#00HSJMPSUL2SUL1:JCNEG;小于0转NEGMOV R1,#01HSJMPSUL2NEG:MOV R1,#0FFHSUL2:RET3.5.2 分支程序设计分支程序设计2)散转多分支程序根据某种输入或运算的结果转向各个处理程序称为散转多分支,即散转程序。(1)利用转移指令表实现转移将转移到不同程序的转移指令列成表格,判断条件后查表,执行表中的转移指令。【例】【功能】某菜单有9项。根据输
4、入数码转去执行相应的子程序。即输入“1”,执行子程序1;输入“2”,执行子程序2;依次类推。3.5.2 分支程序设计分支程序设计【分析】用直接转移指令组成一个转移表,然后把菜单号读入累加器(A),转移表首地址放入DPTR中,利用JMPA+DPTR实现散转。【入口参数】(R3)=存输入键盘码19。【出口参数】转移到相应的子程序入口。ORG0030HKEY_JMP:MOVDPTR,#TAB1;子程序入口首地址送DPTRMOVA,R3;把键盘输入缓冲区内容送累加器(A)DECA;由于输入数码为19,因此需减1MOVB,#03H3.5.2 分支程序设计分支程序设计MUL AB;由于长跳转指令LJMP占
5、用3B,;各子程序入口地址相距3BJMPA+DPTR;根据输入码,执行相应的子程序ORG 2000H;程序入口地址表TAB1:LJMPNO1LJMPNO2LJMPNO3LJMPNO4LJMPNO5LJMPNO6LJMPNO7LJMPNO8LJMPNO9END3.5.2 分支程序设计分支程序设计(2)利用转向地址表实现转移这种方法将转移地址列成表格,将表格的内容作为转移的目标地址。【例】【功能】根据R3(0n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0PRn(n256)【分析】将PR0PRn入口地址列在表格中,每一项占两个单元;PRn在表中的偏移量为2n,因此将R3的内容乘“2”即
6、得PRn在表中的偏移地址;从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMPA+DPTR指令(A先清零)即转移到PRn入口执行。3.5.2 分支程序设计分支程序设计【入口参数】(R3)=0n转移。【出口参数】转移到相应的子程序入口。PR0EQU0110HPR1EQU0220HPR2EQU0330HORG0030HKEY_JMP:MOVDPTR,#TABMOVA,R3ADDA,R3;(A)(R3)*2JNCNADDINCDPH;(R3*2)2563.5.2 分支程序设计分支程序设计NADD:MOVR3,AMOVCA,A+DPTRXCHA,R3;转移地
7、址高8位INCAMOVC A,A+DPTRMOVDPL,A;转移地址低8位MOVDPH,R3CLRAJMPA+DPTRTAB:DWPR0,PR1,PR2,PRnPR0:处理程序0PR1:处理程序1PRn:处理程序nEND3.5.2 分支程序设计分支程序设计(3)利用地址偏移量表实现散转这种方法将转移目标地址与表首地址差列表,作为转移目标地址。【例】【功能】有5个按键0,1,2,3,4,根据按下的键转向不同的处理程序,分别为PR0,PR1,PR2,PR3,PR4。【分析】汇编时,利用了伪指令的数学计算功能,标首地址加上处理程序与标首地址差转到处理程序。【入口参数】(B)=转向程序号(键盘编码)。
8、【出口参数】转移到相应的子程序入口。3.5.2 分支程序设计分支程序设计ORG0030HKEY_JMP:MOVA,BMOVDPTR,#TABMOVC A,A+DPTRJMPA+DPTRTAB:DBPR0-TABDBPR1-TABDBPR2-TABDBPR3-TABDBPR4-TABPR0:处理程序0PR1:处理程序1PR2:处理程序2PR3:处理程序3PR4:处理程序4END3.5.3 循环程序设计循环程序设计u需要重复执行某一程序时可使用循环程序结构。u循环程序分为先循环后判断和先判断后循环两种循环体方式。u循环程序一般包含以下4部分。(1)设置循环初值:设置用于循环过程工作寄存器单元的初值
9、。(2)循环体:循环程序功能部分。(3)循环记录:记录循环过程,监控循环完成情况,为循环判断准备。(4)循环控制:判断循环完成情况,满足条件作相应的处理。不满足继续执行。3.5.3 循环程序设计循环程序设计图3.12 循环程序流程图3.5.3 循环程序设计循环程序设计【例】【功能】n个单字节数相加,和为双字节,存放在(R3、R4)中。【入口参数】单字节数Xi存放在从40H开始的RAM单元中,n放在R2中。(R2作为控制变量,R0作为变址单元)【出口参数】和存放在(R3、R4)中。ADD1:MOVR3,#00HMOVR4,#00HMOVR2,#nMOVR0,#40HLOOP:MOVA,R4;取部
10、分和低位ADDA,R0;与Xi相加MOVR4,AINC R0;地址加1CLRAADDCA,R3;低位字节向高位字节进位MOVR3,ADJNZR2,LOOP;未加完继续重复3.5.3 循环程序设计循环程序设计【例】【功能】设计一个延时10ms的程序。【分析】延时程序的延时主要与所用晶振和延时程序中的循环次数有关。已知AT89C51单片机使用的晶振为12MHz,则可知一个机器周期为1。【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。【出口参数】定时到,退出程序。ORG2000H指令机器周期数1MOVR0,#0AH;毫秒数R012DL2:MOVR1,#MT;1ms延时值R113DL1:NO
11、P14NOP15DJNZR1,DL1;1ms延时循环26DJNZR0,DL2;10ms延时循环23.5.3 循环程序设计循环程序设计该延时程序是一个双重循环程序,内循环1ms延时的预定值MT需计算:(1+1+2)1MT=1000()MT=250=0FAH用0FAH代替程序中的MT,则该程序执行后,能实现10ms的延时。若考虑第1、2、6行延时参数配置指令的时间因素,则该段延时程序的精确延时时间计算式为:11+(1+2)110+(1+1+2)125010=10.031ms3.5.4 子程序设计子程序设计v按功能分为中断子程序和功能子程序。v调用子程序时要注意:(1)中断子程序调用由单片机自身产生
12、,执行RETI指令返回;功能子程序调用由主程序执行LCALL或ACALL指令产生,执行RET指令返回。(2)在子程序中,应包含有现场保护和现场恢复两部分。(3)主程序和子程序约定好交换数据的地址单元或存储器,其为主、子程序共有部分。(4)子程序可以对另外的子程序调用,称为子程序嵌套。3.5.4 子程序设计子程序设计v1.运算类子程序【例】【功能】多字节无符号数的加法。【分析】多字节运算一般是按从低字节到高字节的顺序依次执行的。【入口参数】DATA1=被加数的低位地址。DATA2=加数的低位地址。N字节相加。【出口参数】DATA2=和数低位地址。3.5.4 子程序设计子程序设计MADD:MOVR
13、0,#DATA1;置被加数MOVR1,#DATA2;置加数MOVR7,#N;置字节数CLRC;清进位位LOOP:MOVA,R0ADDCA,R1;求和MOVR1,A;存结果INCR0;修改指针INCR1DJNZR7,LOOP;循环判断RET3.5.4 子程序设计子程序设计【例】【功能】多字节无符号数的减法。【入口参数】DATA1=被减数的低位地址,DATA2=减数的低位地址,N字节相减。【出口参数】DATA2=差数低位地址。3.5.4 子程序设计子程序设计MSUB:MOVR0,#DATA1;置被减数MOVR1,#DATA2;置减数MOVR7,#N;置字节数CLRC;清进位位LOOP:MOVA,R
14、0SUBBA,R1;求差MOVR1,A;存结果INC R0;修改指针INC R1DJNZR7,LOOP;循环判断RET3.5.4 子程序设计子程序设计【例】【功能】双字节无符号数的乘法。【分析】8051指令系统中只有单字节乘法指令,因此,双字节相乘需分解为4次单字节相乘。设双字节的无符号被乘数存放在R3、R2中,乘数存放在R5、R4中,R0指向积的高位。【入口参数】R3(高)R2(低),被乘数;R5(高)R4(低),乘数。【出口参数】(R0)积的高位字节地址指针。3.5.4 子程序设计子程序设计图3.13双字节无符号乘法算法与流程图3.5.4 子程序设计子程序设计MULTB:MOVR7,#04
15、;结果单元清0LOOP:MOVR0,#00HDJNZR7,LOOPMOVA,R2;取被乘数低位字节MOVB,R4;取乘数低位字节R4MULAB;R4R2ACALLRADD;调用乘积相加子程序MOV A,R2;取被乘数低位字节R2MOV B,R5;取乘数高位字节R5MUL AB;R5R2DEC R0;积字节指针减1ACALLRADD;调用乘积相加子程序MOV A,R4MOV B,R3MUL AB;R4R3DEC R0DEC R0ACALLRADDMOV A,R53.5.4 子程序设计子程序设计MOVB,R3MULAB;R5R3DECR0ACALLRADDDECR0RETRADD:ADDA,R0;
16、累加子程序MOVR0,AMOVA,BINCR0ADDC A,R0MOVR0,AINCR0MOVA,R0ADDC A,#00H;加进位MOVR0,ARET3.5.4 子程序设计子程序设计v2.码型转换程序单片机能识别和处理的是二进制码,而输入/输出设备(如LED显示器、微型打印机等)则常使用ASCII码或BCD码。为此,在单片机应用系统中经常需要通过程序进行二进制码与BCD码或ASCII码的相互转换。3.5.4 子程序设计子程序设计【例】【功能】将1位十六进制数(即4位二进制数)转换成相应的ASCII码。【分析】由ASCII编码表可知转换方法为:1位十六进制数小于10,则加上30H,若大于10(
17、或等于10),则加上37H。【入口参数】(R0)=1位十六进制数。【出口参数】(R2)=转换后的ASCII码。3.5.4 子程序设计子程序设计HASC:MOVA,R0;取4位二进制数ANL A,#0FH;屏蔽掉高4位PUSHACC;4位二进制数入栈CLRC;清进(借)位标志位SUBBA,#0AH;用借位标志位的状态判断该数;是在在09之间还是AF之间POPACC;弹出原4位二进制数JC LOOP;借位位为1,跳转至LOOPADDA,#07H;借位位为0,该数在;AF之间,加37HLOOP:ADDA,#30H;该数在09之间,加30HMOVR2,A;ASCII码存于R2RET3.5.4 子程序设
18、计子程序设计【例】【功能】双字节二进制数转换成BCD码【分析】BCD码在计算机中又分为两种形式:非压缩BCD码:1B放1位BCD码,适用于显示和输出压缩的BCD码:1B放2位BCD码,适用于运算及存储【入口参数】(R2、R3)=16位无符号二进制整数。【出口参数】(R4、R5、R6)为转换完的压缩型BCD码3.5.4 子程序设计子程序设计v十进制数B与一个8位的二进制数的关系可以表示为:v只要依十进制运算法则,将bi(i7,6,1,0)按权相加,就可以得到对应的十进制数B。3.5.4 子程序设计子程序设计DCDTH:MOVR7,#16;置计数初值CLRAMOVR6,AMOVR5,AMOVR4,
19、ALOOP:CLRCMOVA,R3RLCAMOVR3,A;R3左移1位并送回MOVA,R2RLCAMOVR2,A;R2左移1位并送回MOVA,R63.5.4 子程序设计子程序设计ADDCA,R6DAAMOV R6,A;(R6)乘2并调整后送回MOV A,R5ADDCA,R5DAAMOV R5,A;(R5)乘2并调整后送回MOV A,R4ADDCA,R4DAAMOV R4,A;(R4)乘2并调整后送回DJNZ R7,LOOPRET3.5.4 子程序设计子程序设计v3.滤波子程序1)中值滤波中值滤波是对某一被测参数连续采样N次,把N次采样值按大小排列,取中间值为本次采样值。中值滤波能有效地克服偶然
20、因素引起的波动或采样器不稳定引起的误码等脉冲干扰。【例】【功能】对采样值中值滤波。【入口参数】SAMP为存放采样值的内存单元首地址,(R3)为采样值个数。【出口参数】DATA为存放滤波值的内存单元地址。3.5.4 子程序设计子程序设计SORT:DECR3;设置外循环次数MOV A,R3;保存外循环次数,计算中值地址PUSH ALOP1:MOV A,R3;设置外循环次数MOV R2,AMOV R0,#SAMPMOV R1,#SAMP+1LOP2:MOV A,R1CLRCSUBBA,R0;(R1)-(R0)(A)JNCDONE;(R1)(R0)不交换MOVA,R0;(R1)(R0)交换XCHA,R
21、1MOVR0,A3.5.4 子程序设计子程序设计DONE:INCR0;数据指针加1INCR1DJNZR2,LOP2DJNZR3,LOP1CLRCPOPARRCAADDA,#SAMP;计算中值地址MOVR0,AMOVDATA,R0;存放滤波值RET3.5.4 子程序设计子程序设计2)均值滤波子程序均值滤波程序有多种如算术平均值滤波法、去极值均值滤波法、滑动平均值法等。算术平均值滤波法是连续N次采样,得到N个值,然后取算术平均。【例】【功能】对已知采样值为单字节,连续采样8次,对采样值进行算术平均值滤波。【入口参数】(R0)=采样首值地址指针,(R1)=采样次数。【出口参数】(R2)=平均值。3.
22、5.4 子程序设计子程序设计F4:CLRA;清累加器MOV R2,AMOV R3,AMOV A,R1PUSH AFL40:MOV A,R0;取一个采样值ADDA,R3;累加到R2、R3中MOV R3,ACLRAADDCA,R2MOV R2,AINCR0DJNZ R1,FL40;累加完8次3.5.4 子程序设计子程序设计FL41:POP ACLR CFL42:RRC AJNC FL43RETFL43:PUSHACLR CMOVA,R2RRC AMOV R2,AMOV A,R3RRC AMOV R3,APOP ASJMPFL423.5.4 子程序设计子程序设计3)惯性滤波子程序最常用的、简单惯性滤
23、波为一阶惯性滤波,如图3.14所示,即RC模拟低通滤波器。图3.14RC模拟低通滤波器3.5.4 子程序设计子程序设计一阶惯性滤波算法的程序流程图如图3.15所示:图3.15一阶惯性滤波算法程序流程图3.5.4 子程序设计子程序设计【例】【功能】对8位A/D采样值惯性滤波;取一个8位整数值,(1-)用256-来代替,计算结果舍去最低字节即可。=0255。双字节乘以单字节的乘法。【入口参数】R0(高位)R1(低位)存放。R2存放采样值,R5存放系数a。【出口参数】R3(高位)R4(低位)存放。3.5.4 子程序设计子程序设计FOF:MOVA,R5;取系数MOVB,A;置系数于B做乘数MOVA,R
24、2;取采样值MULAB;计算XnMOVR4,A;保存乘积低位于R4MOVA,B;取乘积高8位MOVR3,A;保存乘积高8位于R3CLRC;清进位位CCLRA;计算(1-)用(256-)来代替SUBBA,R5MOVB,A;计算(1-)Yn-1,置乘数(1-)MOVA,R1;取Yn-1的低8位MULAB;Yn-1的低8位与(1-)相乘MOVA,B;舍去乘积低8位MOVR1,A;保存Yn-1低8位乘积结果CLRCCLRA;计算(1-)用(256-)来代替3.5.4 子程序设计子程序设计SUBBA,R5MOVB,A;计算(1-)Yn-1,置乘数(1-)MOVA,R0;取Yn-1的高8位MULAB;Yn-1的高8位与(1-)相乘CLRC;清进位位CADDA,R1;计算乘积结果MOVR1,AMOVA,BADDC A,#00HMOVR0,A;(1-)Yn-1乘积结果高8位存于R0,;低8位存于R1MOVA,R1;计算CLRCADDA,R4MOVR4,AMOVA,R0ADDC A,R3MOVR3,ARET