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

📄 MCS-51单片机实用子程序库(96年版).txt

📁 ADC0809AD转换器基本应用技术
💻 TXT
📖 第 1 页 / 共 5 页
字号:
	RLC	A
	MOV	R2,A
	DJNZ	R6,SH42	;被开方数左移完两位
	INC	R7	;左规次数加一
	SJMP	SH41	;继续左规
SQRH	MOV	A,R2    ;规格化后高字节按折线法分为三个区间
	ADD	A,#57H
	JC	SQR2
	ADD	A,#45H
	JC	SQR1
	ADD	A,#24H
	MOV	B,#0E3H	;第一区间的斜率
	MOV	R4,#80H	;第一区间的平方根基数
	SJMP	SQR3
SQR1	MOV	B,#0B2H	;第二区间的斜率
	MOV	R4,#0A0H;第二区间的平方根基数
	SJMP	SQR3
SQR2	MOV	B,#8DH	;第三区间的斜率
	MOV	R4,#0D0H;第三区间的平方根基数
SQR3	MUL	AB	;与区间基点的偏移量乘区间斜率
	MOV	A,B
	ADD	A,R4	;累加到平方根的基数上
	MOV	R4,A
	MOV	B,A
	MUL	AB	;求当前平方根的幂
	XCH	A,R3	;求偏移量(存放在R2R3中)
	CLR	C
	SUBB	A,R3
	MOV	R3,A
	MOV	A,R2
	SUBB	A,B
	MOV	R2,A
SQR4	SETB	C	;用减奇数法校正一个字节的平方根
	MOV	A,R4	;当前平方根的两倍加一存入R5R6中
	RLC	A
	MOV	R6,A
	CLR	A
	RLC	A
	MOV	R5,A
	MOV	A,R3	;偏移量小于该奇数否?
	SUBB	A,R6
	MOV	B,A
	MOV	A,R2
	SUBB	A,R5
	JC	SQR5	;小于,校正结束,已达到一个字节的精度
	INC	R4	;不小于,平方根加一
	MOV	R2,A	;保存新的偏移量
	MOV	R3,B
	SJMP	SQR4	;继续校正
SQR5	MOV	A,R4	;将一个字节精度的根存入R2
	XCH	A,R2
	RRC	A
	MOV	F0,C	;保存最终偏移量的最高位
	MOV	A,R3
	MOV	R5,A	;将最终偏移量的低八位存入R5中
	MOV	R4,#8	;通过(R5R6/R2)求根的低字节
SQR6	CLR	C
	MOV	A,R3
	RLC	A
	MOV	R3,A
	CLR	C
	MOV	A,R5
	SUBB	A,R2
	JB	F0,SQR7
	JC	SQR8
SQR7	MOV	R5,A
	INC	R3
SQR8	CLR	C
	MOV	A,R5
	RLC	A
	MOV	R5,A
	MOV	F0,C
	DJNZ	R4,SQR6	;根的第二字节计算完,在R3中
	MOV	A,R7	;取原被开方数的左规次数
	JZ	SQRE	;未左规,开方结束
SQR9	CLR	C	;按左规次数右移平方根,得到实际根
	MOV	A,R2
	RRC	A
	MOV	R2,A
	MOV	A,R3
	RRC	A
	MOV	R3,A
	DJNZ	R7,SQR9
SQRE	RET

    (14)  标号:  HASC  功能:单字节十六进制数转换成双字节ASCII码

入口条件:待转换的单字节十六进制数在累加器A中。
出口信息:高四位的ASCII码在A中,低四位的ASCII码在B中。
影响资源:PSW、A、B    堆栈需求:  4字节

HASC	MOV	B,A	;暂存待转换的单字节十六进制数
	LCALL	HAS1	;转换低四位
	XCH	A,B	;存放低四位的ASCII码
	SWAP	A	;准备转换高四位
HAS1	ANL	A,#0FH	;将累加器的低四位转换成ASCII码
	ADD	A,#90H
	DA	A
	ADDC	A,#40H
	DA	A
	RET

    (15)  标号:  ASCH    功能:ASCII码转换成十六进制数

入口条件:待转换的ASCII码(30H~39H或41H~46H)在A中。
出口信息:转换后的十六进制数(00H~0FH)仍在累加器A中。
影响资源:PSW、A    堆栈需求:  2字节

ASCH	CLR	C
	SUBB	A,#30H
	JNB	ACC.4,ASH1
	SUBB	A,#7
ASH1	RET

    (16)  标号:HBCD  功能:单字节十六进制整数转换成单字节BCD码整数

入口条件:待转换的单字节十六进制整数在累加器A中。
出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。
影响资源:PSW、A、B、R3    堆栈需求:  2字节

HBCD	MOV	B,#100	;分离出百位,存放在R3中
	DIV	AB
	MOV	R3,A
	MOV	A,#10	;余数继续分离十位和个位
	XCH	A,B
	DIV	AB
	SWAP	A
	ORL	A,B	;将十位和个位拼装成BCD码
	RET

    (17)  标号: HB2   功能:双字节十六进制整数转换成双字节BCD码整数

入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7    堆栈需求:  2字节

HB2	CLR	A	;BCD码初始化
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
	MOV	R2,#10H	;转换双字节十六进制整数
HB3	MOV	A,R7	;从高端移出待转换数的一位到CY中
	RLC	A
	MOV	R7,A
	MOV	A,R6
	RLC	A
	MOV	R6,A
	MOV	A,R5	;BCD码带进位自身相加,相当于乘2
	ADDC	A,R5
	DA	A	;十进制调整
	MOV	R5,A
	MOV	A,R4
	ADDC	A,R4
	DA	A
	MOV	R4,A
	MOV	A,R3
	ADDC	A,R3
	MOV	R3,A	;双字节十六进制数的万位数不超过6,不用调整
	DJNZ	R2,HB3	;处理完16bit
	RET 	
	    	
    (18)  标号:  HBD  功能:单字节十六进制小数转换成单字节BCD码小数

入口条件:待转换的单字节十六进制小数在累加器A中。
出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。
影响资源:PSW、A、B    堆栈需求:  2字节

HBD	MOV	B,#100	;原小数扩大一百倍
	MUL	AB
	RLC	A	;余数部分四舍五入
	CLR	A
	ADDC	A,B
	MOV	B,#10	;分离出十分位和百分位
	DIV	AB
	SWAP	A
	ADD	A,B	;拼装成单字节BCD码小数
	DA	A	;调整后若有进位,原小数接近整数1
	RET

    (19) 标号: HBD2  功能:双字节十六进制小数转换成双字节BCD码小数

入口条件:待转换的双字节十六进制小数在R2、R3中。
出口信息:转换后的双字节BCD码小数仍在R2、R3中。
影响资源:PSW、A、B、R2、R3、R4、R5    堆栈需求:  6字节

HBD2	MOV	R4,#4	;四位十进制码
HBD3	MOV	A,R3	;原小数扩大十倍
	MOV	B,#10
	MUL	AB
	MOV	R3,A
	MOV	R5,B
	MOV	A,R2
	MOV	B,#10
	MUL	AB
	ADD	A,R5
	MOV	R2,A
	CLR	A
	ADDC	A,B
	PUSH	ACC	;保存溢出的一位十进制码
	DJNZ	R4,HBD3	;计算完四位十进制码
	POP	ACC	;取出万分位
	MOV	R3,A
	POP	ACC	;取出千分位
	SWAP	A
	ORL	A,R3	;拼装成低字节BCD码小数
	MOV	R3,A
	POP	ACC	;取出百分位
	MOV	R2,A
	POP	ACC	;取出十分位
	SWAP	A
	ORL	A,R2	;拼装成高字节BCD码小数
	MOV	R2,A	
	RET

    (20)标号:BCDH    功能:单字节BCD码整数转换成单字节十六进制整数

入口条件:待转换的单字节BCD码整数在累加器A中。
出口信息:转换后的单字节十六进制整数仍在累加器A中。
影响资源:PSW、A、B、R4    堆栈需求:  2字节

BCDH	MOV	B,#10H	;分离十位和个位
	DIV	AB
	MOV	R4,B	;暂存个位
	MOV	B,#10	;将十位转换成十六进制
	MUL	AB
	ADD	A,R4	;按十六进制加上个位
	RET

    (21)标号:  BH2   功能:双字节BCD码整数转换成双字节十六进制整数

入口条件:待转换的双字节BCD码整数在R2、R3中。
出口信息:转换后的双字节十六进制整数仍在R2、R3中。
影响资源:PSW、A、B、R2、R3、R4    堆栈需求:  4字节

