首页 AVR单片机 8051单片机 PIC单片机 msp430应用 motorola单片机 C166单片机 开关电源 电源设计 电源技术应用 电磁兼容
ARM芯片开发 DSP开发技术 PowerPC处理器 RABBIT单片机 嵌入式系统设计 工业控制 控制电路 PLC编程 机器人技术 电机原理
vhdl语言学习 asic芯片技术 fpga培训 cpld编程 verilog hdl Vxworks开发 wince开发教程 嵌入式linux uclinux开发 ucos入门
电路设计 数字电路设计 模拟电路设计 音频电路设计 模拟滤波器设计 电子技术基础 电子名词解析

首页->微处理器->单片机8051->正文

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

作者:  来源:51mcu 

上篇:MCS-51单片机实用子程序库(5)
下篇:MCS-51单片机实用子程序库(7)

 

(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)
入口条件:操作数在[R0]中。
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV ;负数开平方,出错
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H;尾数为零,不必运算
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6 ;将阶码扩展成8bit补码
MOV ACC.7,C
INC A ;加一
CLR C
RRC A ;除二
MOV @R0,A ;得到平方根的阶码,回存之
INC R0 ;指向被开方数尾数的高字节
JC SQR0 ;原被开方数的阶码是奇数吗?
MOV A,@R0 ;是奇数,尾数右规一次
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9 ;尾数为零,不必运算
MOV R2,A ;将尾数传送到R2R3中
INC R0
MOV A,@R0
MOV R3,A
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
CLR C
SUBB A,R3
MOV R3,A
MOV A,B
XCH A,R2
SUBB A,R2
MOV R2,A
SQR4: SETB C
MOV A,R4
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
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
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
MOV A,R3 ;将平方根的尾数回传到[R0]中
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0 ;数据指针回归原位
CLR OV ;开方结果有效
RET

(18) 标号: FPLN 功能:浮点数多项式计算

入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 4字节
FPLN: POP DPH ;取出多项式系数存放地址
POP DPL
XCH A,R0 ;R0、R1交换角色,自变量在[R1]中
XCH A,R1
XCH A,R0
CLR A ;清第一工作区
MOV R2,A
MOV R3,A
MOV R4,A
CLR 1FH
PLN1: CLR A ;读取一个系数,并装入第二工作区
MOVC A,@A+DPTR
MOV C,ACC.7
MOV 1EH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R7,A
INC DPTR ;指向下一个系数
MOV C,1EH ;比较两个数符
RRC A
XRL A,23H
RLC A
MOV F0,C ;保存比较结果
LCALL AS1 ;进行代数加法运算
CLR A ;读取下一个系数的第一个字节
MOVC A,@A+DPTR
CJNE A,#40H,PLN2;是结束标志吗?
XCH A,R0 ;运算结束,恢复R0、R1原来的角色
XCH A,R1
XCH A,R0
LCALL MOV0 ;将结果回传到[R0]中
CLR A
INC DPTR
JMP @A+DPTR ;返回主程序
PLN2: MOV A,@R1 ;比较自变量和中间结果的符号
XRL A,23H
RLC A
MOV 1FH,C ;保存比较结果
LCALL MUL0 ;进行乘法运算
SJMP PLN1 ;继续下一项运算

(19) 标号: FLOG 功能:以10为底的浮点对数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:9字节
FLOG: LCALL FLN ;先以e为底求对数
JNB OV,LOG
RET ;如溢出则停止计算
LOG: MOV R5,#0FFH;系数0.43430(1/Ln10)
MOV R6,#0DEH
MOV R7,#5CH
LCALL MUL1 ;通过相乘来换底
LJMP MOV0 ;传回结果
 
(20) 标号: FLN 功能:以e为底的浮点对数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 7字节
 
FLN: LCALL MVR0 ;将[R0]传送到第一工作区
JB 1FH,LNOV;负数或零求对数,出错
MOV A,R3
ORL A,R4
JNZ LN0
LNOV: SETB OV
RET
LN0: CLR C
LCALL RL1 ;左规一次
CLR A
XCH A,R2 ;保存原阶码,清零工作区的阶码
PUSH ACC
LCALL RLN ;规格化
LCALL MOV0 ;回传
LCALL FPLN ;用多项式计算尾数的对数
DB 7BH,0F4H,30H;0.029808
DB 0FEH,85H,13H;-0.12996
DB 7FH,91H,51H;0.28382
DB 0FFH,0FAH,0BAH;-0.4897
DB 0,0FFH,0CAH;0.99918
DB 70H,0C0H,0;1.1442×10-5
DB 40H ;结束
POP ACC ;取出原阶码
JNZ LN1
RET ;如为零,则结束
LN1: CLR 1EH ;清第二区数符
MOV C,ACC.7
MOV F0,C ;保存阶符
JNC LN2
CPL A ;当阶码为负时,求其绝对值
INC A
LN2: MOV R2,A ;阶码的绝对值乘以0.69315
MOV B,#72H
MUL AB
XCH A,R2
MOV R7,B
MOV B,#0B1H
MUL AB
ADD A,R7
MOV R7,A ;乘积的尾数在R6R7R2中
CLR A
ADDC A,B
MOV R6,A
MOV R5,#8 ;乘积的阶码初始化(整数部分为一字节)
LN3: JB ACC.7,LN4;乘积格式化
MOV A,R2
RLC A
MOV R2,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP LN3
LN4: MOV C,F0 ;取出阶符,作为乘积的数符
MOV ACC.7,C
LJMP ASN ;与尾数的对数合并,得原操作数的对数
 
