中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版_第1页
中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版_第2页
中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版_第3页
中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版_第4页
中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.基于单片机的数字PID控制直流电机PWM调压调速器系统设计 所在学院: 机电工程学院 专业班级: 学生姓名: 学生学号: *;目 录PID简介及设计要求1设计原理与思路2设计方案4心得体会7PID简介及设计要求PID (比例积分微分,英文全称为Proportion Integration Differentiation)控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小来实现自动控制,实际中也有PI和PD控制。简单来说,就是测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应。问世至今已有近70年

2、历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的 其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。PID控制器其输入e (t)与输出u (t)的关系为 u(t)=kp(e(t)+1/TIe(t)dt+TD*de(t)/dt) 式中积分的上下限分别是0和t 因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+T

3、D*s)其中kp为比例系数; TI为积分时间常数; TD为微分时间常数。使用中只需设定三个参数(Kp,Ti和Td)即可。在很多情况下,并不一定需要全部三个单元,可以取其中的一到两个单元,但比例控制单元是必不可少的。 本次实验就是应用数字PID模型作单片机控制编程,其中P、I、D参数可根据实际情况进行输入调节。利用单片机PWM输出调节施加于直流电机两端的电压,实现对直流电机的PID调压调速功能。.设计原理与思路PID调速设计原理图如图所示,此为一闭环控制系统:§反馈量运用单片机来控制AD芯片来转换模拟电压到数字电压。具体过程如下:实际转速通过压频转换器转换为频率,输入AD转换芯片。直流

4、电机实际转速越大,则AD给定的电压越大,则产生的数字量越大。再将通过AD转换后得到的八位二进制数输入单片机。单片机利用输入的实际频率值和预先设定的值进行比较,通过运算得到一个偏差。§PID运算借助单片机实现PID运算。PID调节器通过这个偏差进行PID运算,得到PWM的占空比值。如若实际的转速比期望转速小则这样就相当于加大了PWM的占空比,相当于增大直流电机的给定电压,要是比设定值大,这样也会得到一个偏差,就把这个变差与给定的电压向减,这样就可以减少PWM的占空比,同理则减小直流电机的给定电压,直到下一次PID运算。如此往复反馈调节,直到所得实际转速与期望转速接近,达到调节电动机速度

5、的目的。§PWM输出调制PWM的意思是脉宽调节,也就是调节方波高电平和低电平的时间比。例如,一个20%占空比波形,会有20%的高电平时间和80%的低电平时间占空比越大,高电平时间越长,则输出的脉冲幅度越高,即电压越高。如果占空比为0%,那么高电平时间为0,则没有电压输出。如果占空比为100%,那么输出全部电压。所以通过调节占空比,可以实现调节输出电压的目的,而且输出电压可以无级连续调节。§提高控制精度 为提高系统实际调节时的精度,在PID运算过程中所有数据均采用浮点数运算。在单片机应用系统的数据处理过程中,浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较

6、少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。设计方案1. 硬件介绍 在产生PWM波形我们采用ADC0809芯片和AT89C51两个核心器件。 ADC0809芯片是要外加电压和时钟,当输入不同的电压的时候,就可以把不同的电压模拟量转化为数字值,输入的电压越大,其转换的相应的数字也就会越大,ADC0809芯片有8个通道输入和8个通道输出。其具体的管脚图如下: ADC0809芯片管脚图 AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory

7、)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C51是一种带2K字节闪烁可编程可擦除只读存储器的单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示 AT89C51芯片管脚图2. PWM输出程序设计 PWM通过占空比来调节方波高电平和低电平的时间比。由单片机进行控制的实际过程为:将单片机的P1.0 、P1.2与直流电机的电压输入端相接,利用定时器中断来置位复位P1.0 、P1.2来输出电压,于是我们就可以通过改变定时器初值从而改变定时时间来决定输出方波的占空比。利用T0定时器产生时间为1ms的中断(当单片机晶振频率为12MHz时置

8、初值为0FC18H),此为输出方波的周期。利用T1产生时间为01ms的中断(即定时器初值为0FC18H0FFFFH之间,依据PID调节计算值决定),此为一个方波周期中高电平的时间。将PID运算后得到的频率值转为定时器的初值,赋予定时器T1,即可改变控制电压的等效值。%PWM源程序ORG 0000HAJMP MAINORG 000BHAJMP INT0_PORG 001BHAJMP INT1_PORG 0030HMAIN:MOV TMOD,#11HMOV TH0,#0FCHMOV TL0,#18HMOV TH1,#0MOV TL1,#0MOV R1,#0FCHMOV R0,#29HSETB TR

