中国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单片机实用子程序库(五)〗的最新评论:
    (5) 标号: FDIV 功能:浮点数除法

    入口条件:被除数在[R0]中,除数在[R1]中。
    出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。
    影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节
    FDIV: INC R0
    MOV A,@R0
    INC R0
    ORL A,@R0
    DEC R0
    DEC R0
    JNZ DIV1
    MOV @R0,#41H;被除数为零,不必运算
    CLR OV
    RET
    DIV1: INC R1
    MOV A,@R1
    INC R1 
    ORL A,@R1
    DEC R1
    DEC R1 
    JNZ DIV2 
    SETB OV ;除数为零,溢出
    RET 
    DIV2: LCALL MVR0 ;将[R0]传送到第一工作区中
    MOV A,@R0
    XRL A,@R1 ;比较两个操作数的符号
    RLC A
    MOV 1FH,C ;保存结果的符号
    LCALL MVR1 ;将[R1]传送到第二工作区中
    LCALL DIV3 ;调用工作区浮点除法
    LJMP MOV0 ;回传结果
    DIV3: CLR C ;比较尾数的大小
    MOV A,R4
    SUBB A,R7
    MOV A,R3
    SUBB A,R6
    JC DIV4
    LCALL RR1 ;被除数右规一次
    SJMP DIV3
    DIV4: CLR A ;借用R0R1R2作工作寄存器
    XCH A,R0 ;清零并保护之
    PUSH ACC
    CLR A
    XCH A,R1
    PUSH ACC
    MOV A,R2
    PUSH ACC
    MOV B,#10H ;除法运算,R3R4/R6R7-→R0R1
    DIV5: CLR C
    MOV A,R1
    RLC A
    MOV R1,A
    MOV A,R0
    RLC A
    MOV R0,A
    MOV A,R4
    RLC A
    MOV R4,A
    XCH A,R3
    RLC A
    XCH A,R3
    MOV F0,C
    CLR C
    SUBB A,R7
    MOV R2,A
    MOV A,R3
    SUBB A,R6
    ANL C,/F0
    JC DIV6
    MOV R3,A
    MOV A,R2
    MOV R4,A
    INC R1
    DIV6: DJNZ B,DIV5
    MOV A,R6 ;四舍五入
    CLR C
    RRC A
    SUBB A,R3
    CLR A
    ADDC A,R1 ;将结果存回R3R4
    MOV R4,A
    CLR A
    ADDC A,R0
    MOV R3,A
    POP ACC ;恢复R0R1R2
    MOV R2,A
    POP ACC
    MOV R1,A
    POP ACC
    MOV R0,A
    MOV A,R2 ;计算商的阶码
    CLR C
    SUBB A,R5
    LCALL MD ;阶码检验
    LJMP RLN ;规格化

    (6) 标号: FCLR 功能:浮点数清零

    入口条件:操作数在[R0]中。
    出口信息:操作数被清零。
    影响资源:A 堆栈需求: 2字节
    FCLR: INC R0
    INC R0
    CLR A
    MOV @R0,A
    DEC R0
    MOV @R0,A
    DEC R0
    MOV @R0,#41H
    RET 
     
    (7) 标号: FZER 功能:浮点数判零

    入口条件:操作数在[R0]中。
    出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。
    影响资源:A 堆栈需求: 2字节
    FZER: INC R0
    INC R0
    MOV A,@R0
    DEC R0
    ORL A,@R0
    DEC R0
    JNZ ZERO
    MOV @R0,#41H
    ZERO: RET 

    (8) 标号: FMOV 功能:浮点数传送

    入口条件:源操作数在[R1]中,目标地址为[R0]。
    出口信息:[R0]=[R1],[R1]不变。
    影响资源:A 堆栈需求: 2字节
    FMOV: INC R0
    INC R0
    INC R1
    INC R1
    MOV A,@R1
    MOV @R0,A
    DEC R0
    DEC R1
    MOV A,@R1
    MOV @R0,A
    DEC R0
    DEC R1
    MOV A,@R1
    MOV @R0,A
    RET
     
    (9) 标号: FPUS 功能:浮点数压栈

    入口条件:操作数在[R0]中。
    出口信息:操作数压入栈顶。
    影响资源:A、R2、R3 堆栈需求: 5字节
    FPUS: POP ACC ;将返回地址保存在R2R3中
    MOV R2,A
    POP ACC
    MOV R3,A
    MOV A,@R0 ;将操作数压入堆栈
    PUSH ACC
    INC R0
    MOV A,@R0
    PUSH ACC
    INC R0
    MOV A,@R0
    PUSH ACC
    DEC R0
    DEC R0
    MOV A,R3 ;将返回地址压入堆栈
    PUSH ACC
    MOV A,R2
    PUSH ACC
    RET ;返回主程序

    (10) 标号: FPOP 功能:浮点数出栈

    入口条件:操作数处于栈顶。
    出口信息:操作数弹至[R0]中。
    影响资源:A、R2、R3 堆栈需求: 2字节
    FPOP: POP ACC ;将返回地址保存在R2R3中
    MOV R2,A
    POP ACC
    MOV R3,A
    INC R0
    INC R0
    POP ACC ;将操作数弹出堆栈,传送到[R0]中
    MOV @R0,A
    DEC R0
    POP ACC
    MOV @R0,A
    DEC R0
    POP ACC
    MOV @R0,A
    MOV A,R3 ;将返回地址压入堆栈
    PUSH ACC
    MOV A,R2
    PUSH ACC
    RET ;返回主程序

    (11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数)

    入口条件:待比较操作数分别在[R0]和[R1]中。
    出口信息:若CY=1,则[R0] < [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] > [R1]。
    影响资源:A、B、PSW 堆栈需求: 2字节
    FCMP: MOV A,@R0 ;数符比较
    XRL A,@R1
    JNB ACC.7,CMP2
    MOV A,@R0 ;两数异号,以[R0]数符为准
    RLC A
    MOV A,#0FFH
    RET 
    CMP2: MOV A,@R1 ;两数同号,准备比较阶码
    MOV C,ACC.6
    MOV ACC.7,C
    MOV B,A
    MOV A,@R0
    MOV C,ACC.7
    MOV F0,C ;保存[R0]的数符
    MOV C,ACC.6
    MOV ACC.7,C
    CLR C ;比较阶码
    SUBB A,B
    JZ CMP6
    RLC A ;取阶码之差的符号
    JNB F0,CMP5
    CPL C ;[R0]为负时,结果取反
    CMP5: MOV A,#0FFH ;两数不相等
    RET 
    CMP6: INC R0 ;阶码相同时,准备比较尾数
    INC R0
    INC R1
    INC R1
    CLR C
    MOV A,@R0
    SUBB A,@R1
    MOV B,A ;保存部分差 
    DEC R0
    DEC R1
    MOV A,@R0
    SUBB A,@R1
    DEC R0
    DEC R1
    ORL A,B ;生成是否相等信息
    JZ CMP7
    JNB F0,CMP7
    CPL C ;[R0]为负时,结果取反
    CMP7: RET
     
    (12) 标号: FABS 功能:浮点绝对值函数

    入口条件:操作数在[R0]中。
    出口信息:结果仍在[R0]中。
    影响资源:A 堆栈需求: 2字节
    FABS: MOV A,@R0 ;读取操作数的阶码
    CLR ACC.7 ;清除数符
    MOV @R0,A ;回传阶码
    RET

    (13) 标号: FSGN 功能:浮点符号函数

    入口条件:操作数在[R0]中。
    出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零。
    影响资源:PSW、A 堆栈需求: 2字节
    FSGN: INC R0 ;读尾数
    MOV A,@R0
    INC R0
    ORL A,@R0
    DEC R0
    DEC R0
    JNZ SGN
    RET ;尾数为零,结束
    SGN: MOV A,@R0 ;读取操作数的阶码
    RLC A ;取数符
    MOV A,#1 ;按正数初始化
    JNC SGN1 ;是正数,结束
    MOV A,#0FFH ;是负数,改变标志
    SGN1: RET

    (14) 标号: FINT 功能:浮点取整函数

    入口条件:操作数在[R0]中。
    出口信息:结果仍在[R0]中。
    影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节
    FINT: LCALL MVR0 ;将[R0]传送到第一工作区中
    LCALL INT ;在工作寄存器中完成取整运算
    LJMP MOV0 ;将结果传回到[R0]中
    INT: MOV A,R3
    ORL A,R4
    JNZ INTA
    CLR 1FH ;尾数为零,阶码也清零,结束取整
    MOV R2,#41H
    RET 
    INTA: MOV A,R2
    JZ INTB ;阶码为零否?
    JB ACC.7,INTB;阶符为负否?
    CLR C
    SUBB A,#10H ;阶码小于16否?
    JC INTD
    RET ;阶码大于16,已经是整数
    INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一
    MOV R4,A
    MOV C,1FH
    RRC A
    MOV R3,A
    RL A
    MOV R2,A
    JNZ INTC
    MOV R2,#41H
    INTC: RET
    INTD: CLR F0 ;舍尾标志初始化
    INTE: CLR C
    LCALL RR1 ;右规一次
    ORL C,F0 ;记忆舍尾情况
    MOV F0,C
    CJNE R2,#10H,INTE;阶码达到16(尾数完全为整数)否?
    JNB F0,INTF ;舍去部分为零否?
    JNB 1FH,INTF;操作数为正数否?
    INC R4 ;对于带小数的负数,向下取整
    MOV A,R4
    JNZ INTF
    INC R3
    INTF: LJMP RLN ;将结果规格化

    (15) 标号: FRCP 功能:浮点倒数函数

    入口条件:操作数在[R0]中。
    出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。
    影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节
    FRCP: MOV A,@R0
    MOV C,ACC.7
    MOV 1FH,C ;保存数符
    MOV C,ACC.6 ;绝对值传送到第二工作区
    MOV ACC.7,C
    MOV R5,A
    INC R0
    MOV A,@R0
    MOV R6,A
    INC R0
    MOV A,@R0
    MOV R7,A
    DEC R0
    DEC R0
    ORL A,R6
    JNZ RCP
    SETB OV ;零不能求倒数,设立溢出标志
    RET 
    RCP: MOV A,R6
    JB ACC.7,RCP2;操作数格式化否?
    CLR C ;格式化之
    MOV A,R7
    RLC A
    MOV R7,A
    MOV A,R6
    RLC A
    MOV R6,A
    DEC R5
    SJMP RCP
    RCP2: MOV R2,#1 ;将数值1.00传送到第一工作区
    MOV R3,#80H
    MOV R4,#0
    LCALL DIV3 ;调用工作区浮点除法,求得倒数
    LJMP MOV0 ;回传结果

    (16) 标号: FSQU 功能:浮点数平方

    入口条件:操作数在[R0]中。
    出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出。
    影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 9字节
    FSQU: MOV A,R0 ;将操作数
    XCH A,R1 ;同时作为乘数
    PUSH ACC ;保存R1指针
    LCALL FMUL ;进行乘法运算
    POP ACC
    MOV R1,A ;恢复R1指针
    RET

    (待续)

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