導航:首頁 > 操作系統 > 單片機溫度控制系統設計

單片機溫度控制系統設計

發布時間:2022-03-07 19:43:06

單片機溫度控制系統設計

只需要一個溫度感測器
把溫度值傳到單片機
,根據不同設定,來控制製冷還是制熱就好了!具體問題具體解答!

⑵ 基於單片機的溫度控制系統

加熱部件可以在淘寶上買個
usb
5v
加熱片,usb供電的電流不會超過
500ma,
控制可以用單片機腳控制一個
c8050三極體控制加熱片的通斷電。

⑶ 基於51單片機的溫度控制系統的設計

基於51單片機的溫度控制系統的設計好的 提綱發給你看看.

⑷ 基於80C51單片機溫度控制系統設計

塑料袋包裝封口一般使用的是PT100或者熱電偶測溫電路,溫度需要達到大約150-300度之間即可。建議採用PT100,然後使用VI通過信號放大後輸入單片機測量電壓。

⑸ 單片機溫度控制系統(畢業設計)

對啦,這東西很簡單,還是自己做吧,我在N年前工作後做的第一個東東就是這東西,控制老化室的溫度。
需要材料:溫度感測器AD590,AD0809,89c51(本身帶存儲器,空間足夠用4K),LED數碼管,鎖存器(74ls273或373,或者查下有解碼器直接接數碼管的,我忘了叫什麼名字了,你可以查查資料,或到www.21ic.com去下載TTL資料),電源肯定要的5V,其它的需要電阻(數碼管需要上拉電阻,或者用14489晶元也行,需要一個電阻就夠了),AD590好像是電流型的,需要采樣電阻,影響中好像是10K的。
設計時需要分塊,先做好功能劃分:
外圍電路:電源部分,溫度感測器部分,AD轉換部分,顯示部分,
軟體部分:主要就是AD轉換部分和顯示部分。把他們分開來寫會更清晰明了。
注意AD轉換調試起來會有些困難,有時候時序有些差錯就會不對,這時候就要把AD晶元的資料多讀幾遍,一個步驟一個步驟的檢查,就會弄好的。
顯示部分如果直接用led的話,就不是太難了,可以在編寫程序時就解碼(不用解碼器的話),如果用14489的話,就要把晶元的使用說明搞清楚就沒有問題啦,這里有一個I2C協議,就是三條線的通訊電路,因為使用同一電源,實際上就兩條現了,一個叫數據線,一個叫時鍾線。搞清時序關系,不難的。
如果你能把這個東東做的比較好,以後你要是在這方面發展,那對你的幫助就很大了。
祝你學習順利。

⑹ 基於單片機的溫度控制系統的設計

利用溫度感測器DS18B20檢測環境溫度並直接輸出數字溫度信號給單片機AT89C52進行處理。

在LCD液晶上顯示當前環境溫度值、預設溫度值、使用者設定的溫度差以及目前風扇所處的檔位。其中預設溫度值只能為整數形式,檢測到的當前環境溫度可精確到小數點後一位。

同時採用PWM脈寬調制方式來改變直流風扇電機的轉速。

並通過兩個按鍵改變預設溫度值,一個提高預設溫度,另一個降低預設溫度值。通過另一個按鍵控制溫度差的大小。

設有紅外熱釋感測器檢測環境范圍內是否有人,如果有人確定出風方向,如果無人,降低轉速或一定時間內自動關閉。

回答

正如你所說的,一共用了DS18B20模塊,LCD模塊,紅外感測模塊,按鍵,直流電機模塊,程序方面只有一個PWM。現在一一為你分析:

DS18B20模塊:

下圖是它的原理圖,採用單匯流排來進行開發,不像電賽的哪個溫度感測器需要AD轉換,它是可以直接傳出數字信號的。

⑺ MCS-51單片機溫度控制系統的設計

我這個程序可以接受18B20溫控晶元的溫度並在1602上顯示,以下是我做的一個程序,你也可以去我的網路空間查看其他一些程序,可能對你有用
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
unsigned char code digit[10]={"0123456789"}; //定義字元數組顯示數字
unsigned char code Str[]={" Welcome"}; //說明顯示的是溫度
unsigned char code Error[]={"Error!Check!"}; //說明沒有檢測到DS18B20
unsigned char code Temp[]={"Temp:"}; //說明顯示的是溫度
unsigned char code tab[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,//年
0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11,//月
0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,//日
0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,//符號
0x1f,0x15,0x1f,0x15,0x1f,0x1b,0x1f,0x11};//周