9、0SETB TR1SETB EASETB ET0SETB ET1SJMP $INT0_P: MOV TH0,#0FCHMOV TL0,#18HMOV TH1,R1MOV TL1,R0SETB P1.0SETB P1.2SETB TR1NOPRETIINT1_P: CLR P1.0CLR P1.2CLR TR1NOPRETIEND3. 如何将实际转速采集输入单片机 直流电机在转动的过程中,光电开关会将实际的转速情况采集为电脉冲,再经压频转换器输入AD转换器。而实际输入单片机进行运算的并不是转速对应的频率值,而是经AD转换后的八位二进制数。因此,我们要求得频率值与AD转换后的八位二进制数的对应关系

10、。具体过程如下:1. 将单片机与串行数据显示器相连,利用串行数据显示器将输入单片机的八位二进制数显示。2. 将直流电机与电源连接,启动运行。通过调节转换器上的可变电阻,使显示数据为0FEH时(此为保证数据准确,防止饱和失真),记录下实际转速对应的频率值。3. 计算转速频率值与AD转换后的八位二进制数的对应系数。4.对PID控制器参数的调节 比例系数Kp对系统性能的影响: (1)对系统的动态性能影响:Kp加大,将使系统响应速度加快,Kp偏大时,系统振荡次数增多,调节时间加长;Kp太小又会使系统的响应速度缓慢。Kp的选择以输出响应产生4:1衰减过程为宜。 (2)对系统的稳态性能影响:在系统稳定的前

11、提下,加大Kp可以减少稳态误差,但不能消除稳态误差。因此Kp的整定主要依据系统的动态性能。 积分时间TI对系统性能的影响: (1)对系统的动态性能影响:积分控制通常影响系统的稳定性。TI太小,系统可能不稳定,且振荡次数较多;TI太大,对系统的影响将削弱;当TI较适合时,系统的过渡过程特性比较理想。 (2)对系统的稳态性能影响:积分控制有助于消除系统稳态误差,提高系统的控制精度,但若TI太大,积分作用太弱,则不能减少余差。 微分时间TD对系统性能的影响: (1)对系统的动态性能影响:微分时间TD的增加即微分作用的增加可以改善系统的动态特性,如减少超调量,缩短调节时间等。适当加大比例控制,可以减少

12、稳态误差,提高控制精度。但TD值偏大或偏小都会适得其反。另外微分作用有可能放大系统的噪声,降低系统的抗干扰能力。 (2)对系统的稳态性能影响:微分环节的加入,可以在误差出现或变化瞬间,按偏差变化的趋向进行控制。它引进一个早期的修正作用,有助于增加系统的稳定性。 PID控制器的参数必须根据工程问题的具体要求来考虑。一般来说,要同时满足这些要求是很难做到的,必须根据系统的具体情况,满足主要的性能指标,同时兼顾其它方面的要求。 心得体会本次实验完成了基于单片机的数字PID控制器的设计,并通过实验过程对PID参数进行调节,实现了对直流电机的调压调速过程。世上无难事,只怕有心人。从最初接触到设计题目时些

13、许的茫然到最终实验报告的完成,这其间并不是一帆风顺。在最初阶段查阅资料中,程序设计过程中,对PID参数的调节过程中我都遇到了一些问题。通过与张老师和周围的同学交流讨论,在解决问题的同时,我不仅增长了知识也提高了发现问题解决问题的能力。此时,站在“山顶”回看来路,虽然付出的过程充满了坎坷,但成功的完成设计要求也给了我很大的鼓舞与前进的动力。而在今后的人生与工作中还有很多座大山等着我。同时,细节决定成败!在程序设计的过程中,我遇到了平常容易忽视的一些问题,诸如数据存储器空间的复用,语句的书写错误,参数的符号错误等等。俗话说“千里之堤毁于蚁穴”,而这些看似细小的问题却导致了实验的失败,反复更正花费了

