實驗十六、溫度自動控制系統(數碼管顯示)_第1頁
實驗十六、溫度自動控制系統(數碼管顯示)_第2頁
實驗十六、溫度自動控制系統(數碼管顯示)_第3頁
實驗十六、溫度自動控制系統(數碼管顯示)_第4頁
實驗十六、溫度自動控制系統(數碼管顯示)_第5頁
已閱讀5頁,還剩7頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、實驗十六、溫度自動控制系統(數碼管顯示 ) 一、實驗目的1. 進一步掌握溫度自動控制與測量的方法2. 進一步掌握單片機與pc機 uart通訊的設計與應用3鍛煉單片機綜合應用和開發的能力二、實驗設備1單片機最小系統2圖符型液晶顯示屏實驗模塊3溫度測量控制實驗模塊4獨立式鍵盤實驗模塊5. rs232 接口模塊三、實驗要求綜合以上實驗模塊,構成滿足以下要求的溫度自動控制測量系統:(1)顯示當前溫度:在圖符型液晶模塊上,第一行顯示“設置溫度”,第二行顯示實際“測量溫度”(單位為);并顯示出當前pwm 波形的占空比。(2)具有 3 個功能按鍵:1 個“升溫鍵”,按下后“設置溫度”加1;1 個“降溫鍵”,

2、按下后“設置溫度”減1。一個“開始/ 停止”鍵,用來啟動/ 停止溫度自動控制。(3)在“開始 / 停止”鍵第一次按下后,溫度自動測量控制功能啟動;從這時開始,系統開始以一定的時間間隔讀取溫度傳感器的“測量溫度”,并送液晶進行顯示;比較“測量溫度”和“設置溫度”,根據比較的結果,調整輸出的pwm 波形的脈寬 ( 通過軟件進行脈寬調制) ,從而實現溫度自動控制。再次按下該鍵,停止自動測量控制功能。(4)系統“監聽”上位機的命令,響應以下2 個命令:設置溫度命令,該命令可以靈活修改系統原先的“設置溫度”;采集溫度命令,該命令要求系統將當前的“測量溫度”值送給上位機;上位機以一定的時間間隔發送“采集溫

3、度命令”,由此得到溫度曲線。四、實驗原理(1)硬件邏輯結構:如圖16-1 所示,該系統是一個閉環溫度控制系統。圖 16-1 硬件邏輯結構單片機引腳分配如圖16-2 所示:圖 162 硬件示意圖硬件電路圖如圖48-3 所示,使用p3.4 端口輸出 pwm 波形,該波形加到單向可控硅上控制溫度加熱元件。溫度測量使用p3.3 端口,使用ds18b20器件,顯示使用p1.0 和 p1.2 口。按鍵控制功能與實驗26 相同. 圖 483 電路連接圖(2)軟件流程設計該閉環系統采用的直接反饋的方法,根據溫度傳感器測量出來溫度與我們希望的溫度相比較,根據比較結果,不斷改變占空比。如測量的溫度小于期望的溫度值

4、,就增加pwm 波形的占空比,如果大于期望的溫度值,就減少pwm 波形的占空比 , ,最終達到一定的平衡狀態。軟件系統基本流程如左圖所示:數碼管顯示單 片 機系統溫度控制加熱元件與對象溫度測量232 接口通訊數碼管顯示#include #include #include sbit data1=p10; sbit clk=p11; sbit plus=p20; sbit subs=p21; sbit stop=p22; sbit output=p34; sbit dq=p33; unsigned char flag,flag_1=0; / 占空比調節unsigned char high_time

5、,low_time,count=0; 參數unsigned char set_temper=40; /設定溫度unsigned char temper; /測量的溫度unsigned char i; unsigned char j=0; /* 延時子程序 ,延時時間以12m 晶振為準 ,延時時間為30ustime */ void delay(unsigned char time) unsigned char m,n; for(n=0;ntime;n+) for(m=0;m2;m+) /* 寫一位數據子程序*/ void write_bit(unsigned char bitval) ea=0;

