久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
單片機PID溫度控制程序
[打印本頁]
作者:
crrr
時間:
2024-3-20 09:19
標題:
單片機PID溫度控制程序
#include <REGX51.H>
#define Kp 5 //比例系數
#define Ki 2 //積分系數
#define Kd 1 //微分系數
unsigned char m,n,p; //溫度的十位 個位 小數
unsigned char test_temp; //溫度檢定標志
unsigned char key_set_flag; //按鍵設定進入標志
unsigned char flag=1; //按鍵保持標志
unsigned char Change_step=1,e; //溫度設置步進
unsigned char T0_H = 0,T0_L = 0,T1_H=0,T1_L=0;
int Real_temp; //實際溫度值
int Set_temp; //設置溫度
int Disp_temp; //顯示溫度
int last_error; //上次誤差
float I_term; //前面溫差和
bit key_hold;
unsigned char dj_flag1;
bit key_flag;
int PID_MAX;
unsigned int out,PWMT,counter,kk,outp,dz;
int time; //脈沖觸發時刻
sbit DQ=P2^4; //定義DS18b20的管腳
sbit RS = P2^0; //定義液晶屏定義端口
sbit RW = P2^1; //定義液晶屏定義端口
sbit EN = P2^2; //定義液晶屏定義端口
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit k6=P1^5;
sbit k7=P1^6;
sbit k8=P1^7;
sbit PWM=P2^7; //PWM控制腳
sbit DJ1=P2^3;
sbit DJ2=P2^5;
sbit led1=P3^5;
sbit led2=P3^6;
sbit led3=P3^7;
sbit led4=P3^4;
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
unsigned char aa[]={' ',' ','S','e','t','u','p',':',' ',' ','.',' ',' ',' ',' ',' '}; //Distance
unsigned char bb[]={' ',' ',' ',' ',' ',' ',' ','.',' ',' ',' ',' ',' ',' ',' ',' '};
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s);
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data);
void init(); //初始化
/*------------------------------------------------
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--) //大致延時1mS
{
DelayUs2x(245);
DelayUs2x(245);
}
}
/*****延時子程序*****/
void delay(unsigned int t)
{
for(;t>0;t--);
}
void delay_50us(unsigned int t)
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
/*****初始化DS18B20*****/
unsigned char Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時,大于480us
DQ = 1; //拉高總線
delay(8);
x = DQ; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
delay(4);
return x;
}
/*****讀一個字節*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*****寫一個字節*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
/*****讀取溫度*****/
int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
t=Init_DS18B20();
if(t) return Real_temp;
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0x44); //啟動溫度轉換
t=Init_DS18B20();
if(t) return Real_temp;
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a;
if(t<=0||t>0x900)
return Real_temp;
t=t*0.625+0.5;
return(t);
} void keywendu_set(void)
{
if(k1==0)
{
delay(10);
while(!k1);
key_hold=~key_hold;
}
if(key_hold==0)
{
if(k2==0)
{
delay(10);
while(!k2);
Set_temp=Set_temp+1;
if(Set_temp>99)
Set_temp=99;
}
if(k3==0)
{
delay(10);
while(!k3);
Set_temp=Set_temp-1;
if(Set_temp<1)
Set_temp=1;
}
aa[8]=10*Set_temp/100+'0';
aa[9]=10*Set_temp/10%10+'0';
aa[11]=10*Set_temp%10+'0';
LCD_Write_String(0,0,aa);
}
}
void keyzhuansu_set(void)
{
if(k4==0)
{
delay(10);
while(!k4);
key_flag=~key_flag;
}
if(key_flag==0) //手動模式
{
led4=1;
if(k5==0)
{
DJ1=1;
DJ2=0;
}
else if(k6==0)
{
DJ1=0;
DJ2=1;
}
else
{
DJ1=0;
DJ2=0;
}
}
else
{
led4=0;
if(k5==0)
{
delay(10);
while(!k5);
dj_flag1=1;
}
if(k6==0)
{
delay(10);
while(!k6);
dj_flag1=2;
}
if(k7==0)
{
delay(10);
while(!k7);
dj_flag1=3;
}
if(dj_flag1==1)
{
DJ1=1;
DJ2=0;
}
else if(dj_flag1==2)
{
DJ1=0;
DJ2=1;
}
else
{
DJ1=0;
DJ2=0;
}
}
}
int PID(int Set_value,int Real_value) //標準PID溫度控制算法
{
float uk ,uk1 ,duk;
int pid_out,e ,e1 ,e2;
e=Set_value-Real_value;//誤差量
duk=Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2); //+Kd*(e-2e1+e2)
uk=uk1+duk;
pid_out=(int)uk;
uk1=uk;
e2=e1;
e1=e;
if(pid_out>1000)
{
pid_out=998;
}
else if(pid_out<2)
{
pid_out=2;
}
outp=pid_out;
return(pid_out);
}
void T0_int(void) interrupt 1
{
T0_H = (65535-2000)/256; //PWM=1高位初值計算
T0_L = (65535-2000)%256; //PWM=1低位初值計算
TH0 = T0_H; //通的初值高位
TL0= T0_L; //通的初值低位
kk++;
if(kk>1000)
kk=0;
if(kk>outp)
PWM=1;
else PWM=0;
// }
}
void main()
{
PWMT=128; //128級步進PWM控制
PID_MAX=PWMT;
counter=0;
out=0;
PWM=1;
I_term=0;
last_error=0;
Set_temp=30; //初始設定溫度為30度
init();
Real_temp=Set_temp*10;
key_hold=1;
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0x44); //啟動溫度轉換
delay_50us(150); //等待溫度測量 delay_50us(15000);
TMOD=0x01; //定時器0模式1
TR0=1;
ET0=1;
IT0=1;
EX0=1;
EA=1;
aa[12]=0xdf;
aa[13]=0x43;
bb[9]=0xdf;
bb[10]=0x43;
aa[8]=10*Set_temp/100+'0';
aa[9]=10*Set_temp/10%10+'0';
aa[11]=10*Set_temp%10+'0';
LCD_Write_String(0,0,aa);
while(1)
{
counter++;
DelayMs(500);
if(counter>4)
{
test_temp=1; //進行一次溫度檢定
counter=0;
}
if(test_temp) //溫度檢定標志置位,進入溫度PID調節
{
Real_temp=ReadTemperature(); //采集當前實際溫度
test_temp=0; //檢定完成,清溫度檢定標志
bb[5]=Real_temp/100+'0';
bb[6]=Real_temp/10%10+'0';
bb[8]=Real_temp%10+'0';
LCD_Write_String(0,1,bb);
if((Real_temp/10)<(Set_temp))
{
led1=~led1;
led2=1;
}
else if((Real_temp/10)>(Set_temp))
{
led3=~led3;
led2=1;
}
else
{
led1=1;
led2=0;
led3=1;
}
}
if((Real_temp/10)<(Set_temp-1))
{
outp=998;
}
else if((Real_temp/10)>(Set_temp+1))
{
outp=2;
}
else
{
PID(Set_temp*10,Real_temp); //PID程序
}
keywendu_set(); //按鍵溫度設置
keyzhuansu_set();
}
}
///////////////////////////////////////////////////
// 液晶屏顯示處理
///////////////////////////////////////////////////
void write_com(unsigned char com) //寫命令
{
RS_CLR;
RW_CLR;
P0=com;
DelayMs(1);
EN_SET;
DelayMs(1);
EN_CLR;
}
void write_data(unsigned char date) //寫一個字符
{
RS_SET;
RW_CLR;
P0=date;
DelayMs(1);
EN_SET;
DelayMs(1);
EN_CLR;
}
void init() //初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*------------------------------------------------
寫入字符串函數
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
write_com(0x80 + x);
}
else
{
write_com(0xC0 + x);
}
while (*s)
{
write_data( *s);
s ++;
}
}
復制代碼
作者:
wkman
時間:
2024-3-20 14:48
沒有點 其他重點說明,純看程序,看不出什么優缺點啊
作者:
王秋冬
時間:
2024-3-20 16:33
51黑有你最精彩,謝謝上傳。
作者:
tieq1952
時間:
2024-3-22 06:18
你最精彩,謝謝上傳。
作者:
jovew
時間:
2024-10-10 09:06
這個可以控制制冷嗎?
作者:
wkman
時間:
2024-10-10 10:55
要根據 發熱功率 和散熱來考慮吧
作者:
jovew
時間:
2024-10-11 08:06
wkman 發表于 2024-10-10 10:55
要根據 發熱功率 和散熱來考慮吧
我知道,需要加熱和散熱。我想知道這個程序可以控制加熱和制冷嗎?
作者:
綠野3611
時間:
2024-10-12 20:49
為啥編譯不了
作者:
madezhi
時間:
2024-10-16 17:20
加熱 制冷是不是一樣的控制方法
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
97视频在线免费观看
|
天天天天操
|
国产肉体xxxx裸体784大胆
|
国产精品久久久久久无人区
|
欧产日产国产69
|
国产精品成人一区二区三区
|
黄色片视频
|
久久精品一区二区
|
成人小视频在线观看
|
久久免费视频网站
|
香蕉视频色
|
成人羞羞国产免费游戏
|
一区二区精品
|
伊人久久免费视频
|
欧美亚洲在线观看
|
一级片在线播放
|
涩涩久久
|
91二区
|
韩国免费理论片
|
精品一区在线
|
欧美一区二区免费
|
99福利视频
|
一级片日韩
|
日韩天堂网
|
九九九精品视频
|
亚洲成在线
|
www.huangse
|
久久久成人免费视频
|
亚洲国产精品久久久
|
在线观看黄网站
|
第一福利视频导航
|
91亚洲国产成人久久精品麻豆
|
国产精品一区二区三区在线
|
国产日韩精品一区二区
|
伊人av影院
|
日本特黄一级片
|
好吊妞这里只有精品
|
久久日韩精品
|
免费一级a毛片
|
欧美一级片在线播放
|
国产人成
|