14、大量时间。对于我们做工程的人,细节不容忽视!这也是我经过本次实验我的亲身认知。此外,我想真诚地感谢张老师!在学习的过程中,一个方向比一个解答更为重要!张老师为我们指明了方向,而“路”完全靠我们自己去走。在提高学生自主性的同时,也增加了学生的学习与思考的动力。无论实在程序设计过程中还是实验参数调节过程中与同学讨论,都使我受益匪浅。附录:PID程序EK0 EQU 40HEK1 EQU 43HEK2 EQU 46HKPP EQU 60HKII EQU 63HKDD EQU 66HPP EQU 76HII EQU 79HDD EQU 7CHAIM EQU 50HUK0 EQU 70HUK1 EQU 7

15、3H ORG 0000HAJMP MAINORG 000BHAJMP INT0_PORG 001BHAJMP INT1_PORG 0030HMAIN:LCALL SET0SETB TR0SETB TR1SETB EASETB ET0SETB ET1SJMP $INT0_P: INC 4FH MOV R0,#4FH CJNE R0,#20,UNDO LCALL INPUTMOV 4FH,#0UNDO: MOV TH0,#0FCHMOV TL0,#18HMOV TH1,4DHMOV TL1,4EHSETB P1.0SETB P1.2SETB TR1NOPRETIINT1_P: CLR P1.0CL

16、R P1.2CLR TR1NOPRETISET0: MOV 73H,#0 MOV 74H,#0 MOV 75H,#0;%UK1 MOV R0,#UK1 LCALL BTOF MOV 40H,#00H MOV 41H,#00H MOV 42H,#0 MOV R0,#EK0 LCALL BTOF MOV 43H,#00H MOV 44H,#00H MOV 45H,#0;%EK1 MOV R0,#EK1 LCALL BTOF MOV 46H,#0 MOV 47H,#0 MOV 48H,#0;%EK2 MOV R0,#EK2 LCALL BTOF MOV 60H,#7FH MOV 61H,#10H M

17、OV 62H,#0;%KPP MOV R0,#KPP LCALL BTOF MOV 63H,#7FH MOV 64H,#10H MOV 65H,#0;%KII MOV R0,#KII LCALL BTOF MOV 66H,#00H MOV 67H,#00H MOV 68H,#0;%KDD MOV R0,#KDD LCALL BTOF MOV 50H,#03H MOV 51H,#20H MOV 52H,#00H;%AIM频率期望值给定%此值根据实际需要输入% MOV R0,#AIM LCALL BTOF MOV 53H,#01H MOV 54H,#12H MOV 55H,#90H;%求取采样的八

18、位二进制数与对应频率值之间的系数根据实际计算所得 MOV R0,#53H LCALL BTOF MOV TMOD,#11H MOV TH0,#0FCH MOV TL0,#18H MOV TH1,#0 MOV TL1,#0 MOV 4DH,#0FCH MOV 4EH,#29H;%置定时器初值 RETINPUT: MOV DPTR,#0FEF0H MOV A,#0 MOVX DPTR,AWAIT: JB P3.3,WAIT MOVX A,DPTR;%实际值读入 MOV A,#0FFH; MOV 57H,A MOV 56H,#8 MOV 58H,#0;阶码赋值8,将AD读入的八位二进制转为浮点数 M

19、OV R0,#56H MOV R1,#53H;求得八位二进制数对应的频率 LCALL FMUL;%计算偏差 MOV R1,#EK1 MOV R0,#EK2 LCALL FMOV MOV R1,#EK0 MOV R0,#EK1 LCALL FMOV MOV R1,#AIM MOV R0,#EK0 LCALL FMOV MOV R1,#56H LCALL FSUB;%PP计算 MOV R1,#EK0 MOV R0,#PP LCALL FMOV MOV R1,#EK1 LCALL FSUB MOV R1,#KPP LCALL FMUL;%II计算 MOV R0,#II MOV R1,#EK0 LCA