(21) 标号: FE10 功能:以10为底的浮点指数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
FE10: MOV R5,#2 ;加权系数为3.3219(Log210)
MOV R6,#0D4H
MOV R7,#9AH
SJMP EXP ;先进行加权运算,后以2为底统一求幂

(22) 标号: FEXP 功能:以e为底的浮点指数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
FEXP: MOV R5,#1 ;加权系数为1.44272(Lng2e)
MOV R6,#0B8H
MOV R7,#0ABH
EXP: CLR 1EH ;加权系数为正数
LCALL MVR0 ;将[R0]传送到第一工作区
LCALL MUL1 ;进行加权运算
SJMP E20 ;以2为底统一求幂

(23) 标号: FE2 功能:以2为底的浮点指数函数

入口条件:操作数在[R0]中。
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节
FE2: LCALL MVR0 ;将[R0]传送到第一工作区
E20: MOV A,R3
ORL A,R4
JZ EXP1 ;尾数为零
MOV A,R2
JB ACC.7,EXP2;阶符为负?
SETB C
SUBB A,#6 ;阶码大于6否?
JC EXP2
JB 1FH,EXP0;数符为负否?
MOV @R0,#3FH;正指数过大,幂溢出
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
SETB OV
RET
EXP0: MOV @R0,#41H;负指数过大,幂下溢,清零处理
CLR A
INC R0
MOV @R0,A
INC R0
MOV @R0,A
DEC R0
DEC R0
CLR OV
RET
EXP1: MOV @R0,#1 ;指数为零,幂为1.00
INC R0
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
CLR OV
RET
EXP2: MOV A,R2 ;将指数复制到第二工作区
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
MOV C,1FH
MOV 1EH,C
LCALL INT ;对第一区取整
MOV A,R3
JZ EXP4
EXP3: CLR C ;使尾数高字节R3对应一个字节整数
RRC A
INC R2
CJNE R2,#8,EXP3
EXP4: MOV R3,A
JNB 1FH,EXP5
CPL A ;并用补码表示
INC A
EXP5: PUSH ACC ;暂时保存之
LCALL RLN ;重新规格化
CPL 1FH
SETB F0
LCALL AS1 ;求指数的小数部分
LCALL MOV0 ;回传指数的小数部分
LCALL FPLN ;通过多项式计算指数的小数部分的幂
DB 77H,0B1H,0C9H;1.3564×10-3
DB 7AH,0A1H,68H;9.8514×10-3
DB 7CH,0E3H,4FH;0.055495
DB 7EH,0F5H,0E7H;0.24014
DB 0,0B1H,72H;0.69315
DB 1,80H,0 ;1.00000
DB 40H ;结束
POP ACC ;取出指数的整数部分
ADD A,R2 ;按补码加到幂的阶码上
MOV R2,A
CLR 1FH ;幂的符号为正
LJMP MOV0 ;将幂传回[R0]中
 
(24)标号: DTOF 功能:双字节十六进制定点数转换成格式化浮点数

入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。
出口信息:转换成格式化浮点数在[R0]中(三字节)。
影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节
DTOF: MOV R2,A ;按整数的位数初始化阶码
MOV A,@R0 ;将定点数作尾数
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
LCALL RLN ;进行规格化
LJMP MOV0 ;传送结果到[R0]中

相关资料:
c语言编程的难点单片机的C语言应用程序设计
关于单片机硬件抗干扰学用8051单片机的常见问题
微处理器硬件电路设计的几个基本问题51系列单片机I/O口上拉电阻使用点滴
关于C51的中断编程嵌入式系统综述
MCS-51单片机实用子程序库(7)MCS-51单片机实用子程序库(5)
MCS-51单片机实用子程序库(4)MCS-51单片机实用子程序库(3)
MCS-51单片机实用子程序库(2)MCS-51单片机实用子程序库(1)
单片机基础知识接口技术的基本知识


网站地图 | 联系我们 | 免责声明 | 招聘信息 | 友情链接
Copyright © 2005 - 2006 单片机设计网