基于單片機的液位水溫控制_第1頁
基于單片機的液位水溫控制_第2頁
基于單片機的液位水溫控制_第3頁
基于單片機的液位水溫控制_第4頁
基于單片機的液位水溫控制_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、課 程 設 計 報 告 課程名稱_單片機綜合應用設計 題目名稱基于單片機的水位水溫控制系統學生學院_電氣與信息工程學院 _ 專業班級_ 學 號 學生姓名_ 2014 年 7 月 4 日課程設計題目: 基于單片機的水位水溫控制系統設計一、設計項目簡介1. 設計意義及目的早期溫度和水位的參數控制是通過模擬電路實現的。這種方式不僅電路復雜成本高而且誤差大,系統的穩定性不好。單片機及微型計算機技術的發展和應用有效地解決了這些缺點,特別是傳感器的發展更好的提高了檢測參數的精度。選擇基于單片機的水溫水位控制系統是因為它不僅在人們生活中具有顯著的意義,更重要的是能系統地聚溫度和水位參數于一身,對于

2、更好的掌握和認識單片機的應用和傳感器的應用,系統地深刻認識自動控制的實際應用,掌握復雜的多子系統地設計起到了很強的鍛煉作用。2. 系統功能描述本設計的控制系統由水位控制模塊和水溫控制模塊組成。水位控制部分主要由水位檢測、按鍵調整、水位控制和顯示等組成。水溫控制部分主要由溫度檢測、按鍵調整和顯示等組成。本設計的控制系統測量水位水溫方便、直觀成本較低較好地解決了工程應用問題。3. 設計達到目標對水池內的溫度水位進行監測,用lcd1602進行顯示,當水位低于某個程度時,輸出啟動抽水的控制信號,達到水位標準時停止抽水;當溫度低于某個溫度時,輸出啟動加熱裝置控制信號,達到指定溫度時,停止加熱。二、系統硬

3、件設計1. 系統設計方案 用51單片機作為中心處理器,用lcd1602顯示數據,用ds18b20測量溫度,用繼電器控制加熱工具加熱溫度,用超聲波測水液位,當溫度到達一定溫度停止加熱,水位低于標準水位就啟動水泵加水。圖12. 系統電路原理圖設計及說明本次設計用的是AT85C51作為主控制芯片 AT89C51是一種帶4K字節FLASH存儲器(FPEROMFlash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以

4、反復擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃速存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C51單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。外形及引腳排列如圖2所示。LCD1602是本次用來顯示數據的顯示硬件液晶顯示器1602(Liquid Crytal Display)簡稱LCD1602,其主要原理是以電流刺激液晶分子產生點、線、面并配合背部燈光構成畫面。1602表示每行顯示16個字符,

5、共有2行。LCD與51單片機連接如圖3圖3本次用的DS18B20測溫度,經過cpu再轉換到LCD1602顯示DSl8B204數字溫度計提供9位(二進制)溫度讀數,指示器件的溫度。信息經過單線接口送入DSl8B20或從DSl8B20送出,因此從主機CPU到DSl8B20僅需一條線(和地線)。DSl8B20的電源可以由數據線本身提供而不需要外部電源,這允許在許多不同的地方放置溫度敏感器件。DSl8B20的測量范圍從-55攝式度到+125攝式度,增量值為0.5攝式度,可在l s(典型值)內把溫度變換成數字。 用HC-SR04聲波測液位HC-SR04超聲波測距模塊可提供2cm-40

6、0cm的非接觸式距離感測功能,測距精度可達高到3mm;模塊包括超聲波發射器、接收器與控制電路。基本工作原理:(1)采用IO口TRIG觸發測距,給最少10us的高電平信呈。(2)模塊自動發送8個40khz的方波,自動檢測是否有信號返回;(3)有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S)/2;圖6為蜂鳴器與單片機連接圖圖6圖7為按鍵電路圖7圖8為時鐘電路和復位電路時鐘電路用于產生單片機工作所需要的時鐘信號,單片機本身就是一個復雜的同步時序電路,為了保證同步工作方式的實現,電路應在唯一的時鐘信號控制下嚴格地按

7、時序進行工作。  在51芯片內部有一個高增益反相放大器,其輸入端為芯片引腳1XTAL,輸出端為引腳2XTAL,在芯片的外部跨接晶體振蕩器和微調電容,形成反饋電路,就構成了一個穩定的自激振蕩器。 此電路采用12MHz的石英晶體。復位電路:復位是單片機的初始化操作。除了進入系統的正常初始化之外,當由于程序運行出錯或操作錯誤是系統處于死鎖狀態時,為擺脫困境,也需要按復位鍵以重新啟動。 RST引腳是單片機復位信號的輸入端,復位信號是高電平有效,其有效時間應持續24個振蕩周期(即2個機器周期)以上,若使用頻率為12MHz的晶振,則復位信號持續時間應超過4ms才能完