20、LL FMOV MOV R1,#KII LCALL FMUL;%DD; MOV R1,#EK1 MOV R0,#4AH LCALL FMOV MOV A,4AH ADD A,#1 MOV 4AH,A;%阶码加一即原数乘以2; MOV R1,#EK0 MOV R0,#DD LCALL FMOV MOV R1,#4AH LCALL FSUB MOV R1,#EK2 LCALL FADD MOV R1,#KDD LCALL FMUL ;%PID MOV R0,#UK1 MOV R1,#PP LCALL FADD MOV R1,#II LCALL FADD MOV R1,#DD LCALL FADD

21、MOV R1,#UK1 MOV R0,#UK0;检验UK1是否在05之间; LCALL FMOV;%对UK判定处理 MOV R0,#UK0 LCALL FSGN CJNE A,#1,SETZERO MOV 4AH,#01H MOV 4BH,#50H MOV 4CH,#00H MOV R0,#4AH LCALL BTOF MOV R1,#UK0 LCALL FCMP JNC SETT MOV R0,#UK0 MOV R1,#4AH LCALL FMOV LJMP SETTSETZERO:LCALL FCLR;%用UK计算T1的初值 SETT: MOV 4AH,#03H MOV 4BH,#20H

22、MOV 4CH,#00H MOV R0,#4AH LCALL BTOF MOV R1,#UK0 LCALL FMUL LCALL FTOD JC ZANDX CLR C CLR A SUBB A,4BH MOV 4BH,A CLR A SUBB A,4AH MOV 4AH,A CJNE A,#0FCH,FUZHI CLR C MOV A,#29H SUBB A,4BH JC FUZHI MOV 4BH,#29H LJMP FUZHIZANDX: CLR C CLR A SUBB A,4AH MOV 4BH,A MOV 4AH,#0FFHFUZHI: MOV 4DH,4AH MOV 4EH,4B

23、H RET;浮点数格式化FSDT: LCALL MVR0 ;将待格式化操作数传送到第一工作区中LCALL RLN ;通过左规完成格式化LJMP MOV0 ;将已格式化浮点操作数传回到R0中;FADD 功能:浮点数加法FADD: CLR F0 ;设立加法标志SJMP AS ;计算代数和;FSUB 功能:浮点数减法FSUB: SETB F0 ;设立减法标志AS: LCALL MVR1 ;计算代数和?先将R1传送到第二工作区MOV C,F0 ;用加减标志来校正第二操作数的有效符号RRC AXRL A,R1MOV C,ACC.7ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中XRL

24、 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;阶码是否上溢?S

25、ETB 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,AINC R0MOV A,R0 ;将尾数低字节存放在R4中MOV R4,ADEC R0 ;恢复数据指针DEC R0RETMVR1: MOV A,R1 ;将R1传送到第二工作区中的子程序MOV C,ACC.7 ;将数

26、符保存在位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 EQ1MOV A,R6 ;第一操作数为零,结果以第二操作数为准MOV R3,AMOV A,R

27、7MOV R4,AMOV A,R5MOV R2,AMOV C,1EHMOV 1FH,CAS2: RETEQ1: 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 EQ1 ;尾数不为零,继续对阶MOV A,R2 ;尾数为零,提前结束对阶M

28、OV R5,ASJMP AS4EQ3: MOV A,R2 ;判断第一操作数阶符JNB ACC.7,EQ2;如为正,右规第二操作数EQ4: CLR CLCALL RR1 ;第一操作数右规一次ORL A,R3 ;尾数为零否?JNZ EQ1 ;不为零,继续对阶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,

29、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;阶码取最小值RETRLN1: MOV A,R3JB ACC.7,RLN2;尾数最高位为一否?CLR C ;不为一,左规一次LCALL RL1SJMP R

