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

PID温度控制程序

程序说明:

系统上电后显示 “--温度”

表示需要先设定温度才开始进行温度检测

温度设定完毕后程序才开始进行PID温控

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

#include

#include

#include"DS18B20.H"

#include"PID.H"

#define uchar unsigned char

#define uint unsigned int

unsigned char code tab[]=

{

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF

}

;

/*个位0~9的数码管段码*/

unsigned char code sao[]=

{

0x7f,0xbf,0xdf,0xef

}

;

//扫描码

uchar set=30,keyflag=1 ; //set初始化为30° keyflag为进入温度设定的标志位

//4个按键使用说明

sbit key_out=P1^0 ; //用于温度设定后的退出

sbit key_up=P1^1 ; //设定温度加

sbit key_down=P1^2 ; //设定温度减

sbit key_in=P1^3 ; //在程序的运行中如需要重新设定温度 按下此键才能进入设置模式并且此时是停在温度控制的,按下key_out键后才表示设定完毕

void Show_key();

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

void delays(unsigned char k)

{

unsigned char i,j ;

for(i=0;i

for(j=0;j<50;j++);

}

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

//数码管显示函数

P0口 作为数据口

P2口的低四位作为扫描口

变量 x表示扫描

d表示是否要加小数点 为1是 为0不加

y表示传递的数值

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

LCD_disp_char(uchar x,bit d,uchar y)

{

P2=0XFF ;

P0=0xFF ;

if(d==0)

P0=tab[y];

else

P0=tab[y]&0x7f ; //与上0x7f表示是否要加小数点

P2=sao[x]; //打开扫描端号

}

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

按键扫描

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

void keyscan(void)

{

if(key_in==0) //按键进入函数

{

delays(10);    //延时消抖 (以下同)

if(key_in==0)

{

while(key_in==0)

{

Show_key(); //如果一直按着键不放 就一直显示在当前状态 (以下同)

}

keyflag=1 ; //按键标志位

}

}

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

if(key_out==0)   //按键退出

{

delays(10);

if(key_out==0)

{

while(key_out==0)

{

Show_key();

}

keyflag=0 ;

set_temper=set ;

}

}

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

if(key_up==0)   //设定温度的加

{

delays(10);

if(key_up==0)

{

while(key_up==0)

{

Show_key();

}

if(keyflag==1)

{

set++;

if(set>90) //如果大于90°就不在加

set=90 ;

}

}

}

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

if(key_down==0)   //温度设定的减

{

delays(10);

if(key_down==0)

{

while(key_down==0)

{

Show_key();

}

if(keyflag==1)

{

set--;

if(set<30) //温度减到30°时不在往下减

set=30 ;

}

}

}

}

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

按键按下时的显示函数

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

void Show_key()

{

output=1 ;

LCD_disp_char(3,0,10); //显示 -

delays(3);

LCD_disp_char(2,0,10); //显示- (表示温度设定 )

delays(3);

LCD_disp_char(1,0,set/10); //显示温度十位

delays(3);

LCD_disp_char(0,0,set%10); //显示温度个位

delays(3);

}

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

void main()

{

unsigned int tmp ;//声明温度中间变量

unsigned char counter=0 ;

PIDBEGIN(); //PID参数的初始化

output=1 ; //关闭继电器输出

while(1)

{

keyscan();

if(keyflag)

{

Show_key(); //显示温度设定

}

else

{

if(counter--==0)

{

tmp=ReadTemperature();//每隔一段时间读取温度值

counter=20 ;

}

LCD_disp_char(3,0,tmp/1000);   //显示温度十位

delays(3);

LCD_disp_char(2,1,tmp/100%10); //显示温度个位

//显示小数点

delays(3);

LCD_disp_char(1,0,tmp/10%10); //显示温度小数后一位

delays(3);

LCD_disp_char(0,0,tmp%10);//显示温度小数后二位

delays(3);

P2=0XFF ;

P0=0xff ;

compare_temper(); //比较温度

}

}

}

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

//PID算法温控C语言2008-08-17 18:58

#ifndef _PID_H__

#define _PID_H__

#include

#include

#include

struct PID

{

unsigned int SetPoint ;

// 设定目标 Desired Value

unsigned int Proportion ;

// 比例常数 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 output=P1^4;

unsigned char high_time,low_time,count=0 ;

//占空比调节参数

unsigned char set_temper ;

void PIDInit(struct PID*pp)

{

memset(pp,0,sizeof(struct PID)); //PID参数初始化全部设置为0

}

unsigned int PIDCalc(struct PID*pp,unsigned int NextPoint)

{

unsigned int dError,Error ;

Error=pp->SetPoint-NextPoint ;

// 偏差

pp->SumError+=Error ;

// 积分

dError=pp->LastError-pp->PrevError ;

// 当前微分

pp->PrevError=pp->LastError ;

pp->LastError=Error ;

//比例

//积分项

return(pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError);

// 微分项

}

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

温度比较处理子程序

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

void compare_temper()

{

unsigned char i ;

//EA=0;

if(set_temper>temper)

{

if(set_temper-temper>1)

{

high_time=100 ; //大于1°不进行PID运算

low_time=0 ;

}

else

{   //在1°范围内进行PID运算

for(i=0;i<10;i++)

{

//get_temper();

rin=s;

// Read Input

rout=PIDCalc(&spid,rin); //执行PID运算

// Perform PID Interation

}

if(high_time<=100) //限制最大值

high_time=(unsigned char)(rout/800);

else

high_time=100;

low_time=(100-high_time);

}

}

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

else if(set_temper<=temper) //当实际温度大于设置温度时

{

if(temper-set_temper>0)//如果实际温度大于设定温度

{

high_time=0 ;

low_time=100 ;

}

else

{

for(i=0;i<10;i++)

{

//get_temper();

rin=s ;

// Read Input

rout=PIDCalc(&spid,rin);

// Perform PID Interation

}

if(high_time<100) //此变量是无符号字符型

high_time=(unsigned char)(rout/10000);

else

high_time=0 ;//限制不输出负值

low_time=(100-high_time);

//EA=1;

}

}

}

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

T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期

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

void serve_T0()interrupt 1 using 1

{

if(++count<=(high_time))

output=0 ;

else if(count<=100)

{

output=1 ;

}

else

count=0 ;

TH0=0x2f ;

TL0=0xe0 ;

}

void PIDBEGIN()

{

TMOD=0x01 ;

TH0=0x2f ;

TL0=0x40 ;

EA=1 ;

ET0=1 ;

TR0=1 ;

high_time=50 ;

low_time=50 ;

PIDInit(&spid);

// Initialize Structure

spid.Proportion=10 ;

// Set PID Coefficients

spid.Integral=8 ;

spid.Derivative=6 ;

spid.SetPoint=100 ;

// Set PID Setpoint

}

#endif

pid温度控制c语言程序,51单片机PID温度控制程序相关推荐

  1. pid温度控制c语言程序及仿真,pid算法温度控制c语言程序

    描述 温度控制PID自整定原理介绍 整定PID(三模式)控制器 整定温度控制器涉及设置比例.积分和微分值,以得到对特定过 程的可能的最佳控制.如果控制器不包含自动整定算法,或者自 动整定算法未提供适合 ...

  2. 8255A红绿灯c语言程序,51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序).doc...

    51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序) 51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序)2010-04-21 22:0 ...

  3. pid控制器c51语言编程,51单片机电机pid控制系统程序

    51单片机电机pid控制系统程序 本程序来源网上,小编进行了简单修改,还未验证. /************************* 应用背景:直流电机的额定功率12V,额定转速3000rpm,光码 ...

  4. pid温度控制c语言程序及仿真,温度控制PID算法的C语言程序实例代码

    //PID算法温控C语言 #include #include #include #include struct PID { unsigned int SetPoint; // 设定目标 Desired ...

  5. 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...

    <51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...

  6. 单片机汉字点阵c语言程序,51单片机C语言多种点阵屏驱动程序(开发软件为keil C...

    51单片机C语言多种点阵屏驱动程序(开发软件为keil C 2016-08-23 1 0 0 暂无评分 其他 1 积分下载 如何获取积分? 51单片机C语言多种点阵屏驱动程序(开发软件为keil C ...

  7. 单片机交通灯数码管c语言程序,51单片机C语言实现交通灯(红绿灯)源程序.doc

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /*1.程序目的:使用定 ...

  8. 单片机交通灯灯c语言程序,51单片机用C语言实现交通灯(红绿灯)源程序

    51单片机用C语言实现交通灯(红绿灯)源程序 2009-10-29 23:00 交通灯,红黄绿灯交替亮,怎样实现呢?其实就是根据单片机定时器及倒计时的程序修改. 源程序如下: /* 1.程序目的:使用 ...

  9. 超声波c语言程序,51单片机超声波模块的C语言程序.doc

    51单片机超声波模块的C语言程序.doc 超声波模块程序 超声波模块程序 Trig P20 Echo P32 include define uchar unsigned char define uin ...

  10. 时钟加闹钟c语言程序,51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)...

    <51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)>由会员分享,可在线阅读,更多相关<51单片机c语言电子钟(已加入调时.闹铃.整点报时功能)(13页珍藏版)>请在技术 ...

最新文章

  1. 通过Python在Windows或Linux上快速搭建HTTP服务器
  2. Eclipse,Mycclipse自动补全快捷键设置
  3. 运行第一个Docker容器-Docker for Web Developers(1)
  4. oracle空格太多,Oracle Sql字符串多余空格处理方法初记
  5. mysql 数据目录迁移_MySQL数据库数据文件路径迁移步骤
  6. 解决Com调用AutoCAD被呼叫方拒绝接收呼叫
  7. Linux 命令详解(六)Linux 守护进程的启动方法
  8. 企业主要财务指标有哪些
  9. 第31讲 UI组件之 Gallery画廊控件
  10. 守护线程与非守护线程
  11. Android SQLiteDatabase分析
  12. 清华2020计算机系张晨,2020清华特奖入围名单公布:电子系学霸两篇顶会一作
  13. 信息安全工程师笔记-入侵检测技术原理与应用
  14. Centos系列 Curl error (37): Couldn‘t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-XXXX
  15. python 二分查找算法_Python实现二分查找法
  16. matlab johnson变换,johnson算法是什么?
  17. 简单的流媒体服务器(EasyDarwin的安装搭建)
  18. C++ 建立一个被称为sroot()的函数,返回其参数的二次方根.重载sroot()3次, 让它返回整数, 长整数, 与双精度的二次方根(计算二次方根时, 可以使用标准库函数sqrt())
  19. android 双向进度条,Android自定义双向进度条
  20. PyTorch学习记录——PyTorch生态

热门文章

  1. python模拟鼠标点击和键盘输入的操作
  2. 计算机cad标题栏快捷键,AutoCAD快捷键和工具栏及菜单栏大集合
  3. windows自带的压缩/解压缩(zip/unzip)功能-Powershell 的应用之一
  4. 计算机教师简介招聘情况,招聘教师个人简历模板
  5. 自动控制原理--卢京潮 2009(免费)课本完整
  6. 动态规划解最长公共子串
  7. Kotlin教程,从入门到精通
  8. java实现高德地图经纬度转换成百度地图
  9. 矩阵快速幂 斐波那契数列
  10. 如何书写IT行业的个人简历