/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
sbit RS=P0^5; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P0^6; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P0^7; //使能信號位,將E位定義為P2.2引腳
//sbit BF=P1^7; //忙碌標志位,,將BF位定義為P0.7引腳
/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
// result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P2=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P2=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delaynms(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x38);
delaynms(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x38); //連續三次,確保初始化成功
delaynms(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delaynms(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delaynms(5); //延時5ms ,給硬體一點反應時間
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delaynms(5); //延時5ms ,給硬體一點反應時間

}
/************************************************************************
以下是DS18B20的操作程序
************************************************************************/
sbit DQ=P3^7;
unsigned char time; //設置全局變數,專門用於嚴格延時
/*****************************************************
函數功能:將DS18B20感測器初始化,讀取應答信號
出口參數:flag
***************************************************/
bit Init_DS18B20(void)
{
bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
DQ = 1; //先將數據線拉高
for(time=0;time<2;time++) //略微延時約6微秒
;
DQ = 0; //再將數據線從高拉低,要求保持480~960us
for(time=0;time<200;time++) //略微延時約600微秒
; //以向DS18B20發出一持續480~960us的低電平復位脈沖
DQ = 1; //釋放數據線(將數據線拉高)
for(time=0;time<10;time++)
; //延時約30us(釋放匯流排後需等待15~60us讓DS18B20輸出存在脈沖)
flag=DQ; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢
;
return (flag); //返回檢測成功標志
}
/*****************************************************
函數功能:從DS18B20讀取一個位元組數據
出口參數:dat
***************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat; //儲存讀出的一個位元組數據
for (i=0;i<8;i++)
{

DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ = 0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
dat>>=1;
_nop_(); //等待一個機器周期
DQ = 1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
for(time=0;time<2;time++)
; //延時約6us,使主機在15us內采樣
if(DQ==1)
dat|=0x80; //如果讀到的數據是1,則將1存入dat
else
dat|=0x00;//如果讀到的數據是0,則將0存入dat
//將單片機檢測到的電平信號DQ存入r[i]
for(time=0;time<8;time++)
; //延時3us,兩個讀時序之間必須有大於1us的恢復期
}
return(dat); //返回讀出的十進制數據
}
/*****************************************************
函數功能:向DS18B20寫入一個位元組數據
入口參數:dat
***************************************************/
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DQ =1; // 先將數據線拉高
_nop_(); //等待一個機器周期
DQ=0; //將數據線從高拉低時即啟動寫時序
DQ=dat&0x01; //利用與運算取出要寫的某位二進制數據,
//並將其送到數據線上等待DS18B20采樣
for(time=0;time<10;time++)
;//延時約30us,DS18B20在拉低後的約15~60us期間從數據線上采樣
DQ=1; //釋放數據線
for(time=0;time<1;time++)
;//延時3us,兩個寫時序間至少需要1us的恢復期
dat>>=1; //將dat中的各二進制位數據右移1位
}
for(time=0;time<4;time++)
; //稍作延時,給硬體一點反應時間
}
/******************************************************************************
以下是與溫度有關的顯示設置
******************************************************************************/
/*****************************************************
函數功能:顯示沒有檢測到DS18B20
***************************************************/
void display_error(void)
{
unsigned char i;
WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Error[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Error[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(100); //延時100ms較長時間,以看清關於顯示的說明
}
while(1) //進入死循環,等待查明原因
;
}
/*****************************************************
函數功能:顯示說明信息
***************************************************/
void display_explain(void)
{
unsigned char i;
WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Str[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Str[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(100); //延時100ms較長時間,以看清關於顯示的說明
}
}
/*****************************************************
函數功能:顯示溫度符號
***************************************************/
void display_symbol(void)
{
unsigned char i;
WriteAddress(0x40); //寫顯示地址,將在第2行第1列開始顯示
i = 0; //從第一個字元開始顯示
while(Temp[i] != '\0') //只要沒有寫到結束標志,就繼續寫
{
WriteData(Temp[i]); //將字元常量寫入LCD
i++; //指向下一個字元
delaynms(50); //延時1ms給硬體一點反應時間
}
}

/*****************************************************
函數功能:顯示溫度的小數點
***************************************************/
void display_dot(void)
{
WriteAddress(0x49); //寫顯示地址,將在第2行第10列開始顯示
WriteData('.'); //將小數點的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示溫度的單位(Cent)
***************************************************/
void display_cent(void)
{
unsigned char m;

WriteInstruction(0x40);//寫年月日
for(m=0;m<40;m++)//
{
WriteData(tab[m]);
}
WriteAddress(0x4c); //寫顯示地址,將在第2行第13列開始顯示
WriteData(3);
WriteData('C');
//WriteData(49);
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示溫度的整數部分
入口參數:x
***************************************************/
void display_temp1(unsigned char x)
{
unsigned char j,k,l; //j,k,l分別儲存溫度的百位、十位和個位
j=x/100; //取百位
k=(x%100)/10; //取十位
l=x%10; //取個位
WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[j]); //將百位數字的字元常量寫入LCD
WriteData(digit[k]); //將十位數字的字元常量寫入LCD
WriteData(digit[l]); //將個位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示溫度的小數數部分
入口參數:x
***************************************************/
void display_temp2(unsigned char x)
{
WriteAddress(0x4a); //寫顯示地址,將在第2行第11列開始顯示
WriteData(digit[x]); //將小數部分的第一位數字字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:做好讀溫度的准備
***************************************************/
void ReadyReadTemp(void)
{
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
for(time=0;time<100;time++)
; //溫度轉換需要一點時間
Init_DS18B20(); //將DS18B20初始化
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
}

/*****************************************************
函數功能:主函數
***************************************************/

void main(void)
{
unsigned char TL; //儲存暫存器的溫度低位
unsigned char TH; //儲存暫存器的溫度高位
unsigned char TN; //儲存溫度的整數部分
unsigned char TD; //儲存溫度的小數部分
LcdInitiate(); //將液晶初始化
delaynms(5); //延時5ms給硬體一點反應時間
if(Init_DS18B20()==1)
display_error();
display_explain();
display_symbol(); //顯示溫度說明
display_dot(); //顯示溫度的小數點
display_cent(); //顯示溫度的單位
while(1) //不斷檢測並顯示溫度
{
ReadyReadTemp(); //讀溫度准備
TL=ReadOneChar(); //先讀的是溫度值低位
TH=ReadOneChar(); //接著讀的是溫度值高位
TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16
//這樣得出的是溫度的整數部分,小數部分被丟棄了
TD=(TL%16)*10/16; //計算溫度的小數部分,將余數乘以10再除以16取整,
//這樣得到的是溫度小數部分的第一位數字(保留1位小數)
display_temp1(TN); //顯示溫度的整數部分
display_temp2(TD); //顯示溫度的小數部分
delaynms(10);
}

}

⑻ 基於單片機的水溫控制系統設計

溫度要控制到1度以下,很有難度的。

⑼ 單片機多點溫度控制系統設計的程序設計

單片機的多點溫度控制系統

DSl8820溫度感測器的內部存儲器包括9B高速暫存RAM和1B非易失性的可電擦除的E2PROM,後者存放高溫度和低溫度觸發器TH,TL和結構寄存器,該位元組第7位(TM)為0,低5位一直都是1,第6,5位(R1,R0)用來設置解析度,如表1所示。

根據DSl8820的通信協議,主機控制DSl8820完成溫度轉換必須經過3個步驟:每一次讀寫之前都要對其進行復位,復位成功後發送1條ROM指令,最後發送RAM指令,這樣才能對DSl8820進行預定的操作。復位要求主CPU將數據線下拉500μs,然後釋放,DSl8820收到信號後等待16~60μs左右,後發出60~240μs的存在低脈沖,主CPU收到此信號表示復位成功。由於DSl8820採用的是單線進行控制與讀取數據,因此對操作的時序要求非常嚴格,否則由於時序不匹配,將無法完成對器件的正確操作。

2.3控制執行那分

(1)壁掛爐燃燒系統控制。控制電路採用了脈沖繼電器器件作為整個系統的總控部分,當所有居室溫度均達到設定值時,停止壁掛爐的工作。該繼電器的特點是:當線圈收到一個脈沖信號後,線圈通電,電磁鐵吸合,帶動觸頭閉合接通需要控制的電路,當下一個信號到來後,電磁鐵吸合,觸頭斷開,切斷被控制的電源,因此其具有自鎖和信號遙控功能。由於磁鐵的作用,控制脈沖消失後滑片位置不發生變化,保持穩定狀態,所以該器件具有功耗小、具有記憶功能。

(2)居室溫度控制。各居室溫度控制在燃燒控制系統工作前提下,根據各居室溫度測量返回值,採用上海歐凱電磁閥製造有限公司生產的OK6515自保持脈沖電磁閥控制各迴路的通斷。脈沖電磁閥採用脈沖和永磁技術,只需通過控制器切換脈沖的電極觸點來改變電磁閥的開關狀態,當控制器發出電脈沖時,驅動閥芯克服永磁力產生上下移,使閥瓣到位後在永磁作用下處於自保持狀態。

2.4圖形液晶顯示模塊

為了能夠提供形象直觀的用戶顯示界面,系統採用圖形液晶顯示模塊LCDl2864,其具有8位標准數據匯流排、6條控制線及電源線,可與CPU直接介面,顯示各種字元及圖形。考慮到系統中漢字的使用量少,因此選用不帶漢字型檔的LCD。對於使用的漢字分別提取其字模並以二進制形式保存於內部FLASHROM中。

3系統軟體設計

系統軟體設計主要依據系統程序流程以及DSl8820的時序要求進行代碼編寫。為了降低開發難度,提高開發效率,系統開發中引入了μC/OS一Ⅱ嵌入式操作系統並移植了LCD顯示驅動。另一方面,為了確保對DSl8820操作時序的精確性,對DSl8820進行初始化和讀寫代碼仍採用匯編語言。

3.1系統數據結構

系統所需數據結構包括各測溫元件的序列號表,漢字字模存儲、系統運行時間表存儲、各溫控點的設定值及測量值、系統時間的存放及一些臨時數據存儲。

為了區別多個溫度感測器,在系統初始化時讀入感測器中的64位序列號,並將其存入程序存儲空間,以便程序運行期間進行比對,共需64B。漢字字模採用16×16字型檔進行提取,其中每個漢字需32B,約15個字,為了方便程序功能的升級改進,在程序存儲空間中按20個字進行空間分配,需要存儲空間640B。系統運行時間表的設計以小時為設置單位,需要保存24個值;為了減少時間比較過程中的數據計算量以及方便編程,對每個值採用一個位元組存儲,這里共需24B存儲空間,這里仍然使用程序存儲空間進行存儲,以便在系統掉電時設定值不會丟失。

3.2系統程序設計

系統程序設計主要使用KeilC5l進行編寫,但由於對DSl8820器件的讀寫時序要求比較嚴格,故採用匯編代碼,其中溫度讀取子程序主要代碼如下:

⑽ 溫度控制系統設計用51單片機

去圖書館,51類的書上必備的例子

閱讀全文

與單片機溫度控制系統設計相關的資料

熱點內容
java互聯網公司 瀏覽:70
對弈下象棋的app哪裡好 瀏覽:707
有什麼食譜app推薦 瀏覽:471
python實現動態口令 瀏覽:825
我的世界電腦伺服器地址怎麼添加 瀏覽:850
傳奇地圖怎麼加密到pak 瀏覽:977
linux刪除mysql用戶 瀏覽:755
圖案設計pdf 瀏覽:584
pdf編輯器在線 瀏覽:471
華為雲雲耀伺服器如何關機 瀏覽:994
數字加密的歷史 瀏覽:613
宏傑文件夾打不開 瀏覽:819
施工日記app哪個好 瀏覽:566
什麼是壓縮機的排氣量 瀏覽:538
在哪個app可以預約一科考試 瀏覽:634
易語言vmp加殼源碼 瀏覽:513
閱讀前端框架源碼 瀏覽:14
我的世界命令方塊傳送指令 瀏覽:545
不能用start命令打開xp 瀏覽:926
text命令 瀏覽:31