中国IEEE
关于我们 | 会员登陆 | 收藏本站 | 留 言 薄
 

 | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 谷歌商城 | 视频教程 | ieee | 
热门搜索关键字: 单片机教程 | 三极管 | 二极管 |  C语言汇编语言SCADA元器件模拟电子 |
cnieee.com baidu
栏目导航  
栏目更新推荐  
·51单片机C语言学习
·自制51单片机试验板
·AT89S51单片机下载器软件使用说明
·用MCS51做电子钟(附源程序)
·MCS-51单片机实用子程序库(七)
·MCS-51单片机实用子程序库(六)
·MCS-51单片机实用子程序库(五)
·MCS-51单片机实用子程序库(四)
点击TOP(10)  
·自制51单片机试验板
图片文章  

51单片机C语言学习

自制51单片机试验板

AT89S51单片机下载器…

用MCS51做电子钟(附…
 
您现在的位置: 中国IEEE中国电气电子工程师网 >> 单片机知识 >> 硬件知识 >> 51单片机 >> 正文

MCS-51单片机实用子程序库(六)
文章来源:不详 点击数: 更新时间:2008-5-6 【字体:
(欢迎光临中国IEEE,希望本文能对您有所帮助http://www.cnieee.com)


相关文章:

MCS-51指令系统概述
MCS-51 8位单片机(80C,87C/31,51,52,54,58)…
用MCS51做电子钟(附源程序)
MCS-51单片机实用子程序库(七)

  • 上一个文章:

  • 下一个文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    关于〖MCS-51单片机实用子程序库(六)〗的最新评论:
    (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]中

    (待续) 
    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明网站地图 | 名站导航 | 管理登录 | 
    本站资源部分来自互联网,如侵犯您的权利,我们将予以删除  鲁ICP备08006092号
    本站欢迎同类网站做友情链接,QQ留言
    中国IEEE 中国电气电子工程师网 版权所有