MCS-51单片机实用子程序库(doc 62页)

合集下载

51单片机实用汇编程序库

51单片机实用汇编程序库

51单片机实用汇编程序库51 单片机实用程序库4、1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮得效果。

实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP、ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A;灭所有得灯MOV A,#11111110BMAIN1:MOV P1,A;开最左边得灯ACALL DELAY ;延时RL A ;将开得灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ30H,D1RETEND4、2 方波输出程序介绍:P1、0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN、ASM):ORG 0000HMAIN:;直接利用P1、0 口产生高低电平地形成方波//////////////ACALL DELAYSETB P1、0ACALL DELAY10CLR P1、0AJMP MAIN;////////////////////////////////////////////////// DEL AY:MOV R1,#0FFHDJNZ R1,$RET五、定时器功能实例5、1 定时1 秒报警程序介绍:定时器1 每隔1 秒钟将p1、o得输出状态改变1次,以达到定时报警得目得。

实际应用例如:定时报警器。

程序实例(DIN1、ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU34H ;时间秒标志,判就是否到50个0、2 秒,即50*0、2=1 秒MOVTMOD,#00000001B;定时器0 工作于方式1MOVTL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05 秒,定时20 次则一秒11SETB EA;开总中断SETB ET0;开定时器0 中断允许SETBTR0 ;开定时0 运行SETB P1、0LOOP: AJMP LOOPDIN0:;就是否到一秒//////////////////////////////////////// INCC:INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPLP1、0;////////////////////////////////////////////////// RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0、05秒,定时20 次则一秒RETIEND5、2 频率输出公式介绍:f=1/ts51 使用12M 晶振,一个周期就是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 得频率为例:200=1/t:推出t=0、005秒,即5000微秒,即一个高电平或低电平得时间为2500微秒。

51单片机实用汇编程序库(word)之欧阳治创编

51单片机实用汇编程序库(word)之欧阳治创编

51 单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOV P1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0 口产生高低电平地形成方波//////////////ACALL DELAYSETB P1.0ACALL DELAY10CLR P1.0AJMP MAIN;//////////////////////////////////////////// //////DELAY:MOV R1,#0FFHDJNZ R1,$RETEND五、定时器功能实例5.1 定时1 秒报警程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0 入口MAIN:TFLA G EQU 34H ;时间秒标志,判是否到50 个0.2 秒,即50*0.2=1 秒MOV TMOD,#00000001B;定时器0 工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05 秒,定时20 次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0 中断允许SETB TR0 ;开定时0 运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒//////////////////////////////////////// INCC: INC TFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;//////////////////////////////////////////// //////RE:MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05 秒,定时20 次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51 使用12M晶振,一个周期是1 微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

51单片机实用汇编程序库(精品)

51单片机实用汇编程序库(精品)

51单片机实用汇编程序库51 单片机实用程序库4.1 流水灯程序介绍:利用P1 口通过一定延时轮流产生低电平输出,以达到发光二极管轮流亮的效果。

实际应用中例如:广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)ORG 0000HAJMP MAINORG 0030HMAIN:9MOV A,#00HMOVP1,A ;灭所有的灯MOV A,#11111110BMAIN1:MOV P1,A ;开最左边的灯ACALL DELAY ;延时RL A ;将开的灯向右边移AJMP MAIN ;循环DELAY:MOV 30H,#0FFHD1: MOV 31H,#0FFHD2: DJNZ 31H,D2DJNZ 30H,D1RETEND4.2 方波输出程序介绍:P1.0 口输出高电平,延时后再输出低电平,循环输出产生方波。

实际应用中例如:波形发生器。

程序实例(FAN.ASM):ORG 0000HMAIN:;直接利用P1.0 口产生高低电平地形成方波//////////////ACALLDELAYSETBP1.0ACALL DELAY10CLRP1.0AJMPMAIN;//////////////////////////////////////////////////DELAY:MOV R1,#0FFHDJNZR1,$RETEND五、定时器功能实例5.1 定时1 秒报警程序介绍:定时器1 每隔1秒钟将p1.o的输出状态改变1次,以达到定时报警的目的。

实际应用例如:定时报警器。

程序实例(DIN1.ASM):ORG 0000HAJMP MAINORG 000BHAJMP DIN0 ;定时器0入口MAIN:TFLA G EQU 34H;时间秒标志,判是否到50个0.2秒,即50*0.2=1 秒MOV TMOD,#00000001B;定时器0 工作于方式1MOV TL0,#0AFHMOV TH0,#3CH ;设定时时间为0.05秒,定时20 次则一秒11SETB EA ;开总中断SETB ET0 ;开定时器0中断允许SETB TR0 ;开定时0运行SETB P1.0LOOP: AJMP LOOPDIN0:;是否到一秒////////////////////////////////////////INCC: INCTFLAGMOV A,TFLAGCJNE A,#20,REMOV TFLAG,#00HCPL P1.0;//////////////////////////////////////////////////RE:MOV TL0,#0AFHMOV TH0,#3CH;设定时时间为0.05 秒,定时20次则一秒RETIEND5.2 频率输出公式介绍:f=1/ts51使用12M 晶振,一个周期是1微秒使用定时器1工作于方式0,最大值为65535,以产生200HZ 的频率为例:200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电12平或低电平的时间为2500 微秒。

MCS-51单片机实用子程序库(4)

MCS-51单片机实用子程序库(4)

MCS-51单片机实用子程序库(4)作者: 来源:51mcu上篇:MCS-51单片机实用子程序库(3)下篇:MCS-51单片机实用子程序库(5)(二)MCS-51浮点运算子程序库及其使用说明本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。

2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、数制转换等子程序。

3.大型库(FQ51.ASM):包含本说明书中的全部子程序。

为便于读者使用本程序库,先将有关约定说明如下:1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节。

如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。

2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。

当尾数的最高位为1时,便称为规格化浮点数,简称操作数。

在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H。

若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。

3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。

当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH。

51单片机实用程序库

51单片机实用程序库

一、前言科技的进步需要技术不断的提升。

一块大而复杂的模拟电路花费了您庞大的精力,繁多的元器件增加了您的成本。

而此刻,只需要一块几厘米见方的单片机,写入简单的程序,就可以够使您以前的电路简单很多。

相信您在利用并掌握了单片机技术后,无论在您此后开发或是工作上,必然会带来意想不到的惊喜。

二、单片机简介我国开始利用单片机是在1982 年,短短五年时刻里进展极为迅速。

1986 年在上海召开了全国首届单片机开发与应用交流会,有的地域还成立了单片微型运算机应用协会,那是全国形成的第一次高潮。