6、 dq=0; /拉低 dq 以開始一個寫時序if(bitval=1) _nop_(); dq=1; /如要寫 1,則將總線置高 delay(5); /延時 90us 供 da18b20 采樣dq=1; /釋放 dq 總線_nop_(); _nop_(); ea=0; /* 寫一字節數據子程序*/ void write_byte(unsigned char val) unsigned char i; unsigned char temp; ea=0; /tr0=0; for(i=0;ii; /移位操作,將本次要寫的位移到最低位temp=temp&1; write_bit(temp); /

7、向總線寫該位 delay(7); /延時 120us 后/ tr0=1; ea=1; /* 讀一位數據子程序*/ unsigned char read_bit() unsigned char i,value_bit; ea=0; dq=0; /拉低 dq,開始讀時序_nop_(); _nop_(); dq=1; /釋放總線for(i=0;i2;i+) /8us delay value_bit=dq; ea=1; return(value_bit); /* 讀一字節數據子程序*/ unsigned char read_byte() unsigned char i,value=0; ea=0; f

8、or(i=0;i8;i+) if(read_bit() /讀一字節數據,一個時序中讀一次,并作移位處理value|=0 x01i; delay(4); /延時 80us以完成此次都時序,之后再讀下一數據 ea=1; return(value); /* 復位子程序*/ unsigned char reset() unsigned char presence; ea=0; dq=0; /拉低 dq 總線開始復位delay(30); /保持低電平480us dq=1; /釋放總線delay(3); /等待芯片應答信號75us presence=dq; /獲取應答信號delay(28); /延時以完成

9、整個時序ea=1; return(presence); /返回應答信號,有芯片應答返回0,無芯片則返回1 /* 獲取溫度子程序*/ void get_temper() unsigned char i,j; do i=reset(); /復位while(i!=0); /1 為無反饋信號i=0 xcc; /發送設備定位命令write_byte(i); i=0 x44; /發送開始轉換命令write_byte(i); delay(180); /延時do i=reset(); /復位while(i!=0); /0 為無反饋信號c,再次復位i=0 xcc; /設備定位write_byte(i); i=0

10、 xbe; /讀出緩沖區內容write_byte(i); j=read_byte(); /先讀出低位i=read_byte(); /后讀出高位i=(i4; temper=i|j; /* 溫度比較處理子程序*/ compare_temper() if(+flag_1=2) if(set_tempertemper) if(high_time100) /溫度未達到,但占空比已經100,則不執行 high_time+; low_time=100-high_time; else if(set_tempertemper) if(low_time100) /溫度超過設定溫度,但占空比已經為1,則不執行 hi

11、gh_time-; low_time=100-high_time; else flag_1=0; /* t0 中斷服務子程序,用于控制電平的翻轉,40us*100=4ms 周期*/ void serve_t0() interrupt 1 using 1 if(+count=(high_time) output=1; else if(count=100) output=0; else count=0; th0=0 x2f; tl0=0 xe0; /* 串行口中斷服務程序,用于上位機通訊*/ void serve_sio() interrupt 4 using 2 ea=0; ri=0; /cle

12、ar receive flag i=sbuf; if(i=2) while(ri=0) /等待接收溫度值ri=0; set_temper=sbuf; /設定控制溫度值sbuf=0 x02; /發給主機02 while(ti=0) ti=0; else if(i=3) /主機要求采樣溫度,發溫度值 ti=0; sbuf=temper; while(ti=0) ti=0; ea=1; /* void disp_1(unsigned char disp_num16) unsigned char n,a,k,m; for(n=0;n6;n+) k=disp_num1n; for(a=0;a=1; if

13、(m=1) data1=1; else data1=0; _nop_(); clk=1; _nop_(); /* 顯示子程序功能:將占空比溫度轉化為單個字符,顯示占空比和測得到的溫度*/ void display() unsigned char code number=0 xfc,0 x60,0 xda,0 xf2,0 x66,0 xb6,0 xbe,0 xe0,0 xfe,0 xe6; unsigned char disp_num6; unsigned int k,k1; k=high_time; k=k%1000; k1=k/100; if(k1=0) disp_num0=0; else

14、disp_num0=0 x60; k=k%100; disp_num1=numberk/10; disp_num2=numberk%10; disp_num3=0; k=temper; k=k%100; disp_num4=numberk/10; disp_num5=numberk%10; disp_1(disp_num); /* 主程序*/ main() unsigned char z; unsigned char a,b,flag_2=1,count1=0; unsigned char phil=2,0 xce,0 x6e,0 x60,0 x1c,2; tmod=0 x21; /t1 為

15、8 位重裝定時器,t0 為 16 位定時器th0=0 x2f; /50ms 中斷tl0=0 x40; scon=0 x50; /串口工作于方式1,允許接收,采用中斷方式pcon=0 x00; /波特率不加倍th1=0 xfd; /波特率為9600 tl1=0 xfd; ps=1; /串口中斷優先ea=1; /開總中斷ex1=0; /關外部中斷et0=1; /開定時器0 中斷/et0=0; es=1; /開串行口中斷tr0=1; /定時器 1 開始計時tr1=1; high_time=50; /初始化為占空比50%,周期為200ms low_time=50; while(1) if(plus=0

16、) ea=0; for(a=0;a5;a+) for(b=0;b102;b+) /消抖延時if(plus=0) set_temper+; flag=0; else if(subs=0) for(a=0;a5;a+) for(b=0;a102;b+) /消抖延時if(subs=0) set_temper-; flag=0; else if(stop=0) for(a=0;a5;a+) for(b=0;b5) temper=a; else temper=b; a=temper; flag_2=0; if(+count150) display(); count1=0; compare_temper(); /溫度比較和控制 tr0=0; z=1; while(1) ea=0; /顯示 -phil- disp_1(phil); if(stop=0) for(a=0;a5;a+) fo

溫馨提示

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

評論

0/150

提交評論