里面是一整套,系統由單片機STC89C52、液晶顯示模塊LCD1602、溫度檢測模塊、按鍵模塊、報警模塊、加熱模塊、冷卻模塊所組成。系統能完成以下功能,系統采用DS18B20對溫度進行檢測,并且能在LCD1602上實時顯示溫度。用戶可以通過按鍵設置上限和下限溫度,當溫度超過上限溫度時,系統通過繼電器使冷卻器件導通工作,當溫度低于下限溫度時,系統通過繼電器使加熱器件工作。當溫度在上限和下限之間時維持原狀態。
0.png (48.93 KB, 下載次數: 140)
下載附件
2017-5-9 18:21 上傳
PPT模板(非本設計僅供參考)
仿真(使用PROTEUS軟件打開文件里面后綴為DSN的文件)
元件清單
原理圖和PCB(使用PROTEL軟件打開文件里面后綴為SCH和PCB的文件)
外文翻譯
程序(使用KEIL軟件打開文件里面后綴為uvproj的文件)
系統簡介
芯片資料
0.png (62.56 KB, 下載次數: 142)
下載附件
2017-5-9 18:23 上傳
0.png (13.88 KB, 下載次數: 134)
下載附件
2017-5-9 18:24 上傳
仿真(使用PROTEUS軟件打開文件里面后綴為DSN的文件)
1.雙擊圖中間的單片機會出現以下界面
0.png (241.05 KB, 下載次數: 130)
下載附件
2017-5-9 18:28 上傳
2.點擊ProgramFile一欄的文件夾圖標。找到跟仿真文件同一個文件夾里面的”仿真中需要加載的程序.hex”,并點擊打開按鍵。
0.png (154.63 KB, 下載次數: 117)
下載附件
2017-5-9 18:29 上傳
3點擊下面第一個按鈕便可運行成功。
0.png (6.87 KB, 下載次數: 108)
下載附件
2017-5-9 18:29 上傳
題目名稱 | |
|
|
|
|
|
| 一、選題的目的和意義: 溫度控制無論是在工業生產過程中,還是在日常生活中都起著非常重要的作用,過低的溫度或過高的溫度都會使資源失去應有的作用,從而造成資源的巨大浪費。特別是在當前全球資源極度缺乏的情況下,我們更應該掌握好對溫度的控制,把身邊的資源好好地利用起來。 在計算機沒有發明之前,這些控制都是我們難以想象的。而當今,隨著電子行業的迅猛發展,計算機技術和傳感器技術的不斷改進,而且計算機和傳感器的價格也日益降低,可靠性逐步提高,用信息技術來實現溫度控制并提高控制的精確度不僅是可以達到的而且是可以實現的,用高新技術解決生活用電問題,實施對溫度控制已經成為我們電子行業的任務,以此來加強工業化建設,提高人民的生活水平。 溫度控制在實際生活中有一定的實際意義,在工業生產中有著較為廣泛的應用,用單片機實現自適應控制,彌補了傳統 PID控制結構在特定場合下性能下降的不足,設計了一套實用的溫度測控系統,使它在不同時間常數下均可以達到技術指標。此外還有效減少了輸出繼電器的開關次數,適用于環境參數經常變化的小型溫度控制系統。例如:在冶金工業、化工生產、電力工程、造紙行業、機械制造和食品加工等諸多領域中,人們都需要對各類加熱爐、熱處理爐、反應爐和鍋爐中的溫度進行檢測和控制。雖然溫度控制系統的制作方案有很多,但是經過對比各個方案的優劣,還是采用單片機更好,因為采用單片機來對溫度進行控制,不僅具有控制方便、組態簡單和靈活性大等優點,而且可以大幅度提高被控溫度的技術指標,從而能夠大大提高產品的質量和數量 | 二、研究概況及發展趨勢綜述 國內現狀: 我國對于溫度控制技術的研究較晚,始于20世紀80年代。我國工程技術人員在吸收發達國家溫度控制技術的基礎上,才掌握了溫度室內微機控制技術,該技術僅限于對溫度的單項環境因子的控制。溫度控制設施計算機應用,在總體上正從消化吸收、簡單應用階段向實用化、綜合性應用階段過渡和發展。在技術上,以單片機控制的單參數單回路系統居多,尚無真正意義上的多參數綜合控制系統,與發達國家相比,存在較大差距。我國溫度控制控制現狀還遠遠沒有達到工廠化的程度,生產實際中仍然有許多問題困擾著我們,如軟硬件資源不能共享和可靠性比較差。 國外現狀: 國外對溫度控制技術研究較早,始于20世紀70年代。先是采用模擬式的組合儀表,采集現場信息并進行指示、記錄和控制。80年代末出現了分布式控制系統。目前正開發和研制計算機數據采集控制系統的多因子綜合控制系統。現在世界各國的溫度控制技術發展很快,一些國家在實現自動化的基礎上正向著完全自動化、無人化的方向發展。 隨著科學技術的飛速發展,帶動社會生產的發展,自動控制系統在各個領域尤其是工業領域中有著及其廣泛的應用,溫度控制是控制系統中最為常見的控制類型之一。隨著單片機技術的飛速發展,通過單片機對被控對象進行控制日益成為今后自動控制領域的一個重要發展方向,電流、電壓、溫度、壓力、流量、流速和開關量都是常用的主要被控參數 | 三、研究目標、研究內容和擬解決的關鍵問題 研究目標: 本設計主要采用MCS-51系列單片機作為主控芯片,能夠實現溫度控制,數據顯示,參數設置等功能。 研究內容: 根據以上設計需要,系統擬采用以下技術方案,系統的結構框圖如下圖所示。
0.png (4.66 KB, 下載次數: 114)
下載附件
2017-5-9 18:25 上傳
圖1 系統結構框圖 系統由單片機STC89C52、液晶顯示模塊LCD1602、溫度檢測模塊、按鍵模塊、報警模塊、加熱模塊、冷卻模塊所組成。系統能完成以下功能,系統采用DS18B20對溫度進行檢測,并且能在LCD1602上實時顯示溫度。用戶可以通過按鍵設置上限和下限溫度,當溫度超過上限溫度時,系統通過繼電器使冷卻器件導通工作,當溫度低于下限溫度時,系統通過繼電器使加熱器件工作。當溫度在上限和下限之間時維持原狀態。 擬解決的關鍵問題: 1、完成鍵盤的設計,分配好各個按鍵輸入對應單片機各口的控制信息; 2、完成LCD顯示電路的設計,實現具體的控制、提示信息的顯示; 3、完成溫度檢測電路的設計,使其能夠準確溫度值; | 四、研究的基本思路和方法、技術路線、實驗方案及可行性分析 研究的基本思路和方法: 1、確定硬件系統的設計方案: (1)、根據系統的功能要求確定選用的元器件; (2)、分配單片機各個P口地址,以連接對應的元器件,方便控制; (3)、利用protel軟件構建系統的硬件圖; 2、確定軟件部分的設計方案: (1)、確定各部分模塊對應要實現的功能,并根據連接圖寫出對應程序中對應的控制信息,便于軟件編寫; (2)、用keil軟件編寫程序,對應各模塊功能模塊化編寫,便于程序的檢查和調試; 3、利用keil軟件生成hex文件,用PROTEL軟件繪制電路圖 4、依照電路圖,在電路板上焊接各元件,完成系統實物設計; 5、將焊好的電路板反復進行硬件調試和系統整體調試,直到實現系統要求的預定功能。 技術路線、實驗方案及可行性分析: 1、設計用到的設備和軟件: 主要設備:電腦、單片機燒寫器 軟件:Protel仿真軟件、keil軟件 2、利用學習過的模擬電子技術、數字電路技術、單片機原理與應用等知識,了解溫度控制的原理,并選用合適的元器件和系統設計方案。 |
|
|
單片機源程序:
- //-----------------------------------------------------------------------
- //功能說明:使用DS18B20測量室內溫度,并將它顯示在1602液晶上。 核心:AT89S52
- //連接框圖: ___________________
- #include <reg52.h>
- //端口及函數聲明---------------------------------------------------------
- sbit LCD_RS=P1^0; //片選信號
- sbit LCD_RW=P1^1; //讀寫信號
- sbit LCD_E=P1^2; //使能信號
- sbit DQ = P2^2;
- sbit BEEP=P1^3; //高電平亮燈,超過設定值
- sbit RED = P2^0;
- sbit GREEN = P2^1;
- sbit Key_2 = P1^4; //按一次出現H 30,可以進行上限溫度設置 按兩次出現L 20,可以進行下限溫度設置 按第三次恢復溫度顯示
- sbit Key_3 = P1^5; //增加鍵,可以對上限溫度或下限溫度進行增大調整
- sbit Key_4 = P1^6; //減小鍵,可以對下限溫度或下限溫度進行減小調整
- #define LCD_DB P0 //LCD1602數據信號
- #define LocationX 0 //橫排的位置,即X得坐標值 取值范圍0~15
- #define LocationY 1 //豎排的位置,即Y得坐標值 取值范圍為 2,1
- unsigned char code dis_char[]={"Temperature is"};
- unsigned char code dis_char1[]={"Htemp= C "};
- unsigned char code dis_char2[]={"Ltemp= C "};
- //LCD1602函數定義
- void LCD_init(void); //LCD1602初始化函數
- void LCD_write_command(unsigned char command); //LCD1602寫指令函數
- void LCD_write_data(unsigned char dat); //LCD1602寫數據函數
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat); //在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
- void delay_n40us(unsigned int n); //延時函數
- //DS18B20函數定義
- void delayms(unsigned int z); //延時(z)毫秒
- void SetReset(void); //產生復位信號
- void CheckReply(void); //檢測器件應答信號
- bit MainReadBit(void); //從總線讀一個bit
- unsigned char MainReadByte(void); //從總線讀一個字節
- void MainWriteByte(unsigned char dat); //向總線寫一個字節
- void StartConvertTemperature(void); //啟動一次溫度轉換
- unsigned long int ReadTemperature(void); //讀取溫度數據
- unsigned char H_temp = 50,L_temp = 20;
- unsigned char flag_h=0,flag_l=0,count_key2 = 0;
- unsigned char TempBuffer[5];
- unsigned char temp_value;
- //--------------------------------------------------------------------***
- //子函數-----------------------------------------------------------------
- //----------------------------------------
- //LCD1602 延時函數
- void delay_n40us(unsigned int n)
- {
- unsigned int i;
- unsigned char j;
- for(i=n;i>0;i--)
- for(j=0;j<2;j++);
- }
- //----------------------------------------
- //LCD1602液晶初始化函數
- void LCD_init(void)
- {
- LCD_write_command(0x38);//設置8位格式,2行,5x7
- LCD_write_command(0x38);//設置8位格式,2行,5x7
- LCD_write_command(0x38);//設置8位格式,2行,5x7 切記要寫三遍!!!!
- LCD_write_command(0x0c);//整體顯示,關光標,不閃爍
- LCD_write_command(0x06);//設定輸入方式,增量不移位
- LCD_write_command(0x01);//清除屏幕顯示
- delay_n40us(100); //清屏延時
- }
- //----------------------------------------
- //LCD1602寫命令函數
- void LCD_write_command(unsigned char dat)
- {
- LCD_DB=dat;
- LCD_RS=0;//指令
- LCD_RW=0;//寫入
- LCD_E=1; //使能
- LCD_E=0;
- delay_n40us(1);//寫命令延時
- }
- //----------------------------------------
- //LCD1602寫數據函數
- void LCD_write_data(unsigned char dat)
- {
- LCD_DB=dat;
- LCD_RS=1;//數據
- LCD_RW=0;//寫入
- LCD_E=1;//使能
- LCD_E=0;
- delay_n40us(1); //寫數據延時
- }
- //----------------------------------------
- //LCD1602顯示一個字符
- void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)
- {
- unsigned char address;
- if(y==1)
- address=0x80+x; //顯示在第一排的時候的x的地址
- else
- address=0xc0+x; //顯示在第二排的時候的x的地址
- LCD_write_command(address); //輸入地址
- LCD_write_data(dat); //輸入數據
- }
- //*****************************************
- //----------------------------------------
- //毫秒延時函數
- void delayms(unsigned int z)
- {
- unsigned int x,y;
- for(x = z ; x>0 ; x--)
- for(y = 110; y>0 ; y--);
- }
- /***********ds18b20子程序*************************/
- /***********ds18b20延遲子函數(晶振12MHz )*******/
- void delay_18B20(unsigned int i)
- {
- while(i--);
- }
- /**********ds18b20初始化函數**********************/
- void Init_DS18B20(void)
- {
- unsigned char x=0;
- DQ = 1; //DQ復位
- delay_18B20(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- delay_18B20(80); //精確延時 大于 480us
- DQ = 1; //拉高總線
- delay_18B20(14);
- x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- delay_18B20(20);
- }
- /***********ds18b20讀一個字節**************/
- 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_18B20(4);
- }
- return(dat);
- }
- /*************ds18b20寫一個字節****************/
- void WriteOneChar(unsigned char dat)
- {
- unsigned char i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- delay_18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /**************讀取ds18b20當前溫度************/
- void ReadTemp(void)
- {
- unsigned char a=0;
- unsigned char b=0;
- unsigned char t=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- delay_18B20(100); // this message is wery important
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- delay_18B20(100);
- a=ReadOneChar(); //讀取溫度值低位
- b=ReadOneChar(); //讀取溫度值高位
- temp_value=b<<4;
- temp_value+=(a&0xf0)>>4;
- }
- void temp_to_str() //溫度數據轉換成液晶字符顯示
- {
- TempBuffer[0]=temp_value/10+'0'; //十位
- TempBuffer[1]=temp_value%10+'0'; //個位
- TempBuffer[2]=0xdf; //溫度符號
- TempBuffer[3]='C';
- TempBuffer[4]='\0';
- }
- void display_1(void)
- {
- unsigned char j =0,ge=0,shi=0,bai=0;
- unsigned long int last = 0;
- int temp=0;
- for(j=0;j<14;j++)
- {
- LCD_disp_char(j,1,dis_char[j]);
- }
- ReadTemp(); //開啟溫度采集程序
- temp_to_str(); //溫度數據轉換成液晶字符
- // LCDDispString(0,1,TempBuffer);
- temp = (TempBuffer[0]-'0')*10+(TempBuffer[1]-'0');
- LCD_disp_char(5,2,(temp/10+48));
- LCD_disp_char(6,2,(temp%10+48));
- LCD_disp_char(8,2,0xdf);
- LCD_disp_char(9,2,'C');
-
- if(temp >H_temp)
- {
- BEEP = 0;
- RED=1;
- GREEN=0;
- }
- else if ( temp < L_temp)
- {
- BEEP=0;
- GREEN=1;
- RED=0;
- }
- else
- {
- BEEP = 1;RED=1;
- GREEN=1;
- }
- }
- void display_2(void)
- {
- unsigned char j =0;unsigned char ge=0,shi=0;
- for(j=0;j<16;j++)
- {
- LCD_disp_char(j,1,dis_char1[j]);
- LCD_disp_char(j,2,dis_char2[j]);
- }
- LCD_disp_char(11,1,0xdf); LCD_disp_char(11,2,0xdf);
- ge = H_temp%10;
- shi = H_temp/10;
- LCD_disp_char(7,1,(shi+48)); LCD_disp_char(8,1,(ge+48));
- ge = L_temp%10;
- shi = L_temp/10;
- LCD_disp_char(7,2,(shi+48)); LCD_disp_char(8,2,(ge+48));
- }
- void key_scan(void)
- {
- unsigned char ge=0,shi=0;
- P1 |= 0x80; //每次掃描前,先將接鍵盤的引腳口拉高
- if(Key_2 == 0) //同上,判斷第二個按鍵情況
- {
- delayms(10);
- if(Key_2 == 0)
- {
- // display_2();
- count_key2++;
- if(count_key2 == 1)
- {
- display_2();
- flag_h = 1;
- flag_l = 0;
- LCD_disp_char(15,1,35);
- }
- else if(count_key2 == 2)
- {
- display_2();
- flag_l = 1;
- flag_h = 0;
- LCD_disp_char(15,2,35);
- }
- else if(count_key2 == 3)
- {
- flag_l = 0;
- flag_h = 0;
- LCD_init();
- display_1();
- count_key2=0;
- }
- while(!Key_2);
- }
- }
- if(Key_3 == 0) //增加鍵
- {
- delayms(10);
- if(Key_3 == 0)
- {
- if(flag_h ==1)
- {
- H_temp++;
- ge = H_temp%10;
- shi = H_temp/10;
- LCD_disp_char(7,1,(shi+48));
- LCD_disp_char(8,1,(ge+48));
- }
- else if(flag_l == 1)
- {
- L_temp++;
- ge = L_temp%10;
- shi = L_temp/10;
- LCD_disp_char(7,2,(shi+48));
- LCD_disp_char(8,2,(ge+48));
- }
-
- while(!Key_3);
- }
- }
- if(Key_4 == 0) //減少鍵
- {
- delayms(10);
- if(Key_4 == 0)
- {
- if(flag_h ==1)
- {
- H_temp--;
- ge = H_temp%10;
- shi = H_temp/10;
- LCD_disp_char(7,1,(shi+48));
- LCD_disp_char(8,1,(ge+48));
- }
- else if(flag_l == 1)
- {
- L_temp--;
- ge = L_temp%10;
- shi = L_temp/10;
- LCD_disp_char(7,2,(shi+48));
- LCD_disp_char(8,2,(ge+48));
- }
-
- while(!Key_4);
- }
- }
- }
- //--------------------------------------------------------------------***
- //主函數-----------------------------------------------------------------
- void main(void)
- {
- unsigned int ge=0,shi=0,bai=0;
- LCD_init();
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料打包下載:
11基于單片機的溫度控制系統.rar
(3.88 MB, 下載次數: 257)
2017-5-9 18:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|