pid控制器c51语言编程,写给新手一个基于C51的PID控制程序。。。

#include

#include

#include

#include

struct PID {

unsigned int SetPoint; // 设定目标 Desired Value

unsigned int Proportional Const

unsigned int Integral; // 积分常数 Integral Const

unsigned int Derivative; // 微分常数 Derivative Const

unsigned int LastError; // Error[-1]

unsigned int PrevError; // Error[-2]

unsigned int SumError; // Sums of Errors

};

struct PID spid; // PID Control Structure

unsigned int rout; // PID Response (Output)

unsigned int rin; // PID Feedback (Input)

sbit data1=P1^0;

sbit clk=P1^1;

sbit plus=P2^0;

sbit subs=P2^1;

sbit stop=P2^2;

sbit output=P3^4;

sbit DQ=P3^3;

unsigned char flag,flag_1=0;

unsigned char high_time,low_time,count=0;//占空比调节参数

unsigned char set_temper=35;

unsigned char temper;

unsigned char i;

unsigned char j=0;

unsigned int s;

/***********************************************************

延时子程序,延时时间以12M晶振为准,延时时间为30us×time

***********************************************************/

void delay(unsigned char time)

{

unsigned char m,n;

for(n=0;n

for(m=0;m<2;m++){}

}

/***********************************************************

写一位数据子程序

***********************************************************/

void write_bit(unsigned char bitval)

{

EA=0;

DQ=0; /*拉低DQ以开始一个写时序*/

if(bitval==1)

{

_nop_();

DQ=1; /*如要写1,则将总线置高*/

}

delay(5); /*延时90us供DA18b20采样*/

DQ=1; /*释放DQ总线*/

_nop_();

_nop_();

EA=1;

}

/***********************************************************

写一字节数据子程序

***********************************************************/

void write_byte(unsigned char val)

{

unsigned char i;

unsigned char temp;

EA=0;

TR0=0;

for(i=0;i<8;i++) /*写一字节数据,一次写一位*/

{

temp=val>>i; /*移位操作,将本次要写的位移到最低位*/

temp=temp&1;

write_bit(temp); /*向总线写该位*/

}

delay(7); /*延时120us后*/

// TR0=1;

EA=1;

}

/***********************************************************

读一位数据子程序

***********************************************************/

unsigned char read_bit()

{

unsigned char i,value_bit;

EA=0;

DQ=0; /*拉低DQ,开始读时序*/

_nop_();

_nop_();

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C51程序,实现了积分分离PID控制温度的功能。该程序基于Keil C51编译,使用了STC89C52单片机进行控制。 ```c #include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit Heat = P1^0; //加热控制引脚 sbit Cool = P1^1; //制冷控制引脚 sbit Fan = P1^2; //风扇控制引脚 uint SetTemp = 50; //设定温度 uint CurTemp = 0; //当前温度 uint LastErr = 0; //上次误差 uint SumErr = 0; //误差累计 uchar Kp = 10; //比例系数 uchar Ki = 5; //积分系数 uchar Kd = 2; //微分系数 //延时函数 void Delay(uint ms) { uint i, j; for(i = ms; i > 0; i--) { for(j = 110; j > 0; j--) { _nop_(); } } } //读取温度传感值 uchar ReadTemp() { uchar temp = 0; //读取温度传感的数值,将其转换成摄氏度 //将转换后的温度值返回 return temp; } //PID控制函数 void PIDControl() { uint err; //当前误差 uint dErr; //误差变化率 err = SetTemp - CurTemp; //计算当前误差 SumErr += err; //累加误差 //积分分离 if(SumErr > 1000) { SumErr = 1000; } else if(SumErr < -1000) { SumErr = -1000; } dErr = err - LastErr; //计算误差变化率 //计算控制量 uint ctrl = Kp * err + Ki * SumErr + Kd * dErr; //根据控制量控制加热、制冷和风扇 if(ctrl > 0) { Heat = 1; Cool = 0; Fan = 0; } else if(ctrl < 0) { Heat = 0; Cool = 1; Fan = 1; } else { Heat = 0; Cool = 0; Fan = 1; } LastErr = err; //保存上次误差 } //主程序 void main() { while(1) { CurTemp = ReadTemp(); //读取当前温度 PIDControl(); //PID控制 Delay(1000); //延时1秒 } } ``` 在该程序中,我们首先定义了加热、制冷和风扇的控制引脚,以及设定温度、当前温度、上次误差和误差累计等变量。然后,我们定义了延时函数和读取温度传感的函数。最后,我们实现了PID控制函数,其中包括积分分离的处理,以及根据控制量控制加热、制冷和风扇。在主程序中,我们不断地读取当前温度,并进行PID控制,以达到控制温度的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值