📄 单片机实用子程序.txt
字号:
LCALL RL1 ;左规一次
CLR A
XCH A,R2 ;保存原阶码清零工作区的阶码
PUSH ACC
LCALL RLN ;规格化
LCALL MOV0 ;回传
LCALL FPLN ;用多项式计算尾数的对数
DB 7BH,0F4H,30H
DB 0FEH,85H,13H
DB 7FH,91H,51H
DB 0FFH,0FAH,0BAH
DB 0,0FFH,0CAH
DB 70H,0C0H,0 ;-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 ;阶码的绝对值乘以
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; 与尾数的对数合并得原操作数的对数
;标 号 功 能以为底的浮点指数函数
;入口条件操作数在[R0 ]中
;出口信息OV=0 时结果仍在[R0 ]中OV=1 时溢出
;影响资源DPTR PSW A B R2 R7 位1EH 1FH 堆栈需求字节
FE10:MOV R5,#2 ;加权系数为2
MOV R6,#0D4H
MOV R7,#9AH
SJMP EXP ;先进行加权运算后以为底统一求幂
;标 号 功 能以为底的浮点指数函数
;入口条件操作数在[R0 ]中
;出口信息OV=0 时结果仍在[R0 ]中OV=1 时溢出
;影响资源DPTR PSW A B R2 R7 位1EH 1FH 堆栈需求字节
FEXP:MOV R5,#1; 加权系数为2
MOV R6,#0B8H
MOV R7,#0ABH
EXP:CLR 1EH ;加权系数为正数
LCALL MVR0 ;将[R0 ]传送到第一工作区
LCALL MUL1 ;进行加权运算
SJMP E20 ;以为底统一求幂
;标 号 功 能以为底的浮点指数函数
;入口条件操作数在[R0 ]中
;出口信息OV=0 时结果仍在[R0 ]中OV=1 时溢出;
;影响资源DPTR PSW A B R2 R7 位1EH 1FH 堆栈需求字节
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 ;阶码大于否
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 ;指数为零幂为
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; -3
DB 7AH,0A1H,68H; -3
DB 7CH,0E3H,4FH
DB 7EH,0F5H,0E7H
DB 0,0B1H,72H
DB 1,80H,0
DB 40H ;结束
POP ACC ;取出指数的整数部分
ADD A,R2 ;按补码加到幂的阶码上
MOV R2,A
CLR 1FH ;幂的符号为正
LJMP MOV0 ;将幂传回[R0 ]中
;标号 功 能双字节十六进制定点数转换成格式化浮点数
;入口条件双字节定点数的绝对值在[R0 ]中数符在位1FH 中整数部分的位数
;在A 中
;出口信息转换成格式化浮点数在[R0 ]中三字节
;影响资源PSW A R2 R3 R4 位1FH 堆栈需求 字节
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 ]中
;标 号 功 能格式化浮点数转换成双字节定点数
;入口条件格式化浮点操作数在[R0 ]中
;出口信息OV=1 时溢出OV=0 时转换成功定点数的绝对值在[R0 ]中双字节
;数符
;在位1FH 中F0=1 时为整数CY=1 时为一字节整数一字节小数否则为纯小数
;影响资源PSW A B R2 R3 R4 位1FH 堆栈需求 字节
FTOD:LCALL MVR0 ;将[R0 ]传送到第一工作区
MOV A,R2
JZ FTD4 ;阶码为零纯小数
JB ACC.7,FTD4 ;阶码为负纯小数
SETB C
SUBB A,#10H
JC FTD1
SETB OV ;阶码大于溢出
RET
FTD1:SETB C
MOV A,R2
SUBB A,#8 ;阶码大于否
JC FTD3
FTD2:MOV B,#10H ;阶码大于按双字节整数转换
LCALL FTD8
SETB F0 ;设立双字节整数标志
CLR C
CLR OV
RET
FTD3:MOV B,#8 ;按一字节整数一字节小数转换
LCALL FTD8
SETB C ;设立一字节整数一字节小数标志
CLR F0
CLR OV
RET
FTD4:MOV B,#0 ;按纯小数转换
LCALL FTD8
CLR OV ;设立纯小数标志
CLR F0
CLR C
RET
FTD8:MOV A,R2 ;按规定的整数位数进行右规
CJNE A,B,FTD9
MOV A,R3 ;将双字节结果传送到[R0 ]中
MOV @R0,A
INC R0
MOV A,R4
MOV @R0,A
DEC R0
RET
FTD9:CLR C
LCALL RR1 ;右规一次
SJMP FTD8
;标 号 功 能浮点码转换成格式化浮点数
;入口条件浮点码操作数在[R0 ]中
;出口信息转换成的格式化浮点数仍在[R0 ]中
;影响资源PSW A B R2 R7 位1DH 1FH 堆栈需求字节
BTOF:INC R0 ;判断是否为零
INC R0
MOV A,@R0
MOV R7,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
ORL A,R7
JNZ BTF0
MOV @R0,#41H ;为零转换结束
RET
BTF0:MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存数符
CLR 1FH ;以绝对值进行转换
MOV C,ACC.6 ;扩充阶码为八位
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19 ;是否小于
JC BTF2
MOV @R0,#41H ;小于时以计
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1:SUBB A,#19
JC BTF2
MOV A,#3FH ;大于时封顶
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2:CLR A ;准备将码尾数转换成十六进制浮点数
MOV R4,A
MOV R3,A
MOV R2,#10H ;至少两个字节
BTF3:MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
JNB ACC.7,BTF3 ;直到尾数规格化
MOV A,R6 ;四舍五入
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
JNC BTF4
MOV R3,#80H
INC R2
BTF4:MOV DPTR,#BTFL ;准备查表得到十进制阶码对应的浮点数
MOV A,@R0
ADD A,#19 ;计算表格偏移量
MOV B,#3
MUL AB
ADD A,DPL
MOV DPL,A
JNC BTF5
INC DPH
BTF5:CLR A ;查表
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
LCALL MUL1 ;将阶码对应的浮点数和尾数对应的浮点数相乘
MOV C,1DH ;取出数符
MOV 1FH,C
LJMP MOV0 ;传送转换结果
;标 号 功 能格式化浮点数转换成浮点码
;入口条件格式化浮点操作数在[R0 ]中
;出口信息转换成的浮点码仍在[R0 ]中
;影响资源PSW A B R2 R7 位1DH 1FH 堆栈需求字节
FTOB:INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ FTB0
MOV @R0,#41H
RET
FTB0:MOV A,@R0
MOV C,ACC.7
MOV 1DH,C
CLR ACC.7
MOV @R0,A
LCALL MVR0
MOV DPTR,#BFL0 ;绝对值大于或等于时的查表起点
MOV B,#0 ;十的次幂
MOV A,R2
JNB ACC.7,FTB1
MOV DPTR,#BTFL ;绝对值小于时的查表起点
MOV B,#0EDH ;十的次幂
ADD A,#16
JNC FTB1
MOV DPTR,#BFLN ;绝对值大于或等于时的查表起点
MOV B,#0FAH ;十的次幂
FTB1:CLR A ;查表找到一个比待转换浮点数大的整数幂
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
MOV A,R5 ;和待转换浮点数比较
CLR C
SUBB A,R2
JB ACC.7,FTB2 ;差为负数
JNZ FTB3
MOV A,R6
CLR C
SUBB A,R3
JC FTB2
JNZ FTB3
MOV A,R7
CLR C
SUBB A,R4
JC FTB2
JNZ FTB3
MOV R5,B ;正好是表格中的数
INC R5 ;幂加一
MOV R6,#10H ;尾数为
MOV R7,#0
SJMP FTB6 ;传送转换结果
FTB2:INC DPTR ;准备表格下一项
INC DPTR
INC DPTR
INC B ;幂加一
SJMP FTB1
FTB3:PUSH B ;保存幂值
LCALL DIV3 ;相除得到一个二进制浮点数的纯小数
FTB4:MOV A,R2 ;取阶码
JZ FTB5 ;为零吗
CLR C
LCALL RR1 ;右规
SJMP FTB4
FTB5:POP ACC ;取出幂值
MOV R5,A ;作为十进制浮点数的阶码
LCALL HB2 ;转换尾数的十分位和百分位
MOV R6,A
LCALL HB2 ;转换尾数的千分位和万分位
MOV R7,A
MOV A,R3 ;四舍五入
RLC A
CLR A
ADDC A,R7
DA A
MOV R7,A
CLR A
ADDC A,R6
DA A
MOV R6,A
JNC FTB6
MOV R6,#10H
INC R5
FTB6:INC R0 ;存放转换结果
INC R0
MOV A,R7
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
DEC R0
MOV A,R5
MOV C,1DH ;取出数符
MOV ACC.7,C
MOV @R0,A
RET
HB2:MOV A,R4 ;尾数扩大倍
MOV B,#100
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#100
MUL AB
ADD A,R3
MOV R3,A
JNC HB21
INC B
HB21:MOV A,B ;将整数部分转换成码
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
BTFL:DB 41H,0ECH,1EH ;1.0000E-19
DB 45H,93H,93H ;1.0000E-18
DB 48H,0B8H,78H ;1.0000E-17
DB 4BH,0E6H,96H ;1.0000E-16
DB 4FH,90H,1DH ;1.0000E-15
DB 52H,0B4H,25H ;1.0000E-14
DB 55H,0E1H,2EH ;1.0000E-13
DB 59H,8CH,0BDH ;1.0000E-12
DB 5CH,0AFH,0ECH ;1.0000E-11
DB 5FH,0DBH,0E7H ;1.0000E-10
DB 63H,89H,70H ;1.0000E-9
DB 66H,0ABH,0CCH ;1.0000E-8
DB 69H,0D6H,0C0H ;1.0000E-7
BFLN:DB 6DH,86H,38H ;1.0000E-6
DB 70H,0A7H,0C6H ;1.0000E-5
DB 73H,0D1H,0B7H ;1.0000E-4
DB 77H,83H,12H ;1.0000E-3
DB 7AH,0A3H,0D7H ;1.0000E-2
DB 7DH,0CCH,0CDH ;1.0000E-1
BFL0:DB 1,80H,00H ;1.0000
DB 4,0A0H,00H ;1.0000E1
DB 7,0C8H,00H ;1.0000E2
DB 0AH,0FAH,00H ;1.0000E3
DB 0EH,9CH,40H ;1.0000E4
DB 11H,0C3H,50H ;1.0000E5
DB 14H,0F4H,24H ;1.0000E6
DB 18H,98H,97H ;1.0000E7
DB 1BH,0BEH,0BCH ;1.0000E8
DB 1EH,0EEH,6BH ;1.0000E9
DB 22H,95H,03H ;1.0000E10
DB 25H,0BAH,44H ;1.0000E11
DB 28H,0E8H,0D5H ;1.0000E12
DB 2CH,91H,85H ;1.0000E13
DB 2FH,0B5H,0E6H ;1.0000E14
DB 32H,0E3H,60H ;1.0000E15
DB 36H,8EH,1CH ;1.0000E16
DB 39H,31H,0A3H ;1.0000E17
DB 3CH,0DEH,0BH ;1.0000E18
DB 40H,8AH,0C7H ;1.0000E19
;标 号 功 能浮点余弦函数
;入口条件操作数在[R0 ]中
;出口信息结果仍在[R0 ]中
;影响资源DPTR PSW A B R2 R7 位1DH 1FH 堆栈需求 字节
FCOS:LCALL FABS ;COS(-X)=COS X
MOV R5,#1 ;常数1.5708
MOV R6,#0C9H
MOV R7,#10H
CLR 1EH
LCALL MVR0
CLR F0
LCALL AS1
LCALL MOV0 ;保存结果接着运行下面的FSIN 程序
;标 号 功 能浮点正弦函数
;入口条件操作数在[R0 ]中
;出口信息结果仍在[R0 ]中
;影响资源DPTR PSW A B R2 R7 位1DH 1FH 堆栈需求 字节
FSIN:MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自变量的符号
CLR ACC.7 ;统一按正数计算
MOV @R0,A
LCALL MVR0 ;将[R0 ]传送到第一工作区
MOV R5,#0 ;系数
MOV R6,#0A2H
MOV R7,#0FAH
CLR 1EH
LCALL MUL1 ;相乘自变量按规一化
MOV A,R2 ;将结果复制到第二区
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
LCALL INT ;第一区取整获得象限信息
MOV A,R2
JZ SIN2
SIN1:CLR C ;将浮点象限数转换成定点象限数
LCALL RR1
CJNE R2,#10H,SIN1
MOV A,R4
JNB ACC.1,SIN2
CPL 1DH ;对于第三四象限结果取反
SIN2:JB ACC.0,SIN3
CPL 1F
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -