中南大学机电一体化实验数字PIDpwm调压调速设计报告珍藏版

时间:2024.4.13

基于单片机的数字PID控制直流电机

PWM调压调速器系统设计

             

              所在学院:  机电工程学院    

专业班级:                    

学生姓名:                    

学生学号:                    


目    录

PID简介及设计要求............................................................................................................... 1

设计原理与思路......................................................................................................................... 2

设计方案......................................................................................................................................... 4

心得体会......................................................................................................................................... 7


PID简介及设计要求

PID (比例积分微分,英文全称为Proportion Integration Differentiation)控制器由比例单元(P)、积分单元(I)和微分单元(D)组成。它是根据被控过程的特性确定PID控制器的比例系数、积分时间和微分时间的大小来实现自动控制,实际中也有PI和PD控制。简单来说,就是测量关心的变量,与期望值相比较,用这个误差纠正调节控制系统的响应。

问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的 其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。

PID控制器其输入e (t)与输出u (t)的关系为 u(t)=kp(e((t)+1/TI∫e(t)dt+TD*de(t)/dt) 式中积分的上下限分别是0和t 因此它的传递函数为:G(s)=U(s)/E(s)=kp(1+1/(TI*s)+TD*s)其中kp为比例系数; TI为积分时间常数; TD为微分时间常数。使用中只需设定三个参数(Kp,Ti和Td)即可。在很多情况下,并不一定需要全部三个单元,可以取其中的一到两个单元,但比例控制单元是必不可少的。

  

本次实验就是应用数字PID模型作单片机控制编程,其中P、I、D参数可根据实际情况进行输入调节。利用单片机PWM输出调节施加于直流电机两端的电压,实现对直流电机的PID调压调速功能。

.

设计原理与思路

PID调速设计原理图

如图所示,此为一闭环控制系统:

§反馈量

运用单片机来控制AD芯片来转换模拟电压到数字电压。具体过程如下:实际转速通过压频转换器转换为频率,输入AD转换芯片。直流电机实际转速越大,则AD给定的电压越大,则产生的数字量越大。再将通过AD转换后得到的八位二进制数输入单片机。单片机利用输入的实际频率值和预先设定的值进行比较,通过运算得到一个偏差。

§PID运算

借助单片机实现PID运算。PID调节器通过这个偏差进行PID运算,得到PWM的占空比值。如若实际的转速比期望转速小则这样就相当于加大了PWM的占空比,相当于增大直流电机的给定电压,要是比设定值大,这样也会得到一个偏差,就把这个变差与给定的电压向减,这样就可以减少PWM的占空比,同理则减小直流电机的给定电压,直到下一次PID运算。如此往复反馈调节,直到所得实际转速与期望转速接近,达到调节电动机速度的目的。

§PWM输出调制

PWM的意思是脉宽调节,也就是调节方波高电平和低电平的时间比。例如,一个20%占空比波形,会有20%的高电平时间和80%的低电平时间占空比越大,高电平时间越长,则输出的脉冲幅度越高,即电压越高。如果占空比为0%,那么高电平时间为0,则没有电压输出。如果占空比为100%,那么输出全部电压。所以通过调节占空比,可以实现调节输出电压的目的,而且输出电压可以无级连续调节。

§提高控制精度

 为提高系统实际调节时的精度,在PID运算过程中所有数据均采用浮点数运算。在单片机应用系统的数据处理过程中,浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。

设计方案

1.硬件介绍

     在产生PWM波形我们采用ADC0809芯片和AT89C51两个核心器件。

    ADC0809芯片是要外加电压和时钟,当输入不同的电压的时候,就可以把不同的电压模拟量转化为数字值,输入的电压越大,其转换的相应的数字也就会越大,ADC0809芯片有8个通道输入和8个通道输出。其具体的管脚图如下:

  

                                 ADC0809芯片管脚图

      AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C51是一种带2K字节闪烁可编程可擦除只读存储器的单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示

           AT89C51芯片管脚图

2.PWM输出程序设计

    PWM通过占空比来调节方波高电平和低电平的时间比。

由单片机进行控制的实际过程为:将单片机的P1.0 、P1.2与直流电机的电压输入端相接,利用定时器中断来置位复位P1.0 、P1.2来输出电压,于是我们就可以通过改变定时器初值从而改变定时时间来决定输出方波的占空比。利用T0定时器产生时间为1ms的中断(当单片机晶振频率为12MHz时置初值为0FC18H),此为输出方波的周期。利用T1产生时间为0~1ms的中断(即定时器初值为0FC18H~0FFFFH之间,依据PID调节计算值决定),此为一个方波周期中高电平的时间。

将PID运算后得到的频率值转为定时器的初值,赋予定时器T1,即可改变控制电压的等效值。

%PWM源程序

       ORG 0000H

       AJMP MAIN

       ORG 000BH

       AJMP INT0_P

       ORG 001BH

       AJMP INT1_P

       ORG 0030H

MAIN:    MOV TMOD,#11H

       MOV TH0,#0FCH

       MOV TL0,#18H

       MOV TH1,#0

       MOV TL1,#0

       MOV R1,#0FCH

       MOV R0,#29H

       SETB TR0

       SETB TR1

       SETB EA

       SETB ET0

       SETB ET1

       SJMP $

INT0_P: MOV TH0,#0FCH

       MOV TL0,#18H

       MOV TH1,R1

       MOV TL1,R0

       SETB P1.0

       SETB P1.2

       SETB TR1

       NOP

       RETI

INT1_P: CLR P1.0

       CLR P1.2

       CLR TR1

       NOP

       RETI

       END

3.如何将实际转速采集输入单片机

      直流电机在转动的过程中,光电开关会将实际的转速情况采集为电脉冲,再经压频转换器输入AD转换器。而实际输入单片机进行运算的并不是转速对应的频率值,而是经AD转换后的八位二进制数。因此,我们要求得频率值与AD转换后的八位二进制数的对应关系。具体过程如下:

1.将单片机与串行数据显示器相连,利用串行数据显示器将输入单片机的八位二进制数显示。

2.将直流电机与电源连接,启动运行。通过调节转换器上的可变电阻,使显示数据为0FEH时(此为保证数据准确,防止饱和失真),记录下实际转速对应的频率值。

3.计算转速频率值与AD转换后的八位二进制数的对应系数。

4.对PID控制器参数的调节

    比例系数Kp对系统性能的影响:  (1)对系统的动态性能影响:Kp加大,将使系统响应速度加快,Kp偏大时,系统振荡次数增多,调节时间加长;;Kp太小又会使系统的响应速度缓慢。Kp的选择以输出响应产生4:1衰减过程为宜。  (2)对系统的稳态性能影响:在系统稳定的前提下,加大Kp可以减少稳态误差,但不能消除稳态误差。因此Kp的整定主要依据系统的动态性能。 

    积分时间TI对系统性能的影响:  (1)对系统的动态性能影响:积分控制通常影响系统的稳定性。TI太小,系统可能不稳定,且振荡次数较多;TI太大,对系统的影响将削弱;当TI较适合时,系统的过渡过程特性比较理想。  (2)对系统的稳态性能影响:积分控制有助于消除系统稳态误差,提高系统的控制精度,但若TI太大,积分作用太弱,则不能减少余差。 

微分时间TD对系统性能的影响:  (1)对系统的动态性能影响:微分时间TD的增加即微分作用的增加可以改善系统的动态特性,如减少超调量,缩短调节时间等。适当加大比例控制,可以减少稳态误差,提高控制精度。但TD值偏大或偏小都会适得其反。另外微分作用有可能放大系统的噪声,降低系统的抗干扰能力。  (2)对系统的稳态性能影响:微分环节的加入,可以在误差出现或变化瞬间,按偏差变化的趋向进行控制。它引进一个早期的修正作用,有助于增加系统的稳定性。 

PID控制器的参数必须根据工程问题的具体要求来考虑。一般来说,要同时满足这些要求是很难做到的,必须根据系统的具体情况,满足主要的性能指标,同时兼顾其它方面的要求。 

心得体会

本次实验完成了基于单片机的数字PID控制器的设计,并通过实验过程对PID参数进行调节,实现了对直流电机的调压调速过程。

世上无难事,只怕有心人。从最初接触到设计题目时些许的茫然到最终实验报告的完成,这其间并不是一帆风顺。在最初阶段查阅资料中,程序设计过程中,对PID参数的调节过程中我都遇到了一些问题。通过与张老师和周围的同学交流讨论,在解决问题的同时,我不仅增长了知识也提高了发现问题解决问题的能力。此时,站在“山顶”回看来路,虽然付出的过程充满了坎坷,但成功的完成设计要求也给了我很大的鼓舞与前进的动力。而在今后的人生与工作中还有很多座大山等着我。

同时,细节决定成败!在程序设计的过程中,我遇到了平常容易忽视的一些问题,诸如数据存储器空间的复用,语句的书写错误,参数的符号错误等等。俗话说“千里之堤毁于蚁穴”,而这些看似细小的问题却导致了实验的失败,反复更正花费了大量时间。对于我们做工程的人,细节不容忽视!这也是我经过本次实验我的亲身认知。

此外,我想真诚地感谢张老师!在学习的过程中,一个方向比一个解答更为重要!张老师为我们指明了方向,而“路”完全靠我们自己去走。在提高学生自主性的同时,也增加了学生的学习与思考的动力。无论实在程序设计过程中还是实验参数调节过程中与同学讨论,都使我受益匪浅。

附录:PID程序

EK0 EQU 40H

EK1 EQU 43H

EK2 EQU 46H

KPP EQU 60H

KII EQU 63H

KDD EQU 66H

PP  EQU 76H

II  EQU 79H

DD  EQU 7CH

AIM EQU 50H

UK0 EQU 70H

UK1 EQU 73H     

    ORG 0000H

       AJMP MAIN

       ORG 000BH

       AJMP INT0_P

       ORG 001BH

       AJMP INT1_P

       ORG 0030H

MAIN:    LCALL SET0

       SETB TR0

       SETB TR1

       SETB EA

       SETB ET0

       SETB ET1

       SJMP $

INT0_P: INC 4FH

    MOV R0,#4FH

    CJNE @R0,#20,UNDO

    LCALL INPUT

       MOV 4FH,#0

UNDO:   MOV TH0,#0FCH

       MOV TL0,#18H

       MOV TH1,4DH

       MOV TL1,4EH

       SETB P1.0

       SETB P1.2

       SETB TR1

       NOP

       RETI

INT1_P: CLR P1.0

       CLR P1.2

       CLR TR1

       NOP

       RETI

SET0:   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

        MOV 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;%求取采样的八位二进制数与对应频率值之间的系数根据实际计算所得

           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;%置定时器初值

           RET

INPUT:  MOV DPTR,#0FEF0H

        MOV A,#0

        MOVX @DPTR,A

WAIT:   JB P3.3,WAIT

        MOVX A,@DPTR;%实际值读入

           MOV A,#0FFH;

        MOV 57H,A

        MOV 56H,#8

        MOV 58H,#0;阶码赋值8,将AD读入的八位二进制转为浮点数

        MOV 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

           LCALL 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

           MOV R1,#UK1

        MOV R0,#UK0;检验UK1是否在0~5之间;

        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 SETT

SETZERO:LCALL FCLR

;%用UK计算T1的初值

SETT:   MOV 4AH,#03H

        MOV 4BH,#20H

        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 FUZHI

ZANDX:  CLR C

        CLR A

        SUBB A,4AH

        MOV 4BH,A

        MOV 4AH,#0FFH

FUZHI:  MOV 4DH,4AH

        MOV 4EH,4BH

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

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 EQ1

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

EQ1: 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 EQ1 ;尾数不为零,继续对阶

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 EQ1 ;不为零,继续对阶

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;阶码取最小值

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;阶码下溢否?

CLR A

MOV R3,A ;阶码下溢,操作数以零计

MOV R4,A

MOV R2,#0C1H

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

;FMUL 功能:浮点数乘法

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;积为规格化数否?

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

;FCLR 功能:浮点数清零

FCLR: INC R0

INC R0

CLR A

MOV @R0,A

DEC R0

MOV @R0,A

DEC R0

MOV @R0,#41H

RET

;FMOV 功能:浮点数传送

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

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

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

;FSGN 功能:浮点符号函数

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

;DTOF 功能:双字节十六进制定点数转换成格式化浮点数

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]中

;FTOD 功能:格式化浮点数转换成双字节定点数

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

;BTOF 功能:浮点BCD码转换成格式化浮点数

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

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 ;传送转换结果?

;FTOB 功能:格式化浮点数转换成浮点BCD码

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

更多相关推荐:
机电一体化实验报告

机电一体化实验报告学院核技术与自动化工程学院专业电气工程及其自动化指导老师康东姓名许学号日期新20xx0605020920xx1027实验一基于PC的传感器与数据采集实验一实验目的了解传感器USB20xx便携式...

机电一体化实习报告

学号:1143001472028姓名:杨浮兵一、实习目的终于等到了实习的时候了,很早以前就从师兄那里打听到了有实习,那时候可以说是急切地期盼着这一天的到来,因为大家再也无法满足于课堂教学,尽管从同学朋友那里了解…

大学生机电一体化实习报告范文

机电一体化实习报告实践单位:上海程通机电厂实践课题:机电一体化技术的社会实践和就业形势实践内容:古人有云:“纸上得来终觉浅,绝知此事要躬行”。自从走进了大学,距离工作就不远了,学校为了拓展我们学生自身的知识面,…

机电一体化系统综合实训报告

瑞安电大机电一体化系统综合实训报告年级专业学号姓名实习单位岁月如流水般一去不返作为数控专业的一名学生通过大学提供的综合型学习平台整合课堂中相关专业技能知识从而具备了一名数控专业学生应该具备的基本能力以及素质尤其...

