PID控制算法程序文件

合集下载

PID_T使用说明

PID_T使用说明

1.功能介绍 (2)2.安装说明 (2)2.1.添加库文件 (2)2.2.调用PID库 (4)3.PID库功能说明 (4)3.1.地址参数说明 (4)3.2.控制字、状态字位地址 (6)4.应用例子 (7)4.1.系统需求 (7)4.2.应用程序 (9)4.3.程序说明 (9)1. 功能介绍PID_T功能块是集成在CPU内部,不占用用户程序空间,作为一个库函数提供给用户使用。

PID_T主要针对温度控制的智能PID功能,带有自整定、自适功能,用户无需复杂编程,只需调用和设置一些简单的参数就可以使用,温度控制准确。

2. 安装说明2.1. 添加库文件在“文件”----“添加/删除库”,找到库文件“”,如下图所示。

在你存放的文件的位置,找到此文件,如下图所示,点“添加“按钮。

安装成功后,在目录树的“库“下可以看到新增加的PID_T的库:2.2. 调用PID库点要添加功能块的“网络”,双击“库”下面的“PID_T”,就会在“网络”里出现相应的功能块。

结果如下图所示:3. PID库功能说明3.1. 地址参数说明参数地址说明类型数值范围备注LOOP 属于第几个回字,常数或变量0-63路PID,不能重复。

从0开始。

CTRL_WORD 控制字,控制字,常数或变量常用控制字:1、3.2. 控制字、状态字位地址控制字的位地址意义如下:状态字位地址的意义:4. 应用例子4.1. 系统需求在这个例子里,我们以一个温区为例,系统及I/O配置表如下:4.2. 应用程序4.3. 程序说明程序地址参数说明如下:PID_T的参数说明参数地址或数值说明备注LOOP 0 因为这是第一个回路,所以是。

单片机PID算法程序精编版

单片机PID算法程序精编版

单片机P I D算法程序公司内部编号:(GOOD-TMMT-MMUT-UUPTY-UUYY-DTTI-51单片机P I D算法程序(二)位置式P I D控制算法由51单片机组成的数字控制系统控制中,PID控制器是通过PID控制算法实现的。

51单片机通过AD对信号进行采集,变成数字信号,再在单片机中通过算法实现PID运算,再通过DA把控制量反馈回控制源。

从而实现对系统的伺服控制。

位置式PID控制算法位置式PID控制算法的简化示意图上图的传递函数为:(2-1)在时域的传递函数表达式(2-2)对上式中的微分和积分进行近似(2-3)式中n是离散点的个数。

于是传递函数可以简化为:(2-4)其中u(n)——第k个采样时刻的控制;KP——比例放大系数;Ki——积分放大系数;Kd——微分放大系数;T ——采样周期。

如果采样周期足够小,则(2-4)的近似计算可以获得足够精确的结果,离散控制过程与连续过程十分接近。

(2-4)表示的控制算法直接按(2-1)所给出的PID控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为全量式或位置式PID控制算法。

缺点:1)由于全量输出,所以每次输出均与过去状态有关,计算时要对e(k)(k=0,1,…n)进行累加,工作量大。

2)因为计算机输出的u(n)对应的是执行机构的实际位置,如果计算机出现故障,输出u(n)将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实际生产中是不允许的。

位置式PID控制算法C51程序具体的PID参数必须由具体对象通过实验确定。

由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。

这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。

PID控制实验报告

PID控制实验报告

实验二 数字PID 控制计算机控制是一种采样控制,它只能根据采样时刻的偏差值计算控制量。

因此连续PID 控制算法不能直接使用,需要采用离散化方法。

在计算机PID 控制中,使用的是数字PID 控制器。

