求单片机99-0减法单片机计数器程序序 要汇编语言

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机“0~99”加法计数器程序设计--51单片机原理及应用
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口当前位置: >>
第4章 MCS-51单片机汇编语言程序设计
第四章 MCS-51单片机汇编语言程序设计【学习目的和要求】 ?了解汇编语言程序设计中的顺序结构、分支结构、 循环结构程序和子程序的设计方法。 ?掌握代码转换和算术运算程序的基本编程方法和 一些常用的子程序段,能正确地使用MCS-51指令 编制汇编语言程序。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.1 汇编语言程序设计方法4.2 代码转换类程序4.3 运算类程序 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.1 汇编语言程序设计方法汇编语言特点:高效、便捷 用汇编语言编写一个程序的过程分为3步:(1) 分析课题,确定计算方法、运算步骤和顺序,画出流 程图。 (2) 确定数据,包括工作单元的数量,分配存放单元。 (3) 按所使用计算机的指令系统,根据流程图编写汇编语 言程序。基本结构形式:顺序结构、循环结构、分支结构、子程序结构。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计1、顺序程序顺序程序的特点和设计方法:1.结构比较简单,按程序编写顺序依次执行,程 序流向不变。2.使用数据传送类指令较多,程序中没有控制转 移类指令。3.可作为复杂程序中的某一组成部分。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-1】双字节二进制数求补。程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。开始程序清单:BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3(R2)→A 取反加1(A)→R2(R3)→A 取反,加进位(A)→R3 返回 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计2.分支程序分支程序的特点和设计方法:1.程序中包含无条件转移、条件转移和散转指令。 2.单分支程序有一个入口、两个出口,一般用无条件转 移和条件转移指令来实现。其结构形式有两种:一种是 当条件满足时,执行A段处理程序,否则执行B段处理程 序。另一种是当条件满足时,跳过A段处理程序,直接 执行B段处理程序,否则顺序执行A段和B段处理程序。 3.分支程序的出口有两个以上时,一般用散转指令来实 现。其实现方法有四种,分别是转移指令表法、地址偏 移量表法、转向地址表法和利用RET指令法。 4.分支程序允许嵌套,即一个分支接一个分支,形成树 状多分支结构。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-2】设变量x存放在VAR单元之中,函数 值 y存放在FUNC中,按下式给y赋值:x ? 0 ?1, ? y ? ?0, x ? 0 ? ? 1, x ? 0 ?开始 取自变量A程序清单:VAR EQU 30H FUNC EQU 31H START:MOV A,VAR JZ COMP JNB ACC.7, POSI MOV A,#0FFH SJMP COMP POSI: MOV A, #01H COMP:MOV FUNC, A END ;取x ;为0,转COMP ;&0,转POSI ;&0,-1送入A ;+1送入A(A)=0 Y N (A)&0 Y N (A)= -1 (A)=1保存结果 结束 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-3】32个分支转移程序。根据入口条件转移到32个 目的地址。 入口:(R3)=转移目的地址的序号00H-1FH。 出口:转移到相应子程序入口。开始程序清单:送转移地址序号A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31散转生成正确偏移号置换指令地址表首址转入R3指示的程序AJMP……AJMP 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计3.循环程序包括:循环初始化、循环处理、循环控制开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值图4-4 循环程序流程图的两种组织方式 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计分类:单重循环程序、多重循环程序循环程序的特点和设计方法:1.结构紧凑,占用存储单元较少,程序中间有分支。 2.凡是分支程序中可以使用的控制转移指令,循环程序一般都 可以使用。 3.循环控制有多种形式,较常用的是计数循环和条件循环两种 形式。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-4】若Xi均为单字节数,并按i(i=1~n)的顺序存放在内部 RAM从50H开始的单元中,n放在R2中,要求将它 们 的和(双字节)放在R3、R4中。 入口:Xi存放在从50H开始的单元; n放在R2中。 开始 出口:和存放于R3、R4中置初值程序清单:ADD1: MOV R3,#00H ;清和存储单元 MOV R4,#00H MOV R2,# n ;置循环计数初值 MOV R0,#50H LOOP: MOV A, R4 ;取部分和低位 ADD A,@R0 ;与Xi相加 MOV R4,A INC R0 ;Xi地址加1 CLR A ADDC A, R3 ;低位字节向高位进位 MOV R3,A DJNZ R2,LOOP ;未加完继续重复 END取部分和低字节 与下一个数相加 部分和→R4 Xi 地址加1 部分和高字节加上进位 部分和→R3 NR2-1=0 Y 结束 第 【例4-5】已知8051单片机使用的晶振为6MHz,要求设计一 四 个软件延时程序,延时时间为10ms。 该延时程序实际上是一个双重循 章 环程序。内循环的预定值 延时程序的延时时间主要与所用晶振频率和延时程序中的循MT尚需计算: 环次数有关。由晶振频率为6MHz可知,一个机器周期为2 。 (1+1+2) ×2× MT=1000(μ 入口:(R0)=毫秒数;(R1)=1ms延时预定值。 开始 s) 出口:定时到,退出程序。 MT=125=7DH单 片 机 汇 编 语 言 程 序 设 计MCS-51程序清单:ORG 2000H 周期数 MOV R0, #0AH ;毫秒数→R0 1 DL2: MOV R1, #MT ;1ms延时值→R1 1 DL1: NOP 1 NOP 1 DJNZ R1,DL1 ;1ms延时循环 2 用7DH代替程序中的MT,则该程序执行后,能实 2 DJNZ R0,DL2 ;10ms延时循环 现10ms的延时。若考虑其他指令的时间因素,则 END N 该段延时程序的精确延时时间应为: 1× μs +{(1+2)× μs +(1+1+2)× μs 2 2 2 × 125}× 10=10062(μs )延迟毫秒数→R0MT→R1R1-1=0 Y R0-1=0 Y 结束N 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4、子程序设计子程序的特点和设计方法:1.子程序的第一条指令的地址成为子程序的入口地址,该指令 前应有标号。 2.在主程序中用调用指令调用子程序,在子程序末尾用返回指 令从子程序返回到主程序。 3.在子程序的开始,使用压栈指令把需要保护的内容压入堆栈; 在返回主程序前,使用弹出指令把堆栈中保护的内容送回原 来的寄存器或存储单元中。 4.在子程序中尽量使用相对转移指令,以便子程序放在内存的 任何区域都能被主程序调用。 5.子程序的入口参数由主程序通过相关的工作寄存器、特殊功 能寄存器、片内RAM或堆栈等传递给子程序;子程序的出口 参数由子程序通过相关的工作寄存器、特殊功能寄存器、片 内RAM或堆栈等传递给主程序。 第 【例4-6】用程序实现 c ? a ? b ,设a、b、c分别存于内部RAM 四 的30H、31H、32H 单元。 章 主程序清单: 开始2 2单 片 机 汇 编 语 言 程 序 设 计MCS-51STAR: MOV ACALL MOV MOV ACALL ADD MOV SJMPA,30H SQR R1,A A,31H SQR A,R1 32H,A $;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果子程序清单:SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END子程序入口条件:(A)=待查表的数。 出口条件:(A)=平方值。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.2 代码转换类程序(1) 双字节二进制数转换成BCD数。转换方法:因为 ?a 15 a 14 ... a 1 a 0 ? 2 ? ?... ?0 ? 2 ? a 15 ? ? 2 ? a 14 ... ? ? 2 ? a 0所以将二进制数从最高位逐次左移入 BCD码寄存器的最低位,并且每次都 实现 ?... ? ? 2 ? a i 的运算。共循环 16次,由R7控制。 入口: R3R2(16位无符号二进制整数)。N 开始 BCD码寄存器清0 设循环指针二进制数左移1位,移入C(? ? ) ? 2 ? a循环次数到? Y 返回i出口: R6(万位)、R5(千位、百位)、R4(十值、个位)存放5位BCD码。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计程序清单:BCBCD: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H LP0: CLR C MOV A,R2 RLC A MOV R2,A MOV A, R3 RLC A MOV R3,A MOV A, R4 ADDC A, R4 DA A MOV R4,A MOV A, R5 ADDC A, R5 DA A MOV R5,A MOV A, R6 ADDC A, R6 DA A MOV R6,A DJNZ R7, LP0 RET ;BCD码寄存器清零;设循环指针 ;C清0 ;取16位无符号数低字节 ;低字节带进位左移 ;左移结果保存在R2中 ;取16位无符号数高字节 ;高字节带进位左移 ;左移结果保存在R3中 ;实现?... ? ? 2 ? a i 的运算 ;(R4)+(R4)=(R4)×2,带进位相加,C中为ai ;十进制调整;(R5)+(R5)=(R5)×2;(R6)+(R6)=(R6)×2 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计(2)BCD数转换成双字节二进制数。 转换方法:因为 ?d3d 2 d 1 d 0 ? BCD ? ?? d 3 ? 10 ? d 2 ? ? 10 ? d 1 ? ? 10 ? d 0,而d i ? 1 ? 10 ? d i运算可编成子程序。开始开始 高位BCD→A 乘以10 加低位BCD数 存结果(b)子程序框图入口:R5(千位,百 位)、R4(十位,个位) 为BCD码。 出口:R5R4(16位 无符号二进制整数)。取 高 字 节 BCD数 调用子程序结 果 ×1 0 0 取 低 字 节 BCD数 调用子程序两结果相加存结果(a )主 程 序 框 图 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计程序清单: BCDB: MOV MOV ACALL MOV MUL MOV XCH MOV MOV MOV ACALL ADD MOV MOV ADDC MOV HERE: SJMP 子程序清单: BCDB1: MOV ANL SWAP MOV MUL MOV MOV ANL ADD MOV RETA,R5 R2,A BCDB1 B,#64H AB R6,A A,B R5,A A,R4 R2,A BCDB1 A,R6 R4,A A,R5 A,#00H R5,A HERE A,R2 A,#0F0H A B,#0AH AB R3,A A,R2 A,#0FH A,R3 R2,A;取千位、百位BCD码 ;调用子程序 ;乘以100 ;乘积低8位送R6 ;交换乘积高、低位 ;乘积高位送R5 ;取十位、个位BCD码 ;送入R2 ;调用子程序 ;加千位、百位乘积低8位 ;送入R4 ;乘积高8位送A ;加进位位 ;存结果;取BCD码 ;屏蔽低4位;高位BCD码乘以10 ;乘积送R3 ;取BCD码 ;屏蔽高4位 ;高位加低位BCD码 ;送R2 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计(3) 4位二进制数转换为ASCII码。 转换方法:数字0~9的ASCII码分别是30H~39H;英文大写字母A~F的ASCII码分别是41H~46H。 可见数字0~9的ASCII码与数字值相差30H。字母 A~F的ASCII码与其数值相差37H。转换过程中, 若4位二进制数小于10,则此二进制数加上30H, 若大于或等于10,则加上37H。 入口:(R2) = 4位二进制数。 出口:(R2) = 转换后的ASCII码。 程序清单:BINASC:MOV A,R2 ANL A,#0FH CLR C CJNE A, #0AH,LP LP: JC LOOP ADD A,#07H LOOP: ADD A,#30H MOV R2,A RET ;取4位二进制数 ;屏蔽高4位 ; ;该数&10转到LOOP开始 取出4位二进制数 屏蔽高4位 是否≥10 N Y (A)+07H→A(A)+30H→A 存结果ASCII码 返回 图4-10 二进制数转换为 ASCII码程序流程图;ASCII码→(R2) 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计(4) ASCII码转换为4位二进制数。 转换方法:为4位二进制数转换为ASCII码的逆过程。 入口:(R2) = ASCII码。 出口:(R2) = 转换后的二进制数。程序清单: ASCBIN:MOV CLR SUBB MOV SUBB MOV JC MOV SUBB LOOP: MOV RET A,R2 C A,#30H R2,A A,#0AH A, R2 LOOP A,R2 A,#07H R2,A ;取ASCII码 ;ASCII码减去30H ;得二进制数→(R2) ; 减30H结果→A ;&10,转LOOP ;&10,再减去07H ;存结果开始 取ASCII码ASCII码减30H是否&10 N 再减去07H 存结果 返回Y 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3 运算类程序4.3.1 定点数运算程序设计定点数的表示方法:定点数就是小数点固定的数。它可以分为整数、小数、 混合小数等。按数的正负可分为无符号数和有符号数。1、有符号数的表示方法(1)原码表示法 (2)补码表示法如果在一个无 符号数中增加 一个符号位, 就可以表示数 的正负。符号 位为0表示该数 是正数;符号 位为1表示该数 为负数。引入补码后,在 数的前面加一位 符号位,该位为0 表示正数,为1表 示负数。对于正 数,数值表示法 不变;对于负数, 采用该数的补码 来表示。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-7】双字节数取补子程序 功能:(R4R5)取补 → ( R4R5)入口:R4R5中存放被取补数 出口:取补后数仍存放在R4R5中程序清单:CMPT: MOV CPL ADD MOV MOV CPL ADDC MOV RETA, R5 A A, #1 R5, A A, R4 A A, #0 R4, A;取低8位数;低8位取补后送R5 ;取高8位数 ;取反 ;加进位位 ;高8位数取补后送R4 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计2. 带符号数的移位在一个采用位置表示权的数制中,数的左移和右移操作 分别等于乘以和除以基数的操作。由于一般带有符号的数的 最高位为符号位,故在执行算术移位操作时,必须保持最高 位不变,需选择适当的数字移入空位置。以带符号的二进制 数为例: 1. 正数:由于正数的符号位为0,故左移或右移都移入0。 2. 原码表示的负数:由于负数的符号位为1,故移位时 符号不应参加移位,并保证左移或右移都移入0。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-8】双字节原码左移一位子程序。 功能:(R2R3)左移一位→ ( R2R3),不改变符号位, 不考虑溢出 入口:原码双字节存放在R2R3中 出口:左移后仍存放在R2R3中程序清单: DRL1: MOV CLR RLC MOV MOV RLC MOV MOV RET A,R3 C A R3,A A,R2 A A.7,C R2,A ;取低8位 ;清进位位 ;带进位左移 ;低8位左移一位送R3 ;取高8位 ;带进位左移 ;恢复符号位 ;高8位左移后送R2 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-9】双字节原码右移一位子程序。 功能:(R2R3)右移一位→ ( R2R3),不改变符号位, 不考虑溢出 入口:原码双字节存放在R2R3中 出口:右移后仍存放在R2R3中程序清单: DRR1: MOV MOV CLR RRC MOV MOV RRC MOV RET A, R2 C, A.7 A.7 A R2,A A, R3 A R3,A ;取高8位 ;A.7送入CY ;A.7位清0 ;高8位带进位右移,恢 复符号位 ;取低8位 ;低8位带进位右移一位 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计3、补码表示的负数:补码表示的负数的左移操作与原码相同,低位移入0。右移时,最高位应移入1。【例4-10】双字节补码右移一位子程序。 功能:(R2R3)右移一位→ ( R2R3),不改变符号位 入口:双字节补码存放在R2R3中 出口:右移后仍存放在R2R3中程序清单: CRR1: MOV MOV RRC MOV MOV RRC MOV RET A, R2 C, A.7 A R2,A A,R3 A R3,A ;取高8位 ;暂存符号位 ;高8位带进位右移,将符号 位移进A.7 ;高8位移位后送R2 ;取低8位 ;低8位带进位右移 ;送R3 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3.2 定点数加减运算【例4-11】双字节补码加法子程序。 功能: (R2R3)+(R6R7)→ ( R4R5) 入口:R2R3存放被加数,R6R7存放加数 出口:结果存放在R4R5中出口时OV=1表示溢出 程序清单: NADD: MOV ADD MOV MOV ADDC MOV RET A,R3 A,R7 R5,A A,R2 A,R6 R4,A ;取被加数低8位 ;与加数低8位相加 ;低8位之和送入R5 ;取被加数高8位 ;与加数高8位带进位相加 ;高8位和送R4 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-12】双字节补码减法子程序。 功能: (R2R3)-(R6R7)→ ( R4R5)入口:R2R3存放被减数,R6R7存放减数 出口:结果存放在R4R5中出口时OV=1表示溢出 程序清单: NADD: MOV CLR SUBB MOV MOV SUBB MOV RET A,R3 C A,R7 R5,A A,R2 A,R6 R4, A ;取被减数低8位 ;清进位位 ;低8位相减 ;结果送R5 ;取被减数高8位 ;高8位带借位相减 ;结果送R4 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3.3 定点数乘法运算1. 无符号数二进制乘法用重复加法作乘法的过程可叙述如下: 1. 2. 3. 4. 5. 清0累计积 从最低位开始检查各个乘数位。 如乘数位为1,加被乘数至累计积,否则不加。 左移一位被乘数。 重复步骤(1)~(4)n次。(n为字长)。实际用程序实现这一算法时,把乘数与结果联合 组成一个双倍字长,将左移被乘数改为右移结果与乘 数。一方面可化简加法(只需要单字长运算),另一 方面可用右移来完成乘数最低位的检查,得到的乘积 为双倍字长。程序框图如图4-12所示。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计N无符号数乘法开始 0―&R4R5 16―&R0 0―&C0―&乘积单元 移位计数值―&计数器 0―&进位位部分积和乘数右移一位CR4R5R6R7右移一 位―&R4R5R6R7C N C =1? Y (R4R5)+(R2R3)―&R4R5 N移出位=1? Y 加被乘数到部分积计数器减1R0-1―&R0计数器=0? Y 积右移一位N(R0)=0? Y CR4R5R6R7右移一 位―&R4R5R6R7C返回 返回 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-13】采用重复相加法的双字节无符号乘法。功能:(R2R3)×(R6R7)→(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:结果存放在R4R5 R6R7中 程序框图如图4-13所示。 程序清单:NMUL: MOV MOV MOV CLR NMLP: MOV RRC MOV MOV RRC MOV MOV RRC MOV MOV R4,#0 R5,#0 R0,#16 C A,R4 A R4,A A ,R5 A R5,A A, R6 A R6,A A, R7 ;R4,R5清0 ;16位二进制数 ;CR4R5R6R7右移一位 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计RRC MOV JNC MOV ADD MOV MOV ADDC MOV NMLN: DJNZ MOV RRC MOV MOV RRC MOV MOV RRC MOV MOV RRC MOV RETA R7,A NMLN A, R5 A,R3 R5,A A,R4 A,R2 R4,A R0,NMLP A, R4 A R4,A A, R5 A R5,A A, R6 A R6,A A, R7 A R7,A;C中为移出的乘数最低位 ; ;C不为1,转NMLN ;C为1,(R4R5)+(R2R3);循环16次 ;CR4R5R6R7再右移一位 将C移入(R4).7 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计2. 有符号数二进制乘法(1)原码乘法 对原码表示的带符号二进制数,按正数与正数相乘为正, 正数与负数相乘为负,负数与负数相乘为正的原则,得出积 的符号(计算机中可用异或操作得出积的符号),然后清0 符号位,执行不带符号位的乘法,最后送积的符号。设被乘数A的符 号为A0,数值为A, 乘数B的符号位为B0, 数值为B,积C的符 号位为C0,数值为C, 这个算法可用图414来表示(图中F0 为符号暂存位)。原码乘法 A0 ? B0―&F0 A× B―&CF0―&C0返回 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-14】原码有符号数双字节乘法。 功能:(R2R3)×(R6R7)→(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:积存放在R4R5 R6R7中 说明:所有操作数均为原码,符号位在最高位。 本程序调用例4-13的无符号双字节乘法子程序。 程序清单:MULT: MOV XRL MOV MOV MOV CLR MOV MOV CLR MOV ACALL MOV MOV MOV MOV RET A,R2 A,R6 C,A.7 F0,C A,R2 A.7 R2,A A,R6 A.7 R6,A NMUL A,R4 C,F0 A.7,C R4,A ;取被乘数高8位 ;与乘数高8位异或 ;暂存符号位;取被乘数高8位 ;清符号位后送回R2;取乘数高8位 ;清符号位后送回R6 ;调用无符号乘法 ;取乘积的高8位 ;送积的符号 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计补码乘法0―&符号标志(2)补码乘法被乘数为负? N Y 被乘数取补 符号标志取反采取先变成原码, 然后执行乘法,再由 符号标志确定乘积符 号的方法。乘数为负数? N Y 乘数取补 符号标志取反无符号二进制数乘法符号标志=1? N Y 乘积取补返回 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计3. MCS-51快速乘法MCS-51快速乘法有一条乘法指令:MUL AB。它执行 (A)×(B)―&BA。它进行的是单字节乘以单字节,积为双字 节的运算。由于单字节运算不能满足实际需要,故必需把 它扩展为双字节的乘法。扩展时可按照以字节为单位的竖 式乘法来编程序。【例4-15】无符号双字节快速乘法。功能:(R2R3)×(R6R7)→(R4R5R6R7) 入口:R2R3中存放被乘数,R6R7中存放乘数 出口:积存放在R4R5 R6R7中 计算及原理如下式:× 【R2】 【R6】 【R3R7】H 【R2R7】L 【R3R6】L 【R6】 【R3】 【R7】 【R3R7】L【R2R7】H 【R3R6】H +【R2R6】H 【R2R6】L 【R4】 【R5】【R7】 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计程序清单:QMUL:MOV MOV MUL XCH MOV MOV MUL ADD MOV CLR ADDC MOV MOV A,R3 B,R7 AB A,R7 R5,B B,R2 AB A,R5 R4,A A A,B R5,A A,R6;(R3)×(R7) ;(R7)=(R3×R7)L ;(R5)=(R3×R7)H ;(R2)×(R7);(R5)=(R2×R7)H 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计MOV MUL ADD XCH XCH ADDC MOV MOV MOV MUL ADD MOV CLR MOV MOV ADDC MOV RETB,R3 AB A,R4 A,R6 A,B A,R5 R5,A F0,C A, R2 AB A, R5 R5,A A A.0,C C, F0 A, B R4,A;(R3)×(R6);暂存Cy;(R2)×(R6);加以前加法的进位; (R2×R6) → R4 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3.4 定点数除法运算1.无符号二进制数除法1(商)除法移位次数―&计数器被除数左移一位1 0 0 1 0 0 ÷1 0 1=1 D 101
D D 部分余数0被除数 ? 除数? Y 1―&商,减去除数N 0―&商1 0 0 0 部分余数 101 0 1 1 余数图4-16 比 较除法流 程图N计数值减1计数器=0? Y 返回手算除法步骤 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计NDIVI【例4-16】采用比较 的无符号双字节除法。功能: (R2R3R4R5)÷(R6R7) →(R4R5) 余数为(R2R3) 入口:R2R3R4R5中存放 被除数,R6R7中 存放除数。 出口:商存放在R4R5, 余数存放在R2R3 中。(R2R3)(R6R7) ? N 计数值16 ―&BY溢出,1―&F0 0 ―& CR2 R3 R4 R5 C 左环移一位C ―&F0(R2R3)―(R6R7 )―&A R1F0 = 1? Y N Y C = 1? N (AR1)―&R2R3(执行减法) (R5)+1―&R5(上商1)(B)―1=0? N Y 0―&F0返回图4-17 无符号双字节除法程序框图 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计程序清单:NDIVI: MOV CLR SUBB MOV SUBB JNC MOV NDVL1:CLR MOV RLC MOV MOV RLC MOV MOV RLC MOV XCH RLC XCH A,R3 C A,R7 A,R2 A,R6 NDVE1 B,#16 C A,R5 A R5,A A,R4 A R4,A A,R3 A R3,A A,R2 A A,R2 ;先比较是否发生溢出;无溢出,进行除法 ;执行左移一位,移入为0;(R3)→R2, (R2) →A ; (R3)→A 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计MOV CLR SUBB MOV MOV SUBB JB JC NDVM1:MOV MOV MOV INC NDVD1: DJNZ CLR RET NDVE1: SETB RETF0,C C A,R7 R1,A A,R2 A,R6 F0,NDVM1 NDVD1 R2,A A,R1 R3,A R5 B,NDVL1 F0F0;保存移出的最高位;(R3) -(R7) →R1 ; (R2) -(R6) →A;执行减法(回送减法结果);上商1 ;循环16次 ;正常出口 ;溢出 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计2.带符号二进制除法(1)原码除法:原码除法在除法前,先求出商的符号,然 后清零符号位,执行不带符号的除法,最后送商的符号。【例4-17】原码带符号双字节除法。功能:(R2R3R4R5)÷((R6R7)→(R4R5) 入口: R2R3R4R5中存放被除数,R6R7中存放除数。 出口: 商存放在R4R5中,余数存放在R2R3中,若溢 出则 F0=1 说明: 操作数均以原码表示,符号位在最高位。 第 程序: 四 IDIV: MOV XRL 章 MOV MCS-51 单 片 机 汇 编 语 言 程 序 设 计A,R2 A,R6 C,A.7 MOV F0,C PUSH PSW MOV A,R2 CLR A.7 MOV R2,A MOV A,R6 CLR A.7 MOV R6,A ACALL NDIVI JB F0,IDVE MOV A,R4 JB A.7,IDVE POP PSW MOV C,F0 MOV A.7,C MOV R4,A RET IDVE: SETB F0 RET;保存符号位;清0被除数符号位;清0除数符号位 ;调用无符号双字节除法子程序(例4.16);回送积的符号;溢出 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计(2)补码除法: 对于补码表示的符号二进制数的除法,可 像补码乘法一样,采用先对负数取补,然后再 执行除法。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3.5 数据极值查找数据极值查找就是在指定的数据区中找出最大值或最小值。【例4-18】已知内部RAM ADRR为起始地址的数据块内数据是无 符号数,数据块长为LEN,找出数据块中最大值并存入MAX单元。入口: R0(数据首地址指针)。 LEN(长度)。 出口: MAX(最大值MAX单元)。程序清单:ORG LEN DATA MAX DATA MOV MOV LOOP: MOV CJNE NEXT1:JC MOV NEXT2:INC DJNZ RET H MAX,#00H R0,#ADDR A,@R0 A,MAX,NEXT1 NEXT2 MAX,A R0 LEN,LOOP;MAX清0 ;数据起始地址 ;数据块中某数送A ;A与MAX比较 ;若A<MAX,则转NEXT2 ;若A≥MAX,则大数送 MAX ;修改数据块指针 ;未完,转LOOP ;返回 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计4.3.6 数据排序数据排序就是使数据区中的数据从小到大排列(升序), 或数据从大到小排列(降序),最常用的是冒泡法。介绍:冒泡法是一种相邻数互换的排序方法,又称两两比较法 执行时从前向后进行相邻数比较,如数据的大小次序与要求顺序不 符时(逆序),就将两个数互换,否则不互换。为进行升序排序, 应通过这种相邻数互换方法,使小的数向前移,大数向后移。如此 从前向后进行一次冒泡(相邻数互换),就会把最大数换到最后; 再进行一冒泡,就会把次大数排在倒数第二的位置;以此类推,对 于n个数,理论上说应进行(n-1)次冒泡才能完成排序。但实际上 有时不到(n-1)次就已排好顺序。判定排序是否完成最简单的方 法是看各次冒泡中是否有互换发生,如果有数据互换,说明排序还 没完成;否则就表示已排好序。为此控制排序结束一般用设置互换 标志的方法,以其状态表示在一次冒泡中有无数据互换进行。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计【例4-19】 假定8个数连续存放在20H为首地址的 内部RAM中,使用冒泡法进行升序排序编程。(单 字节无符号数)设R7为比较次数计数器,初始值为07H,用户标志位 F0为冒泡过程中是否有数据互换的状态标志,F0=0表示 无互换发生,F0=1表示有互换发生。入口:R0(数据区首地址指针)。 R7(比较次数)。 出口:F0作为发生互换的标志, 当无互换时,排序结束。 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计N Y开始互换标志清零 顺序取一个数 指针加1 顺序再取一个数比较后取的数小? N Y 相邻数互换 互换标志置位图4-18 排 序流程图比较一遍? Y 互换标志=1? N返回 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?程序清单如下: SORT: MOV MOV CLR LOOP: MOV MOV INC MOV CLR SUBB JC MOV DEC MOV INC SETB NEXT:DJNZ JB RET R0,#20H ;数据首地址 R7,#07H ;比较次数 F0 ;互换标志清0 A,@R0 ;取前一个数 2BH,A ;存前一个数 R0 2AH,@R0 ;取后一个数 C ;清CY A,@R0;前数减后数 NEXT @R0,2BH R0 @R0,2AH ;两个数交换位置 R0 ;准备下一次比较 F0 ;互换标志置位 R7,LOOP ;下个数比较? F0,SORT ;下一轮比较? 第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计本章小结1. 在进行程序设计时,必须根据实际问题和单片机的特点来确定算 法,然后按照尽可能使程序简短、节省数据存放单元和缩短运算 时间3个原则来编写程序。 2. 汇编语言程序具有四种基本结构形式,顺序结构程序是一种最简 单、最基本的程序,特点是按程序编写的顺序依次执行,程序流 向不变。编写时应注意正确选择指令,提高程序的执行效率;分 支结构程序可以根据程序要求无条件或有条件地改变程序的执行 顺序,选择程序流向。编写分支结构程序主要在于正确使用转移 指令;需多次重复执行某段程序时,可把这段程序设计为循环结 构程序。这种结构可大大缩短程序,提高程序质量;为了使子程 序有―定的通用性,子程序中的操作对象应尽量用地址或寄存器 形式,而不用立即数形式。子程序中如含有转移指令,应尽量用 相对转移指令,以便它不管放在哪个区域,都能正确执行。代码 转换和定点运算子程序是程序设计中经常用到的子程序。使用子 程序可以使整个程序的结构清楚,阅读理解方便,节省程序存储 空间。 3. MCS-51指令系统中,有单字节加、减、乘、除算术运算指令,这 为四则运算编程带来了较大方便。但实际应用中仅有单字节的运 算是不够的,还常常用到双字节及多字节的加、减、乘、除运算 程序。 掌握程序设计的基本方法和这些常用的子程序可以更好地
更多搜索:
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 单片机计数器程序 的文章

 

随机推荐