截止今日,单片机应用技术飞速进展,咱们上因特网输入一个“单片机”的搜索,将会看到上万个介绍单片机的网站,这还不包括国外的。

与它相应的专业杂志此刻也有很多,比如由单片机界的权威何立民主编的《单片机与嵌入式系统应用》杂志现以盛行电子界,在2003年7月,(91 猎头网)在上海、广州、北京等大城市所做的一次专业人材需求报告中,单片机人材的需求量位居第一。

一块小小的片子,为何有如此的魔力?咱们第一从它的组成提及:单片机,亦称单片微电脑或单片微型运算机。

它是把中央处置器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要运算机功能部件都集成在一块集成电路芯片上的微型运算机。

运算机的产生加速了人类改造世界的步伐,可是它毕竟体积大。

微运算机(单片机)在这种情形下诞生了,它为咱们改变了什么?纵观咱们此刻生活的各个领域,从导弹的导航装置,到飞机上各类仪表的控制,从运算机的网络通信与数据传输,到工业自动化进程的实时控制和数据处置,和咱们生活中普遍利用的各类智能IC 卡、电子宠物等,这些都离不开单片机。

以前没有单片机时,这些东西也能做,可是只能利用复杂的模拟电路,但是如此做出来的产品不仅体积大,而且本钱高,而且由于长期利用,元器件不断老化,控制的精度自然也会达不到标准。

在单片机产生后,咱们就将控制这些东西变成智能化了,咱们只需要在单片机外围接一点简单的接口电路,核心部份只是由人为的写入程序来完成。

51单片机实用子程序(汇编)

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。