一、位置式PID 控制算法按模拟PID 控制算法,以一系列的采样时刻点kT 代表连续时间t ,以矩形法数值积分近似代替积分,以一阶后向差分近似代替微分,可得离散PID 位置式表达式:∑∑==--++=⎪⎪⎭⎫ ⎝⎛--++=k j di p k j D I p T k e k e k T j e k k e k k e k e T T j e T T k e k k u 00)1()()()())1()(()()()( 式中,D p d I pi T k k T k k ==,,e 为误差信号(即PID 控制器的输入),u 为控制信号(即控制器的输出)。

在仿真过程中,可根据实际情况,对控制器的输出进行限幅。

二、连续系统的数字PID 控制仿真连续系统的数字PID 控制可实现D/A 及A/D 的功能,符合数字实时控制的真实情况,计算机及DSP 的实时PID 控制都属于这种情况。

1.Ex3 设被控对象为一个电机模型传递函数BsJs s G +=21)(,式中J=0.0067,B=0.1。

输入信号为)2sin(5.0t π,采用PD 控制,其中5.0,20==d p k k 。

采用ODE45方法求解连续被控对象方程。

因为Bs Js s U s Y s G +==21)()()(,所以u dt dy B dty d J =+22,另y y y y ==2,1,则⎪⎩⎪⎨⎧+-==/J)*u ((B/J)y y y y 12221 ,因此连续对象微分方程函数ex3f.m 如下 function dy = ex3f(t,y,flag,para)u=para;J=0.0067;B=0.1;dy=zeros(2,1);dy(1) = y(2);dy(2) = -(B/J)*y(2) + (1/J)*u;控制主程序ex3.mclear all;close all;ts=0.001; %采样周期xk=zeros(2,1);%被控对象经A/D转换器的输出信号y的初值e_1=0;%误差e(k-1)初值u_1=0;%控制信号u(k-1)初值for k=1:1:2000 %k为采样步数time(k) = k*ts; %time中存放着各采样时刻rin(k)=0.50*sin(1*2*pi*k*ts); %计算输入信号的采样值para=u_1; % D/AtSpan=[0 ts];[tt,xx]=ode45('ex3f',tSpan,xk,[],para); %ode45解系统微分方程%xx有两列,第一列为tt时刻对应的y,第二列为tt时刻对应的y导数xk = xx(end,:); % A/D,提取xx中最后一行的值,即当前y和y导数yout(k)=xk(1); %xk(1)即为当前系统输出采样值y(k)e(k)=rin(k)-yout(k);%计算当前误差de(k)=(e(k)-e_1)/ts; %计算u(k)中微分项输出u(k)=20.0*e(k)+0.50*de(k);%计算当前u(k)的输出%控制信号限幅if u(k)>10.0u(k)=10.0;endif u(k)<-10.0u(k)=-10.0;end%更新u(k-1)和e(k-1)u_1=u(k);e_1=e(k);endfigure(1);plot(time,rin,'r',time,yout,'b');%输入输出信号图xlabel('time(s)'),ylabel('rin,yout');figure(2);plot(time,rin-yout,'r');xlabel('time(s)'),ylabel('error');%误差图程序运行结果显示表1所示。

基于DSP的PID控制算法的实现

基于DSP的PID控制算法的实现

《数字信号处理与DSP应用》课程论文题目:基于DSP的PID控制算法的实现学号:***********名:***班级:6班专业:电路与系统课程老师:黄乡生二零一二年二月二十日摘要:按偏差的比例、积分和微分进行控制的调节器称为PID调节器,PID 调节器是连续系统中技术成熟、应用最为广泛的一种调节器。

它构简单,参数易于调整,在长期的应用中已积累了丰富的经验。

特别在工业过程中,由于控制对象的精确数学模型难以建立,系统的参数又经常发生变化,运用现代控制理论分析综合要耗费很大的代价进行模型辨识,但往往不能得到预期的效果,所以人们常采用数字PID调节器,并根据经验进行在线整定。

这次课程设计将综合用数字信号处理DSP以及自动控制方面的知识,使用CCS集成开发环境进行代码的编译,仿真,才能完成了本次设计。

关键词:PID控制;DSP;仿真;CCSAbstrat: According to the proportion of deviation, integral and differential controls the regulator called the PID regulator, PID regulator is continuous system mature technology, the most widely used a regulator. Its simple structure, easy to adjust the parameters, in the long-term of the application has accumulated a wealth of experience. Especially in the industrial process, because the controlled objects, accurate mathematical model is hard to develop, the parameters of the system and often changes, the use of modern control theory of comprehensive analysis to take a lot of cost model identification, but often can't get the desired effect, so people often uses the digital PID regulator, and according to the experience of online setting. The courses are designed to be integrated with the digital signal processing DSP as well as the automatic control the knowledge of therespect, use CCS integrated development environment for the compilation of the code, simulation, to complete the design.Keywords: PID Control;DSP;simulation ;CCS前言在数字PID算法是目前一般控制领域中经常使用的自动控制算法,它依据给定的设定值,反馈值,以及比例系数,积分和微分时间,计算出一定的控制量,使被控对象能保持在设定的工作范围,并且可以自动的消除外部扰动。

PID控制c程序

PID控制c程序

至于参数的整定,根据响应的情况调,比如,响应慢了,我就增大kp,或者减小kd,超调大了,就减小kp或增大点kd,这个规律你可以看看PID三个参数的作用:)SetPoint =SetPoint- Verror;//与设定值比较,得到误差值tempi=PIDCal(&vPID, Error;+=tempi;// Value与Num[2]为共同体,共同体名laserLASERH=[0];LASERL=[1];}}/////////////////////////////////////////////////////////////////////////Title:PID参数初始化//Description: Proportion="0"//Integral=0//LastError=0//Input: PID的P、I控制常数和之前的误差量(PID *pp)//Return:void PIDInit (PID *pp)//PID参数初始化,都置0{memset ( pp,0,sizeof(PID));//memset()的函数,它可以一字节一字节地把整个数组设置为一个指定的值。

// memset()函数在头文件中声明,它把数组的起始地址作为其第一个参数,//第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。

//其函数原型为:void *memset(void*,int,unsigned);//头文件<>}/////////////////////////////////////////////////////////////////////////Title:增量式PID算法程序//Description:给出一个误差增量//Input: PID的P、I控制常数和之前的误差量(PID *pp)& 当前误差量(ThisError)//Return: 误差增量templ//////////////////////////////////////////////////////////////////////int PIDCal( PID *pp, int ThisError ){//增量式PID算法(需要控制的不是控制量的绝对值,而是控制量的增量)int pError,dError,iError;long templ;pError = ThisError-pp->LastError;iError = ThisError;dError = ThisError-2*(pp->LastError)+pp->PreError;//增量计算templ=pp->Proportion*pError + pp->Integral*iError+pp->Derivative*dError;//增量//存储误差用于下次运算pp->PreError= pp->LastError;pp->LastError = ThisError;return ((int)(templ>>8));}。

直流电机控制(PID)实验报告

直流电机控制(PID)实验报告
b = speed1 / 100;
s = speed1 % 100 / 10;
g = speed1 % 100 % 10;
sent(table[b]);
sent(table[s]);
sent(table[g]);
sent(0); sent(0);//预期值
sent(table[speedset/100]);
out=0;
uk1=uk;//为下一次增量做准备
e2=e1;
e1=e;
PWMTime=out; //out对应于PWM高电平的时间
return(0);
}
void PWMOUT()
{
//PWM=1;
if(cnt<PWMTime)//若小于PWM的设定时间,则输出高电平
PWM=1;
else//否则输出低电平
三、仪器及原理图
实验仪器:THKL-C51仿真器
四、实验代码
%增量式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ufloat unsigned float
sbit PWM=P1^2;
sbit DIN=P1^0;
sbit CLK=P1^1;
uint num;
float count=0;
uint cnt,n=0;
uint out;
uint PWMTime;
uchar code table[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x7B,0x71,0x00,0x40 };

数字PID控制实验

数字PID控制实验

4.5.1数字PID 控制实验 1 标准PID 控制算法一.实验要求1. 了解和掌握连续控制系统的PID 控制的原理。

2. 了解和掌握被控对象数学模型的建立。

3. 了解和掌握数字PID 调节器控制参数的工程整定方法。

4. 观察和分析在标准PID 控制系统中,P.I.D 参数对系统性能的影响。

二.实验内容及步骤 ⑴ 确立模型结构本实验采用二个惯性环节串接组成实验被控对象,T1=0.2S ,T2=0.5S Ko=2。

S e T K s G τ-+⨯≈+⨯+=1S 110.2S 21S 5.01)(000⑵ 被控对象参数的确认被控对象参数的确认构成如图4-5-10所示。

本实验将函数发生器(B5)单元作为信号发生器,矩形波输出(OUT )施加于被测系统的输入端R ,观察矩形波从0V 阶跃到+2.5V 时被控对象的响应曲线。

图4-5-10 被控对象参数的确认构成实验步骤:注:将‘S ST ’用‘短路套’短接!① 在显示与功能选择(D1)单元中,通过波形选择按键选中‘矩形波’(矩形波指示灯亮)。

② B5的量程选择开关S2置下档,调节“设定电位器1”,使之矩形波宽度>2秒(D1单元左显示)。

③ 调节B5单元的“矩形波调幅”电位器使矩形波输出电压= 2.5V 左右(D1单元右显示)。

④ 构造模拟电路:按图4-5-10安置短路套及测孔联线,表如下。

(a )安置短路套 (b )测孔联线⑤ 运行、观察、记录:A)先运行LABACT 程序,选择界面的“工具”菜单选中“双迹示波器”(Alt+W )项,弹出双迹示波器的界面,点击开始,用虚拟示波器观察系统输入信号。

