正文

积分分离PID控制算法程序 (A51)2006-09-22 17:11:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/18672.html

分享到:

;**********积分分离PID控制算法程序 ********;T、TD、TI、KP依次从30H,33H,36H,39H开始。;A,B,C,A',的值依次存在BLOCK1,BLOCK2,BLOCK3 BLOCK4 的地址里;这里B'与C值相同; 这里R(k)给的是定值ORG 0000HE EQU 20H ; 一阈值GK EQU 23H ;G(k)GK1 EQU 26H ;G(k-1)FK EQU 29H ;F(k)FK1 EQU 2CH ;F(k-1)BLOCK1 EQU 50H ;ABLOCK2 EQU 53H ;BBLOCK3 EQU 56H ;CBLOCK4 EQU 5AH ;A'UK EQU 5DH ;存放结果BUFF EQU 43H ;暂存区BUFF1 EQU 46HBUFF2 EQU 49HBUFFR0 EQU 4CHREC EQU 63H ;采样次数RK EQU 66H ;R(k)CK EQU 69H ;采样数据始址EK EQU 6CH ;存放偏差值E(k)的始址EK1 EQU 70H ;存放E(k-1)的始址TEST: MOV RK,#01H ;常数Rk 1.25的BCD码浮点数MOV RK+1,#12HMOV RK+2,#50H; MOV E,#7EH ;设定一阈值0.001的BCD码浮点数; MOV E+1,#10H; MOV E+2,#00HMOV E,#00H ;阈值为0.3MOV E+1,#30HMOV E+2,#00HMOV 3CH,#01H ;常数1的BCD码浮点数MOV 3DH,#10HMOV 3EH,#00HMOV 40H,#01H ;常数2的BCD码浮点数MOV 41H,#20HMOV 42H,#00HMOV 30H,#01H ;T 2.34的BCD 码浮点数MOV 31H,#23HMOV 32H,#40HMOV 33H,#01H ;Td 3.54的BCD码浮点数MOV 34H,#35HMOV 35H,#40HMOV 36H,#01H ;Ti 1.12的BCD码浮点数MOV 37H,#11HMOV 38H,#20HMOV 39H,#01H ;Kp 1.25的BCD码浮点数MOV 3AH,#12HMOV 3BH,#50HMOV R0,#E ; 将其转换成二进制浮点操作数LCALL BTOFMOV R0,#RKLCALL BTOFMOV R0,#3CHLCALL BTOFMOV R0,#40HLCALL BTOFMOV R0,#39HLCALL BTOFMOV R0,#36HLCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#33H ;指向BCD码浮点操作数TdLCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#30H ;指向BCD码浮点操作数TLCALL BTOF ;将其转换成二进制浮点操作数MOV R1, #BUFFR0 ;保存30H中的值 即T值LCALL FMOVR0MOV R1, #36H ;计算A值(1+T/Ti+Td/T).KpLCALL FDIVMOV R1,#3CH ;常数1LCALL FADDMOV R0,#33H ;保存33H中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#BUFFR0LCALL FDIVMOV R1,#30H ;30H里存的是T/Ti+1LCALL FADDMOV R1,#39HLCALL FMULMOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中LCALL FMOVR0MOV R1,#BUFFR0 ;30H恢复原值MOV R0,#30HLCALL FMOVMOV R1,#BUFF ;33H恢复原值MOV R0,#33HLCALL FMOVMOV R0,#40H ;计算B的值Kp.(1+2.Td/T)MOV R1,#33HLCALL FMULMOV R1,#30HLCALL FDIVMOV R1,#3CHLCALL FADDMOV R1,#39HLCALL FMULMOV R1,#BLOCK2 ;保存B值到BLOCK2中LCALL FMOVR0MOV R0,#39H ;计算C的值Kp.Td/TMOV R1,#33HLCALL FMULMOV R1,#30HLCALL FDIVMOV R1,#BLOCK3 ;保存C值到BLOCK3中LCALL FMOVR0MOV R0,#33H ;计算A',保存33H中的值MOV R1,#BUFFR0LCALL FMOVR0MOV R1,#30HLCALL FDIVMOV R1,#3CHLCALL FADDMOV R1,#39HLCALL FMULMOV R1,#BLOCK4 ;保存A'值到BLOCK4中LCALL FMOVR0MOV R1,#BUFFR0 ;恢复33H中的值LCALL FMOVMOV R0,#EK1 ;将EK1,FK1,GK1设初值0LCALL FCLRMOV R0,#FK1LCALL FCLRMOV R0,#GK1LCALL FCLRMOV REC,#04H ;设置采样次数LOOP: MOV CK,#01H ;采样数据暂时给了一个定值MOV CK+1,#10HMOV CK+2,#00HMOV R0,#CKLCALL BTOFMOV R0,#RK ;保存R(k)中的值MOV R1,#BUFFR0LCALL FMOVR0MOV R1,#CKLCALL FSUB ;计算R(k)-C(k)的值送给E(k)MOV R1,#EKLCALL FMOVR0MOV R1,#BUFFR0LCALL FMOV ;恢复R(K)的值,释放、BUFFR0MOV R0,#BUFFR0 ;EK存到BUFFR0MOV R1,#EKLCALL FMOVLCALL FABS ;求EK的绝对值MOV R1,#E ;判断EK的绝对值与E的大小LCALL FCMPJC PID ;EK<=E时转PID控制程序否则PD程序CJNE A,#00H,PDLJMP PIDPD: MOV R0,#BLOCK4MOV R1,#BUFFR0 ;保存A'的值LCALL FMOVR0MOV R1,#EKLCALL FMULMOV R1,#FK1LCALL FSUBMOV R1,#UK ;结果存在UK中LCALL FMOVR0MOV R1,#BUFFR0 ;恢复A'LCALL FMOVMOV R0,#BLOCK3 ;计算B'.E(k)这里B'值与C值同MOV R1,#BUFFR0 ;保存B'LCALL FMOVR0MOV R1,#EKLCALL FMULMOV R1,#FK ;B'.EK存到FK中LCALL FMOVR0MOV R1,#BUFFR0 ;恢复B'LCALL FMOVLJMP OUTPID: MOV R0,#BLOCK1 ;计算A.E(k)+G(K-1)MOV R1,#BUFFR0 ;保存ALCALL FMOVR0MOV R1,#EKLCALL FMULMOV R1,#GK1LCALL FADDMOV R1,#UK ;计算结果存入UK中LCALL FMOVR0MOV R1,#BUFFR0 ;恢复A值LCALL FMOVMOV R0,#BLOCK2 ;计算U(k)-B.E(k)+C.E(k-1)MOV R1,#BUFFR0 ;保存B到BUFFR0LCALL FMOVR0MOV R1,#EKLCALL FMULMOV R1,#BUFF ;B.E(k)保存到BUFFLCALL FMOVR0MOV R0,#UKMOV R1,#BUFF1 ;UK保存到BUFF1LCALL FMOVR0MOV R1,#BUFFLCALL FSUBMOV R1,#BUFF ;U(k)-BE(k)保存到BUFFLCALL FMOVR0MOV R0,#BLOCK3 ;计算C.E(k-1)MOV R1,#BUFF2 ;保存C到BUFF2LCALL FMOVR0MOV R1,#EK1LCALL FMULMOV R1,#BUFFLCALL FADDMOV R1,#GK ;U(k)-BE(k)+CE(k-1)保存到GKLCALL FMOVR0MOV R1,#BUFF2 ;恢复C值释放BUFF2LCALL FMOVMOV R0,#UK ;恢复UK值释放BUFF1MOV R1,#BUFF1LCALL FMOVMOV R0,#BLOCK2 ;恢复BMOV R1,#BUFFR0LCALL FMOVOUT: MOV R0,#GK1 ;G(k)-->G(k-1)MOV R1,#GKLCALL FMOVMOV R0,#FK1 ;F(k)-->F(K-1)MOV R1,#FKLCALL FMOVMOV R0,#EK1 ;E(K)-->E(K-1)MOV R1,#EKLCALL FMOVMOV R0,#UK ;UK转换成BCD码浮点数输出LCALL FTOBLCALL DELAY ;等待采样时刻DJNZ REC,NEXT1SJMP $NEXT1: LJMP LOOPDELAY: MOV R7,#02HDELAY1: MOV R6,#0FFHDELAY2: DJNZ R6,DELAY2DJNZ R7,DELAY1RET; (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 AXRL A,@R1MOV C,ACC.7ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中XRL A,@R0 ;与第一操作数的符号比较RLC AMOV F0,C ;保存比较结果LCALL MVR0 ;将[R0]传送到第一工作区中LCALL AS1 ;在工作寄存器中完成代数运算MOV0: INC R0 ;将结果传回到[R0]中的子程序入口INC R0MOV A,R4 ;传回尾数的低字节MOV @R0,ADEC R0MOV A,R3 ;传回尾数的高字节MOV @R0,ADEC R0MOV A,R2 ;取结果的阶码MOV C,1FH ;取结果的数符MOV ACC.7,C ;拼入阶码中MOV @R0,ACLR ACC.7 ;不考虑数符CLR OV ;清除溢出标志CJNE A,#3FH,MV01;阶码是否上溢? ******** 应为#40HSETB OV ;设立溢出标志MV01: MOV A,@R0 ;取出带数符的阶码RETMVR0: MOV A,@R0 ;将[R0]传送到第一工作区中的子程序MOV C,ACC.7 ;将数符保存在位1FH中MOV 1FH,CMOV C,ACC.6 ;将阶码扩充为8bit补码MOV ACC.7,CMOV R2,A ;存放在R2中INC R0MOV A,@R0 ;将尾数高字节存放在R3中MOV R3,A ;INC R0MOV A,@R0 ;将尾数低字节存放在R4中MOV R4,ADEC R0 ;恢复数据指针DEC R0RETMVR1: MOV A,@R1 ;将[R1]传送到第二工作区中的子程序MOV C,ACC.7 ;将数符保存在位1EH中MOV 1EH,CMOV C,ACC.6 ;将阶码扩充为8bit补码MOV ACC.7,CMOV R5,A ;存放在R5中INC R1MOV A,@R1 ;将尾数高字节存放在R6中MOV R6,AINC R1MOV A,@R1 ;将尾数低字节存放在R7中MOV R7,ADEC R1 ;恢复数据指针DEC R1RETAS1: MOV A,R6 ;读取第二操作数尾数高字节ORL A,R7JZ AS2 ;第二操作数为零,不必运算MOV A,R3 ;读取第一操作数尾数高字节ORL A,R4JNZ EQMOV A,R6 ;第一操作数为零,结果以第二操作数为准MOV R3,AMOV A,R7MOV R4,AMOV A,R5MOV R2,AMOV C,1EHMOV 1FH,CAS2: RETEQ: MOV A,R2 ;对阶,比较两个操作数的阶码XRL A,R5JZ AS4 ;阶码相同,对阶结束JB ACC.7,EQ3;阶符互异MOV A,R2 ;阶符相同,比较大小CLR CSUBB A,R5JC EQ4EQ2: CLR C ;第二操作数右规一次MOV A,R6 ;尾数缩小一半RRC AMOV R6,AMOV A,R7RRC AMOV R7,AINC R5 ;阶码加一ORL A,R6 ;尾数为零否?JNZ EQ ;尾数不为零,继续对阶MOV A,R2 ;尾数为零,提前结束对阶MOV R5,ASJMP AS4EQ3: MOV A,R2 ;判断第一操作数阶符JNB ACC.7,EQ2;如为正,右规第二操作数EQ4: CLR CLCALL RR1 ;第一操作数右规一次ORL A,R3 ;尾数为零否?JNZ EQ ;不为零,继续对阶MOV A,R5 ;尾数为零,提前结束对阶MOV R2,AAS4: JB F0,AS5 ;尾数加减判断MOV A,R4 ;尾数相加ADD A,R7MOV R4,AMOV A,R3ADDC A,R6MOV R3,AJNC AS2LJMP RR1 ;有进位,右规一次AS5: CLR C ;比较绝对值大小MOV A,R4SUBB A,R7MOV B,AMOV A,R3SUBB A,R6JC AS6MOV R4,B ;第一尾数减第二尾数MOV R3,ALJMP RLN ;结果规格化AS6: CPL 1FH ;结果的符号与第一操作数相反CLR C ;结果的绝对值为第二尾数减第一尾数MOV A,R7SUBB A,R4MOV R4,AMOV A,R6SUBB A,R3MOV R3,ARLN: MOV A,R3 ;浮点数规格化ORL A,R4 ;尾数为零否?JNZ RLN1MOV R2,#0C1H;阶码取最小值 ******??应为#C0HRETRLN1: MOV A,R3JB ACC.7,RLN2;尾数最高位为一否?CLR C ;不为一,左规一次LCALL RL1SJMP RLN ;继续判断RLN2: CLR OV ;规格化结束RETRL1: MOV A,R4 ;第一操作数左规一次RLC A ;尾数扩大一倍MOV R4,AMOV A,R3RLC AMOV R3,ADEC R2 ;阶码减一CJNE R2,#0C0H,RL1E;阶码下溢否? ***** 应改为CJNE R2,#0BFH,RL1E;CLR AMOV R3,A ;阶码下溢,操作数以零计MOV R4,AMOV R2,#0C1H ; ******应改为MOV R2,#0C0HRL1E: CLR OVRETRR1: MOV A,R3 ;第一操作数右规一次RRC A ;尾数缩小一半MOV R3,AMOV A,R4RRC AMOV R4,AINC R2 ;阶码加一CLR OV ;清溢出标志CJNE R2,#40H,RR1E;阶码上溢否?MOV R2,#3FH ;阶码溢出SETB OVRR1E: RET; (4) 标号: FMUL 功能:浮点数乘法;入口条件:被乘数在[R0]中,乘数在[R1]中。;出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中MOV A,@R0XRL A,@R1 ;比较两个操作数的符号RLC AMOV 1FH,C ;保存积的符号LCALL MUL0 ;计算积的绝对值LJMP MOV0 ;将结果传回到[R0]中MUL0: LCALL MVR1 ;将[R1]传送到第二工作区中MUL1: MOV A,R3 ;第一尾数为零否?ORL A,R4JZ MUL6MOV A,R6 ;第二尾数为零否?ORL A,R7JZ MUL5MOV A,R7 ;计算R3R4×R6R7-→R3R4MOV B,R4MUL ABMOV A,BXCH A,R7MOV B,R3MUL ABADD A,R7MOV R7,ACLR AADDC A,BXCH A,R4MOV B,R6MUL ABADD A,R7MOV R7,AMOV A,BADDC A,R4MOV R4,ACLR ARLC AXCH A,R3MOV B,R6MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AJB ACC.7,MUL2;积为规格化数否? R7四舍五入MOV A,R7 ;左规一次RLC AMOV R7,ALCALL RL1MUL2: MOV A,R7JNB ACC.7,MUL3INC R4MOV A,R4JNZ MUL3INC R3MOV A,R3JNZ MUL3MOV R3,#80HINC R2MUL3: MOV A,R2 ;求积的阶码ADD A,R5MD: MOV R2,A ;阶码溢出判断JB ACC.7,MUL4JNB ACC.6,MUL6MOV R2,#3FH ;阶码上溢,设立标志SETB OVRETMUL4: JB ACC.6,MUL6MUL5: CLR A ;结果清零(因子为零或阶码下溢)MOV R3,AMOV R4,AMOV R2,#41HMUL6: CLR OVRET; (5) 标号: FDIV 功能:浮点数除法;入口条件:被除数在[R0]中,除数在[R1]中。;出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。;影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节FDIV: INC R0MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ DIV1MOV @R0,#41H;被除数为零,不必运算CLR OVRETDIV1: INC R1MOV A,@R1INC R1ORL A,@R1DEC R1DEC R1JNZ DIV2SETB OV ;除数为零,溢出RETDIV2: LCALL MVR0 ;将[R0]传送到第一工作区中MOV A,@R0XRL A,@R1 ;比较两个操作数的符号RLC AMOV 1FH,C ;保存结果的符号LCALL MVR1 ;将[R1]传送到第二工作区中LCALL DIV3 ;调用工作区浮点除法LJMP MOV0 ;回传结果DIV3: CLR C ;比较尾数的大小MOV A,R4SUBB A,R7MOV A,R3SUBB A,R6JC DIV4LCALL RR1 ;被除数右规一次SJMP DIV3DIV4: CLR A ;借用R0R1R2作工作寄存器XCH A,R0 ;清零并保护之PUSH ACCCLR AXCH A,R1PUSH ACCMOV A,R2PUSH ACCMOV B,#10H ;除法运算,R3R4/R6R7-→R0R1DIV5: CLR CMOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R4RLC AMOV R4,AXCH A,R3RLC AXCH A,R3MOV F0,CCLR CSUBB A,R7MOV R2,AMOV A,R3SUBB A,R6ANL C,/F0JC DIV6MOV R3,AMOV A,R2MOV R4,AINC R1DIV6: DJNZ B,DIV5MOV A,R6 ;四舍五入CLR CRRC ASUBB A,R3CLR AADDC A,R1 ;将结果存回R3R4MOV R4,ACLR AADDC A,R0MOV R3,APOP ACC ;恢复R0R1R2MOV R2,APOP ACCMOV R1,APOP ACCMOV R0,AMOV A,R2 ;计算商的阶码CLR CSUBB A,R5LCALL MD ;阶码检验LJMP RLN ;规格化; (6) 标号: FCLR 功能:浮点数清零;入口条件:操作数在[R0]中。;出口信息:操作数被清零。;影响资源:A 堆栈需求: 2字节FCLR: INC R0INC R0CLR AMOV @R0,ADEC R0MOV @R0,ADEC R0MOV @R0,#41HRET; (7) 标号: FZER 功能:浮点数判零;入口条件:操作数在[R0]中。;出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。;影响资源:A 堆栈需求: 2字节FZER: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ ZEROMOV @R0,#41HZERO: RET; (8) 标号: FMOV 功能:浮点数传送;入口条件:源操作数在[R1]中,目标地址为[R0]。;出口信息:[R0]=[R1],[R1]不变。;影响资源:A 堆栈需求: 2字节FMOV: INC R0INC R0INC R1INC R1MOV A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R1MOV @R0,ARET; (8.1) 标号: FMOVR0 功能:浮点数传送;入口条件:源操作数在[R0]中,目标地址为[R1]。;出口信息:[R1]=[R0],[R0]不变。;影响资源:A 堆栈需求: 2字节FMOVR0: INC R1INC R1INC R0INC R0MOV A,@R0MOV @R1,ADEC R1DEC R0MOV A,@R0MOV @R1,ADEC R1DEC R0MOV A,@R0MOV @R1,ARET; (24)标号: DTOF 功能:双字节十六进制定点数转换成格式化浮点数;入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。;出口信息:转换成格式化浮点数在[R0]中(三字节)。;影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节DTOF: MOV R2,A ;按整数的位数初始化阶码MOV A,@R0 ;将定点数作尾数MOV R3,AINC R0MOV A,@R0MOV R4,ADEC R0LCALL 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,R2JZ FTD4 ;阶码为零,纯小数JB ACC.7,FTD4;阶码为负,纯小数SETB CSUBB A,#10HJC FTD1SETB OV ;阶码大于16,溢出RETFTD1: SETB CMOV A,R2SUBB A,#8 ;阶码大于8否?JC FTD3FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换LCALL FTD8SETB F0 ;设立双字节整数标志CLR CCLR OVRETFTD3: MOV B,#8 ;按一字节整数一字节小数转换LCALL FTD8SETB C ; 设立一字节整数一字节小数标志CLR F0CLR OVRETFTD4: MOV B,#0 ;按纯小数转换LCALL FTD8CLR OV ;设立纯小数标志CLR F0CLR CRETFTD8: MOV A,R2 ;按规定的整数位数进行右规***阶码是扩展后的值CJNE A,B,FTD9MOV A,R3 ;将双字节结果传送到[R0]中MOV @R0,AINC R0MOV A,R4MOV @R0,ADEC R0RETFTD9: CLR CLCALL RR1 ;右规一次SJMP FTD8; (26) 标号: BTOF 功能:浮点BCD码转换成格式化浮点数;入口条件:浮点BCD码操作数在[R0]中。;出口信息:转换成的格式化浮点数仍在[R0]中。;影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节BTOF: INC R0 ;判断是否为零。INC R0MOV A,@R0MOV R7,ADEC R0MOV A,@R0MOV R6,ADEC R0ORL A,R7JNZ BTF0MOV @R0,#41H;为零,转换结束。RETBTF0: MOV A,@R0MOV C,ACC.7MOV 1DH,C ;保存数符。CLR 1FH ;以绝对值进行转换。MOV C,ACC.6 ;扩充阶码为八位。MOV ACC.7,CMOV @R0,AJNC BTF1ADD A,#19 ;是否小于1E-19?JC BTF2MOV @R0,#41H ;小于1E-19时以0计。INC R0MOV @R0,#0INC R0MOV @R0,#0DEC R0DEC R0RETBTF1: SUBB A,#19JC BTF2MOV A,#3FH ;大于1E19时封顶。MOV C,1DHMOV ACC.7,CMOV @R0,AINC R0MOV @R0,#0FFHINC R0MOV @R0,#0FFHDEC R0DEC R0RETBTF2: CLR A ;准备将BCD码尾数转换成十六进制浮点数。MOV R4,AMOV R3,AMOV R2,#10H ;至少两个字节。BTF3: MOV A,R7ADD A,R7DA AMOV R7,AMOV A,R6ADDC A,R6DA AMOV R6,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,ADEC R2JNB ACC.7,BTF3;直到尾数规格化。MOV A,R6 ;四舍五入。ADD A,#0B0H ; ******加#80H,也可以CLR AADDC A,R4MOV R4,ACLR AADDC A,R3MOV R3,AJNC BTF4MOV R3,#80H ; ****有进位右规一次INC R2BTF4: MOV DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数。MOV A,@R0ADD A,#19 ;计算表格偏移量。MOV B,#3MUL ABADD A,DPLMOV DPL,AJNC BTF5INC DPHBTF5: CLR A ;查表。MOVC A,@A+DPTRMOV C,ACC.6MOV ACC.7,CMOV R5,AMOV A,#1MOVC A,@A+DPTRMOV R6,AMOV A,#2MOVC A,@A+DPTRMOV R7,ALCALL MUL1 ;将阶码对应的浮点数和尾数对应的浮点数相乘。MOV C,1DH ;取出数符。MOV 1FH,CLJMP MOV0 ;传送转换结果。; (27) 标号: FTOB 功能:格式化浮点数转换成浮点BCD码;入口条件:格式化浮点操作数在[R0]中。;出口信息:转换成的浮点BCD码仍在[R0]中。;影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节FTOB: INC R0MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ FTB0MOV @R0,#41HRETFTB0: MOV A,@R0MOV C,ACC.7MOV 1DH,CCLR ACC.7MOV @R0,ALCALL MVR0MOV DPTR,#BFL0;绝对值大于或等于1时的查表起点。MOV B,#0 ;十的0次幂。MOV A,R2JNB ACC.7,FTB1MOV DPTR,#BTFL;绝对值小于1E-6时的查表起点。MOV B,#0EDH ;十的-19次幂。ADD A,#16JNC FTB1MOV DPTR,#BFLN;绝对值大于或等于1E-6时的查表起点。MOV B,#0FAH ;十的-6次幂。FTB1: CLR A ;查表,找到一个比待转换浮点数大的整数幂。MOVC A,@A+DPTRMOV C,ACC.6MOV ACC.7,CMOV R5,AMOV A,#1MOVC A,@A+DPTRMOV R6,AMOV A,#2MOVC A,@A+DPTRMOV R7,AMOV A,R5 ;和待转换浮点数比较。CLR CSUBB A,R2JB ACC.7,FTB2;差为负数。JNZ FTB3MOV A,R6CLR CSUBB A,R3JC FTB2JNZ FTB3MOV A,R7CLR CSUBB A,R4JC FTB2JNZ FTB3MOV R5,B ;正好是表格中的数。INC R5 ;幂加一。MOV R6,#10H ;尾数为0·1000。MOV R7,#0SJMP FTB6 ;传送转换结果。FTB2: INC DPTR ;准备表格下一项。INC DPTRINC DPTRINC B ;幂加一。SJMP FTB1 ;FTB3: PUSH B ;保存幂值。LCALL DIV3 ;相除,得到一个二进制浮点数的纯小数。FTB4: MOV A,R2 ;取阶码。JZ FTB5 ;为零吗?CLR C ;LCALL RR1 ;右规。SJMP FTB4FTB5: POP ACC ;取出幂值。MOV R5,A ;作为十进制浮点数的阶码。LCALL HB2 ;转换尾数的十分位和百分位。MOV R6,ALCALL HB2 ;转换尾数的千分位和万分位。MOV R7,AMOV A,R3 ;四舍五入。RLC ACLR AADDC A,R7DA AMOV R7,ACLR AADDC A,R6DA AMOV R6,AJNC FTB6MOV R6,#10HINC R5FTB6: INC R0 ;存放转换结果。INC R0MOV A,R7MOV @R0,ADEC R0MOV A,R6MOV @R0,ADEC R0MOV A,R5MOV C,1DH ;取出数符。MOV ACC.7,CMOV @R0,ARETHB2: MOV A,R4 ; 尾数扩大100倍。MOV B,#100MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#100MUL ABADD A,R3MOV R3,AJNC HB21INC BHB21: MOV A,B ;将整数部分转换成BCD码。MOV B,#10DIV ABSWAP AORL A,BRETBTFL: DB 41H,0ECH,1EH ;1.0000E-19DB 45H,93H,93H ;1.0000E-18DB 48H,0B8H,78H ;1.0000E-17DB 4BH,0E6H,96H ;1.0000E-16DB 4FH,90H,1DH ;1.0000E-15DB 52H,0B4H,25H ;1.0000E-14DB 55H,0E1H,2EH ;1.0000E-13DB 59H,8CH,0BDH ;1.0000E-12DB 5CH,0AFH,0ECH ;1.0000E-11DB 5FH,0DBH,0E7H ;1.0000E-10DB 63H,89H,70H ;1.0000E-9DB 66H,0ABH,0CCH ;1.0000E-8DB 69H,0D6H,0C0H ;1.0000E-7BFLN: DB 6DH,86H,38H ;1.0000E-6DB 70H,0A7H,0C6H ;1.0000E-5DB 73H,0D1H,0B7H ;1.0000E-4DB 77H,83H,12H ;1.0000E-3DB 7AH,0A3H,0D7H ;1.0000E-2DB 7DH,0CCH,0CDH ;1.0000E-1BFL0: DB 1,80H,00H ;1.0000DB 4,0A0H,00H ;;1.0000E1DB 7,0C8H,00H ;1.0000E2DB 0AH,0FAH,00H ;1.0000E3DB 0EH,9CH,40H ;1.0000E4DB 11H,0C3H,50H ;1.0000E5DB 14H,0F4H,24H ;1.0000E6DB 18H,98H,97H ;1.0000E7DB 1BH,0BEH,0BCH ;1.0000E8DB 1EH,0EEH,6BH ;1.0000E9DB 22H,95H,03H ;1.0000E10DB 25H,0BAH,44H ;1.0000E11DB 28H,0E8H,0D5H ;1.0000E12DB 2CH,91H,85H ; 1.0000E13DB 2FH,0B5H,0E6H ;1.0000E14DB 32H,0E3H,60H ;1.0000E15DB 36H,8EH,1CH ;1.0000E16DB 39H,31H,0A3H ;1.0000E17DB 3CH,0DEH,0BH ;1.0000E18DB 40H,8AH,0C7H ;1.0000E19;绝对值子程序FABS: MOV A,@R0 ;读取操作数的阶码CLR ACC.7 ;清除数符MOV @R0,A ;回传阶码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,@R1JNB ACC.7,CMP2MOV A,@R0 ;两数异号,以[R0]数符为准RLC AMOV A,#0FFHRETCMP2: MOV A,@R1 ;两数同号,准备比较阶码MOV C,ACC.6MOV ACC.7,CMOV B,AMOV A,@R0MOV C,ACC.7MOV F0,C ;保存[R0]的数符MOV C,ACC.6MOV ACC.7,CCLR C ;比较阶码SUBB A,BJZ CMP6RLC A ;取阶码之差的符号JNB F0,CMP5CPL C ;[R0]为负时,结果取反CMP5: MOV A,#0FFH ;两数不相等RETCMP6: INC R0 ;阶码相同时,准备比较尾数INC R0INC R1INC R1CLR CMOV A,@R0SUBB A,@R1MOV B,A ;保存部分差DEC R0DEC R1MOV A,@R0SUBB A,@R1DEC R0DEC R1ORL A,B ;生成是否相等信息JZ CMP7JNB F0,CMP7CPL C ;[R0]为负时,结果取反CMP7: RET;=========

阅读(441) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册