8、成復位操作。復位操作有上電自動復位和按鍵手動復位兩種方式。上電自動復位是通過外部復位電路的電容充電來實現的 三、系統軟件設計1. 軟件設計方案圖112. 軟件設計框圖及說明本系統中,主程序主要分兩部分,分別是設置部分和工作部分。設置部分需要調用設置子程序,工作時需要調用顯示屏初始化、鍵盤掃描、錯誤檢驗、溫度讀取、顯示、繼電器控制、延時子程序。因為系統開始工作時需要先設置目標溫度,所以需要設置子程序。目標溫度設置好之后可以在工作中微調。工作時首先要將顯示屏初始化,這樣才能保證顯示屏的工作。因為需要微調,所以除了設置子程序之外,主程序也需要調用鍵盤掃描和錯誤檢驗程序。之后,需要顯示目標溫度和實際溫

9、度的比較,于是需要從傳感器讀取溫度值,即溫度讀取子程序。讀到溫度之后,需要將兩個溫度顯示出來,于是需要調用顯示子程序。當然,因為要控制升溫降溫設備,所有還需要繼電器控制子程序。最后,延時,否則屏幕會持續閃動系統無法正常使用。 溫度傳感器圖13四、設計調試及結果分析(做實物的同學給出實際調試結果,附結果圖片;仿真的同學寫仿真結果分析,給出仿真結果圖)五、 結束語本次設計優點:本系統簡單可行,所用原件均為市場主流原件,造價低廉并能準確完成我們需要的對溫度的顯示和控制等功能。并且通過LCD液晶顯示明確直觀地將目標溫度和現場實際溫度顯示出來,便于我們觀察和記錄。本次設計缺點:焊接電路的時候有虛焊,有的

10、元件連接不好,控制系統部署很靈敏通過這次課題設計,我對單片機的工作原理有了更深一步的了解,對于I/O工作方式更加明確,并且在應用上掌握了不少方法。在與同學們交流中,也發現不少問題,并且及時的做出相應的更改,還有一些應用巧妙的方法,這些使我對單片機技術能更靈活的應用。致謝:多謝老師在課堂上傳授的知識,感謝隊員的各方面的幫助,讓我可以完成這個課程設計,讓我學到了很多東西,以前不懂的地方經過同學指點已經基本可以明白。六、 附錄1. 電路原理圖整體繪制圖2. 電路PCB圖整體繪制圖3. 相關程序代碼#include<reg52.h>#include<intrins.h>#def

11、ine uint unsigned int#define uchar unsigned char#define NOP() _nop_();_nop_();_nop_();_nop_();#define LCD_DATA P2sbit DSPORT=P10; /DS18b20sbit Heat = P00; /溫度控制繼電器sbit Push = P01;/抽水控制/-Beep-sbit BEEP = P11;/sbit LED = P14;/-Key-sbit AUTO = P34;sbit MOV = P35;sbit ADD = P36;sbit DEC = P37; /sbit EN

12、= P24;sbit INT = P33;/-LCD引腳-sbit LCD_RS=P04;sbit LCD_RW=P05;sbit LCD_EN=P06;/-超聲波引腳-sbit Tx=P31;/觸發控制信號輸入sbit Rx=P32;/回響信號輸出 uchar temp_dis = "N:00.0 C 000.0cm"/LCD第一行uchar table = " :00.0 C 000.0cm"/LCD第二行顯示uchar Hand_table= "H: heat push "/uchar Auto_table= "A:0

13、0.0 C 000.0cm"uchar Set_Table7 =3,6,0,0,2,0,0;/設定溫度值,水位值數組uchar Con_Flag=0;/控制標志位1為自動,0為手動uchar aa=0, bb=0;long int t,distance,S_Distance=0,R_Distance=0;/L=500;/distance=超聲波安裝點 與 水面的距離,水深=超聲波安裝點-distancelong int temp = 0,S_Temp=0,R_Temp=0;int TError=0,DError=0;uchar cache4=0,0,0,0;uchar datas3

14、= 0,0,0; /定義數組/double Kp=0.0;/PID控制的比例、積分、微分常數/* 函 數 名 : Delay1ms* 函數功能 : 延時函數* 輸 入 : 無* 輸 出 : 無*/void Delay1ms(uint ms)uint t;while(ms-)for(t=0;t<120;t+);/* 函 數 名 : Init_Config* 函數功能 : 中斷配置* 輸 入 : 無* 輸 出 : 無*/void Init_Config(void)TMOD=0x19;TR0=1;/啟動定時器EX0=1;/開外部中斷IT0=1;EX1=1;IT1=1;PX0=1;PX1=0;E

