




已阅读5页,还剩41页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.5 汇编语言程序的基本结构,汇编语言源程序设计通常采用结构化设计方法, 任何复杂的程序都可分解为: 顺序结构部分 分支结构部分 循环结构部分 子程序部分,3.5.1 顺序程序设计,【例】【功能】求变量X()的平方。 【入口参数】X值存放在片内RAM的30H单元 【出口参数】X2值存放在片内RAM的31H单元 程序框图如图3.10所示。 ORG 1000H START:MOV DPTR,#2000H MOV A,30H MOVC A,A+DPTR MOV 31H,A SJMP $ ORG 2000H TABLE:DB 00,01,04,09,16,25 END 特点:从第一条指令开始顺序执行,直到最后一条指令,图3.10 顺序程序流程图,3.5.2 分支程序设计,分支:根据某种标志改变程序执行的顺序。 一般分为单分支、多分支。 分支流程图如图3.11所示。,(a) 单分支 (b)多分支 图3.11 分支程序流程图,3.5.2 分支程序设计,1. 单分支 【例】 【功能】某装置有自动/手动控制按键,按键状态由P1.0口输入;高电平为自动控制,低电平为手动控制 【入口参数】P1.0 CY: JB P1.0,AUTO HC: LJMP CY AUTO: LJMP CY,3.5.2 分支程序设计,2. 多分支 包括一般多分支和散转多分支。 1) 一般多分支 【例】 【功能】x、y均为8位二进制数,求解: 【入口参数】(R0)=x。 【出口参数】(R1)=y。,3.5.2 分支程序设计,START: CJNE R0, #00H, SUL1 ;判断R0是否为0,为0转SUL1 MOV R1, #00H SJMP SUL2 SUL1: JC NEG ;小于0转NEG MOV R1, #01H SJMP SUL2 NEG : MOV R1, #0FFH SUL2: RET,3.5.2 分支程序设计,2) 散转多分支程序 根据某种输入或运算的结果转向各个处理程序称为散转多分支,即散转程序。 (1) 利用转移指令表实现转移 将转移到不同程序的转移指令列成表格,判断条件后查表,执行表中的转移指令。 【例】 【功能】某菜单有9项。根据输入数码转去执行相应的子程序。即输入“1”,执行子程序1;输入“2”,执行子程序2;依次类推。,3.5.2 分支程序设计,【分析】用直接转移指令组成一个转移表,然后把菜单号读入累加器(A),转移表首地址放入DPTR中,利用JMP A+DPTR实现散转。 【入口参数】(R3)=存输入键盘码19。 【出口参数】转移到相应的子程序入口。 ORG 0030H KEY_JMP:MOV DPTR, #TAB1;子程序入口首地址送DPTR MOV A, R3;把键盘输入缓冲区内容送累加器(A) DEC A ;由于输入数码为19,因此需减1 MOV B, #03H,3.5.2 分支程序设计,MUL AB ;由于长跳转指令LJMP占用3B, ;各子程序入口地址相距3B JMP A+DPTR ;根据输入码,执行相应的子程序 ORG 2000H ;程序入口地址表 TAB1: LJMP NO1 LJMP NO2 LJMP NO3 LJMP NO4 LJMP NO5 LJMP NO6 LJMP NO7 LJMP NO8 LJMP NO9 END,3.5.2 分支程序设计,(2) 利用转向地址表实现转移 这种方法将转移地址列成表格,将表格的内容作为转移的目标地址。 【例】 【功能】根据R3(0n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0PRn(n256) 【分析】 将PR0 PRn入口地址列在表格中,每一项占两个单元; PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址; 从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零)即转移到PRn入口执行。,3.5.2 分支程序设计,【入口参数】(R3)=0n 转移。 【出口参数】转移到相应的子程序入口。 PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H ORG 0030H KEY_JMP: MOV DPTR, #TAB MOV A,R3 ADD A,R3 ;(A)(R3)*2 JNC NADD INC DPH ;(R3*2)256,3.5.2 分支程序设计,NADD: MOV R3,A MOVC A, A+DPTR XCH A, R3 ;转移地址高8位 INC A MOVC A, A+DPTR MOV DPL,A ;转移地址低8位 MOV DPH, R3 CLR A JMP A+DPTR TAB: DW PR0,PR1,PR2, PRn PR0: 处理程序0 PR1: 处理程序1 PRn: 处理程序n END,3.5.2 分支程序设计,(3) 利用地址偏移量表实现散转 这种方法将转移目标地址与表首地址差列表,作为转移目标地址。 【例】 【功能】有5个按键 0,1,2,3,4,根据按下的键转向不同的处理程序,分别为PR0,PR1,PR2,PR3,PR4。 【分析】汇编时,利用了伪指令的数学计算功能,标首地址加上处理程序与标首地址差转到处理程序。 【入口参数】(B)=转向程序号(键盘编码)。 【出口参数】转移到相应的子程序入口。,3.5.2 分支程序设计,ORG 0030H KEY_JMP: MOV A, B MOV DPTR, #TAB MOVC A,A+DPTR JMP A+DPTR TAB: DB PR0-TAB DB PR1-TAB DB PR2-TAB DB PR3-TAB DB PR4-TAB PR0: 处理程序0 PR1: 处理程序1 PR2: 处理程序2 PR3: 处理程序3 PR4: 处理程序4 END,3.5.3 循环程序设计,需要重复执行某一程序时可使用循环程序结构。 循环程序分为先循环后判断和先判断后循环两种循环体方式。 循环程序一般包含以下4部分。 (1) 设置循环初值:设置用于循环过程工作寄存器单元的初值。 (2) 循环体:循环程序功能部分。 (3) 循环记录:记录循环过程,监控循环完成情况,为循环判断准备。 (4) 循环控制:判断循环完成情况,满足条件作相应的处理。不满足继续执行。,3.5.3 循环程序设计,图3.12 循环程序流程图,3.5.3 循环程序设计,【例】 【功能】n个单字节数相加,和为双字节,存放在(R3、R4)中。 【入口参数】单字节数Xi存放在从40H开始的RAM单元中,n放在R2中。(R2作为控制变量,R0作为变址单元 ) 【出口参数】和存放在(R3、R4)中。 ADD1: MOV R3, #00H MOV R4, #00H MOV R2, #n MOV R0, #40H LOOP: MOV A, R4 ;取部分和低位 ADD A, R0 ;与Xi相加 MOV R4, A INC R0 ;地址加1 CLR A ADDC A, R3 ;低位字节向高位字节进位 MOV R3, A DJNZ R2, LOOP ;未加完继续重复,3.5.3 循环程序设计,【例】 【功能】设计一个延时10ms的程序。 【分析】延时程序的延时主要与所用晶振和延时程序中的循环次数 有关。已知AT89C51单片机使用的晶振为12MHz,则可知一个机器周期为1。 【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。 【出口参数】定时到,退出程序。 ORG 2000H 指令机器周期数 1 MOV R0 , #0AH ;毫秒数R0 1 2 DL2: MOV R1 , #MT ;1ms延时值R1 1 3 DL1: NOP 1 4 NOP 1 5 DJNZ R1 , DL1 ;1ms延时循环 2 6 DJNZ R0 , DL2 ;10ms延时循环 2,3.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.031ms,3.5.4 子程序设计,按功能分为中断子程序和功能子程序。 调用子程序时要注意: (1)中断子程序调用由单片机自身产生,执行RETI指令 返回;功能子程序调用由主程序执行LCALL或ACALL 指令产生,执行RET指令返回。 (2)在子程序中,应包含有现场保护和现场恢复两部分。 (3)主程序和子程序约定好交换数据的地址单元或存储 器,其为主、子程序共有部分。 (4)子程序可以对另外的子程序调用,称为子程序嵌套。,3.5.4 子程序设计,1. 运算类子程序 【例】 【功能】多字节无符号数的加法。 【分析】多字节运算一般是按从低字节到高字节的顺序依次执行的。 【入口参数】DATA1=被加数的低位地址。 DATA2=加数的低位地址。 N字节相加。 【出口参数】DATA2=和数低位地址。,3.5.4 子程序设计,MADD: MOV R0,#DATA1 ;置被加数 MOV R1, #DATA2 ;置加数 MOV R7,#N ;置字节数 CLR C ;清进位位 LOOP: MOV A,R0 ADDC A,R1 ;求和 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP ;循环判断 RET,3.5.4 子程序设计,【例】 【功能】多字节无符号数的减法。 【入口参数】DATA1=被减数的低位地址, DATA2=减数的低位地址,N字节相减。 【出口参数】DATA2=差数低位地址。,3.5.4 子程序设计,MSUB:MOV R0,#DATA1 ;置被减数 MOV R1,#DATA2 ;置减数 MOV R7,#N ;置字节数 CLR C ;清进位位 LOOP:MOV A,R0 SUBB A,R1 ;求差 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP ;循环判断 RET,3.5.4 子程序设计,【例】 【功能】双字节无符号数的乘法。 【分析】8051指令系统中只有单字节乘法指令,因此,双字节相乘需分解为4次单字节相乘。设双字节的无符号被乘数存放在R3、R2中,乘数存放在R5、R4中,R0指向积的高位。 【入口参数】R3(高)R2(低),被乘数; R5(高)R4(低),乘数。 【出口参数】(R0)积的高位字节地址指针。,3.5.4 子程序设计,图3.13 双字节无符号乘法算法与流程图,3.5.4 子程序设计,MULTB: MOV R7, #04 ;结果单元清0 LOOP : MOV R0,#00H DJNZ R7,LOOP MOV A, R2 ;取被乘数低位字节 MOV B, R4 ;取乘数低位字节R4 MUL AB ;R4R2 ACALL RADD ;调用乘积相加子程序 MOV A, R2 ;取被乘数低位字节 R2 MOV B, R5 ;取乘数高位字节R5 MUL AB ;R5R2 DEC R0 ;积字节指针减1 ACALL RADD ;调用乘积相加子程序 MOV A,R4 MOV B,R3 MUL AB ;R4R3 DEC R0 DEC R0 ACALL RADD MOV A,R5,3.5.4 子程序设计,MOV B,R3 MUL AB ;R5R3 DEC R0 ACALL RADD DEC R0 RET RADD:ADD A,R0 ;累加子程序 MOV R0,A MOV A,B INC R0 ADDC A,R0 MOV R0,A INC R0 MOV A,R0 ADDC A,#00H ;加进位 MOV R0,A RET,3.5.4 子程序设计,2. 码型转换程序 单片机能识别和处理的是二进制码,而输入/输出设备(如LED显示器、微型打印机等)则常使用ASCII码或BCD码。为此,在单片机应用系统中经常需要通过程序进行二进制码与BCD码或ASCII码的相互转换 。,3.5.4 子程序设计,【例】 【功能】将1位十六进制数(即4位二进制数)转换成相 应的ASCII码。 【分析】由ASCII编码表可知转换方法为: 1位十六进制数小于10,则加上30H, 若大于10(或等于10),则加上37H。 【入口参数】(R0)=1位十六进制数。 【出口参数】(R2)=转换后的ASCII码。,3.5.4 子程序设计,HASC:MOV A,R0 ;取4位二进制数 ANL A,#0FH ;屏蔽掉高4位 PUSH ACC ;4位二进制数入栈 CLR C ;清进(借)位标志位 SUBB A,#0AH ;用借位标志位的状态判断该数 ; 是在在09之间还是AF之间 POP ACC ;弹出原4位二进制数 JC LOOP ;借位位为1,跳转至LOOP ADD A,#07H ;借位位为0,该数在 ;AF之间,加37H LOOP: ADD A,#30H ;该数在09之间,加30H MOV R2,A ;ASCII码存于R2 RET,3.5.4 子程序设计,【例】 【功能】双字节二进制数转换成BCD码 【分析】BCD码在计算机中又分为两种形式: 非压缩BCD码:1B放1位BCD码,适用于显示和输出 压缩的BCD码:1B放2位BCD码,适用于运算及存储 【入口参数】(R2、R3)=16位无符号二进制整数。 【出口参数】(R4、R5、R6)为转换完的压缩型BCD码,3.5.4 子程序设计,十进制数B与一个8位的二进制数的关系可以表示为: 只要依十进制运算法则,将 bi(i7,6,1,0)按权相加,就可以得到对应的十进制数B。,3.5.4 子程序设计,DCDTH: MOV R7,#16 ;置计数初值 CLR A MOV R6,A MOV R5,A MOV R4,A LOOP : CLR C MOV A,R3 RLC A MOV R3,A ;R3左移1位并送回 MOV A,R2 RLC A MOV R2,A ;R2左移1位并送回 MOV A,R6,3.5.4 子程序设计,ADDC A,R6 DA A MOV R6,A ;(R6)乘2并调整后送回 MOV A,R5 ADDC A,R5 DA A MOV R5,A ;(R5)乘2并调整后送回 MOV A,R4 ADDC A,R4 DA A MOV R4,A ;(R4)乘2并调整后送回 DJNZ R7,LOOP RET,3.5.4 子程序设计,3. 滤波子程序 1) 中值滤波 中值滤波是对某一被测参数连续采样N次,把N次采样值按大小排列,取中间值为本次采样值。中值滤波能有效地克服偶然因素引起的波动或采样器不稳定引起的误码等脉冲干扰。 【例】 【功能】对采样值中值滤波。 【入口参数】SAMP为存放采样值的内存单元首地址,(R3)为采样值个数。 【出口参数】DATA为存放滤波值的内存单元地址。,3.5.4 子程序设计,SORT: DEC R3 ;设置外循环次数 MOV A,R3;保存外循环次数,计算中值地址 PUSH A LOP1: MOV A,R3;设置外循环次数 MOV R2,A MOV R0,#SAMP MOV R1,#SAMP+1 LOP2: MOV A,R1 CLR C SUBB A,R0;(R1)-(R0)(A) JNC DONE ;(R1)(R0)不交换 MOV A, R0;(R1)(R0)交换 XCH A, R1 MOV R0, A,3.5.4 子程序设计,DONE : INC R0 ;数据指针加1 INC R1 DJNZ R2,LOP2 DJNZ R3,LOP1 CLR C POP A RRC A ADD A, #SAMP ;计算中值地址 MOV R0, A MOV DATA, R0 ;存放滤波值 RET,3.5.4 子程序设计,2) 均值滤波子程序 均值滤波程序有多种如算术平均值滤波法、去极值均值滤波法、滑动平均值法等。算术平均值滤波法是连续N次采样,得到N个值,然后取算术平均。 【例】 【功能】对已知采样值为单字节,连续采样8次,对采样值进行算术平均值滤波。 【入口参数】(R0)=采样首值地址指针,(R1)=采样次数。 【出口参数】(R2)=平均值。,3.5.4 子程序设计,F4: CLR A ;清累加器 MOV R2, A MOV R3, A MOV A, R1 PUSH A FL40: MOV A, R0 ;取一个采样值 ADD A, R3 ;累加到R2、R3中 MOV R3, A CLR A ADDC A, R2 MOV R2, A INC R0 DJNZ R1, FL40 ;累加完8次,3.5.4 子程序设计,FL41: POP A CLR C FL42:RRC A JNC FL43 RET FL43:PUSHA CLR C MOV A,R2 RRC A MOV R2,A MOV A,R3 RRC A MOV R3,A POP A SJMP FL42,3.5.4 子程序设计,3) 惯性滤波子程序 最常用的、简单惯性滤波为一阶惯性滤波,如图3.14所示,即RC模拟低通滤波器。 图3.14 RC模拟低通滤波器,3.5.4 子程序设计,一阶惯性滤波算法的程序流程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 健康管理考试口诀及答案
- 高数题库及答案资源
- 2025年森林管护工考试题及答案
- 成长足迹课件
- 2025年重庆地理补考试卷及答案
- 特岗化学考试真题及答案
- 情景剧表演课课件
- 护理员理论考试题及答案
- 瑜伽导师考试题目及答案
- 火车司机选拔考试题及答案
- 2025广东中山大学附属第一医院惠亚医院事业编制人员招聘37人(第二批次)笔试备考试题及答案解析
- 精神卫生防治业务技能竞赛理论试题库300题(含答案)
- 校服专业知识培训内容课件
- 2025年生物制药靶点发现与验证技术临床试验监管政策报告
- 2025年全国质量月数智驱动筑基强链创新质量生态宣传
- 2025海航航空食品(北京)有限公司招聘260人笔试参考题库附答案解析
- 睿卡古筝课件
- 电路维修安全知识培训课件
- 炼铜厂安全知识培训课件
- 2025至2030中国压力袜(弹性袜)行业项目调研及市场前景预测评估报告
- 2026届新高考历史热点冲刺复习秦统一多民族封建国家的建立
评论
0/150
提交评论