中南大学机电一体化实验报告

实验目的1.了解直流电机PWM的工作原理;2.用汇编语言编程并用PID调速方法实现直流电机的调速;3.培养综合应用所学知识来指导实践的能力;4.掌握常用元器件的识别和测试,熟悉常用仪表,了解电路调试的基本方法,…

机电一体化毕业实习报告

机电工程系毕业实习报告题目专业机电一体化技术班级学生姓名指导教师完成日期20xx年05月10日附件9毕业生毕业实习报告撰写说明毕业实习是高职教育人才培养方案的重要组成部分是教师教育过程中培养学生的创新精神和实践...

机电一体化系统设计实验报告

实验一三相异步电动机正反转控制实验专业年级学号姓名评分一实验目的1学习和掌握PLC的实际操作和使用方法2学习和掌握利用PLC控制三相异步电动机正反转的方法二实验内容及步骤本实验采用PLC对三相异步电动机进行正反...

机电一体化实验报告双冲头机构

姓名学号班级20xx年12月20日机电一体化实验报告1概述12实验目的13实验材料14实验步骤15心得体会21概述机电一体化设计中机构创新是各类复杂机械设计中决定性的一步机构的设计选型一般先通过作图和计算来进行...

机电一体化实训报告 -

西安广播电视大学综合实训报告(理、工、农、医用)年(季):2010春专业:数控技术(专)课程:机电一体化系统设计学号:***综合实训报告任务书一、课程性质、目的和任务机电一体化系统综合实训是中央广播电视大学数控…

机电一体化系统综合实训报告2

机电一体化系统综合实训一课程性质目的和任务机电一体化系统综合实训是数控技术专业专科的重要的综合实践课之一本课程4学分课内学时为72本实训环节是在课程试验的基础上以机电一体化系统的硬件连接控制原理控制软件编制安装...

机电一体化实习报告3

机电一体化实习报告实践单位汇众兴机电厂实践课题机电一体化中金工的认识与实践实践内容一实习意义我们大家都知道一个高校毕业生在三年或四年大学生涯结束之前都要参加一次踏入社会前的实习活动对于这个活动的意义不同人不同的...

机电一体化专业人才培养方案论证报告

机电一体化专业人才培养方案论证报告一调研目的时间对象方式1调研目的了解山东省经济科技和社会发展对职业技术教育人才培养模式教学内容课程体系知识和能力结构的需求情况定位机电一体化专业职业技术人才的培养目标和人才规格...

机电一体化实验报告(39篇)