15、A=1;/開總中斷/* 函 數 名 : read_lcd_state* 函數功能 : 讀取LCD狀態* 輸 入 : 無* 輸 出 : 無*/uchar read_lcd_state()uchar state;LCD_RS=0;LCD_RW=1;LCD_EN=1;_nop_();state=LCD_DATA;LCD_EN=0;_nop_();return state;/* 函 數 名 : lcd_busy_wait* 函數功能 : LCD測忙* 輸 入 : 無* 輸 出 : 無*/void lcd_busy_wait()while(read_lcd_state() & 0x80)=0x8

16、0);NOP();/* 函 數 名 : lcd_write_com* 函數功能 : 寫命令入LCD* 輸 入 : 無* 輸 出 : 無*/void lcd_write_com(uchar com)lcd_busy_wait();LCD_RS=0;/RS為0時,寫指令,RS為1時,寫數據LCD_RW=0;LCD_DATA=com;NOP();LCD_EN=1;NOP();LCD_EN=0;/* 函 數 名 : lcd_write_data* 函數功能 : 寫數據入LCD* 輸 入 : dat* 輸 出 : 無*/void lcd_write_data(uchar dat)lcd_busy_wai

17、t();LCD_RS=1;LCD_RW=0;LCD_DATA=dat;NOP();LCD_EN=1;NOP();LCD_EN=0;/* 函 數 名 : lcd_init* 函數功能 : LCD初始化* 輸 入 : 無* 輸 出 : 無*/void lcd_init()LCD_EN=0;lcd_write_com(0x38);/LCD顯示模式設置lcd_write_com(0x0c);/LCD顯示開/關及光標設置lcd_write_com(0x06);/當寫一個字符后地址指針加1,且光標加1lcd_write_com(0x01);/顯示清屏/* 函 數 名 : set_lcd_pos* 函數功能

18、 : 設置LCD顯示地址* 輸 入 : p* 輸 出 : 無*/void set_lcd_pos(uchar p)lcd_write_com(p|0x80);/* 函 數 名 : lcd_print* 函數功能 : 打印顯示字符* 輸 入 : p,*s,low* 輸 出 : 無*/void lcd_print(uchar p,uchar *s,uint low)uint num;set_lcd_pos(p);for(num=0;num<low;num+)lcd_write_data(snum);Delay1ms(1);void HC05_Init()Tx=1;/觸發脈沖NOP();NOP

19、();NOP();NOP();Tx=0;distance=0.17*t;/距離計算/distance=L-distance;/水深/* 函 數 名 : distance_convert* 函數功能 : 距離裝換* 輸 入 : Ldat* 輸 出 : 無*/void distance_convert(long int Ldat)cache0=Ldat/1000;cache1=Ldat/100%10;cache2=Ldat/10%10;cache3=Ldat%10;temp_dis9=cache0+'0'temp_dis10=cache1+'0'temp_dis11

20、=cache2+'0'temp_dis13=cache3+'0'/* 函 數 名 : Ds18b20Init* 函數功能 : 初始化DS18b20* 輸 入 : 無* 輸 出 : 無*/uchar Ds18b20Init()uchar i;DSPORT = 0; /將總線拉低480us960usi = 70;while(i-); /延時642usDSPORT = 1;/然后拉高總線,如果DS18B20做出反應會將在15us60us后總線拉低i = 0;while(DSPORT)/等待DS18B20拉低總線i+;if(i>5)/等待>5MSreturn

21、 0;/初始化失敗Delay1ms(1);return 1;/初始化成功/* 函 數 名 : Ds18b20WriteByte* 函數功能 : 向18B20寫入一個字節* 輸 入 : Tdat* 輸 出 : 無/*/void Ds18b20WriteByte(uchar Tdat)uint i, j;for(j=0; j<8; j+)DSPORT = 0; /每寫入一位數據之前先把總線拉低1usi+;DSPORT = Tdat & 0x01; /然后寫入一個數據,從最低位開始i=6;while(i-); /延時68us,持續時間最少60usDSPORT = 1;/然后釋放總線,至

22、少1us給總線恢復時間才能接著寫入第二個數值Tdat >>= 1;/* 函 數 名 : Ds18b20ReadByte* 函數功能 : 讀取一個字節* 輸 入 : 無* 輸 出 : 無*/uchar Ds18b20ReadByte()uchar byte, bi;uint i, j;for(j=8; j>0; j-)DSPORT = 0;/先將總線拉低1usi+;DSPORT = 1;/然后釋放總線i+;i+;/延時6us等待數據穩定bi = DSPORT; /讀取數據,從最低位開始讀取/*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/byte

23、= (byte >> 1) | (bi << 7); i = 4;/讀取完之后等待48us再接著讀取下一個數while(i-);return byte;/* 函 數 名 : Ds18b20ChangTemp* 函數功能 : 讓18b20開始轉換溫度* 輸 入 : 無* 輸 出 : 無*/void Ds18b20ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳過ROM操作命令 Ds18b20WriteByte(0x44); /溫度轉換命令Delay1ms(100);/等待轉換成功,而如果你是一直刷