BH2	MOV	A,R3	;将低字节转换成十六进制
	LCALL	BCDH
	MOV	R3,A
	MOV	A,R2	;将高字节转换成十六进制
	LCALL	BCDH
	MOV	B,#100	;扩大一百倍
	MUL	AB
	ADD	A,R3	;和低字节按十六进制相加
	MOV	R3,A
	CLR	A
	ADDC	A,B
	MOV	R2,A
	RET

    (22)标号:  BHD   功能:单字节BCD码小数转换成单字节十六进制小数

入口条件:待转换的单字节BCD码数在累加器A中。
出口信息:转换后的单字节十六进制小数仍在累加器A中。
影响资源:PSW、A、R2、R3    堆栈需求:  2字节

BHD	MOV	R2,#8	;准备计算一个字节小数
BHD0	ADD	A,ACC	;按十进制倍增
	DA	A
	XCH	A,R3
	RLC	A	;将进位标志移入结果中
	XCH	A,R3
	DJNZ	R2,BHD0	;共计算8bit小数
	ADD	A,#0B0H	;剩余部分达到0.50否?
	JNC	BHD1	;四舍
	INC	R3	;五入
BHD1	MOV	A,R3	;取结果
	RET

    (23)标号: BHD2  功能:双字节BCD码小数转换成双字节十六进制小数

入口条件:待转换的双字节BCD码小数在R4、R5中。
出口信息:转换后的双字节十六进制小数在R2、R3中。
影响资源:PSW、A、R2~R6    堆栈需求:  2字节

BHD2	MOV	R6,#10H	;准备计算两个字节小数
BHD3	MOV	A,R5	;按十进制倍增
	ADD	A,R5
	DA	A
	MOV	R5,A
	MOV	A,R4
	ADDC	A,R4
	DA	A
	MOV	R4,A
	MOV	A,R3	;将进位标志移入结果中
	RLC	A
	MOV	R3,A
	MOV	A,R2
	RLC	A
	MOV	R2,A
	DJNZ	R6,BHD3	;共计算16bit小数
	MOV	A,R4
	ADD	A,#0B0H	;剩余部分达到0.50否?
	JNC	BHD4	;四舍
	INC	R3	;五入
	MOV	A,R3
	JNZ	BHD4
	INC	R2
BHD4	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,DPH
	MOV	R2,A
	MOV	R4,A
	MOV	A,B	;取数据个数
	DEC	A	;减一,得到需要比较的次数
	JZ	MME	;只有一个数据,不需要比较
	MOV	R1,A	;保存比较次数
	PUSH	DPL	;保护数据块的首址
	PUSH	DPH
MM1	INC	DPTR	;指向一个新的数据
	MOVX	A,@DPTR	;读取这个数据
	MOV	B,A	;保存
	SETB	C	;与最大值比较
	SUBB	A,R6
	JC	MM2	;不超过当前最大值,保持当前最大值
	MOV	R6,B	;超过当前最大值,更新最大值存放地址
	MOV	R2,DPH	;同时更新最大值存放地址
	MOV	R3,DPL
	SJMP	MM3
MM2	MOV	A,B	;与最小值比较
	CLR	C
	SUBB	A,R7
	JNC	MM3	;大于或等于当前最小值,保持当前最小值
	MOV	R7,B	;更新最小值
	MOV	R4,DPH	;更新最小值存放地址
	MOV	R5,DPL
MM3	DJNZ	R1,MM1	;处理完全部数据
	POP	DPH	;恢复数据首址
	POP	DPL
MME	RET

    (25)  标号:  MMS    功能:求单字节十六进制有符号数据块的极值

入口条件:数据块的首址在DPTR中,数据个数在R7中。
出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
影响资源:PSW、A、B、R1~R7    堆栈需求:  4字节

MMS	MOV	B,R7	;保存数据个数
	MOVX	A,@DPTR	;读取第一个数据
	MOV	R6,A	;作为最大值的初始值
	MOV	R7,A	;也作为最小值的初始值
	MOV	A,DPL	;取第一个数据的地址
	MOV	R3,A	;作为最大值存放地址的初始值
	MOV	R5,A	;也作为最小值存放地址的初始值
	MOV	A,DPH
	MOV	R2,A
	MOV	R4,A
	MOV	A,B	;取数据个数
	DEC	A	;减一,得到需要比较的次数
	JZ	MMSE	;只有一个数据,不需要比较
	MOV	R1,A	;保存比较次数
	PUSH	DPL	;保护数据块的首址
	PUSH	DPH
