51单片机实用汇编子程序库(中文资料)
MCS-51单片机实用子程序库6
MCS-51单片机实用子程序库(六)(17)标号:FSQR功能:浮点数开平方(快速逼近算法)入口条件:操作数在[R0]中。
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。
影响资源:PSW、A、B、R2~R7 堆栈需求:2字节FSQR: MOV A,@R0JNB ACC.7,SQRSETB OV ;负数开平方,出错RETSQR: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ SQMOV @R0,#41H;尾数为零,不必运算CLR OVRETSQ: MOV A,@R0MOV C,ACC.6 ;将阶码扩展成8bit补码MOV ACC.7,CINC A ;加一CLR CRRC A ;除二MOV @R0,A ;得到平方根的阶码,回存之INC R0 ;指向被开方数尾数的高字节JC SQR0 ;原被开方数的阶码是奇数吗?MOV A,@R0 ;是奇数,尾数右规一次RRC AMOV @R0,AINC R0MOV A,@R0RRC AMOV @R0,ADEC R0SQR0: MOV A,@R0JZ SQR9 ;尾数为零,不必运算MOV R2,A ;将尾数传送到R2R3中INC R0MOV A,@R0MOV R3,AMOV A,R2 ;快速开方,参阅定点子程序说明ADD A,#57HJC SQR2ADD A,#45HJC SQR1ADD A,#24HMOV B,#0E3HMOV R4,#80H SJMP SQR3SQR1: MOV B,#0B2H MOV R4,#0A0H SJMP SQR3SQR2: MOV B,#8DH MOV R4,#0D0H SQR3: MUL AB MOV A,BADD A,R4MOV R4,AMOV B,AMUL ABXCH A,R3CLR CSUBB A,R3MOV R3,AMOV A,BXCH A,R2SUBB A,R2MOV R2,ASQR4: SETB CMOV A,R4RLC AMOV R6,ACLR ARLC AMOV R5,AMOV A,R3SUBB A,R6MOV B,AMOV A,R2SUBB A,R5JC SQR5INC R4MOV R2,AMOV R3,BSJMP SQR4SQR5: MOV A,R4XCH A,R2RRC AMOV F0,CMOV A,R3MOV R5,AMOV R4,#8SQR6: CLR CMOV A,R3RLC AMOV R3,ACLR CMOV A,R5SUBB A,R2JB F0,SQR7JC SQR8SQR7: MOV R5,AINC R3SQR8: CLR CMOV A,R5RLC AMOV R5,AMOV F0,CDJNZ R4,SQR6MOV A,R3 ;将平方根的尾数回传到[R0]中MOV @R0,ADEC R0MOV A,R2MOV @R0,ASQR9: DEC R0 ;数据指针回归原位CLR OV ;开方结果有效RET(18)标号:FPLN功能:浮点数多项式计算入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。
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 单片机实用程序库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 微秒。
MCS-51单片机实用子程序库要点
MCS-51单片机实用子程序库(一)MCS-51定点运算子程序库及其使用说明(1)标号:BCDA功能:多字节BCD码加法(2)标号:BCDB功能:多字节BCD码减法(3)标号:NEG功能:多字节BCD码取补(4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十)(5)标号:MULD功能:双字节二进制无符号数乘法(6)标号:MUL2功能:双字节二进制无符号数平方(7)标号:DIVD功能:双字节二进制无符号数除法(8)标号:D457功能:双字节二进制无符号数除以单字节二进制数(9)标号:DV31功能:三字节二进制无符号数除以单字节二进制数(10)标号:MULS功能:双字节二进制有符号数乘法(补码)(11)标号:DIVS功能:双字节二进制有符号数除法(补码)(12)标号:SH2功能:双字节二进制无符号数开平方(快速)(13)标号:SH4功能:四字节二进制无符号数开平方(快速)(14)标号:HASC功能:单字节十六进制数转换成双字节ASCII码(15)标号:ASCH功能:ASCII码转换成十六进制数(16)标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数(17)标号:HB2功能:双字节十六进制整数转换成三字节BCD码整数(18)标号:HBD功能:单字节十六进制小数转换成单字节BCD码小数(19)标号:HBD2功能:双字节十六进制小数转换成双字节BCD码小数(20)标号:BCDH功能:单字节BCD码整数转换成单字节十六进制整数(21)标号:BH2功能:双字节BCD码整数转换成双字节十六进制整数(22)标号:BHD功能:单字节BCD码小数转换成单字节十六进制小数(23)标号:BHD2功能:双字节BCD码小数转换成双字节十六进制小数(24)标号:MM功能:求单字节十六进制无符号数据块的极值(25)标号:MMS功能:求单字节十六进制有符号数据块的极值(26)标号:FDS1功能:顺序查找(ROM)单字节表格(27)标号:FDS2功能:顺序查找(ROM)双字节表格(28)标号:FDD1功能:对分查找(ROM)单字节无符号增序数据表格(29)标号:FDD2功能:对分查找(ROM)双字节无符号增序数据表格(30)标号:DDM1功能:求单字节十六进制无符号数据块的平均值(31)标号:DDM2功能:求双字节十六进制无符号数据块的平均值(32)标号:XR1功能:求单字节数据块的(异或)校验和(33)标号:XR2功能:求双字节数据块的(异或)校验和(34)标号:SORT功能:单字节无符号数据块排序(增序)(二)MCS-51浮点运算子程序库及其使用说明(1)标号:FSDT功能:浮点数格式化(2)标号:FADD功能:浮点数加法(3)标号:FSUB功能:浮点数减法(4) 标号:FMUL功能:浮点数乘法(5)标号:FDIV功能:浮点数除法(6)标号:FCLR功能:浮点数清零(7)标号:FZER功能:浮点数判零(8)标号:FMOV功能:浮点数传送(9)标号:FPUS功能:浮点数压栈(10)标号:FPOP功能:浮点数出栈(11)标号:FCMP功能:浮点数代数值比较(不影响待比较操作数)(12)标号:FABS功能:浮点绝对值函数(13)标号:FSGN功能:浮点符号函数(14)标号:FINT功能:浮点取整函数(15) 标号:FRCP功能:浮点倒数函数(16)标号:FSQU功能:浮点数平方(17)标号:FSQR功能:浮点数开平方(快速逼近算法)(18)标号:FPLN功能:浮点数多项式计算(19)标号:FLOG功能:以10为底的浮点对数函数(20)标号:FLN功能:以e为底的浮点对数函数(21)标号:FE10功能:以10为底的浮点指数函数(22)标号:FEXP功能:以e为底的浮点指数函数(23)标号:FE2功能:以2为底的浮点指数函数(24)标号:DTOF功能:双字节十六进制定点数转换成格式化浮点数(25)标号:FTOD功能:格式化浮点数转换成双字节定点数(26)标号:BTOF功能:浮点BCD码转换成格式化浮点数(27)标号:FTOB功能:格式化浮点数转换成浮点BCD码(28)标号:FCOS功能:浮点余弦函数(29)标号:FSIN功能:浮点正弦函数(30)标号:FATN功能:浮点反正切函数(31)标号:RTOD功能:浮点弧度数转换成浮点度数(32)标号:DTOR功能:浮点度数转换成浮点弧度数******************************************************************************* ******************************************************************************* *******************************************************************************(三)实用程序清单:清单1:双精度加法子程序清单2:被减数x1与减数x2比较大小子程序清单3;浮点减法子程序,减数数符求反后为加数清单4:;浮点乘法子程序清单5 ;浮点除法子程序清单6; 浮点数开平方子程序清单7 ;浮点数牛顿迭代开平方子程序清单8;基本运算子程序的演示程序清单9;装入浮点数清单10 ;计算奇次多项式值(ln x、sin x、arcsin x 等)子程序清单11 计算对数函数子程序清单12 先取ln 10,计算x?ln a清单13 弧度化为角度清单14 反正弦函数子程序清单15 函数子程序的演示程序清单16 ;阶乘子程序,定点二进制整数n 在R4 中清单17 ;定点整数二翻十清单18 ;定点十进制数变二进制浮点数,数符已装入7BH 位,0 表正,1 表负清单19 ;最小二乘法拟合直线程序清单20 ;定点16位整数×16 位整数→32 位整数清单21 INTSQR:取17位根,末位舍入清单22 SLPA V:滑动平均子程序清单23 BCDSB:减法子程序清单24 TBLENGTH EQU 10;CHETA:;字排序清单25 FUNC2:功能2 标志清单26 ACUM ;地址4060H 1 2 3 4 5 6 7 8 9 a b c d e f 70 71H;ASCII 码串T I , A S ,+/-x x x x x x x k g CR LF清单27 RDATE:;读日期清单28 GETAD1:传输清单29 DSPA:;显示程序清单30 LFDD8:键入BCD 码(最多8 位)左移子程序清单31 KEYIN2:只用二键输入数字程序P1.7选数P1.6 回车清单32 定时时钟清单33 PPRNT:打印清单34 SPDRV1:基本运作定时步进电机清单35 清单36 清单37 串行通信清单38 START4:;转8250 中断服务子程序清单39 P8255A EQU 7800H;显示口,只写P8255B EQU 7000H;打印口清单40 CRCST:;循环余检测子程序清单41 GTOB8 8位格莱码(在ACC中)翻为二进制数******************************************************************************* ****************************************************************************** 清单42 FPCPR: ;被减数x1 与减数x2 比较大小子程序清单43 FPSUB: ;浮点减法子程序清单44 FPMUL: ;浮点乘法子程序,尾数相乘(a+b)?(c+d)→ac+ad+bc+bd清单45 FPDIV清单46 FPDI2清单47 FPSQ:;模拟手算快速开平方子程序,先建实数标志清单48 FSQR:清单49 DMST: 演示程序清单50清单51 LNX:对数函数子程序,ln x=mln 2+lnt 或ln x=(m-1)ln 2+ln(2t)清单52 DXP:以10 为底的指数函数子程序清单53 CTNX1:余切函数子程序,x为角度,先化为弧度CTNX:余切函数子程序,x 为弧度,先计算正切值清单54 ASINX 反正弦函数及其衍生函数子程序清单清单55 NP;阶乘子程序清单56 SINTBTD:超长整数(最大限为270FFFFFFFFFH,在28H,26H,24H 三字中)翻为十进制整数在33H~2CH 中清单57 DTOB:;浮点数十翻二子程序清单58 FBTD:;浮点数分解为定点整数及定点小数清单59清单60 BEGN:;键盘管理程序清单61 TIM96: 精确定时程序清单62 SSEND:;软件定时器定时发送字符子程序(用P2.5)清单63 SSEND1:;用HSO定时发送字符子程序清单64 SRECV;用高速输入器件HSI0 和软件定时器1 定时接收字符子程清单65 CRC0B: CRC 校验程序清单66 GB16:16 位格莱码变二进制数(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
实用汇编程序子程序
(7) 标号:DIVD 功能:双字节二进制无符号数除法
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
LCALL BCDA ;按多字节BCD码加法处理
CPL C ;将补码加法的进位标志转换成借位标志
MOV F0,C ;保护借位标志
LCALL NEG1 ;恢复减数[R1]的原始值
MOV C,F0 ;恢复借位标志
RET
NEG1: MOV A,R0 ;[R1]十进制取补子程序入口
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
PUSH PSW ;保存结果的符号
LCALL DIVD ;计算两个绝对值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去结果的符号,保留溢出标志
RET
DVS1: POP PSW ;未溢出,取出结果的符号
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果
MOV A,R2
ADDC A,B
MOV R2,A
RET
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 微秒。
51_汇编子程序库
51汇编子程序库;片内RAM初始化子程序IBCLR:MOV A,R0MOV R1,ACLR AIBC1:MOV@R1,AINC R1DJNZ R7,IBC1RET;片外RAM初始化子程序EBCLR1:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11:MOVX@DPTR,AINC DPTRDJNZ R7,EBC11RET;片外RAM初始化子程序(双字节个单元) EBCLR2:MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ EBC21INC R6EBC21:CLR AMOVX@DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET;内部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,IBM1RET;外部RAM数据复制程序;入口:ADDPH,ADDPL,R7 ;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV1:MOV A,ADDPL ADD A,R7MOV DPL,ACLR AADDC A,ADDPH MOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,#00HMOV P2,AEBM11:DEC R0CJNE R0,#0FFH,EBM12 DEC P2EBM12:DEC DPL MOV A,DPLCJNE A,#0FFH,EBM13 DEC DPHEBM13:MOVX A,@R0 MOVX@DPTR,A DJNZ R7,EBM11;外部RAM数据复制程序;入口:ADDPH,ADDPL,R6,R7 ;占用资源:ACC;堆栈需求:2字节;出口:R0,R1EBMOV2:MOV A,ADDPL ADD A,R7MOV DPL,AMOV A,R6ADDC A,ADDPHMOV DPH,AMOV A,R7ADD A,R1XCH A,R0ADDC A,R6MOV P2,AMOV A,R7JZ EBM21EBM21: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,ADDPLMOV DPL,AMOV A,ADDPHADDC A,#00HMOV DPH,AMOV A,R0ADD A,R7MOV R0,AITEM1:DEC R0DEC DPLMOV A,DPLCJNE A,#0FFH,ITEM2 DEC DPHITEM2:MOVX A,@DPTR MOV@R0,ADJNZ R7,ITEM1RET;限幅滤波程序;占用资源:B;堆栈需求:2字节;出口:A JUGFILT:MOV B,A CLR CSUBB A,SDAT JNC JUGFT1CPL AINC AJUGFT1:SETB A SUBB A,#DELTY JNC JUGFT3MOV A,SDAT RETJUGFT3:MOV A,B MOV SDAT,A RET;中位值滤波程序;占用资源:ESELSORT;堆栈需求:4字节;出口:AMEDFILT:LCALL ESELSORT MOV A,NCLR CRRC AADD A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AJNC MEDFT1INC DPHMEDFT1:MOVX A,@DPTR RET;N点算术平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AAVFILT:MOV A,ADDPL MOV DPL,AMOV A,ADDPHMOV DPH,ACLR AMOV R3,AMOV R4,AMOV R7,NAVFT1:MOVX A,@DPTR INC DPTRADD A,R4MOV R4,AJNC AVFT2INC R3AVFT2:DJNZ R7,AVFT1 MOV R7,NMOV R2,#00HLCALL NDIV31MOV A,R4RET;N点加权平均滤波;入口:ADDPH,ADDPL,N;占用资源:B,R3,R4;堆栈需求:2字节;出口:AQAVFILT:CLR AMOV R3,AMOV R4,AMOV R7,NMOV P2,ADDPHMOV R1,ADDPLMOV DPTR,#QAVTAB QAVFT1:MOVC A,@A+DPTR MOV B,AMOVX A,@R1INC DPTRINC R1MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,ADJNZ R7,QAVFT1 MOV A,R4JNB ACC.7,QAVFT2 INC R3QAVFT2:MOV A,R3 RETQAVTAB:DB;一阶加权滞后滤波程序;入口:A,DELTY;占用资源:B,R3,R4;堆栈需求:2字节;出口:ACLR AMOV DPTR,#ABTAB MOVC A,@A+DPTR MUL ABMOV R4,AMOV R3,BMOV A,#01H MOVC A,@A+DPTR MOV B,DELTY MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,R4JNB ACC.7,FT1INC 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,R3ADDC 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,ACLR AADDC A,BMOV R2,ACLR OVRET;单字节无符号数乘法程序(R2R3R4*R7)=(R5R2R3R4) ;入口:R2,R3,R4,R6,R7;占用资源:ACC,B;堆栈需求:2字节;出口:R5,R2,R3,R4 NMUL31:MOV A,R4 MOV 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,R7MUL ABADD A,R3MOV R3,ACLR A ADDC A,B XCH A,R2 MOV B,R7 MUL AB ADD A,R2 MOV R2,A CLR A ADDC A,B XCH A,R5 MOV B,R7 MUL AB ADD A,R5 MOV R5,A CLR A ADDC A,B MOV R7,A CLR OV RET;双字节无符号数乘法程序(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 AB ADD A,R5 MOV R5,A MOV A,B ADDC A,R2 MOV R2,A CLR A ADDC A,#00H XCH A,R3 MOV B,R6 MUL AB ADD A,R2 MOV R2,A MOV A,B ADDC A,R3 XCH A,R5 MOV R3,A CLR 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,R7ADD A,R5 MOV R5,A MOV A,B ADDC A,R1 MOV R1,A CLR A ADDC A,#00H XCH A,R3 MOV B,R6 MUL AB ADD A,R1 MOV R1,A MOV A,B ADDC A,R3 XCH A,R5 MOV R3,A MOV A,R2 MOV B,R7ADD A,R1 MOV R1,A MOV A,B ADDC A,R5 MOV R5,A CLR A ADDC A,#00H XCH A,R2 MOV B,R6 MUL AB ADD A,R5 MOV R5,A MOV A,B ADDC A,R2 XCH A,R1 MOV R2,A CLR 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,@R1DJNZ NCNT,NMLMN1 MOV NCNT,B NMLMN2:CLR A XCH A,@R0MOV R2,AMOV A,R6MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNMLMN3:MOV A,R2 MOV B,@R1INC R1MUL ABADDC A,@R0MOV@R0,AINC R0ADDC 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,R2DIV AB PUSH AMOV R2,B MOV B,#10H NDV311:CLR C MOV A,R4 RLC AMOV R4,A MOV A,R3 RLC AMOV R3,A MOV A,R2 RLC AMOV R2,A MOV F0,C CLR CSUBB A,R7JB F0,NDV312NDV312: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 ABMOV R5,B MOV B,#18H NDV411:CLR C MOV A,R4 RLC AMOV R4,A MOV A,R3 RLC AMOV R3,A MOV A,R2 RLC AMOV R2,A MOV A,R5 RLC AMOV R5,A MOV F0,C CLR 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 ANDV421:MOV A,R2 CLR CSUBB A,R7MOV R1,AMOV A,R5SUBB A,R6JC NDV422MOV R5,AMOV A,R1MOV R2,AINC BSJMP NDV421 NDV422:PUSH B MOV B,#10HNDV423:CLR C MOV A,R4RLC AMOV R4,ARLC 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,A MOV A,R1INC 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,M CLR CSUBB A,NMOV NCNT,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00H NDVMN1:MOV R7,N LCALL NSUBN MOV A,R5MOV R1,AJC NDVMN2INC R2SJMP NDVMN1 NDVMN2:MOV R7,NLCALL NADDN MOV A,NCNT SWAP ARR AMOV NCNT,A NDVMN3:MOV A,R3 MOV R0,AMOV R7,MLCALL NRLCN MOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NLCALL NSUBNJB F0,NDVMN4JC NDVMN5 NDVMN4:MOV A,R3MOV R0,AINC@R0SJMP NDVMN6NDVMN5: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,M CLR CSUBB A,NMOV B,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00H NDVMN1:MOV R7,N CLR CNDVMN2:MOV A,@R0 SUBB A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN2 MOV A,R4MOV R0,AMOV A,R5MOV R1,AJC NDVMN3INC R2SJMP NDVMN1 NDVMN3:MOV R7,N CLR CNDVMN4:MOV A,@R0 ADDC A,@R1MOV@R0,AINC R0INC R1DJNZ R7,NDVMN4 MOV A,#08HMUL ABMOV B,ANDVMN5:MOV A,R3 MOV R0,AMOV R7,MCLR CNDVMN6:MOV A,@R0 RLC AMOV@R0,AINC R0DJNZ R7,NDVMN6 MOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NCLR CNDVMN7:MOV A,@R0 SUBB A,@R1MOV@R0,AINC R1DJNZ R7,NDVMN7JB F0,NDVMNBJC NDVMN8 NDVMNB:MOV A,R3 MOV R0,AINC@R0SJMP NDVMNA NDVMN8:MOV R7,N MOV A,R4MOV R0,AMOV A,R5MOV R1,ACLR CNDVMN9:MOV A,@R0 ADDC 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,R0NRLN1: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,R6CPL 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.7MOV SR0,CXRL 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 ACC.7,CMOV R5,ARET;原码有符号双字节除法程序(R5R2R3R4/R6R7)=(R3R4)余数(R6R7) ;入口:R5,R2,R3,R4;占用资源:ACC,SR0,NDIV42;堆栈需求:6字节;出口:R3,R4,R6,R7,OV IDIV:MOV A,R5 XRL A,R6MOV C,ACC.7MOV SR0,CMOV A,R5CLR ACC.7MOV R5,AMOV A,R6CLR ACC.7MOV R6,ALCALL NDIV42 MOV A,R3JB ACC.7,IDIVEJB OV,IDIVEMOV C,SR0MOV ACC.7,CMOV R3,ARET。
51单片机实用程序库
一、前言科技的进步需要技术不断的提升。
一块大而复杂的模拟电路花费了您庞大的精力,繁多的元器件增加了您的成本。
而此刻,只需要一块几厘米见方的单片机,写入简单的程序,就可以够使您以前的电路简单很多。
相信您在利用并掌握了单片机技术后,无论在您此后开发或是工作上,必然会带来意想不到的惊喜。
二、单片机简介我国开始利用单片机是在1982 年,短短五年时刻里进展极为迅速。
1986 年在上海召开了全国首届单片机开发与应用交流会,有的地域还成立了单片微型运算机应用协会,那是全国形成的第一次高潮。
截止今日,单片机应用技术飞速进展,咱们上因特网输入一个“单片机”的搜索,将会看到上万个介绍单片机的网站,这还不包括国外的。
与它相应的专业杂志此刻也有很多,比如由单片机界的权威何立民主编的《单片机与嵌入式系统应用》杂志现以盛行电子界,在2003年7月,(91 猎头网)在上海、广州、北京等大城市所做的一次专业人材需求报告中,单片机人材的需求量位居第一。
一块小小的片子,为何有如此的魔力?咱们第一从它的组成提及:单片机,亦称单片微电脑或单片微型运算机。
它是把中央处置器(CPU)、随机存取存储器(RAM)、只读存储器(ROM)、输入/输出端口(I/0)等主要运算机功能部件都集成在一块集成电路芯片上的微型运算机。
运算机的产生加速了人类改造世界的步伐,可是它毕竟体积大。
微运算机(单片机)在这种情形下诞生了,它为咱们改变了什么?纵观咱们此刻生活的各个领域,从导弹的导航装置,到飞机上各类仪表的控制,从运算机的网络通信与数据传输,到工业自动化进程的实时控制和数据处置,和咱们生活中普遍利用的各类智能IC 卡、电子宠物等,这些都离不开单片机。
以前没有单片机时,这些东西也能做,可是只能利用复杂的模拟电路,但是如此做出来的产品不仅体积大,而且本钱高,而且由于长期利用,元器件不断老化,控制的精度自然也会达不到标准。
在单片机产生后,咱们就将控制这些东西变成智能化了,咱们只需要在单片机外围接一点简单的接口电路,核心部份只是由人为的写入程序来完成。
MCS-51单片机实用子程序库(doc 62页)
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]中。
经典51单片机实用子程序库(二)
51单片机实用子程序库(二)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。
在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。
例如有一个十进制浮点操作数存放在30H、31H、32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。
MCS-51单片机程序库
MCS-51单片机程序库关键词:mcs-51 单片机MCS-51单片机实用子程序库目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可*性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
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,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
MCS51单片机实用子程序库96年版
《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
MCS-51单片机实用子程序库77107
MCS-51单片机实用子程序库(目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机使用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机使用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在使用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
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,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
MCS-51单片机实用子程序库(3)
MCS-51单片机实用子程序库(3)作者: 来源:51mcu上篇:MCS-51单片机实用子程序库(2)下篇:MCS-51单片机实用子程序库(4)(23)标号:BHD2功能:双字节BCD码小数转换成双字节十六进制小数入口条件:待转换的双字节BCD码小数在R4、R5中。
出口信息:转换后的双字节十六进制小数在R2、R3中。
*影响资源:PSW、A、R2~R6 堆栈需求:2字节BHD2: MOV R6,#10H ;准备计算两个字节小数BHD3: MOV A,R5 ;按十进制倍增ADD A,R5DA AMOV R5,AMOV A,R4ADDC A,R4DA AMOV R4,AMOV A,R3 ;将进位标志移入结果中RLC AMOV R3,AMOV A,R2RLC AMOV R2,ADJNZ 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单片机实用子程序库(汇编)
MOV @R0,A;和存回[R0]中
DJNZ R2,BCD1;处理完所有字节
RET
R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0;调整数据指针
DEC R1
MOV A,@R0
ADDC A,@R1;按字节相加
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C;保存溢出位
CLR C
SUBB A,R7;计算(R2R3-R6R7)
MUL AB
ADD A,R4;累加部分积
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2;计算 R2乘 R7
MOV B,R7
MUL AB
ADD A,R4;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
DA A;十进制调整
MOV @R0,A;和存回[R0]中
DJNZ R2,BCD1;处理完所有字节
RET
(2)标号:BCDB功能:多字节BCD码减法
入口条件:字节数在 R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在 CY中。
影响资源:PSW、A、R2、R3堆栈需求:6字节
单片机实用子程序库大全
内容目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
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,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
MCS-51单片机实用子程序库·周航慈
MCS-51单片机实用子程序库目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》(周航慈)一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
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,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
MCS-51单片机实用子程序库5
MCS-51单片机实用子程序库(五)(5)标号:FDIV功能:浮点数除法入口条件:被除数在[R0]中,除数在[R1]中。
出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。
影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:5字节FDIV: INC R0MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ DIV1MOV @R0,#41H;被除数为零,不必运算CLR OVRETDIV1: INC R1MOV A,@R1INC R1ORL A,@R1DEC R1DEC R1JNZ DIV2SETB OV ;除数为零,溢出RETDIV2: LCALL MVR0 ;将[R0]传送到第一工作区中MOV A,@R0XRL A,@R1 ;比较两个操作数的符号RLC AMOV 1FH,C ;保存结果的符号LCALL MVR1 ;将[R1]传送到第二工作区中LCALL DIV3 ;调用工作区浮点除法LJMP MOV0 ;回传结果DIV3: CLR C ;比较尾数的大小MOV A,R4SUBB A,R7MOV A,R3SUBB A,R6JC DIV4LCALL RR1 ;被除数右规一次SJMP DIV3DIV4: CLR A ;借用R0R1R2作工作寄存器XCH A,R0 ;清零并保护之PUSH ACCXCH A,R1PUSH ACCMOV A,R2PUSH ACCMOV B,#10H ;除法运算,R3R4/R6R7-→R0R1 DIV5: CLR CMOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R4RLC AMOV R4,AXCH A,R3RLC AXCH A,R3MOV F0,CCLR CSUBB A,R7MOV R2,AMOV A,R3SUBB A,R6ANL C,/F0JC DIV6MOV R3,AMOV A,R2MOV R4,AINC R1DIV6: DJNZ B,DIV5MOV A,R6 ;四舍五入CLR CRRC ASUBB A,R3CLR AADDC A,R1 ;将结果存回R3R4MOV R4,ACLR AADDC A,R0MOV R3,APOP ACC ;恢复R0R1R2MOV R2,AMOV R1,APOP ACCMOV R0,AMOV A,R2 ;计算商的阶码CLR CSUBB A,R5LCALL MD ;阶码检验LJMP RLN ;规格化(6)标号:FCLR功能:浮点数清零入口条件:操作数在[R0]中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MCS-51单片机实用子程序库;片内RAM初始化子程序IBCLR: MOV A,R0MOV R1,ACLR AIBC1 : MOV @R1,AINC R1DJNZ R7,IBC1RET;片外RAM初始化子程序EBCLR1: MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,ACLR CEBC11: MOVX @DPTR,AINC DPTRDJNZ R7,EBC11RET;片外RAM初始化子程序(双字节个单元)EBCLR2: MOV A,ADDPLMOV DPL,AMOV A,ADDPHMOV DPH,AMOV A,R7JZ EBC21INC R6EBC21: CLR AMOVX @DPTR,AINC DPTRDJNZ R7,EBC21DJNZ R6,EBC21RET;内部RAM数据复制程序;入口: R0,R7;占用资源: A;堆栈需求: 2字节IBMOV: MOV A,R0ADD A,R7MOV R0,AMOV A,R1ADD A,R7MOV R1,AIBM1 : DEC R0DEC R1MOV A,@R0MOV @R1,ADJNZ R7,IBM1RET;外部RAM数据复制程序;入口: ADDPH,ADDPL,R7;占用资源: ACC;堆栈需求: 2字节;出口: R0,R1EBMOV1 : MOV A,ADDPL ADD 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,EBM11RET;外部RAM数据复制程序;入口: ADDPH,ADDPL,R6,R7;占用资源: ACC;堆栈需求: 2字节EBMOV2 : MOV A,ADDPL ADD 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,ADDPL ADD 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,SDA T,DEL TY;占用资源: B;堆栈需求: 2字节;出口: AJUGFIL T : MOV B,ACLR CSUBB A,SDA TJNC JUGFT1CPL AINC AJUGFT1 : SETB ASUBB A,#DEL TYJNC JUGFT3MOV A,SDA TRETJUGFT3 : MOV A,BMOV SDA T,ARET;中位值滤波程序;入口: ADDPH,ADDPL,N;占用资源: ESELSORT;堆栈需求: 4字节;出口: AMEDFIL T : 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 VFIL T : 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 VFIL T : 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,DEL TY;占用资源: B,R3,R4;堆栈需求: 2字节;出口: ABQFIL T : MOV B,ACLR AMOV DPTR,#ABTABMOVC A,@A+DPTRMUL ABMOV R4,AMOV R3,BMOV A,#01HMOVC A,@A+DPTRMOV B,DEL TYMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,R4JNB ACC.7,FT1INC R3FT1 : MOV A,R3MOV DEL TY,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,R3ADDC 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,ACLR 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,R7MUL ABADD 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,R6ADD A,R5MOV R5,ACLR AADDC A,BMOV R2,AMOV A,R3MOV B,R7MUL ABADD A,R5MOV R5,AMOV A,BADDC 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,R7ADD A,R5MOV R5,AMOV A,BADDC A,R1MOV R1,ACLR AADDC A,#00HXCH A,R3MOV B,R6MUL 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,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 ABPUSH AMOV 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,R3RLC AMOV 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 CMOV NCNT,AADD A,R0MOV R4,AXCH A,R0MOV R3,AMOV A,R1MOV R5,AMOV R2,#00HNDVMN1 : MOV R7,NLCALL NSUBNMOV A,R5MOV R1,AJC NDVMN2INC R2SJMP NDVMN1NDVMN2 : MOV R7,NLCALL NADDNMOV A,NCNTSW AP ARR AMOV NCNT,ANDVMN3 : MOV A,R3MOV R0,AMOV R7,MLCALL NRLCNMOV F0,CMOV A,R4MOV R0,AMOV A,R5MOV R1,AMOV R7,NLCALL NSUBNJB F0,NDVMN4JC NDVMN5NDVMN4 : MOV A,R3MOV R0,AINC @R0SJMP NDVMN6NDVMN5 : MOV A,R5MOV R1,AMOV R7,NLCALL NADDNNDVMN6 : DJNZ NCNT,NDVMN3MOV A,R4MOV R1,AMOV A,R2MOV @R1,AMOV 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 R0INC R1DJNZ R7,NDVMN4MOV A,#08HMUL ABMOV B,ANDVMN5 : MOV A,R3MOV 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 R0INC R1DJNZ R7,NDVMN9 NDVMNA : DJNZ B,NDVMN5MOV A,MCLR CSUBB A,NADD A,R3MOV R1,AMOV A,R2MOV @R1,AMOV A,R3RET;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,R6CPL 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.7MOV SR0,CXRL A,R6MOV C,ACC.7MOV A,R3CLR ACC.7MOV R3,AMOV A,R6CLR ACC.7MOV R6,ALCALL 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 ACC.7,CMOV R5,ARET;原码有符号双字节除法程序 (R5R2R3R4/R6R7)=(R3R4) 余数(R6R7) ;入口: R5,R2,R3,R4;占用资源: ACC,SR0,NDIV42;堆栈需求: 6字节;出口: R3,R4,R6,R7,OVIDIV : MOV A,R5MOV 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,R0 FINDB11 : MOVX A,@DPTRCJNE A,B,FINDB12MOV R1,DPLMOV R0,DPHCLR ARETFINDB12 : INC DPTRDJNZ R7,FINDB11MOV A,#0FFHRET;单字节顺序查找程序;入口: 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,R0 FINDS11 : MOVX A,@DPTRINC DPTRCLR CSUBB A,R4JNZ FINDS12MOVX A,@DPTRSUBB A,R3JNZ FINDS12MOV A,DPLCLR CSUBB A,#01HMOV R1,AMOV A,DPHSUBB A,#00HMOV 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,R5FMAMIB : 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 CMOV 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,R0MOV 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,R1SUBB 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,@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,R4MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABADD A,R3MOV R3,ACLR AMOV 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 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 R6,AMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV 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,@DPTRMOV R6,AINC 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,FST2CLR 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 R1MOV A,R7MOVX @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 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,NSW AP ARR AMOV R7,A PDBMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,ACLR CPDBMN3 : MOV A,@R1 ADDC A,@R1DA AJNB ACC.4,PDBMN4SETB CCLR ACC.4 PDBMN4 : 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,AMOV 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 R2,AMOV B,NCLR AIDBMN1 : MOV @R0,AINC R0DJNZ B,IDBMN1MOV A,R2MOV R0,AMOV A,MMOV NCNT,A IDBMN2 : 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,R3MOV B,#0AHMUL 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,R4RLC AMOV 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,R0PUSH AMOV 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,MSW AP 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,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(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。