久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機PID恒溫程序設計
[打印本頁]
作者:
一條叼咸魚
時間:
2019-7-15 11:12
標題:
51單片機PID恒溫程序設計
我控制電路主要包括,
數碼管
顯示電路、按鍵電路、報警電路、
H
型全橋式驅動電熱絲電路、溫度檢測電路及其控制電路。
如下圖
a28202c80fd8bcb41e1207dc17c5095.png
(45.23 KB, 下載次數: 45)
下載附件
2019-7-15 11:06 上傳
通過代碼控制使系統恒溫,溫度可以通過單片機設置,可以加減溫度。溫度的穩定是通過PID控制的,通過PID使溫度差保持在百分之5內。
下面是PID控制程序
void wendu_regulation_PID() //PID 控制調節溫度子程序
{
float PWM_out;
Kp_PID=16;Ki_PID=18.2;Kd_PID=4.8;
ek_PID[j]=wendu-w;
switch(j)
{
case
2:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j-1]+ek_PID[j-2]);break;
case
1:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j-1]+ek_PID[j+1]);break;
case
0:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j+2])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j+2]+ek_PID[j+1]);break;
}
PWM=PWM_out;
if(PWM>100) PWM=100;
if(PWM<0) PWM=0;
j++;
if(j==3) j=0;
}
復制代碼
其中的數據要自己不斷試驗方可
單片機源程序如下:
/**************************************************************************************
* DS18B20溫度傳感器實驗 *
實現現象: 具體接線操作請看視頻。
下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數碼管就會顯示
檢測的溫度值,
注意事項:
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#include"temp.h"
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k3=P1^0;
sbit k1=P1^1;
sbit k2=P1^2;
sbit beep=P1^3;
char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
u16 wendu=3160;
u16 PWM;
u16 w;
u8 Kd_PID,Kp_PID,Ki_PID,ek_PID[3];
u16 a=0;
u8 j;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
void ad() //定時器初始化
{
TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
ET0=1;//打開定時器0中斷允許
EA=1;//打開總中斷
TR0=1;//打開定時器
}
/*******************************************************************************
* 函 數 名 : datapros()
* 函數功能 : 溫度讀取處理轉換函數
* 輸 入 : temp
* 輸 出 : 無
*******************************************************************************/
void datapros(int temp)
{
float tp;
if(temp< 0) //當溫度值為負數
{
DisplayData[0] = 0x40; // -
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
else
{
DisplayData[0] = 0x00;
tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
DisplayData[0] = smgduan[temp % 10000 / 1000];
DisplayData[1] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[2] = smgduan[temp % 100 / 10];
DisplayData[3] = smgduan[temp % 10];
DisplayData[4] = smgduan[wendu /1000];
DisplayData[5] = smgduan[wendu % 1000/100]| 0x80;
DisplayData[6] = smgduan[wendu % 100/10];
DisplayData[7] = smgduan[wendu %10];
}
/*******************************************************************************
* 函 數 名 : keypros1
* 函數功能 : 按鍵處理函數,判斷按鍵k1是否按下
********************************************************************************/
void keypros1()
{
if(k1==0) //檢測按鍵K1是否按下
{
delay(1000); //消除抖動 一般大約10ms
if(k1==0) //再次判斷按鍵是否按下
{
wendu=wendu+10; //溫度加0.1度
}
while(!k1); //檢測按鍵是否松開
}
}
/*******************************************************************************
* 函 數 名 : keypros2
* 函數功能 : 按鍵處理函數,判斷按鍵k2是否按下
*******************************************************************************/
void keypros2()
{
if(k2==0) //檢測按鍵K2是否按下
{
delay(1000); //消除抖動 一般大約10ms
if(k2==0) //再次判斷按鍵是否按下
{
wendu=wendu-10; //溫度減0.1度
}
while(!k2); //檢測按鍵是否松開
}
}
/*******************************************************************************
* 函數名 :DigDisplay()
* 函數功能 :數碼管顯示函數
* 輸入 : 無
* 輸出 : 無
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位選,選擇點亮的數碼管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//顯示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//顯示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//顯示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//顯示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//顯示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//顯示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//顯示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//顯示第7位
}
P0=DisplayData[i];//發送數據
delay(100); //間隔一段時間掃描
P0=0x00;//消隱
}
}
/*******************************************************************************
* 函 數 名 : heat
* 函數功能 : PWM 調壓控溫子程序
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void heat(PWM) //PWM 調壓控溫子程序
{
if(a<PWM)
k3=1;
if(a>PWM)
{k3=0;}
if(a>100){a=0;}
}
/*******************************************************************************
* 函 數 名 : wendu_bili
* 函數功能 : 比例控制調節速度子程序
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void wendu_regulation_PID() //PID 控制調節溫度子程序
{
float PWM_out;
Kp_PID=16;Ki_PID=18.2;Kd_PID=4.8;
ek_PID[j]=wendu-w;
switch(j)
{
case
2:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j-1]+ek_PID[j-2]);break;
case
1:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j-1])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j-1]+ek_PID[j+1]);break;
case
0:PWM_out=Kp_PID*(ek_PID[j]-ek_PID[j+2])+Ki_PID*ek_PID[j]+Kd_PID*(
ek_PID[j]-2*ek_PID[j+2]+ek_PID[j+1]);break;
}
PWM=PWM_out;
if(PWM>100) PWM=100;
if(PWM<0) PWM=0;
j++;
if(j==3) j=0;
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{ ad();
while(1)
{
int qq;
keypros1(); //溫度加0.1
keypros2(); //溫度減0.1
qq=Ds18b20ReadTemp();
datapros(qq); //數據處理函數
w=qq*0.0625*100+0.5; //浮點數變成整數
wendu_regulation_PID();
heat(PWM);
DigDisplay();//數碼管顯示函數
if(w>59.4||w<19.8)
{beep=~beep;delay(100);}
}
}
void Timer0() interrupt 1//定時器 T0 定時 0.01 秒
{ static u16 i;
TH0=0xFC;
TL0=0x18;
i++;
if(i==10) //定時達到 0.01 秒讀取溫度傳感器的溫度值
{
a++; i=0;
}
}
復制代碼
下面的源代碼下載鏈接
PID.rar
(45.36 KB, 下載次數: 140)
2019-7-15 11:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
engcyh
時間:
2019-7-16 18:27
不錯,有空仿真一下看看
作者:
面具下的狼性
時間:
2021-3-30 16:27
井井有條,每個函數都單獨注解出來,讓我們這些初學者一目了然,各個函數和語法功能都能清晰看到如何使用。
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩精品一区二区三区中文字幕
|
国产玖玖
|
日韩福利在线
|
国产欧美一区二区在线观看
|
韩日一区二区三区
|
久久久青草婷婷精品综合日韩
|
青久草视频
|
狠狠操狠狠操
|
国产精品a一区二区三区网址
|
精品欧美一区免费观看α√
|
欧美精品一区在线发布
|
日本一区二区高清视频
|
久久久久久国产
|
久草免费在线视频
|
成人精品一区
|
一级a性色生活片久久毛片波多野
|
中文字幕在线不卡播放
|
黄色网址在线播放
|
在线视频一区二区三区
|
日韩精品区
|
亚州av在线
|
99精品久久99久久久久
|
www亚洲免费国内精品
|
欧美高清视频
|
亚洲高清在线观看
|
www,黄色,com
|
国产成人精品一区二区
|
九七午夜剧场福利写真
|
在线欧美一区二区
|
香蕉婷婷
|
日韩中文字幕高清
|
99久久精品国产一区二区三区
|
国产乱码精品一区二区三区忘忧草
|
偷牌自拍
|
久久九九色
|
亚洲一区高清
|
99精品热视频
|
欧美一区二区另类
|
最新中文在线视频
|
国产第一区二区
|
中文字幕在线观看视频网站
|