MMS1	INC	DPTR	;调整数据指针
	MOVX	A,@DPTR	;读取一个数据
	MOV	B,A	;保存
	SETB	C	;与最大值比较
	SUBB	A,R6
	JZ	MMS4	;相同,不更新最大值
	JNB	OV,MMS2	;差未溢出,符号位有效
	CPL	ACC.7	;差溢出,符号位取反
MMS2	JB	ACC.7,MMS4;差为负,不更新最大值
	MOV	R6,B	;更新最大值
	MOV	R2,DPH	;更新最大值存放地址
	MOV	R3,DPL
	SJMP	MMS7
MMS4	MOV	A,B	;与最小值比较
	CLR	C
	SUBB	A,R7
	JNB	OV,MMS6	;差未溢出,符号位有效
	CPL	ACC.7	;差溢出,符号位取反
MMS6	JNB	ACC.7,MMS7;差为正,不更新最小值
	MOV	R7,B	;更新最小值
	MOV	R4,DPH	;更新最小值存放地址
	MOV	R5,DPL
MMS7	DJNZ	R1,MMS1	;处理完全部数据
	POP	DPH	;恢复数据首址
	POP	DPL
MMSE	RET 	
 	
    (26)  标号:  FDS1    功能:顺序查找(ROM)单字节表格

入口条件:待查找的内容在A中,表格首址在DPTR中,表格的字节数在R7中。
出口信息:OV=0时,顺序号在累加器A中;OV=1时,未找到。
影响资源:PSW、A、B、R2、R6      堆栈需求:  2字节

FDS1	MOV	B,A	;保存待查找的内容
	MOV	R2,#0	;顺序号初始化(指向表首)
	MOV	A,R7	;保存表格的长度
	MOV	R6,A
FD11	MOV	A,R2	;按顺序号读取表格内容
	MOVC	A,@A+DPTR
	CJNE	A,B,FD12;与待查找的内容比较
	CLR	OV	;相同,查找成功
	MOV	A,R2	;取对应的顺序号
	RET	
FD12	INC	R2	;指向表格中的下一个内容
	DJNZ	R6,FD11	;查完全部表格内容
	SETB	OV	;未查找到,失败
	RET

    (27)  标号:  FDS2    功能:顺序查找(ROM)双字节表格

入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据总个数在R7中。
出口信息:OV=0时顺序号在累加器A中,地址在DPTR中;OV=1时未找到。
影响资源:PSW、A、R2、R6、DPTR    堆栈需求:  2字节

FDS2	MOV	A,R7	;保存表格中数据的个数
	MOV	R6,A
	MOV	R2,#0	;顺序号初始化(指向表首)
FD21	CLR	A	;读取表格内容的高字节
	MOVC	A,@A+DPTR
	XRL	A,R4	;与待查找内容的高字节比较
	JNZ	FD22
	MOV	A,#1	;读取表格内容的低字节
	MOVC	A,@A+DPTR
	XRL	A,R5	;与待查找内容的低字节比较
	JNZ	FD22
	CLR	OV	;相同,查找成功
	MOV	A,R2	;取对应的顺序号
	RET 	
FD22	INC	DPTR	;指向下一个数据
	INC	DPTR
	INC	R2	;顺序号加一
	DJNZ	R6,FD21	;查完全部数据
	SETB	OV	;未查找到,失败
	RET

    (28)  标号:FDD1  功能:对分查找(ROM)单字节无符号增序数据表格

入口条件:待查找的内容在累加器A中,表格首址在DPTR中,字节数在R7中。
出口信息:OV=0 时,顺序号在累加器A中;OV=1 时,未找到。
影响资源:PSW、A、B、R2、R3、R4      堆栈需求:  2字节

FDD1	MOV	B,A	;保存待查找的内容
	MOV	R2,#0	;区间低端指针初始化(指向第一个数据)
	MOV	A,R7
	DEC	A
	MOV	R3,A	;区间高端指针初始化(指向最后一个数据)
FD61	CLR	C	;判断区间大小
	MOV	A,R3
	SUBB	A,R2
	JC	FD69	;区间消失,查找失败
	RRC	A	;取区间大小的一半
	ADD	A,R2	;加上区间的低端
	MOV	R4,A	;得到区间的中心
	MOVC	A,@A+DPTR;读取该点的内容
	CJNE	A,B,FD65;与待查找的内容比较
	CLR	OV	;相同,查找成功
	MOV	A,R4	;取顺序号

⌨️ 快捷键说明

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