24、著的話,就不用這個延時了 /* 函 數 名 : Ds18b20ReadTempCom* 函數功能 : 發送讀取溫度命令* 輸 入 : 無* 輸 出 : 無*/void Ds18b20ReadTempCom()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); /跳過ROM操作命令Ds18b20WriteByte(0xbe); /發送讀取溫度命令/* 函 數 名 : Ds18b20ReadTemp* 函數功能 : 讀取溫度* 輸 入 : 無* 輸 出 : 無*/int Ds18b20ReadTemp()uchar tmh, tml;uchar da

25、tas3 = 0,0,0; /定義數組Ds18b20ChangTemp(); /先寫入轉換命令Ds18b20ReadTempCom();/然后等待轉換完后發送讀取溫度命令tml = Ds18b20ReadByte();/讀取溫度值共16位,先讀低字節tmh = Ds18b20ReadByte();/再讀高字節temp = tmh;temp <<= 8;temp |= tml;temp=temp*0.625;return temp; /* 函 數 名 : Ds1820Disp* 函數功能 : DS18b20的顯示* 輸 入 : Tdata* 輸 出 : 無*void LcdDispl

26、ay(int Tdata) /lcd顯示 datas0 = Tdata % 1000 /100 ;datas1 = Tdata % 100 / 10;datas2 = Tdata % 10 ;temp_dis2=datas0+'0'temp_dis3=datas1+'0'temp_dis5=datas2+'0'temp_dis6=0xdf;/攝氏度符號/* 函 數 名 : Read_Value* 函數功能 : 寫入溫度值、水位值的顯示* 輸 入 : 無* 輸 出 : 無*/void Write_Value(void) /溫度值 table2= S

27、et_Table0+'0' /十位 table3= Set_Table1+'0' /個位 table5 = Set_Table2+'0' /小數位 table6 = 0xdf; /水位值 table9= Set_Table3+'0' table10= Set_Table4+'0' table11= Set_Table5+'0' table13= Set_Table6+'0' /* 函 數 名 : Read_Value* 函數功能 : 讀取溫度值、水位值的顯示* 輸 入 : 無* 輸

28、出 : 無*void Read_Set_Value(void)S_Distance= Set_Table3*1000+Set_Table4*100+Set_Table5*10+Set_Table6; 水位S_Temp= Set_Table0*100+Set_Table1*10+Set_Table2; 溫度/* 函 數 名 : Read_Value* 函數功能 : 讀取溫度值、水位值的顯示* 輸 入 : 無* 輸 出 : 無*void Read_Real_Value(void)R_Distance = cache0*1000+cache1*100+cache2*10+cache3;R_Temp

29、= datas0*100+datas1*10+datas2;/* 函 數 名 : Auto_Temp_Control* 函數功能 : * 輸 入 : 無* 輸 出 : 無*void Auto_Temp_Control(void)if(TError>20) Heat=0;else if(TError<-20)Heat=1;/* 函 數 名 : Auto_Distance_Control* 函數功能 : * 輸 入 : 無* 輸 出 : 無*void Auto_Distance_Control()if(DError>50) Push=0;else if(DError<-10

30、)Push=1;/* 函 數 名 : Auto_Activity* 函數功能 : 自動* 輸 入 : 無* 輸 出 : 無*void Auto_Activity(void)while(1)table0='S'LcdDisplay(temp);lcd_print(0x00,temp_dis,16);Set_Tablebb=aa;Write_Value();lcd_print(0x40,table,16);Delay1ms(1);HC05_Init();distance_convert(distance);Ds18b20ReadTemp();Set_Tablebb=0x5f;Wri

31、te_Value();lcd_print(0x40,table,16);if(!MOV)Delay1ms(1);bb+;if(bb=7)bb=0;else if(!ADD)Delay1ms(1);aa+;if(aa=10)aa=0;Set_Tablebb=aa;else if(!DEC)if(aa=0)aa=10;Delay1ms(1);aa-;Set_Tablebb=aa;else if(!AUTO)Read_Set_Value();break;else if(!AUTO)break;/* 函 數 名 : Hand_Activity* 函數功能 : 手動模式配置* 輸 入 : 無* 輸 出 : 無*void Hand_Activity(void)if(!ADD) /手動加熱Heat=0;Hand_table3='H'Hand_table4='E'Hand_table5='A'Hand_table6='T'elseHeat=1;Hand_table3='h'Hand_table4='e'Hand_table5='a'Hand_table6='t'if(!DEC)/手動抽水Push=0;Hand_table9='P'

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論