Ⅰ 基於單片機的恆溫控制系統
我剛幫別人做了一個,是按這個要求做的,你可以提出任意修改要求。
程序是匯編的,已經調試通過。
ProteUS模擬文件下載地址:
推薦:70電加熱PRE.rar( http://ishare.iask.sina.com.cn/f/7033603.html )
; 設計基於單片計算機的溫度控制器。用於控制電加熱爐的溫度。具體要求如下:
; 1. 溫度連續可調,范圍為30℃~150℃
; 2. 超調量σ%≤20%
; 3. 溫度誤差≤±0.5℃
; 4. 人-機對話方便
; 5. 控制演算法採用PID或改進的PID或其他演算法.
; (我用的是AT89C52的單片機:
; A.電加熱爐經由溫度感測器測量後,
; 通過V/F變換器的模數轉換,
; 將電壓或電流量轉換為數字信號進入單片機內,
; 然後通過移位寄存器和解碼器的信息轉換,
; 通過顯示驅動器來進行LED數碼管的溫度顯示;
; B.單片機也通過雙向可控硅來控制爐內的溫度;
; C.用戶通過按鍵來設置溫度上限、下限值)
Ⅱ 怎樣用PID演算法對恆溫箱的溫度進行控制,求相關的51單片機匯編程序
本設計要求:本溫度控制系統為以單片機為核心,實現了對溫度實時監測和控制,實現了控制的智能化。設計恆溫箱溫度控制系統,配有溫度感測器,採用DS18B20數字溫度感測器,無需數模擬∕數字轉換,可直接與單片機進行數字傳輸,採用了PID控制技術,可以使溫度保持在要求的一個恆定范圍內,配有鍵盤,用於輸入設定溫度;配有數碼管LED用來顯示溫度。
技術參數和設計任務:
1、利用單片機AT89C2051實現對溫度的控制,實現保持恆溫箱在最高溫度為110℃。
2、可預置恆溫箱溫度,烘乾過程恆溫控制,溫度控制誤差小於±2℃。
3、預置時顯示設定溫度,恆溫時顯示實時溫度,採用PID控制演算法顯示精確到0.1℃。
4、溫度超出預置溫度±5℃時發出聲音報警。
5、對升、降溫過程沒有線性要求。
6、溫度檢測部分採用DS18B20數字溫度感測器,無需數模擬∕數字轉換,可直接與單片機進行數字傳輸
7、人機對話部分由鍵盤、顯示和報警三部分組成,實現對溫度的顯示、報警。
需要的話聯系用戶名扣扣
Ⅲ 基於單片機的恆溫箱設計可能遇到什麼難點
關鍵在於PID恆溫。
第一步要先做好PID子程序
第二部需要摸索參數調整的規律。
Ⅳ 基於單片機恆溫箱控制系統
只有圖,沒有程序。從圖來看,埠配置不好,單一功能要充分利用埠,原則上P0口作為段嗎,這里,如果作為位碼的話可以節省一級驅動,應為P0口的驅動能力較強,極力推鑒1051-4051(埠驅動20mA),降低硬體成本,減少軟體編程量。這里有一個模擬器帶的溫度顯示程序。你參考一下,如果加上控制,在程序合適位置加入判斷語句如if(****,P1.x=?),再配置一個輸出埠,就行了。程序如下,附模擬圖。
#include<reg52.h>
#include<intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDATA=P1^0;//DS18B20接入口
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
char,shi,ge;//定義變數
/*延時子函數*/
voiddelay(uintnum)
{
while(num--);
}
/*************DS18b20溫度感測器函數*********************/
voidInit_DS18B20(void) //感測器初始化
{
ucharx=0;
DATA=1; //DQ復位
delay(10); //稍做延時
DATA=0; //單片機將DQ拉低
delay(80); //精確延時大於480us//450
DATA=1; //拉高匯流排
delay(20);
x=DATA; //稍做延時後如果x=0則初始化成功x=1則初始化失敗
delay(30);
}
//讀一個位元組
ReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DATA=0;//給脈沖信號
dat>>=1;
DATA=1;//給脈沖信號
if(DATA)
dat|=0x80;
delay(8);
}
return(dat);
}
//寫一個位元組
voidWriteOneChar(unsignedchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
DATA=0;
DATA=dat&0x01;
delay(10);
DATA=1;
dat>>=1;
}
delay(8);
}
//讀取溫度
intReadTemperature(void)
{
uchara=0;
ucharb=0;
intt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0x44);//啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC);//跳過讀序號列號的操作
WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
t=b;
t<<=8;
t=t|a; //得到溫度值的各個位的值
t=t*0.0625; //得到實際的溫度值
return(t);
}
/*顯示子函數*/
voiddisplay(int,intshi,intge)
{
P0=0xff; //對數碼管清零,防止串擾
P2=0xfb;
P0=table[]; //顯示百位
delay(50); //一小段延時動態顯示
P0=0xff; //對數碼管清零,防止串擾
P2=0xf7;
P0=table[shi]; //顯示十位
delay(50);
P0=0xff;
P2=0xef;
P0=table[ge]&0x7f; //顯示個位
delay(100);
P0=0xff;
P2=0xdf;
P0=table[0]; //顯示小數位,這里沒有處理小數位,默認的為0
delay(50);
}
voidmain()
{
inttemp;
while(1)
{
temp=ReadTemperature(); //讀溫度
=temp/100; //獲取百位
shi=temp%100/10; //獲取十位
ge=temp%10; //獲取個位
display(,shi,ge); //顯示函數
}
}