⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ¿

📁 该文件里包含了大量的常用经典的程序代码,可以为51编程者带来事半功倍的效果,
💻
📖 第 1 页 / 共 3 页
字号:



            《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,用户只要不在工作区中存放无
关的或非消耗性的信息,程序就具有较好的透明性。

  
  定点库程序使用的资源:
  R0 和 R1 做间接寻址寄存器,小地址放数据的高字节
  R2,R3,R4,R5,R6,R7
  A,B,PSW  做工作寄存器


    (1)  标号:  BCDA    功能:多字节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	;调整数据指针
	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]十进制取补子程序入口
	XCH	A,R1	;交换指针
	XCH	A,R0
	LCALL	NEG	;通过[R0]实现[R1]取补
	MOV	A,R0
	XCH	A,R1	;换回指针
	XCH	A,R0
	RET

    (3)  标号:  NEG    功能:多字节BCD码取补

入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3    堆栈需求:  2字节

NEG:	MOV	A,R7	;取(字节数减一)至R2中
	DEC	A
	MOV	R2,A
	MOV	A,R0	;保护指针
	MOV	R3,A
NEG0:	CLR	C	
	MOV	A,#99H
	SUBB	A,@R0	;按字节十进制取补
	MOV	@R0,A	;存回[R0]中
	INC	R0	;调整数据指针
	DJNZ	R2,NEG0	;处理完(R2)字节
	MOV	A,#9AH	;最低字节单独取补
	SUBB	A,@R0
	MOV	@R0,A
	MOV	A,R3	;恢复指针
	MOV	R0,A
	RET

    (4)  标号:  BRLN    功能:多字节BCD码左移十进制一位(乘十)

入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
影响资源:PSW、A、R2、R3    堆栈需求:  2字节

BRLN:	MOV	A,R7	;取字节数至R2中
   	MOV	R2,A
	ADD	A,R0	;初始化数据指针
	MOV	R0,A
	MOV	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乘R7
	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
	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
	CLR	A
	RLC	A
	XCH	A,R2	;计算R2乘R6
	MOV	B,R6
	MUL	AB
	ADD	A,R3	;累加部分积
	MOV	R3,A
	MOV	A,R2
	ADDC	A,B
	MOV	R2,A
	RET

    (6)  标号: MUL2    功能:双字节二进制无符号数平方

入口条件:待平方数在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	R5,A
	MOV	A,R2	;计算R2平方
	MOV	B,A
	MUL	AB
	XCH	A,R3	;暂存部分积,并换出R2和R3
	XCH	A,B
	XCH	A,R2
	MUL	AB	;计算2×R2×R3
	CLR	C
	RLC	A
	XCH	A,B
	RLC	A
	JNC	MU20
	INC	R2	;累加溢出量
MU20:	XCH	A,B	;累加部分积
	ADD	A,R4
	MOV	R4,A
	MOV	A,R3
	ADDC	A,B
	MOV	R3,A
	CLR	A
	ADDC	A,R2
	MOV	R2,A
	RET

    (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,R3	
	SUBB	A,R7
	MOV	A,R2
	SUBB	A,R6
	JC	DVD1
	SETB	OV	;溢出
	RET
DVD1:	MOV	B,#10H	;计算双字节商
DVD2:	CLR	C	;部分商和余数同时左移一位
	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)
	MOV	R1,A
	MOV	A,R2
	SUBB	A,R6
	ANL	C,/F0	;结果判断
	JC	DVD3
	MOV	R2,A	;够减,存放新的余数
	MOV	A,R1
	MOV	R3,A
	INC	R5	;商的低位置一
DVD3:	DJNZ	B,DVD2	;计算完十六位商(R4R5)
	MOV	A,R4	;将商移到R2R3中
	MOV	R2,A
	MOV	A,R5
	MOV	R3,A
	CLR	OV	;设立成功标志
	RET

    (8)  标号:  D457   功能:双字节二进制无符号数除以单字节二进制数

入口条件:被除数在R4、R5中,除数在R7中。
出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
影响资源:PSW、A、R3~R7    堆栈需求:  2字节

D457:	CLR	C
	MOV	A,R4
	SUBB	A,R7
	JC	DV50
	SETB	OV	;商溢出
	RET
DV50:	MOV	R6,#8	;求平均值(R4R5/R7-→R3)
DV51:	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	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
	JC	DV54
DV53:	INC	R3
DV54:	CLR	OV
	RET

    (9)  标号:  DV31    功能:三字节二进制无符号数除以单字节二进制数

入口条件:被除数在R3、R4、R5中,除数在R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
影响资源:PSW、A、B、R2~R7    堆栈需求:  2字节

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
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	MOV	F0,C
	CLR	C
	SUBB	A,R7
	ANL	C,/F0
	JC	DM24
	MOV	R3,A
	INC	R5
DM24:	DJNZ	R2,DM23
	MOV	A,R3	;四舍五入
	ADD	A,R3
	JC	DM25
	SUBB	A,R7
	JC	DM26
DM25:	INC	R5
	MOV	A,R5
	JNZ	DM26
	INC	R4
DM26:	CLR	OV
	RET             ;商在R4R5中 


    (10)  标号: MULS    功能:双字节二进制有符号数乘法(补码)

入口条件:被乘数在R2、R3中,乘数在R6、R7中。
出口信息:乘积在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R7    堆栈需求:  4字节

MULS:	MOV	R4,#0	;清零R4R5
	MOV	R5,#0
	LCALL	MDS	;计算结果的符号和两个操作数的绝对值
	LCALL	MULD	;计算两个绝对值的乘积
	SJMP	MDSE	;用补码表示结果

    (11)  标号:  DIVS    功能:双字节二进制有符号数除法(补码)

入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0时商在R2、R3中,OV=1时溢出。
影响资源:PSW、A、B、R1~R7    堆栈需求:  5字节

DIVS:	LCALL	MDS	;计算结果的符号和两个操作数的绝对值
	PUSH	PSW	;保存结果的符号
	LCALL	DIVD	;计算两个绝对值的商
	JNB	OV,DVS1	;溢出否?
	POP	ACC	;溢出,放去结果的符号,保留溢出标志
	RET
DVS1:	POP	PSW	;未溢出,取出结果的符号
	MOV	R4,#0
	MOV	R5,#0
MDSE:	JB	F0,MDS2	;用补码表示结果
	CLR	OV	;结果为正,原码即补码,计算成功
	RET
MDS:	CLR	F0	;结果符号初始化
	MOV	A,R6	;判断第二操作数的符号
	JNB	ACC.7,MDS1;为正,不必处理

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -