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

(1)按当前流行的以IBM PC为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
CPL F0;为负,结果符号取反
JCDM25
SUBBA,R7
JCDM26
DM25INC R5
MOV A,R5
JNZ DM26
INC R4
DM26CLR OV
RET;商在R4R5xx
(10)标号:
MULS功能:
双字节二进制有符号数乘法(补码)入口条件:
被乘数在R
2、R3xx,乘数在R
6、R7xx。
出口信息:
乘积在R
2、R
3、R
4、R5xx。
MOV B,R7
MUL AB
MOV R4,B;暂存部分积
MOV R5,A
MOV A,R3;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4;累加部分积
MOV R4,A
CLR A
ADDCA,B
MOV R3,A
MOV A,R2;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4;累加部分积
BCDBLCALLNEG1;减数[R1]十进制取补
LCALLBCDA;按多字节BCD码加法处理
CPL C;将补码加法的进位标志转换成借位标志
MOV F0,C;保护借位标志
LCALLNEG1;恢复减数[R1]的原始值
MOV C,F0;恢复借位标志
51实用子程序

出口信息:结果在 R2 、 R3 、 R4 、 R5 中。
影响资源: PSW 、 A 、 B 、 R2 ~ R5 堆栈需求: 2字节
MUL2: MOV A,R3 ;计算 R3 平方
MOV B,A
MUL AB
MOV R4,B ;暂存部分积
子程序的使用方法如下:
1.将子程序全部内容链接在应用程序之后,统一编译即可。 优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序中的有关部分链接在应用程序之后,统一编译即可。 有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。 优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
SUBB A,@R0
MOV @R0,A
MOV A,R3 ;恢复指针
MOV R0,A
RET
【返回目录】
(4) 标号: BRLN 功能:多字节BCD码左移十进制一位(乘十)
入口条件:字节数在 R7 中,操作数在 [R0] 中。
出口信息:乘积在 R2 、 R3 、 R4 、 R5 中。
影响资源: PSW 、 A 、 B 、 R2 ~ R7 堆栈需求: 2字节
MULD: MOV A,R3 ;计算 R3 乘 R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
(7)浮点数判零
(8)浮点数传送
(9)浮点数压栈
(10)浮点数出栈
(11)浮点数代数值比较(不影响待比较操作数)
(12)浮点绝对值函数
(13)浮点符号函数
(14)浮点取整函数
(15)浮点倒数函数
(16)浮点数平方
(17)浮点数开平方(快速逼近算法)
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结束。
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。
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]中。
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,#45HADD 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 C MOV 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,R4 XCH A,R2RRC AMOV 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结束。
MCS51单片机实用子程序库

MCS-51单片机实用子程序库/技术文章- C51程序设计- MCS-51单片机实用子程序库(一)MCS-51定点运算子程序库及其使用说明(1)标号:BCDA功能:多字节BCD码加法 3 (2)标号:BCDB功能:多字节BCD码减法 3 (3)标号:NEG功能:多字节BCD码取补 4 (4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十) 5 (5)标号:MULD功能:双字节二进制无符号数乘法 5 (6)标号:MUL2功能:双字节二进制无符号数平方 5 (7)标号:DIVD功能:双字节二进制无符号数除法 6 (8)标号:D457功能:双字节二进制无符号数除以单字节二进制数7 (9)标号:DV31功能:三字节二进制无符号数除以单字节二进制数8 (10)标号:MULS功能:双字节二进制有符号数乘法(补码)9 (11)标号:DIVS功能:双字节二进制有符号数除法(补码)9 (12)标号:SH2功能:双字节二进制无符号数开平方(快速)11 (13)标号:SH4功能:四字节二进制无符号数开平方(快速)11 (14)标号:HASC功能:单字节十六进制数转换成双字节ASCII码14 (15)标号:ASCH功能:ASCII码转换成十六进制数14 (16)标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数14 (17)标号:HB2功能:双字节十六进制整数转换成双字节BCD码整数15 (18)标号:HBD功能:单字节十六进制小数转换成单字节BCD码小数16 (19)标号:HBD2功能:双字节十六进制小数转换成双字节BCD码小数16 (20)标号:BCDH功能:单字节BCD码整数转换成单字节十六进制整数17 (21)标号:BH2功能:双字节BCD码整数转换成双字节十六进制整数17 (22)标号:BHD功能:单字节BCD码小数转换成单字节十六进制小数17 (23)标号:BHD2功能:双字节BCD码小数转换成双字节十六进制小数18 (24)标号:MM功能:求单字节十六进制无符号数据块的极值18 (25)标号:MMS功能:求单字节十六进制有符号数据块的极值19 (26)标号:FDS1功能:顺序查找(ROM)单字节表格20 (27)标号:FDS2功能:顺序查找(ROM)双字节表格21 (28)标号:FDD1功能:对分查找(ROM)单字节无符号增序数据表格21 (29)标号:FDD2功能:对分查找(ROM)双字节无符号增序数据表格22 (30)标号:DDM1功能:求单字节十六进制无符号数据块的平均值23 (31)标号:DDM2功能:求双字节十六进制无符号数据块的平均值24 (32)标号:XR1功能:求单字节数据块的(异或)校验和25 (33)标号:XR2功能:求双字节数据块的(异或)校验和25 (34)标号:SORT功能:单字节无符号数据块排序(增序)26定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
51实用子程序集锦

DV31 CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30 MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23 CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53 INC R3
DV54 CLR OV
RET
(9) 标号: DV31 功能:三字节二进制无符号数除以单字节二进制数
入口条件:被除数在R3、R4、R5中,除数在R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
CPL C ;将补码加法的进位标志转换成借位标志
MOV F0,C ;保护借位标志
LCALL NEG1 ;恢复减数[R1]的原始值
MOV C,F0 ;恢复借位标志
RET
NEG1 MOV A,R0 ;[R1]十进制取补子程序入口
XCH A,R1 ;交换指针
XCH A,R0
LCALL NEG ;通过[R0]实现[R1]取补
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《MCS-51单片机实用子程序库(96年版)》
周航慈
目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个
子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方
面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(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,用户只要不在工作区中存放无
关的或非消耗性的信息,程序就具有较好的透明性。
(1)标号:BCDA功能:多字节BCD码加法
入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求: 2字节
BCDA: MOV A,R7 ;取字节数至R2中
MOV R2,A
ﻩADDA,R0ﻩ;初始化数据指针
ﻩMOVﻩR0,A
MOV A,R2
ﻩADDﻩA,R1
MOVﻩR1,A
CLR C
BCD1:ﻩDECﻩR0 ;调整数据指针
ﻩ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、R3 堆栈需求: 6字节
BCDB:ﻩLCALL NEG1ﻩ;减数[R1]十进制取补
LCALL BCDA ;按多字节BCD码加法处理
CPLﻩC ;将补码加法的进位标志转换成借位标志
MOV F0,Cﻩ;保护借位标志
LCALL NEG1ﻩ;恢复减数[R1]的原始值
ﻩMOVﻩC,F0;恢复借位标志
RET
NEG1: MOVﻩA,R0 ;[R1]十进制取补子程序入口
ﻩXCHA,R1;交换指针
XCHﻩA,R0
ﻩLCALLﻩNEGﻩ;通过[R0]实现[R1]取补
MOVﻩA,R0
ﻩXCH A,R1ﻩ;换回指针。