(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。

在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。

程序清单中开列了四个栏目:标号、指令、操作数、注释。

为方便读者理解,注释尽力详细。

子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。

优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。

2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。

有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。

优点是程序紧凑,缺点是需要对子程序库进行仔细删节。

(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

《MCS-1单片机实用子程序库(96年版)》

《MCS-1单片机实用子程序库(96年版)》

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。

(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。

在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。

程序清单中开列了四个栏目:标号、指令、操作数、注释。

为方便读者理解,注释尽力详细。

子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。

优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。

2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。

有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。

优点是程序紧凑,缺点是需要对子程序库进行仔细删节。

(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

MCS-51定点运算子程序库

MCS-51定点运算子程序库

(一) MCS-51定点运算子程序库及其使用说明
定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:
1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数
据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
DEC R1
MOV A,@R0
ADDC A,@R1 ;按字节相加
DA A ;十进制调整
MOV @R0,A ;和存回[R0]中
DJNZ R2,BCD1 ;处理完所有字节
RET
(2) 标号: BCDB 功能:多字节BCD码减法
入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求: 2字节
BCDA: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0 ;调整数据指针
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:
(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
MOV R2,A
RET
(6) 标号: MUL2 功能:双字节二进制无符号数平方

51单片机子程序库

51单片机子程序库
据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MOV A,@R0 ;取一字节
SWAP A ;交换十进制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字节移出的十进制高位
XCHD A,@R0 ;换出本字节的十进制高位
MOV R3,A ;保存本字节的十进制高位
MOV R0,A
RET
(4) 标号: BRLN 功能:多字节BCD码左移十进制一位(乘十)
入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
入口条件:待平方数在R2、R3中。
出口信息:结果在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R5 堆栈需求: 2字节
MUL2: MOV A,R3 ;计算R3平方
MOV B,A
MUL AB
MOV R4,B ;暂存部分积
MOV F0,C ;保存溢出位
LCALL BCDA ;按多字节BCD码加法处理
CPL C ;将补码加法的进位标志转换成借位标志

MCS-51单片机实用子程序库

MCS-51单片机实用子程序库

DJNZ R6,BHD3 ;共计算16bit小数MOV A,R4ADD A,#0B0H ;剩余部分达到0.50否?JNC BHD4 ;四舍INC R3 ;五入MOV A,R3JNZ BHD4INC R2BHD4: RET(24)标号:MM功能:求单字节十六进制无符号数据块的极值入口条件:数据块的首址在DPTR中,数据个数在R7中。

出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。

影响资源:PSW、A、B、R1~R7 堆栈需求:4字节MM: MOV B,R7 ;保存数据个数MOVX A,@DPTR ;读取第一个数据MOV R6,A ;作为最大值的初始值MOV R7,A ;也作为最小值的初始值MOV A,DPL ;取第一个数据的地址MOV R3,A ;作为最大值存放地址的初始值MOV R5,A ;也作为最小值存放地址的初始值MOV A,DPHMOV R2,AMOV R4,AMOV A,B ;取数据个数DEC A ;减一,得到需要比较的次数JZ MME ;只有一个数据,不需要比较MOV R1,A ;保存比较次数PUSH DPL ;保护数据块的首址PUSH DPHMM1: INC DPTR ;指向一个新的数据MOVX A,@DPTR ;读取这个数据MOV B,A ;保存SETB C ;和最大值比较SUBB A,R6JC MM2 ;不超过当前最大值,保持当前最大值MOV R6,B ;超过当前最大值,更新最大值存放地址MOV R2,DPH ;同时更新最大值存放地址MOV R3,DPLSJMP MM3MM2: MOV A,B ;和最小值比较CLR CSUBB A,R7JNC MM3 ;大于或等于当前最小值,保持当前最小值MOV R7,B ;更新最小值MOV R4,DPH ;更新最小值存放地址MOV R5,DPLMM3: DJNZ R1,MM1 ;处理完全部数据POP DPH ;恢复数据首址POP DPLMME: RET(25)标号:MMS功能:求单字节十六进制有符号数据块的极值入口条件:数据块的首址在DPTR中,数据个数在R7中。

汇编子程序库

汇编子程序库

MCS-51单片机实用子程序库1、片内RAM初始化子程序IBCLR: MOV A,R0MOV R1,ACLR AIBC1 : MOV @R1,AINC R1DJNZ R7,IBC1RET2、片外RAM初始化子程序EBCLR1: MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11: MOVX @DPTR,AINC DPTRDJNZ R7,EBC11RET3、片外RAM初始化子程序(双字节个单元)EBCLR2: MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ E BC21INC R6EBC21: CLR AMOVX @DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET4、内部RAM数据复制程序;入口: R0,R7;占用资源: A;堆栈需求: 2字节;出口: R1IBMOV: MOV A,R0ADD A,R7MOV R0,AMOV A,R1ADD A,R7MOV R1,AIBM1 : DEC R0DEC R1MOV A,@R0MOV @R1,ADJNZ R7,IBM1RET5、外部RAM数据复制程序;入口: ADDPH,ADDPL,R7;占用资源: ACC;堆栈需求: 2字节;出口: R0,R1EBMOV1 : MOV A,ADDPLADD A,R7MOV DPL,ACLR AADDC A, ADDPHMOV DPH,AMOV A ,R7ADD A, R1XCH A ,R0ADDC A, #00HMOV P2, AEBM11: DEC R0CJNE R0,#0FFH,EBM12DEC P2EBM12: DEC DPLMOV A,DPLCJNE A,#0FFH,EBM13DEC DPHEBM13: MOVX A,@R0MOVX @DPTR,ADJNZ R7,EBM11RET6、外部RAM数据复制程序;入口: ADDPH,ADDPL,R6,R7;占用资源: ACC;堆栈需求: 2字节;出口: R0,R1EBMOV2 : MOV A,ADDPLADD A,R7MOV DPL,AMOV A,R6ADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,R6MOV P2,AMOV A,R7JZ EBM21INC R6EBM21: DEC R0CJNE R0,#0FFH,EBM22DEC P2EBM22: DEC DPLMOV A,DPLCJNE A,#0FFH,EBM23DEC DPHEBM23: MOVX A,@R0MOVX @DPTR,ADJNZ R7,EBM21DJNZ R6,EBM21RET;外部RAM数据复制到内部RAM程序;入口: ADDPH,ADDPL,R7;占用资源: ACC;堆栈需求: 2字节;出口: R0ITEMOV : MOV A,ADDPLADD A,R7MOV DPL,AMOV A,ADDPHADDC A,#00HMOV DPH,AMOV A,R0ADD A,R7MOV R0,AITEM1 : DEC R0DEC DPLMOV A,DPLCJNE A,#0FFH,ITEM2DEC DPHITEM2 : MOVX A,@DPTRMOV @R0,ADJNZ R7,ITEM1RET;限幅滤波程序;入口: A,SDAT,DELTY;占用资源: B;堆栈需求: 2字节;出口: AJUGFILT : MOV B,ACLR CSUBB A,SDA TJNC JUGFT1CPL AINC AJUGFT1 : SETB ASUBB A,#DELTYJNC JUGFT3MOV A,SDATRETJUGFT3 : MOV A,BMOV SDAT,ARET;中位值滤波程序;入口: ADDPH,ADDPL,N;占用资源: ESELSORT;堆栈需求: 4字节;出口: AMEDFILT : LCALL ESELSORTMOV A,NCLR CRRC AADD A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJNC MEDFT1INC DPHMEDFT1 : MOVX A,@DPTRRET;N点算术平均滤波;入口: ADDPH,ADDPL,N;占用资源: B,R3,R4;堆栈需求: 2字节;出口: AA VFILT : MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR AMOV R3,AMOV R4,AMOV R7,NA VFT1: MOVX A,@DPTRINC DPTRADD A,R4MOV R4,AJNC A VFT2INC R3A VFT2: DJNZ R7,A VFT1MOV R7,NMOV R2,#00HLCALL NDIV31MOV A,R4RET;N点加权平均滤波;入口: ADDPH,ADDPL,N;占用资源: B,R3,R4;堆栈需求: 2字节;出口: AQA VFILT : CLR AMOV R3,AMOV R4,AMOV R7,NMOV P2,ADDPHMOV R1,ADDPLMOV DPTR,#QA VTAB QA VFT1 : MOVC A,@A+DPTRMOV B,AMOVX A,@R1INC DPTRINC R1MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,ADJNZ R7,QA VFT1MOV A,R4JNB ACC.7,QA VFT2INC R3QA VFT2 : MOV A,R3RETQA VTAB : DB;一阶加权滞后滤波程序;入口: A,DELTY;占用资源: B,R3,R4;堆栈需求: 2字节;出口: ABQFILT : MOV B,ACLR AMOV DPTR,#ABTABMOVC A,@A+DPTRMUL ABMOV R4,AMOV R3,BMOV A,#01HMOVC A,@A+DPTRMOV B,DELTYMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,R4JNB ACC.7,FT1INC R3FT1 : MOV A,R3MOV DELTY,ARETBQTAB: DB 80H,80H;双字节取补程序/(R3R4)=(R3R4) ;入口: R3,R4;占用资源: ACC;堆栈需求: 2字节;出口: R3,R4CMPT : MOV A,R4CPL AADD A,#01HMOV R4,AMOV A,R3CPL AADDC A,#00HMOV R3,ARET;N节取补程序/([R0])=([R0]);入口: R0,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0NCMPTN : MOV B,R0SETB CNCPT1: MOV A,@R0CPL AADDC A,#00HMOV @R0,AINC R0DJNZ R7,NCPT1MOV R0,BRET;双字节无符号数加法程序(R3R4+R6R7)=(R3R4) ;入口: R3,R4,R6,R7;占用资源: ACC;堆栈需求: 2字节;出口: R3,R4,CFNADD : MOV A,R4ADD A,R7MOV R4,AMOV A,R3ADD C A,R6MOV R3,ARET;N字节无符号数加法程序([R0]+[R1])=([R0]);入口: R0,R1,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0,CFNADDN: MOV B,R0CLR CNADN1: MOV A,@R0ADDC A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NADN1MOV R0,BRET;双字节无符号数减法程序(R3R4-R6R7)=(R3R4) ;入口: R3,R4,R6,R7;占用资源: ACC;堆栈需求: 2字节;出口: R3,R4NSUB : MOV A,R4CLR CSUBB A,R7MOV R4,AMOV A,R3SUBB A,R6MOV R3,ARET;N字节无符号数减法程序([R0]-[R1])=([R0]);入口: R0,R1,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0,CFNSUBN: MOV B,R0MOV R7,NCLR CNSUBN1 : MOV A,@R0SUBB A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NSUBN1MOV R0,BRET;单字节无符号数乘法程序(R3R4*R7)=(R2R3R4) ;入口: R3,R4,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R2,R3,R4NMUL21 : MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,AADDC A,BMOV R2,ACLR OVRET;单字节无符号数乘法程序(R2R3R4*R7)=(R5R2R3R4);入口: R2,R3,R4,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R5,R2,R3,R4NMUL31 : MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BMOV R5,ACLR OVRET;单字节无符号数乘法程序(R5R2R3R4*R7)=(R7R5R2R3R4) ;入口: R5,R2,R3,R4,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R7,R5,R2,R3,R4NMUL41 : MOV A,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7ADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,R7MUL ABADD A,R2MOV R2,ACLR AADDC A,BXCH A,R5MOV B,R7MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R7,ACLR OVRET;双字节无符号数乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口: R3,R4,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R5,R2,R3,R4NMUL22 : MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABADD A,R5MOV R5,AADDC A,R2MOV R2,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL ABADD A,R2MOV R2,AMOV A,BADDC A,R3XCH A,R5MOV R3,ACLR OVRET;双字节无符号数乘法程序(R2R3R4*R6R7)=(R1R5R2R3R4) ;入口: R2,R3,R4,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R1,R5,R2,R3,R4NMUL32 : MOV A,R4MOV B,R7MUL ABXCH A,R4MOV R5,BMOV B,R6MUL ABADD A,R5MOV R5,ACLR AADDC A,BMOV R1,AMOV A,R3MOV B,R7MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R1MOV R1,ACLR AADDC A,#00HXCH A,R3MUL ABADD A,R1MOV R1,AMOV A,BADDC A,R3XCH A,R5MOV R3,AMOV A,R2MOV B,R7MUL ABADD A,R1MOV R1,AMOV A,BADDC A,R5MOV R5,ACLR AADDC A,#00HXCH A,R2MOV B,R6MUL ABADD A,R5MOV R5,AMOV A,BADDC A,R2XCH A,R1MOV R2,ACLR OVRET;N字节无符号数乘法程序([R0]*[R1])=([R0]) ;入口: R0,R1,M,N;占用资源: ACC,B,R2,R5,R6,R7,NCNT;堆栈需求: 2字节;出口: R0NMULMN : MOV A,MADD A,R0MOV R5,AXCH A,R1XCH A,R5ADD A,NXCH A,R0MOV R6,AMOV B,MMOV NCNT,BNMLMN1 : DEC R0DEC R1CLR AXCH A,@R1MOV @R0,ADJNZ NCNT,NMLMN1MOV NCNT,BNMLMN2 : CLR AXCH A,@R0MOV R2,AMOV A,R6MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNMLMN3 : MOV A,R2MOV B,@R1INC R1MUL ABADDC A,@R0MOV @R0,AINC R0MOV A,BADDC A,@R0MOV @R0,ADJNZ R7,NMLMN3INC R0INC R6DJNZ NCNT,NMLMN2MOV A,R0CLR CSUBB A,MSUBB A,NMOV R0,ARET;单字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;入口: R2,R3,R4,R7;占用资源: ACC,B,F0;堆栈需求: 3字节;出口: (R2),R3,R4,R7,OVNDIV31 : MOV A,R2MOV B,R7DIV ABMOV R2,BMOV B,#10HNDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311POP ACLR OVJZ NDV314SETB OVNDV314 : XCH A,R2MOV R7,ARET;单字节无符号除法程序(R5R2R3R4/R7)=(R5)R2R3R4 余数R7 ;入口: R2,R3,R4,R7;占用资源: ACC,B,F0;堆栈需求: 3字节;出口: (R5),R2,R3,R4,R7,OVNDIV41 : MOV A,R5MOV B,R7DIV ABPUSH AMOV R5,BMOV B,#18HNDV411 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3MOV R3,AMOV A,R2RLC AMOV R2,AMOV A,R5RLC AMOV R5,AMOV F0,CCLR CSUBB A,R7JB F0,NDV412JC NDV413NDV412 : MOV R5,AINC R4NDV413 : DJNZ B,NDV411POP ACLR OVJZ NDV414SETB OVNDV414 : XCH A,R5MOV R7,ARET;双字节无符号除法程序(R5R2R3R4/R6R7)=(R2)R3R4 余数R6R7 ;入口: R5,R2,R3,R4,R6,R7;占用资源: ACC,B,F0;堆栈需求: 4字节;出口: (R2),R3,R4,R6,R7,OVNDIV42 : MOV A,R1PUSH AMOV B,#00HNDV421 : MOV A,R2CLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JC NDV422MOV R5,AMOV A,R1MOV R2,AINC BSJMP NDV421NDV422 : PUSH BMOV B,#10HNDV423 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AXCH A,R5RLC AXCH A,R5MOV F0,CCLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JB F0,NCV424JC NDV425NCV424 : MOV R5,AMOV A,R1MOV R2,AINC R4NDV425 : DJNZ B,NDV423POP ACLR OVJNZ NDV426SETB OVNDV426 : XCH A,R2MOV R7,AMOV A,R5MOV R6,APOP AMOV R1,ARET;N字节无符号除法程序(组合) ([R0]/[R1])=([R0]);入口: R0,R1,M,N;占用资源: ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN ;堆栈需求: 4字节;出口: R0;NDIVMN : MOV A,MCLR CSUBB A,NMOV NCNT,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00H NDVMN1 : MOV R7,NLCALL NSUBNMOV A,R5MOV R1,AJC NDVMN2INC R2SJMP NDVMN1 NDVMN2 : MOV R7,NLCALL NADDNMOV A,NCNTSWAP ARR AMOV NCNT,A NDVMN3 : MOV A,R3MOV R0,AMOV R7,MLCALL NRLCNMOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NLCALL NSUBNJB F0,NDVMN4JC N DVMN5 NDVMN4 : MOV A,R3MOV R0,AINC @R0SJMP NDVMN6 NDVMN5 : MOV A,R5MOV R1,AMOV R7,NLCALL NADDNNDVMN6 : DJNZ NCNT,NDVMN3MOV A,R4MOV R1,AMOV A,R2MOV @R1,AMOV A,R3MOV R0,ARET;N字节无符号除法程序(集成) ([R0]/R[1])=([R0]) ;入口: R0,R1,M,N;占用资源: ACC,R2,R3,R4,R5,R7,F0;堆栈需求: 2字节;出口: R0NDIVMN : MOV A,MCLR CSUBB A,NMOV B,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00HNDVMN1 : MOV R7,NCLR CNDVMN2 : MOV A,@R0SUBB A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NDVMN2MOV A,R4MOV R0,AMOV A,R5MOV R1,AJC NDVMN3INC R2SJMP NDVMN1NDVMN3 : MOV R7,NCLR CNDVMN4 : MOV A,@R0ADDC A,@R1MOV @R0,AINC R1DJNZ R7,NDVMN4MOV A,#08HMUL ABMOV B,A NDVMN5 : MOV A,R3MOV R0,AMOV R7,MCLR CNDVMN6 : MOV A,@R0RLC AMOV @R0,AINC R0DJNZ R7,NDVMN6MOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNDVMN7 : MOV A,@R0SUBB A,@R1MOV @R0,AINC R0INC R1DJNZ R7,NDVMN7JB F0,NDVMNBJC NDVMN8 NDVMNB : MOV A,R3MOV R0,AINC @R0SJMP NDVMNA NDVMN8 : MOV R7,NMOV A,R4MOV R0,AMOV A,R5MOV R1,ACLR CNDVMN9 : MOV A,@R0ADDC A,@R1MOV @R0,AINC R0DJNZ R7,NDVMN9NDVMNA : DJNZ B,NDVMN5MOV A,MCLR CSUBB A,NADD A,R3MOV R1,AMOV A,R2MOV @R1,AMOV A,R3MOV R0,ARET;N字节数据左移程序RLC([R0])=(CF[R0]);入口: R0,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0,CFNRLCN: MOV B,R0CLR CNRLN1: MOV A,@R0RLC AMOV @R0,AINC R0DJNZ R7,NRLN1MOV R0,BRET;原码有符号双字节减法程序(R3R4-R6R7)=R3R4 ;入口: R3,R4,R6,R7;占用资源: ACC,DADD;堆栈需求: 6字节;出口: R3,R4,OVDSUB : MOV A,R6CP ACC.7MOV R6,ALCALL DADDRET;原码有符号双字节加法程序(R3R4+R6R7)=R3R4 ;入口: R3,R4,R6,R7;占用资源: ACC,SR0,NADD,NSUB,CMPT;堆栈需求: 4字节;出口: R3,R4,OVDADD : MOV A,R3MOV C,ACC.7XRL A,R6MOV C,ACC.7MOV A,R3CLR ACC.7MOV R3,AMOV A,R6CLR ACC.7MOV R6,AJC DAB2LCALL NADDMOV A,R3JB ACC.7,DABEDAB1 : MOV C,SR0MOV ACC.7,CMOV R3,ACLR OVRETDABE : SETB OVRETDAB2 : LCALL NSUBMOV A,R3JNB ACC.7,DAB1LCALL CMPTCPL SR0SJMP DAB1;原码有符号双字节乘法程序(R3R4*R6R7)=(R5R2R3R4) ;入口: R3,R4,R6,R7;占用资源: ACC,SR0,NMUL22;堆栈需求: 4字节;出口: R5,R2,R3,R4IMUL : MOV A,R3XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R3CLR ACC.7MOV R3,AMOV A,R6CLR ACC.7MOV R6,ALCALL NMUL22MOV A,R5MOV C,SR0MOV R5,ARET;原码有符号双字节除法程序(R5R2R3R4/R6R7)=(R3R4) 余数(R6R7) ;入口: R5,R2,R3,R4;占用资源: ACC,SR0,NDIV42;堆栈需求: 6字节;出口: R3,R4,R6,R7,OVIDIV : MOV A,R5XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R5CLR ACC.7MOV R5,AMOV A,R6CLR ACC.7MOV R6,ALCALL NDIV42MOV A,R3JB ACC.7,IDIVEJB OV,IDIVEMOV C,SR0MOV ACC.7,CMOV R3,ARETIDIVE: SETB OVRET;单字节顺序查找程序;入口: R0,R1,A,R7;占用资源: B;堆栈需求: 2字节;出口: R0,R1,AFINDB1 : MOV B,AMOV DPL,R1MOV DPH,R0FINDB11 : MOVX A,@DPTRCJNE A,B,FINDB12MOV R1,DPLMOV R0,DPHCLR ARETFINDB12 : INC DPTRDJNZ R7,FINDB11RET;单字节顺序查找程序;入口: R0,R1,A,R6,R7;占用资源: B;堆栈需求: 2字节;出口: R0,R1,AFINDB2 : MOV B,AMOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDB21INC R6FINDB21 : MOVX A,@DPTRCJNE A,B,FINDB22MOV R1,DPLMOV R0,DPHCLR ARETFINDB22 : INC DPTRDJNZ R7,FINDB21DJNZ R6,FINDB21MOV A,#0FFHRET;双字节字符串顺序查找程序;入口: R0,R1,R3,R4,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0,R1,AFINDS1 : MOV DPL,R1MOV DPH,R0FINDS11 : MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS12MOVX A,@DPTRSUBB A,R3JNZ FINDS12MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHMOV R0,ACLR ARETFINDS12 : DJNZ R7,FINDS11MOV A,#0FFHRET;双字节字符串顺序查找程序;入口: R0,R1,R3,R4,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0,R1,AFINDS2 : MOV DPL,R1MOV DPH,R0MOV A,R7JZ FINDS21INC R6FINDS21 : MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS22MOVX A,@DPTRSUBB A,R3JNZ FINDS22MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDS22 : DJNZ R7,FINDS21DJNZ R6,FINDS21MOV A,#0FFHRET;N字节字符串顺序查找程序;入口: ADDPH,ADDPL,R0,R6,R7,N;占用资源: ACC,B,R2,NCNT;堆栈需求: 2字节;出口: ADDPH,ADDPL,AFINDN: MOV A,R0MOV R2,AMOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ FINDN1INC R6FINDN1 : MOV A,R2MOV R0,AMOV A,NMOV NCNT,AFINDN2 : MOVX A,@DPTRCLR CSUBB A,@R0JNZ FINDN3INC DPTRINC R0DJNZ NCNT,FINDN2MOV A,DPLCLR CSUBB A,NMOV ADDPL,AMOV A,DPHSUBB A,#00HMOV ADDPH,ACLR ARETFINDN3 : CLR CMOV A,R0SUBB A,R2JNZ FINDN4INC DPTRFINDN4 : DJNZ R7,FINDN1DJNZ R6,FINDN1MOV A,#0FFHRET;单字节最值查找程序;入口: R0,R1,R6,R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R0(最大值),R1(最小值),R2,R3,R4,R5 FMAMIB : MOV DPL,R1MOV DPH,R0MOVX A,@DPTRMOV R0,AMOV R1,AMOV A,DPLMOV R3,AMOV R5,AMOV A,DPHMOV R2,AMOV R4,AMOV A,R7JZ FMMB1INC R6FMMB1: MOVX A,@DPTRMOV B,ASETB CSUBB A,R0JC FMMB2MOV R0,BMOV R3,DPLMOV R2,DPHSJMP FMMB3 FMMB2: MOV A,BCLR CSUBB A,R1JNC FMMB3MOV R1,BMOV R5,DPLMOV R4,DPH FMMB3: INC DPTRDJNZ R7,FMMB1DJNZ R6,FMMB1RET;浮点数顺序查找程序;入口: R0,R1,R2,R3,R4,R6,R7 ;占用资源: B,NCNT,FCMP;堆栈需求: 2字节;出口: R0,R1,AFINDF: MOV DPL,R1MOV DPH,R0MOV A,R7MOV B,AMOV NCNT,R6JZ FINDF1INC NCNTFINDF1 : MOVX A,@DPTRINC DPTRMOV R5,AMOVX A,@DPTRINC DPTRMOV R6,AMOVX A,@DPTRINC DPTRMOV R7,ALCALL FCMPJNZ FINDF2MOV A,DPLCLR CSUBB A,#03HMOV R1,AMOV A,DPHSUBB A,#00HMOV R0,ACLR ARETFINDF2 : DJNZ B,FINDF1DJNZ NCNT,FINDF1MOV A,#0FFHRET;浮点数最值查找程序;入口: ADDPH,ADDPL,R6,R7;占用资源: ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP ;堆栈需求: 5字节;出口: [R0](最大值),[R1](最小值),R2,R3,R4,R5FMAMIF : MOV A,ADDPLMOV R3,AMOV R5,AMOV DPL,AMOV A,ADDPHMOV R2,AMOV R4,AMOV DPH,AMOV B,R7MOV R7,#03HLCALL ITEMOVMOV R7,#03HLCALL IBMOVMOV A,BJZ FMMF1INC NCNTFMMF1: PUSH BMOVX A,@DPTRINC DPTRMOV R2,AMOVX A,@DPTRINC DPTRMOV R3,AMOVX A,@DPTRINC DPTRMOV R4,ALCALL MOVR1LCALL FCMPJNC FMMF2MOV A,R0XCH A,R1MOV R0,ALCALL MOVBMOV R5,DPLMOV R4,DPHMOV A,R0XCH A,R1MOV R0,ASJMP FMMF3 FMMF2: MOV A,R0XCH A,R1MOV R0,ALCALL MOVR1LCALL FCMPMOV A,R0XCH A,R1MOV R0,AJZ FMMF3JC FMMF3LCALL MOVBMOV R3,DPLMOV R2,DPH FMMF3: POP BDJNZ B,FMMF1DJNZ NCNT,FMMF1RET;单字节折半查找程序;入口: A,R0,R1,R6,R7;占用资源: B,R2;堆栈需求: 2字节;出口: R0,R1SEARCHB : MOV B,AMOV A,R1ADD A,R7MOV R7,AMOV A,R0ADDC A,R6MOV R6,AMOV A,R7SUBB A,#01HMOV R7,AJNC SECH1DEC R6SECH1: MOV A,R7CLR CSUBB A,R1MOV A,R6SUBB A,R0JNC SECH2MOV A,#0FFHRETSECH2: MOV A,R7ADD A,R1MOV R2,AMOV A,R6ADDC A,R0RRC AMOV DPH,AMOV A,R2RRC AMOV DPL,AMOVX A,@DPTRCLR CSUBB A,BJNC SECH3INC DPTRMOV R0,DPHMOV R1,DPLSJMP SECH1 SECH3: JZ SECH5MOV A,DPLSUBB A,#01HMOV R7,AJNC SECH4MOV R6,DPHDEC R6SECH4: SJMP SECH1 SECH5: MOV R0,DPHMOV R1,DPLCLR ARET;辛普生积分程序;入口: DPTR,N,COUNT;占用资源: ACC,R3,R4,R6,R7 ;堆栈需求: 2字节;出口: R3,R4SJF : MOV R7,NMOVX A,@DPTRINC DPTRMOV R4,AMOV R3,#00HDEC R7SJF1 : MOVX A,@DPTRINC DPTRCLR CRLC AMOV R6,ACLR ARLC AXCH A,R7JNB ACC.0,SJF2XCH A,R6RLC AXCH A,R6XCH A,R7RLC AXCH A,R7SJF2 : XCH A,R7XCH A,R6ADD A,R4MOV R4,AMOV A,R6ADDC A,R3MOV R3,ADJNZ R7,SJF1SJF3 : MOVX A,@DPTRADD A,R4MOV R4,ACLR AADDC A,R3MOV R3,AMOV R7,#COUNTLCALL NMUL21MOV A,NMOV B,#03HMUL ABMOV R7,ALCALL NDIV31RETNMUL21 : MOV A,R4 MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV R2,ACLR OVRETNDIV31 : MOV B,#10H NDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311RET;内部RAM数据排序程序(升序);入口: R0(起始地址),N(数据个数);占用资源: ACC,B,R5,R6,R7;堆栈需求: 2字节;出口: R0ISELSORT : MOV R7,NDEC R7ISST1: MOV A,R7MOV R6,AMOV A,R0MOV R1,AMOV R2,AMOV B,@R1ISST2: INC R1MOV A,@R1CLR CSUBB A,BJC ISST3MOV A,R1MOV R2,AMOV B,@R1ISST3: DJNZ R6,ISST2MOV A,BXCH A,@R1MOV B,R2MOV R1,BMOV @R1,ADJNZ R7,ISST1RET;外部RAM数据排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数) ;占用资源: ACC,B,R0,R1,R5,R7;堆栈需求: 2字节;出口: ADDPH-ADDPLESELSORT : MOV R7,NDEC R7ESST1: MOV A,R7MOV R0,DPHMOVX A,@DPTRMOV B,AESST2: INC DPTRMOVX A,@DPTRCLR CSUBB A,BJC ESST3MOV R0,DPLMOV R1,DPHMOVX A,@DPTRMOV B,AESST3: DJNZ R6,ESST2MOVX A,@DPTRXCH A,BMOVX @DPTR,AMOV DPL,R0MOV DPH,R1MOV A,BMOVX @DPTR,ADJNZ R7,ESST1RET;外部RAM浮点数排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数);占用资源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT ;堆栈需求: 5字节;出口: ADDPH,ADDPLFSORT: MOV A,NMOV NCNT,ADEC NCNTFST1 : MOV B,NCNTMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPTRMOV R2,AINC DPTRMOVX A,@DPTRMOV R3,AINC DPTRMOVX A,@DPTRMOV R4,AFST2 : INC DPTRMOVX A,@DPTRMOV R5,AINC DPTRMOVX A,@DPTRINC DPTRMOVX A,@DPTRMOV R7,APUSH BLCALL FCMPPOP BJNC FST4MOV A,DPLCLR CSUBB A,#02HMOV R1,AMOV R0,DPHJNC FST3DEC R0FST3 : MOV A,R5MOV R2,AMOV A,R6MOV R3,AMOV A,R7MOV R4,AFST4 : DJNZ B,FST2MOV A,DPLCLR CSUBB A,#02HMOV DPL,AJNC FST5DEC DPHFST5 : MOV A,R2MOVX @DPTR,AINC DPTRMOV A,R3MOVX @DPTR,AINC DPTRMOV A,R4MOVX @DPTR,AMOV A,R0MOV P2,AMOV A,R5MOVX @R1,AINC R1MOV A,R6MOVX @R1,AINC R1MOVX @R1,ADJNZ NCNT,FST1RET;BCD小数转换为二进制小数(2位) ;入口: R0(低位首址),R7;占用资源: ACC,B,R5;堆栈需求: 2字节;出口: R3,R4PDTB : CLR AMOV R3,AMOV R4,APDB1 : MOV A,R3MOV B,#9AHMUL ABMOV R5,BXCH A,R4MOV B,#19HMUL ABADD A,R4MOV A,R5ADDC A,BMOV R5,AMOV A,@R0MOV B,#9AHMUL ABADD A,R5MOV R4,ACLR AADDC A,BXCH A,R3MOV B,#19HMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,@R0MOV B,#19HMUL ABADD A,R3MOV R3,ADEC R0DJNZ R7,PDB1RET;BCD小数转换为二进制小数(N位) ;入口: R1(低位首址),M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0PDTBMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR APDBMN1 : MOV @R0,AINC R0DJNZ B,PDBMN1MOV A,NSWAP ARR AMOV R7,APDBMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MCLR CPDBMN3 : MOV A,@R1ADDC A,@R1DA AJNB ACC.4,PDBMN4SETB CCLR ACC.4PDBMN4 : MOV @R1,AINC R1DJNZ B,PDBMN3MOV B,NPDBMN5 : MOV A,@R0RLC AMOV @R0,AINC R0DJNZ B,PDBMN5DJNZ R7,PDBMN2MOV A,R2MOV R0,ARET;BCD整数转换为二进制整数(1位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R4IDTB1: CLR AMOV R4,AIDB11: MOV A,R4MOV B,#0AHMUL ABADD A,@R0INC R0MOV R4,ADJNZ R7,IDB11RET;BCD整数转换为二进制整数(2位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R3,R4IDTB2: CLR AMOV R3,AMOV R4,AIDB21: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ADJNZ R7,IDB21RET;BCD整数转换为二进制整数(3位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R2,R3,R4IDTB3: CLR AMOV R2,AMOV R3,AMOV R4,AIDB31: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,#0AHMUL ABADD A,R2MOV R2,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ACLR AADDC A,R2MOV R2,ADJNZ R7,IDB31RET;BCD整数转换为二进制整数(N位) ;入口: R1(高位地址),M,N;占用资源: ACC,B,R2,R7,NCNT,F0 ;堆栈需求: 2字节;出口: R0IDTBMN : MOV A,R0MOV B,NCLR AIDBMN1 : MOV @R0,AINC R0DJNZ B,IDBMN1MOV A,R2MOV R0,AMOV A,MMOV NCNT,AIDBMN2 : MOV R7,NCLR ACLR F0IDBMN3 : XCH A,@R0MOV B,#0AHMUL ABMOV C,F0ADDC A,@R0MOV F0,CMOV @R0,AINC R0MOV A,BDJNZ R7,IDBMN3MOV A,R2MOV R0,AMOV A,@R1INC R1ADD A,@R0MOV @R0,ADJNZ NCNT,IDBMN2RET;二进制小数(2位)转换为十进制小数(分离BCD码) ;入口: R3,R4,R7;占用资源: ACC,B;堆栈需求: 3字节;出口: R0PBTD : MOV A,R7PUSH APBD1 : MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV @R0,AINC R0DJNZ R7,PBD1POP AMOV R7,AMOV A,R0CLR CSUBB A,R7MOV R0,ARET;二进制小数(M位)转换为十进制小数(分离BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7,NCNT;堆栈需求: 2字节;出口: R0PBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV A,NMOV NCNT,APBDMN1 : MOV R7,MCLR ACLR F0PBDMN2 : XCH A,@R1MOV B,#0AHMUL ABMOV C,F0ADDC A,@R1MOV F0,CMOV @R1,AINC R1MOV A,BDJNZ R7,PBDMN2ADDC A,#00HMOV @R0,AINC R0MOV A,R3MOV R1,ADJNZ NCNT,PBDMN1MOV A,R2MOV R0,ARET;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4MOV R4,AMOV A,R3RLC AMOV R3,AMOV B,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZ R7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码) ;入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码) ;入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0MOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321POP AMOV R0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOV R0,ADJNZ R7,IBD322RET;二进制整数(M位)转换为十进制整数(组合BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0IBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR AIBDMN1 : MOV @R0,AINC R0DJNZ B,IBDMN1MOV A,MSWAP ARR ACLR CMOV R7,AIBDMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MIBDMN3 : MOV A,@R1RLC AMOV @R1,AINC R1DJNZ B,IBDMN3MOV B,NIBDMN4 : MOV A,@R0ADDC A,@R0DA AJNB ACC.4,IBDMN5SETB CCLR ACC.4IBDMN5 : MOV @R0,AINC R0DJNZ B,IBDMN4DJNZ R7,IBDMN2MOV A,R2MOV R0,ARET;附:;三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;入口: R2,R3,R4,R7;占用资源: ACC,B,F0;堆栈需求: 3字节;出口: (R2),R3,R4,R7,OVNDIV31 : MOV A,R2MOV B,R7DIV ABPUSH AMOV R2,BMOV B,#10HNDV311 : CLR CMOV A,R4MOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311POP ACLR OVJZ NDV314SETB OVNDV314 : XCH A,R2MOV R7,ARET(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

51单片机实用子程序(汇编)

51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。

(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。

在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。

程序清单中开列了四个栏目:标号、指令、操作数、注释。

为方便读者理解,注释尽力详细。

子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。

优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。

2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。

有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。

优点是程序紧凑,缺点是需要对子程序库进行仔细删节。

(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

第14章MCS51程序设计及实用子程序

第14章MCS51程序设计及实用子程序
2.实现方法 用直接转移指令(AJMP或LJMP指令)组成一个转移表, 然后把标志单元的内容读入累加器A,转移表首地址放入 DPTR中,再利用指令JMP @A+DPTR实现散转。 散转点超过256时,对DPTR进行修正。
例:要求根据寄存器R7的内容转向各个处理程序。
即(R7)=0,转向PRG0 即(R7)=1,转向PRG1 即(R7)=2,转向PRG2 …………………………… 即(R7)=n,转向PRGn
A, #03H ;2
A, @A+PC ;1
R3,A
;1
;1
05F0H,0E89H,0A695H,1EAAH 0D9BH,7F93H,0373H,26D7H
2710H,9E3FH,1A66H,22E3H
1174H,16EFH,33E4H,6CA0H
TB1:
ORG MOV MOV ADD MOV MOVC XCH INC MOVC MOV CLR MOV SUBB MOV SUBB JNC CLR RET
操作步骤:
(1)将转移表首地址送入DPTR作为基地址。 (2)将条件标志单元内容装入A中作为变址,在装
入前,还应根据转移表项内容作相应变化。 (3)实现程序转移。
根据转移表的不同可以分为三种散转程序:
一、使用转移指令表的散转程序
1.应用场合 根据标志单元的内容是0,1,…n,分别转向处理程序0,处 理程序1,…处理程序n。
报警值的单元地址=表格首地址+(Xi*2)
查表程序清单(方法1)
TB1: MOV ADD MOV ADD MOVC XCH ADD MOVC MOV RET
TAB1: DW DW DW DW
A, R2
A, R2 ;A←路数Xi*2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MCS-51单片机实用子程序库(doc 62页)《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。

笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。

本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。

经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。

本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。

(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。

地址小的单元存放数据的高字节。

例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。

2.运算精度:单次定点运算精度为结果最低位的当量值。

3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。

(1)标号:BCDA功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。

出口信息:和在[R0]中,最高位进位在CY中。

影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。

出口信息:差在[R0]中,最高位借位在CY中。

影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB: L CALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3)标号:NEG功能:多字节BCD码取补入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节NEG: MOV A,R7 ;取(字节数减一)至R2中DEC AMOV R2,AMOV A,R0 ;保护指针MOV R3,ANEG0: CLR CMOV A,#99HSUBB A,@R0 ;按字节十进制取补MOV @R0,A ;存回[R0]中INC R0 ;调整数据指针DJNZ R2,NEG0 ;处理完(R2)字节MOV A,#9AH ;最低字节单独取补SUBB A,@R0MOV @R0,AMOV A,R3 ;恢复指针MOV R0,ARET(4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十)入口条件:字节数在R7中,操作数在[R0]中。

出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。

影响资源:PSW、A、R2、R3 堆栈需求:2字节BRLN: M OV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV R3,#0 ;工作单元初始化BRL1: DEC R0 ;调整数据指针MOV A,@R0 ;取一字节SWAP A ;交换十进制高低位MOV @R0,A ;存回MOV A,R3 ;取低字节移出的十进制高位XCHD A,@R0 ;换出本字节的十进制高位MOV R3,A ;保存本字节的十进制高位DJNZ R2,BRL1 ;处理完所有字节RET(5)标号:MULD功能:双字节二进制无符号数乘法入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求:2字节MULD: MOV A,R3 ;计算R3乘R7MOV B,R7MUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R3 ;计算R3乘R6MOV B,R6MUL ABADD A,R4 ;累加部分积MOV R4,ACLR AADDC A,BMOV R3,AMOV A,R2 ;计算R2乘R7MOV B,R7MUL ABADD A,R4 ;累加部分积MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR ARLC AXCH A,R2 ;计算R2乘R6MOV B,R6MUL ABADD A,R3 ;累加部分积MOV R3,AMOV A,R2ADDC A,BMOV R2,ARET(6)标号:MUL2功能:双字节二进制无符号数平方入口条件:待平方数在R2、R3中。

出口信息:结果在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R5 堆栈需求:2字节MUL2: MOV A,R3 ;计算R3平方MOV B,AMUL ABMOV R4,B ;暂存部分积MOV R5,AMOV A,R2 ;计算R2平方MOV B,AMUL ABXCH A,R3 ;暂存部分积,并换出R2和R3XCH A,BXCH A,R2MUL AB ;计算2×R2×R3CLR CRLC AXCH A,BRLC AJNC MU20INC R2 ;累加溢出量MU20: XCH A,B ;累加部分积ADD A,R4MOV R4,AMOV A,R3ADDC A,BMOV R3,ACLR AADDC A,R2MOV R2,ARET(7)标号:DIVD功能:双字节二进制无符号数除法入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。

出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。

影响资源:PSW、A、B、R1~R7 堆栈需求:2字节DIVD: CLR C ;比较被除数和除数MOV A,R3SUBB A,R7MOV A,R2JC DVD1SETB OV ;溢出RETDVD1: MOV B,#10H ;计算双字节商DVD2: CLR C ;部分商和余数同时左移一位MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AXCH A,R2RLC AXCH A,R2MOV F0,C ;保存溢出位CLR CSUBB A,R7 ;计算(R2R3-R6R7)MOV R1,ASUBB A,R6ANL C,/F0 ;结果判断JC DVD3MOV R2,A ;够减,存放新的余数MOV A,R1MOV R3,AINC R5 ;商的低位置一DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)MOV A,R4 ;将商移到R2R3中MOV R2,AMOV A,R5MOV R3,ACLR OV ;设立成功标志RET(8)标号:D457功能:双字节二进制无符号数除以单字节二进制数入口条件:被除数在R4、R5中,除数在R7中。

出口信息:OV=0 时,单字节商在R3中,OV=1时溢出。

影响资源:PSW、A、R3~R7 堆栈需求:2字节D457: CLR CMOV A,R4SUBB A,R7JC DV50SETB OV ;商溢出RETDV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)DV51: MOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV F0,CCLR CSUBB A,R7ANL C,/F0JC DV52MOV R4,ADV52: CPL CMOV A,R3RLC AMOV R3,ADJNZ R6,DV51MOV A,R4 ;四舍五入ADD A,R4JC DV53SUBB A,R7JC DV54DV53: INC R3DV54: CLR OVRET(9)标号:DV31功能:三字节二进制无符号数除以单字节二进制数入口条件:被除数在R3、R4、R5中,除数在R7中。

出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。

影响资源:PSW、A、B、R2~R7 堆栈需求:2字节DV31: CLR CMOV A,R3SUBB A,R7JC DV30SETB OV ;商溢出RETDV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5DM23: CLR CMOV A,R5RLC AMOV R5,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV F0,CCLR CSUBB A,R7ANL C,/F0JC DM24MOV R3,AINC R5DM24: DJNZ R2,DM23MOV A,R3 ;四舍五入ADD A,R3JC DM25SUBB A,R7JC DM26DM25: INC R5MOV A,R5JNZ DM26INC R4DM26: CLR OVRET ;商在R4R5中(10)标号:MULS功能:双字节二进制有符号数乘法(补码)入口条件:被乘数在R2、R3中,乘数在R6、R7中。

出口信息:乘积在R2、R3、R4、R5中。

影响资源:PSW、A、B、R2~R7 堆栈需求:4字节MULS: MOV R4,#0 ;清零R4R5MOV R5,#0LCALL MDS ;计算结果的符号和两个操作数的绝对值LCALL MULD ;计算两个绝对值的乘积SJMP MDSE ;用补码表示结果(11)标号:DIVS功能:双字节二进制有符号数除法(补码)入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。

出口信息:OV=0时商在R2、R3中,OV=1时溢出。

相关文档
最新文档