友情推荐网上购书渠道:
EDN网(ednchina)购书入口   >>>
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历

百宝专栏

  • 首页 相册 标签
  • 电脑应用(65)
  • 供需信息(22)
  • 写书近况(82)
  • 匠人文集(115)
  • 硬件技术(171)
  • 匠人公告(86)
  • 与非门专栏(545)
  • 匠人笔记(115)
  • 团队撰写(96)
  • 汽车电子(52)
  • 编程技巧(465)
  • 程序宝典(476)
  • 网络酷文(472)
  • 开发工具(19)
  • 资料宝藏(274)
  • 项目管理(11)
  • 藏经宝阁(42)
  • 趣味设计(5)
  • 社区热贴(2)
  • 比尔盖茨熊专栏(0) 
  • 百宝信息

    载入中...

    百宝流量

    (2006-07-01开始)



    匠人手记

    芯片专题

    器件专题

    软件专题

    硬件专题

    综合专题

    项目专题

    原创专题

    器件检测
    LCD LED
    按键 触摸键
    E2PROM
    电池 电机
    电阻 电容 电感

    指令系统
    软件算法
    编程规范
    滤波算法
    串行通讯

    PCB设计
    I2C PWM
    红外遥控
    充电技术
    中断 ADC 

    匠人手记
    匠人夜话
    网络心路
    一周热点串烧
    从零开始玩PIC
    DIY旋转时钟

    增量式PID控制算法程序
    程序匠人 发表于 2006-4-26 23:16:00  阅读全文 | 回复(2) | 引用通告 | 编辑

    ;********增量式PID控制算法程序***********
    ;T、TD、TI、KP依次从30H,33H,36H,39H开始。
    ;A,B,C的值依次存在BLOCK1,BLOCK2,BLOCK3的地址里
    ; 这里R(k)给的是定值
    ;

    ORG 0000H
    BLOCK1 EQU 43H ;A,B ,C
    BLOCK2 EQU 46H
    BLOCK3 EQU 49H
    UK EQU 4CH ;存结果UK
    RK EQU 50H
    EK EQU 53H ;存放偏差值E(k)的始址
    EK1 EQU 56H ;存放E(k-1)的始址
    EK2 EQU 59H ;存放E(k-2)的始址
    CK EQU 5CH ;采样数据始址
    BUFF EQU 60H ;暂存区
    BUFF1 EQU 63H
    BUFF2 EQU 66H
    REC EQU 69H
    TEST:
    MOV RK,#01H ;常数Rk的BCD码浮点数
    MOV RK+1,#12H ;1.25
    MOV RK+2,#50H
    MOV 3CH,#01H ;常数1的BCD码浮点数
    MOV 3DH,#10H
    MOV 3EH,#00H
    MOV 40H,#01H ;常数2的BCD码浮点数
    MOV 41H,#20H
    MOV 42H,#00H
    MOV 30H,#01H ;T的BCD 码浮点数
    MOV 31H,#23H ;2.34
    MOV 32H,#40H
    MOV 33H,#01H ;Td的BCD码浮点数
    MOV 34H,#35H ;3.54
    MOV 35H,#40H
    MOV 36H,#01H ;Ti的BCD码浮点数
    MOV 37H,#11H ;1.12
    MOV 38H,#20H
    MOV 39H,#01H ;Kp的BCD码浮点数
    MOV 3AH,#12H ;1.25
    MOV 3BH,#50H

    MOV R0,#RK ;指向BCD码浮点操作数
    LCALL BTOF ;将其转换成二进制浮点操作数
    MOV R0,#3CH
    LCALL BTOF
    MOV R0,#40H
    LCALL BTOF

    MOV R0,#39H
    LCALL BTOF
    MOV R0,#36H ;指向BCD码浮点操作数Ti
    LCALL BTOF ;将其转换成二进制浮点操作数
    MOV R0,#33H ;指向BCD码浮点操作数Td
    LCALL BTOF ;将其转换成二进制浮点操作数
    MOV R0,#30H ;指向BCD码浮点操作数T
    LCALL BTOF ;将其转换成二进制浮点操作数

    MOV R1, #BUFF1 ;保存30H中的值 即T值
    LCALL FMOVR0
    MOV R1, #36H ;计算A值(1+T/Ti+Td/T).Kp
    LCALL FDIV
    MOV R1,#3CH ;常数1
    LCALL FADD
    MOV R0,#33H ;保存33H中的值
    MOV R1,#BUFF
    LCALL FMOVR0
    MOV R1,#BUFF1
    LCALL FDIV
    MOV R1,#30H ;30H里存的是T/Ti+1
    LCALL FADD
    MOV R1,#39H
    LCALL FMUL
    MOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中
    LCALL FMOVR0
    MOV R1,#BUFF1 ;30H恢复原值
    MOV R0,#30H
    LCALL FMOV
    MOV R1,#BUFF ;33H恢复原值
    MOV R0,#33H
    LCALL FMOV
    MOV R0,#40H ;计算B的值Kp.(1+2.Td/T)
    MOV R1,#33H
    LCALL FMUL
    MOV R1,#30H
    LCALL FDIV
    MOV R1,#3CH
    LCALL FADD
    MOV R1,#39H
    LCALL FMUL
    MOV R1,#BLOCK2 ;保存B值到BLOCK2中
    LCALL FMOVR0
    MOV R0,#39H ;计算C的值Kp.Td/T
    MOV R1,#33H
    LCALL FMUL
    MOV R1,#30H
    LCALL FDIV
    MOV R1,#BLOCK3 ;保存C值到BLOCK3中
    LCALL FMOVR0
    MOV R0,#EK1 ;将EK1,EK2设初值0
    LCALL FCLR
    MOV R0,#EK2
    LCALL FCLR
    MOV REC,#03H ;设置采样次数
    LOOP: MOV CK,#7eH ;采样数据暂时给了一个定值
    MOV CK+1,#21H ;0.002112
    MOV CK+2,#12H
    MOV R0,#CK
    LCALL BTOF
    MOV R0,#RK ;保存R(k)中的值
    MOV R1,#BUFF
    LCALL FMOVR0
    MOV R1,#CK
    LCALL FSUB ;计算R(k)-C(k)的值送给E(k)
    MOV R1,#EK
    LCALL FMOVR0
    MOV R1,#BUFF ;恢复RK的值 释放BUFF
    MOV R0,#RK
    LCALL FMOV
    MOV R0,#BLOCK2 ;将B.e(k-1)的值暂存在BUFF1中
    MOV R1,#BUFF ;保存B
    LCALL FMOVR0
    MOV R1,#EK1
    LCALL FMUL
    MOV R1,#BUFF1
    LCALL FMOVR0
    MOV R1,#BUFF ;恢复B释放BUFF
    LCALL FMOV
    MOV R0,#BLOCK3 ;将C.e(K-2)的值暂存在BUFF2中
    MOV R1,#BUFF ;保存C
    LCALL FMOVR0
    MOV R1,#EK2
    LCALL FMUL
    MOV R1,#BUFF2
    LCALL FMOVR0
    MOV R1,#BUFF ;恢复C释放BUFF
    LCALL FMOV
    MOV R0,#BLOCK1 ;A.E(k)
    MOV R1,#BUFF
    LCALL FMOVR0
    MOV R1,#EK
    LCALL FMUL
    MOV R1,#BUFF1 ;计算Uk值A.E(k)-B.E(k-1)+C.E(k-2)
    LCALL FSUB
    MOV R1,#BUFF2
    LCALL FADD
    MOV R1,#UK ;保存结果到UK中
    LCALL FMOVR0
    MOV R1,#BUFF ;恢复A 释放BUFF
    LCALL FMOV
    MOV R0,#UK ;UK转换成BCD码浮点数输出
    LCALL FTOB
    MOV R1,#EK1 ;将E(k-1)-->E(k-2),E(k)-->E(k-1)
    MOV R0,#EK2
    LCALL FMOV
    MOV R1,#EK
    MOV R0,#EK1
    LCALL FMOV
    LCALL DELAY ;等待采样时刻
    DJNZ REC,NEXT1
    SJMP $
    NEXT1: LJMP LOOP
    DELAY: MOV R7,#02H
    DELAY1: MOV R6,#0FFH
    DELAY2: DJNZ R6,DELAY2
    DJNZ R7,DELAY1
    RET


    ; (1) 标号: FSDT 功能:浮点数格式化

    ;入口条件:待格式化浮点操作数在[R0]中。

    ;出口信息:已格式化浮点操作数仍在[R0]中。
    ;影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节

    FSDT: LCALL MVR0 ;将待格式化操作数传送到第一工作区中
    LCALL RLN ;通过左规完成格式化
    LJMP MOV0 ;将已格式化浮点操作数传回到[R0]中

    ; (2) 标号: FADD 功能:浮点数加法

    ;入口条件:被加数在[R0]中,加数在[R1]中。
    ;出口信息:OV=0时,和仍在[R0]中,OV=1时,溢出。
    ;;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 6字节

    FADD: CLR F0 ;设立加法标志

    SJMP AS ;计算代数和

    ; (3) 标号: FSUB 功能:浮点数减法

    ;入口条件:被减数在[R0]中,减数在[R1]中。
    ;出口信息:OV=0时,差仍在[R0]中,OV=1时,溢出。
    ;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节

    FSUB: SETB F0 ;设立减法标志
    AS: LCALL MVR1 ;计算代数和。先将[R1]传送到第二工作区
    MOV C,F0 ;用加减标志来校正第二操作数的有效符号
    CLR A ; ********???应加的一条语句
    RRC A
    XRL A,@R1
    MOV C,ACC.7
    ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中
    XRL A,@R0 ;与第一操作数的符号比较
    RLC A
    MOV F0,C ;保存比较结果
    LCALL MVR0 ;将[R0]传送到第一工作区中
    LCALL AS1 ;在工作寄存器中完成代数运算
    MOV0: INC R0 ;将结果传回到[R0]中的子程序入口
    INC R0
    MOV A,R4 ;传回尾数的低字节
    MOV @R0,A
    DEC R0
    MOV A,R3 ;传回尾数的高字节
    MOV @R0,A
    DEC R0
    MOV A,R2 ;取结果的阶码
    MOV C,1FH ;取结果的数符
    MOV ACC.7,C ;拼入阶码中
    MOV @R0,A
    CLR ACC.7 ;不考虑数符
    CLR OV ;清除溢出标志
    CJNE A,#3FH,MV01;阶码是否上溢? ******** 应为#40H

    SETB OV ;设立溢出标志
    MV01: MOV A,@R0 ;取出带数符的阶码
    RET
    MVR0: MOV A,@R0 ;将[R0]传送到第一工作区中的子程序
    MOV C,ACC.7 ;将数符保存在位1FH中
    MOV 1FH,C
    MOV C,ACC.6 ;将阶码扩充为8bit补码
    MOV ACC.7,C
    MOV R2,A ;存放在R2中
    INC R0
    MOV A,@R0 ;将尾数高字节存放在R3中
    MOV R3,A ;
    INC R0
    MOV A,@R0 ;将尾数低字节存放在R4中
    MOV R4,A
    DEC R0 ;恢复数据指针
    DEC R0
    RET
    MVR1: MOV A,@R1 ;将[R1]传送到第二工作区中的子程序

    MOV C,ACC.7 ;将数符保存在位1EH中
    MOV 1EH,C
    MOV C,ACC.6 ;将阶码扩充为8bit补码
    MOV ACC.7,C
    MOV R5,A ;存放在R5中
    INC R1
    MOV A,@R1 ;将尾数高字节存放在R6中
    MOV R6,A
    INC R1
    MOV A,@R1 ;将尾数低字节存放在R7中
    MOV R7,A
    DEC R1 ;恢复数据指针
    DEC R1
    RET
    AS1: MOV A,R6 ;读取第二操作数尾数高字节
    ORL A,R7
    JZ AS2 ;第二操作数为零,不必运算
    MOV A,R3 ;读取第一操作数尾数高字节
    ORL A,R4
    JNZ EQ
    MOV A,R6 ;第一操作数为零,结果以第二操作数为准

    MOV R3,A
    MOV A,R7
    MOV R4,A
    MOV A,R5
    MOV R2,A
    MOV C,1EH
    MOV 1FH,C
    AS2: RET
    EQ: MOV A,R2 ;对阶,比较两个操作数的阶码
    XRL A,R5
    JZ AS4 ;阶码相同,对阶结束
    JB ACC.7,EQ3;阶符互异
    MOV A,R2 ;阶符相同,比较大小
    CLR C
    SUBB A,R5
    JC EQ4
    EQ2: CLR C ;第二操作数右规一次
    MOV A,R6 ;尾数缩小一半
    RRC A
    MOV R6,A
    MOV A,R7
    RRC A
    MOV R7,A
    INC R5 ;阶码加一
    ORL A,R6 ;尾数为零否?
    JNZ EQ ;尾数不为零,继续对阶

    MOV A,R2 ;尾数为零,提前结束对阶
    MOV R5,A
    SJMP AS4
    EQ3: MOV A,R2 ;判断第一操作数阶符
    JNB ACC.7,EQ2;如为正,右规第二操作数
    EQ4: CLR C
    LCALL RR1 ;第一操作数右规一次
    ORL A,R3 ;尾数为零否?
    JNZ EQ ;不为零,继续对阶
    MOV A,R5 ;尾数为零,提前结束对阶
    MOV R2,A
    AS4: JB F0,AS5 ;尾数加减判断
    MOV A,R4 ;尾数相加
    ADD A,R7
    MOV R4,A
    MOV A,R3
    ADDC A,R6
    MOV R3,A
    JNC AS2
    LJMP RR1 ;有进位,右规一次

    AS5: CLR C ;比较绝对值大小
    MOV A,R4
    SUBB A,R7
    MOV B,A
    MOV A,R3
    SUBB A,R6
    JC AS6
    MOV R4,B ;第一尾数减第二尾数
    MOV R3,A
    LJMP RLN ;结果规格化
    AS6: CPL 1FH ;结果的符号与第一操作数相反
    CLR C ;结果的绝对值为第二尾数减第一尾数
    MOV A,R7
    SUBB A,R4
    MOV R4,A
    MOV A,R6
    SUBB A,R3
    MOV R3,A
    RLN: MOV A,R3 ;浮点数规格化
    ORL A,R4 ;尾数为零否?
    JNZ RLN1
    MOV R2,#0C1H;阶码取最小值 ******??应为#C0H
    RET
    RLN1: MOV A,R3
    JB ACC.7,RLN2;尾数最高位为一否?
    CLR C ;不为一,左规一次
    LCALL RL1
    SJMP RLN ;继续判断
    RLN2: CLR OV ;规格化结束
    RET
    RL1: MOV A,R4 ;第一操作数左规一次
    RLC A ;尾数扩大一倍
    MOV R4,A
    MOV A,R3
    RLC A
    MOV R3,A
    DEC R2 ;阶码减一
    CJNE R2,#0C0H,RL1E;阶码下溢否? ***** 应改为CJNE R2,#0BFH,RL1E;
    CLR A
    MOV R3,A ;阶码下溢,操作数以零计
    MOV R4,A
    MOV R2,#0C1H ; ******应改为MOV R2,#0C0H
    RL1E: CLR OV
    RET
    RR1: MOV A,R3 ;第一操作数右规一次
    RRC A ;尾数缩小一半

    MOV R3,A
    MOV A,R4
    RRC A
    MOV R4,A
    INC R2 ;阶码加一
    CLR OV ;清溢出标志
    CJNE R2,#40H,RR1E;阶码上溢否?
    MOV R2,#3FH ;阶码溢出
    SETB OV
    RR1E: RET

    ; (4) 标号: FMUL 功能:浮点数乘法

    ;入口条件:被乘数在[R0]中,乘数在[R1]中。
    ;出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。
    ;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节

    FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中
    MOV A,@R0
    XRL A,@R1 ;比较两个操作数的符号

    RLC A
    MOV 1FH,C ;保存积的符号
    LCALL MUL0 ;计算积的绝对值
    LJMP MOV0 ;将结果传回到[R0]中
    MUL0: LCALL MVR1 ;将[R1]传送到第二工作区中
    MUL1: MOV A,R3 ;第一尾数为零否?
    ORL A,R4
    JZ MUL6
    MOV A,R6 ;第二尾数为零否?
    ORL A,R7
    JZ MUL5
    MOV A,R7 ;计算R3R4×R6R7-→R3R4
    MOV B,R4
    MUL AB
    MOV A,B
    XCH A,R7
    MOV B,R3
    MUL AB
    ADD A,R7
    MOV R7,A
    CLR A
    ADDC A,B
    XCH A,R4
    MOV B,R6
    MUL AB
    ADD A,R7
    MOV R7,A
    MOV A,B
    ADDC A,R4
    MOV R4,A
    CLR A
    RLC A
    XCH A,R3
    MOV B,R6
    MUL AB
    ADD A,R4
    MOV R4,A
    MOV A,B
    ADDC A,R3
    MOV R3,A
    JB ACC.7,MUL2;积为规格化数否? R7四舍五入
    MOV A,R7 ;左规一次
    RLC A
    MOV R7,A
    LCALL RL1
    MUL2: MOV A,R7
    JNB ACC.7,MUL3
    INC R4
    MOV A,R4
    JNZ MUL3
    INC R3
    MOV A,R3
    JNZ MUL3
    MOV R3,#80H
    INC R2
    MUL3: MOV A,R2 ;求积的阶码
    ADD A,R5
    MD: MOV R2,A ;阶码溢出判断

    JB ACC.7,MUL4
    JNB ACC.6,MUL6
    MOV R2,#3FH ;阶码上溢,设立标志
    SETB OV
    RET
    MUL4: JB ACC.6,MUL6
    MUL5: CLR A ;结果清零(因子为零或阶码下溢)
    MOV R3,A
    MOV R4,A
    MOV R2,#41H
    MUL6: CLR OV
    RET

    ; (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
    ; (8.1) 标号: FMOVR0 功能:浮点数传送

    ;入口条件:源操作数在[R0]中,目标地址为[R1]。
    ;出口信息:[R1]=[R0],[R0]不变。
    ;影响资源:A 堆栈需求: 2字节

    FMOVR0: INC R1
    INC R1
    INC R0
    INC R0
    MOV A,@R0
    MOV @R1,A
    DEC R1
    DEC R0
    MOV A,@R0
    MOV @R1,A
    DEC R1
    DEC R0
    MOV A,@R0
    MOV @R1,A
    RET
    ; (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]中

    ; (25) 标号: FTOD 功能:格式化浮点数转换成双字节定点数

    ;入口条件:格式化浮点操作数在[R0]中。
    ;出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符

    ;在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
    ;影响资源:PSW、A、B、R2、R3、R4、位1FH 堆栈需求: 6字节

    FTOD: LCALL MVR0 ;将[R0]传送到第一工作区
    MOV A,R2
    JZ FTD4 ;阶码为零,纯小数
    JB ACC.7,FTD4;阶码为负,纯小数
    SETB C
    SUBB A,#10H
    JC FTD1
    SETB OV ;阶码大于16,溢出
    RET
    FTD1: SETB C
    MOV A,R2
    SUBB A,#8 ;阶码大于8否?
    JC FTD3
    FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换
    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

    ; (26) 标号: BTOF 功能:浮点BCD码转换成格式化浮点数

    ;入口条件:浮点BCD码操作数在[R0]中。
    ;出口信息:转换成的格式化浮点数仍在[R0]中。
    ;影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节


    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 ;是否小于1E-19?
    JC BTF2
    MOV @R0,#41H ;小于1E-19时以0计。
    INC R0
    MOV @R0,#0
    INC R0
    MOV @R0,#0
    DEC R0
    DEC R0
    RET
    BTF1: SUBB A,#19
    JC BTF2
    MOV A,#3FH ;大于1E19时封顶。
    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 ;准备将BCD码尾数转换成十六进制浮点数。
    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 ; ******加#80H,也可以
    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 ;传送转换结果。

    ; (27) 标号: FTOB 功能:格式化浮点数转换成浮点BCD码

    ;入口条件:格式化浮点操作数在[R0]中。
    ;出口信息:转换成的浮点BCD码仍在[R0]中。
    ;影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节

    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;绝对值大于或等于1时的查表起点。
    MOV B,#0 ;十的0次幂。
    MOV A,R2
    JNB ACC.7,FTB1
    MOV DPTR,#BTFL;绝对值小于1E-6时的查表起点。
    MOV B,#0EDH ;十的-19次幂。
    ADD A,#16
    JNC FTB1
    MOV DPTR,#BFLN;绝对值大于或等于1E-6时的查表起点。
    MOV B,#0FAH ;十的-6次幂。
    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 ;尾数为0·1000。
    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 ; 尾数扩大100倍。
    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 ;将整数部分转换成BCD码。
    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

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    回复:增量式PID控制算法程序
    很急(游客)发表评论于2006-5-14 19:12:00  个人主页 | 引用 | 返回 | 删除 | 回复

    很急(游客)急求增量式PID控制算法程序c和vc编程实现液位控制

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    回复:增量式PID控制算法程序
    急死了(游客)发表评论于2006-5-14 19:07:00  个人主页 | 引用 | 返回 | 删除 | 回复

    急死了(游客)

    紧急求救:

    pid 增量式控制算法c及vc语言编程实现液位控制

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    回复:求救CCD1209的驱动程序
    日(游客)发表评论于2006-5-7 21:30:00  个人主页 | 引用 | 返回 | 删除 | 回复

    日(游客)

    您接触过CCD1209吗?您知道它的驱动程序怎么处理吗?谢谢!!!

    看《匠人手记》,与匠人同行!北航出版,正在热卖!

    发表评论:
    载入中...

    广告5号位 [投放]


    学习板、开发板、编程器、下载器、仿真器(查看详情……)

    站内搜索


    站外搜索


    百度  google
    mp3  歌词 
    图片  FLASH 
    知道  文档
    新闻  词典 
    地图  mp3 
    软件  天网 
    雅虎  爱问 
    搜狗  讯雷 
    网讯  华军 
    天空 

    21IC器件搜索
    百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     
     

    新鲜货色

    匠人手记

    近期动态

    载入中...

      《匠人手记》购书全攻略 
     书友近况:淘书手记答疑与讨论:什么是散转程序 
     《匠人手记》新书艳照
     EDN《匠人手记》签名售书优惠活动开始报名啦!
     欢迎加入《匠人手记》EDN书友会
     欢迎加入《匠人手记》书友会Q群
     《匠人手记》终稿目录
     《匠人手记》封面,请大家先睹为快
     上周六收到了北航寄来的《匠人手记》清样,让大家先睹为快

    匠人原创

    粉丝评论

    往日酷贴

    载入中...

    载入中...



     网络酷文:博客,改变的不仅仅是图书 
     网络酷文:C语言宏定义技巧C语言 条件编译详解

      21IC上海2008-04聚会报名进行中。。。 
     两分钟让你明白什么是ERP![转]
      神奇的Duff's Device 算法
      实用一线通讯电路及软件设计方法
      程序员的“七年之痒”
      史上最短但最精彩的武侠小说
      网络无厘头文学《缺钙水浒》(爆笑)

     你的博客还能持续多久(转贴)
     电动车无刷电机控制器软件设计要点(作者:谢渊斌)

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!