30、LN ;继续判断RLN2: CLR OV ;规格化结束RETRL1: MOV A,R4 ;第一操作数左规一次RLC A ;尾数扩大一倍MOV R4,AMOV A,R3RLC AMOV R3,ADEC R2 ;阶码减一CJNE R2,#0C0H,RL1E;阶码下溢否?CLR AMOV R3,A ;阶码下溢,操作数以零计MOV R4,AMOV R2,#0C1HRL1E: CLR OVRETRR1: MOV A,R3 ;第一操作数右规一次RRC A ;尾数缩小一半MOV R3,AMOV A,R4RRC AMOV R4,AINC R2 ;阶码加一CLR OV ;清溢出标志CJNE R2,#40H,RR

31、1E;阶码上溢否?MOV R2,#3FH ;阶码溢出SETB OVRR1E: RET;FMUL 功能:浮点数乘法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×R

32、6R7-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;积为规格化数否?MOV A,R7 ;左规一次RLC AMOV R7,ALCALL RL1MUL2: MOV A,R7JNB ACC.7,MUL3

33、INC 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;FCLR 功能:浮点数清零FCLR: INC R0INC R0CLR AMOV R

34、0,ADEC R0MOV R0,ADEC R0MOV R0,#41HRET;FMOV 功能:浮点数传送FMOV: INC R0INC R0INC R1INC R1MOV A,R1MOV R0,ADEC R0DEC R1MOV A,R1MOV R0,ADEC R0DEC R1MOV A,R1MOV R0,ARET;FCMP 功能:浮点数代数值比较(不影响待比较操作数)FCMP: MOV A,R0 ;数符比较XRL A,R1JNB ACC.7,CMP2MOV A,R0 ;两数异号,以R0数符为准RLC AMOV A,#0FFHRETCMP2: MOV A,R1 ;两数同号,准备比较阶码MOV C,

35、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 R1OR

36、L A,B ;生成是否相等信息JZ CMP7JNB F0,CMP7CPL C ;R0为负时,结果取反CMP7: RET;FSGN 功能:浮点符号函数FSGN: INC R0 ;读尾数MOV A,R0INC R0ORL A,R0DEC R0DEC R0JNZ SGNRET ;尾数为零,结束SGN: MOV A,R0 ;读取操作数的阶码RLC A ;取数符MOV A,#1 ;按正数初始化JNC SGN1 ;是正数,结束MOV A,#0FFH ;是负数,改变标志SGN1: RET;DTOF 功能:双字节十六进制定点数转换成格式化浮点数DTOF: MOV R2,A ;按整数的位数初始化阶码MOV A,

37、R0 ;将定点数作尾数MOV R3,AINC R0MOV A,R0MOV R4,ADEC R0LCALL RLN ;进行规格化LJMP MOV0 ;传送结果到R0中;FTOD 功能:格式化浮点数转换成双字节定点数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,按双字节

38、整数转换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 CLCAL

39、L RR1 ;右规一次SJMP FTD8;BTOF 功能:浮点BCD码转换成格式化浮点数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

40、;小于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,

41、R6DA AMOV R6,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,ADEC R2JNB ACC.7,BTF3;直到尾数规格化?MOV A,R6 ;四舍五入?ADD A,#0B0HCLR AADDC A,R4MOV R4,ACLR AADDC A,R3MOV R3,AJNC BTF4MOV R3,#80HINC R2BTF4: MOV DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数?MOV A,R0ADD A,#19 ;计算表格偏移量?MOV B,#3MUL ABADD A,DPLMOV DPL,AJNC BTF5INC DPHBTF5: C

42、LR 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 ;传送转换结果?;FTOB 功能:格式化浮点数转换成浮点BCD码FTOB: INC R0MOV A,R0INC R0ORL A,R0DEC R0DEC R0JNZ FTB0MOV R0,#41HRETFTB0: MOV A,R0MOV C,AC

43、C.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,CM

44、OV 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 CLCALL RR1 ;右规?SJMP FTB4FTB5: POP ACC ;取出幂值?MOV R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论