欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)溫度控制PID算法
[打印本頁]
作者:
HJZ——I
時間:
2019-3-16 20:44
標(biāo)題:
單片機(jī)溫度控制PID算法
#include <main.h>
extern unsigned char time_value;
extern bit flag;
int PWM=0;
int PWM_I,PWM_P;
unsigned char time_value=0;
bit flag;
uint temp_m1=0;
int temp_m=0; //溫度放大100倍后的中轉(zhuǎn)值
int set_temp=0; //設(shè)置溫度*100
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0EC;
TL0 = 0x078;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()//主函數(shù)
{
init();//初始化函數(shù)
pid_init (&temp_PID);
InitTimer0();
temp_PID.Proportion =120; // Set PID Coefficients 比例
temp_PID.Integral =5; //積分
temp_PID.Derivative =2; //導(dǎo)數(shù)
while(1)
{
temp_control();//控制按鍵函數(shù)
if(time_value<PWM)
{
heatting=1;
}
else
{
heatting=0;
}
if(time_value==30)
{
display_real_tenp(temp_m1);
}//顯示函數(shù)
if(time_value==60)
temp_m=unnormal_proccessing(temp_m1);//溫度轉(zhuǎn)換函數(shù)*100
if(time_value==100)
{
if(set_temp-temp_m>250)
{
PWM=PWM_MAX;
}
else
{
PWM_I=pid_calc(&temp_PID,temp_m);
PWM =PWM_I ;
if( PWM>=100)PWM=100;
else if(PWM<=PWM_MIN) PWM=PWM_MIN;
}
}
if(time_value==120)
{
PWM_P=PWM/2;
LcdWriteCom(0x80+0X40+0x0C);
LcdWriteData('0'+PWM_P/100);
LcdWriteCom(0x80+0X40+0x0D);
LcdWriteData('0'+PWM_P%100/10);
LcdWriteCom(0x80+0X40+0x0E);
LcdWriteData('0'+PWM_P%10);
}
}
}
void init()//初始化函數(shù)
{
uint i,j;
//函數(shù)初始化
LcdInit();//LCD初始化函數(shù)
Ds18b20Init();
//I/O口初始化
heatting=0;//不制熱
//LCD初始化顯示
LcdWriteCom(0x80);//第一行顯示
j=strlen(num1);
for(i=0; i<j; i++)
{
LcdWriteData(num1[i]);
delay_ms(1);
}
LcdWriteCom(0x80+0x40);//第二行顯示
j=strlen(num2);
for(i=0; i<j; i++)
{
LcdWriteData(num2[i]);
delay_ms(1);
}
LcdWriteCom(0x04); //關(guān)閉寫一個指針加1
}
uint get_temp(uint temp)//計算溫度函數(shù)
{
float tp;
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個浮點(diǎn)型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點(diǎn)
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
//算加上0.5,還是在小數(shù)點(diǎn)后面。
return temp;
}
void display_real_tenp(uint temp)//實(shí)時溫度顯示函數(shù)
{
uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
datas[2] = temp % 100 / 10;
datas[3] = temp % 10;
LcdWriteCom(0x80+0x0a); //寫地址 80表示初始地址
LcdWriteData('0'+datas[0]); //十位
LcdWriteCom(0x80+0x0b); //寫地址 80表示初始地址
LcdWriteData('0'+datas[1]); //個位
LcdWriteCom(0x80+0x0d); //寫地址 80表示初始地址
LcdWriteData('0'+datas[2]); //顯示小數(shù)點(diǎn)
LcdWriteCom(0x80+0x0e); //寫地址 80表示初始地址
LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
}
void temp_control()//控制溫度上下限函數(shù)
{
if(limit_choise==0)//選擇按鍵
{
delay_ms(5);
if(limit_choise==0)
{
while(!limit_choise);
limit_choise_num++;
if(limit_choise_num>=2)
{
limit_choise_num=0;
}
}
}
if(limit_choise_num==0)//正常顯示
{
LcdWriteCom(0x0c);//關(guān)閉光標(biāo)
}
if(limit_choise_num==1)//調(diào)節(jié)上限溫度
{
LcdWriteCom(0x80+0X40+2);
LcdWriteCom(0x0f);//開啟光標(biāo)
if(increase_temperature==0)//增加溫度
{
delay_ms(5);
if(increase_temperature==0)
{
while(!increase_temperature);
up_limit_temp++;
if(up_limit_temp>=100)
{
up_limit_temp=0;
}
//寫入新數(shù)據(jù)
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData('0'+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x04);
LcdWriteData('0'+up_limit_temp%10);
LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
}
}
if(reduce_temperature==0)//減少溫度
{
delay_ms(5);
if(reduce_temperature==0)
{
while(!reduce_temperature);
up_limit_temp--;
if(up_limit_temp<0)
{
up_limit_temp=99;
}
//寫入新數(shù)據(jù)
LcdWriteCom(0x80+0X40+0x03);
LcdWriteData('0'+up_limit_temp/10);
LcdWriteCom(0x80+0X40+0x04);
LcdWriteData('0'+up_limit_temp%10);
LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫
}
}
}
set_temp=up_limit_temp*100;
temp_PID.SetPoint =set_temp;
}
int unnormal_proccessing(uint temp)//溫度轉(zhuǎn)換函數(shù)
{
uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
int temp1=0;
datas[0] = temp % 10000 / 1000;
datas[1] = temp % 1000 / 100;
datas[2] = temp % 100 / 10;
}
復(fù)制代碼
作者:
admin
時間:
2019-3-18 04:05
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1