图4-5-11 被控对象响应曲线B) 在图4-5-112被控对象响应曲线上测得t1和t2。

通常取)∞=(3.0)(010Y t Y ,要求从图中测得1t ; 通常取)∞=(7.0)(020Y t Y ,要求从图中测得2t 。

计算0T 和τ:0.84730.3567t -1.204t )]t (y 1[ln -)]t (y 1[ln )]t (y 1[ln t )]t (y 1[n t 0.8473t t )]t (y 1[ln -)]t (y 1[ln t t T 212010201102122010120==-----=-=---=τC) 求得数字PID 调节器控制参数P K 、I T 、D T (工程整定法))/0.2(1)/0.37()/0.6(1)/0.5()/2.5(]27.0)/(35.1[10000200000T T T T T T T T T T K K D I P ττττττ+⨯=++⨯=+=据上式计算数字PID 调节器控制参数P K 、I T 、D T⑶ 数字PID 闭环控制系统实验模块号 跨接座号 1 A5 S5,S7,S10 2 A7 S2,S7,S9,P 3 B5‘S-ST ’1 输入信号R B5(OUT )→A5(H1)2 运放级联 A5A (OUTA )→A7(H1)3 示波器联接 ×1档B5(OUT )→B3(CH1) 4A7A (OUTA )→B3(CH2)数字PID 闭环控制系统实验构成见图4-5-12,观察和分析在标准PID 控制系统中,P.I.D 参数对系统性能的影响,分别改变P.I.D 参数,观察输出特性,填入实验报告,图4-5-12 数字PID 闭环控制系统实验构成实验步骤:注:将‘S ST ’用‘短路套’短接!① 在显示与功能选择(D1)单元中,通过波形选择按键选中‘矩形波’(矩形波指示灯亮)。

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(一)PID算法(原创文章,转载请注明出处/tengjingshu) 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制图1控制器公式在实际应用中,可以根据受控对象的特性和控制的性能要求,灵活地采用不同的控制组合,构成比例(P)控制器比例+积分(PI)控制器比例+积分+微分(PID)控制器式中或式中控制系统中的应用在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。

自动控制系统的调节单元将来自变送器的测量值与给定值相比较后产生的偏差进行比例、积分、微分(PID)运算,并输出统一标准信号,去控制执行机构的动作,以实现对温度、压力、流量、也为及其他工艺参数的自动控制。

比例作用P只与偏差成正比;积分作用I是偏差对时间的积累;微分作用D 是偏差的变化率;比例(P)控制比例控制能迅速反应误差,从而减少稳态误差。

除了系统控制输入为0和系统过程值等于期望值这两种情况,比例控制都能给出稳态误差。

当期望值有一个变化时,系统过程值将产生一个稳态误差。

但是,比例控制不能消除稳态误差。

比例放大系数的加大,会引起系统的不稳定。

图2比例(P)控制阶跃响应积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

为了减小稳态误差,在控制器中加入积分项,积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。

这样,即使误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减少,直到等于零。

积分(I)和比例(P)通常一起使用,称为比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

如果单独用积分(I)的话,由于积分输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。

图3积分(I)控制和比例积分(PI)控制阶跃相应微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;********增量式PID控制算法程序***********;T、TD、TI、KP依次从30H,33H,36H,39H开始。

;A,B,C的值依次存在BLOCK1,BLOCK2,BLOCK3的地址里; 这里R(k)给的是定值;ORG 0000HBLOCK1 EQU 43H ;A,B ,CBLOCK2 EQU 46HBLOCK3 EQU 49HUK EQU 4CH ;存结果UKRK EQU 50HEK EQU 53H ;存放偏差值E(k)的始址EK1 EQU 56H ;存放E(k-1)的始址EK2 EQU 59H ;存放E(k-2)的始址CK EQU 5CH ;采样数据始址BUFF EQU 60H ;暂存区BUFF1 EQU 63HBUFF2 EQU 66HREC EQU 69HTEST:MOV RK,#01H ;常数Rk的BCD码浮点数MOV RK+1,#12H ;1.25MOV RK+2,#50HMOV 3CH,#01H ;常数1的BCD码浮点数MOV 3DH,#10HMOV 3EH,#00HMOV 40H,#01H ;常数2的BCD码浮点数MOV 41H,#20HMOV 42H,#00HMOV 30H,#01H ;T的BCD 码浮点数MOV 31H,#23H ;2.34MOV 32H,#40HMOV 33H,#01H ;Td的BCD码浮点数MOV 34H,#35H ;3.54MOV 35H,#40HMOV 36H,#01H ;Ti的BCD码浮点数MOV 37H,#11H ;1.12MOV 38H,#20HMOV 39H,#01H ;Kp的BCD码浮点数MOV 3AH,#12H ;1.25MOV 3BH,#50HMOV R0,#RK ;指向BCD码浮点操作数LCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#3CHLCALL BTOFMOV R0,#40HLCALL BTOFMOV R0,#39HLCALL BTOFMOV 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 FMOVR0MOV R1, #36H ;计算A值(1+T/Ti+Td/T).Kp LCALL FDIVMOV R1,#3CH ;常数1LCALL FADDMOV R0,#33H ;保存33H中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#BUFF1LCALL FDIVMOV R1,#30H ;30H里存的是T/Ti+1 LCALL FADDMOV R1,#39HLCALL FMULMOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中LCALL FMOVR0MOV R1,#BUFF1 ;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,#EK1 ;将EK1,EK2设初值0 LCALL FCLRMOV R0,#EK2LCALL FCLRMOV REC,#03H ;设置采样次数LOOP: MOV CK,#7eH ;采样数据暂时给了一个定值MOV CK+1,#21H ;0.002112MOV CK+2,#12HMOV R0,#CKLCALL BTOFMOV R0,#RK ;保存R(k)中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#CKLCALL FSUB ;计算R(k)-C(k)的值送给E(k)MOV R1,#EKLCALL FMOVR0MOV R1,#BUFF ;恢复RK的值释放BUFFMOV R0,#RKLCALL FMOVMOV R0,#BLOCK2 ;将B.e(k-1)的值暂存在BUFF1中MOV R1,#BUFF ;保存BLCALL FMOVR0MOV R1,#EK1LCALL FMULMOV R1,#BUFF1LCALL FMOVR0MOV R1,#BUFF ;恢复B释放BUFFLCALL FMOVMOV R0,#BLOCK3 ;将C.e(K-2)的值暂存在BUFF2中MOV R1,#BUFF ;保存CLCALL FMOVR0MOV R1,#EK2LCALL FMULMOV R1,#BUFF2LCALL FMOVR0MOV R1,#BUFF ;恢复C释放BUFFLCALL FMOVMOV R0,#BLOCK1 ;A.E(k)MOV R1,#BUFFLCALL FMOVR0MOV R1,#EKLCALL FMULMOV R1,#BUFF1 ;计算Uk值A.E(k)-B.E(k-1)+C.E(k-2) LCALL FSUBMOV R1,#BUFF2LCALL FADDMOV R1,#UK ;保存结果到UK中LCALL FMOVR0MOV R1,#BUFF ;恢复A 释放BUFFLCALL FMOVMOV R0,#UK ;UK转换成BCD码浮点数输出LCALL FTOBMOV R1,#EK1 ;将E(k-1)-->E(k-2),E(k)-->E(k-1)MOV R0,#EK2LCALL FMOVMOV R1,#EKMOV R0,#EK1LCALL FMOVLCALL 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,#0C0H;阶码取最小值RETRLN1: 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,#0BFH,RL1E;阶码下溢否?;CLR AMOV R3,A ;阶码下溢,操作数以零计MOV R4,AMOV R2,#0C0H ;RL1E: 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]中。

相关文档
最新文档