數(shù)字溫度計設計-開題報告書_第1頁
數(shù)字溫度計設計-開題報告書_第2頁
數(shù)字溫度計設計-開題報告書_第3頁
數(shù)字溫度計設計-開題報告書_第4頁
數(shù)字溫度計設計-開題報告書_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、-. z數(shù)字溫度計設計開題報告364.1設計要求利用溫度傳感器DS18B20測量*一點環(huán)境溫度.測量圍為-5050,精度為0.5.用LED數(shù)碼管進展實際溫度值直讀顯示.2.擴展功能能夠根據(jù)需要任意設定溫度的上下限報警功能.364.2硬件設計1設計思想以51單片機為主控制器,以數(shù)字式溫度傳感器DS18B20為傳感元件,以LED數(shù)碼管作為顯示器件實時顯示測量溫度。數(shù)字式溫度計測溫圍在5050,誤差在0.5以。溫度測量間隔時間選擇1s。通過鍵盤擴展,實現(xiàn)溫度上下限值的設定及溫度報警功能。對溫度采樣值實現(xiàn)數(shù)字濾波。通過硬件或軟件方法實現(xiàn)時間顯示。2主要元器件介紹:單片機AT89C51 溫度傳感器DS1

2、8B20 4位共陽LED數(shù)碼管 3 功能電路介紹主控制器:單片機AT89C2051具有低電壓供電和小體積等特點,兩個端口剛好滿足電路系統(tǒng)的設計需要。顯示電路:顯示電路采用4位共陽LED數(shù)碼管,從P1口輸出段碼,列掃描用P3.0P3.3口來實現(xiàn),列驅動用9012三極管。電路圖溫度計電路設計原理圖如上圖所示,溫度計的控制器使用單片機AT89C51,溫度傳感器使用DS18B20,用4位共陽極LED數(shù)碼管以動態(tài)掃描法實現(xiàn)溫度顯示。圖中有3個獨立式按鍵可以分別調整溫度的上下限報警設置,圖中蜂鳴器可以在被測溫度不在上下限圍時,發(fā)出報警鳴叫聲音,同時LED數(shù)碼管將沒有被測溫度顯示,這時可以調整上下限,從而測

3、出被測的溫度值。364.3 軟件設計1 設計思想數(shù)字溫度計設計的應用程序由主程序,LED顯示子程序,溫度檢測程序組2軟件流程圖3源程序 ds18b20數(shù)碼管動態(tài)顯示頭文件* 功 能: 通過定時器0延時是數(shù)碼管動態(tài)顯示* 編程者: ZPZ* 編程時間:2009/10/2*/*ifndef _ds18b20_display_H_ /定義頭文件*define _ds18b20_display_H_*define uint unsigned int /變量類型宏定義,用uint表示無符號整形16位*define uchar unsigned char /變量類型宏定義,用uchar表示無符號字符型8位

4、sbit wei1=P24; /可位尋址變量定義,用wei1表示P2.4口sbit wei2=P25; /用wei2表示P2.5口sbit wei3=P26; /用wei3表示P2.6口sbit wei4=P27; /用wei4表示P2.7口uchar num=0; /定義num為全局無符號字符型變量,賦初值為0uchar code temperature1= 0*3f,0*06,0*5b,0*4f,0*66, 0*6d,0*7d,0*07,0*7f,0*6f;/定義顯示碼表09uchar code temperature2= 0*bf,0*86,0*db,0*cf,0*e6, 0*ed,0*

5、fd,0*87,0*ff,0*ef;/帶小數(shù)點的0.9.uchar code temperature3= 0*00,0*80,0*40,0*76,0*38;/依次是不顯示.-HL/*延時子函數(shù)*/void display_delay(uint t) /延時1ms左右uint i,j;for(i=t;i0;i-) for(j=120;j0;j-);/*定時器1初始化函數(shù)*/void timer1_init(bit t) TMOD=0*10;/設定定時器1工作在方式1,最大定時65.53ms TH0=0*3c;/定時器賦初值,定時50ms TL0=0*b0; EA=1;/開總中斷 ET1=1;/開

6、定時器1中斷 TR1=t;/ 局部變量t為1啟動定時器1,為0關閉定時器1/*定時器1中斷函數(shù)*/void timer1() interrupt 3 TH0=0*3c;/重新賦初值,定時50ms TL0=0*b0;num+;/每進入一次定時器中斷num加1每50ms加1一次 if(num20)/進入20次中斷,定時1s num=0;/num歸0,重新定開場定時1s s1=0;/定時1s時間到時自動關閉報警上下限顯示功能 v1=1;/定時1s時間到時自動關閉報警上下限查看功能 /*調整報警上下限顯示選擇函數(shù)*/void selsct_1(uchar f,uchar k) /消除百位的0顯示,及正

7、負溫度的顯示選擇 if(f=0)/假設為正溫度,百位為0則不顯示百位,不為0則顯示 if(k/100=0) P0=temperature30; else P0=temperature1k/100; if(f=1)/假設為負溫度,假設十位為0,百位不顯示,否則百位顯示- if(k%100/10=0) P0=temperature30; else P0=temperature32; void selsct_2(bit f,uchar k)/消除十位的0顯示,及正負溫度的顯示選擇 if(f=0) /假設為正溫度,百位十位均為0則不顯示十位,否則顯示十位 if(k/100=0)&(k%100/10=0

8、) P0=temperature30; else P0=temperature1k%100/10; if(f=1)/假設為負溫度,假設十位為0,十位不顯示,否則十位顯示- if(k%100/10=0) P0=temperature32; else P0=temperature1k%100/10; /*主顯示函數(shù)*/void display(uchar t,uchar t_d) /用于實測溫度、上限溫度的顯示 uchar i; for(i=0;i4;i+) /依次從左至右選通數(shù)碼管顯示,實現(xiàn)動態(tài)顯示 switch(i) case 0: /選通第一個數(shù)碼管 wei2=1; /關第二個數(shù)碼管 wei

9、3=1; /關第三個數(shù)碼管 wei4=1; /關第四個數(shù)碼管 wei1=0; /開第一個數(shù)碼管 if(a=0)selsct_1(f,t); /假設a=0則在第一個數(shù)碼管上顯示測量溫度的百位或- if(a=1) P0=temperature33; /假設a=1則在第一個數(shù)碼管上顯示H if(a=2) P0=temperature34; /假設a=2則在第一個數(shù)碼管上顯示L break; case 1: /選通第二個數(shù)碼管 wei1=1; wei3=1; wei4=1; wei2=0; if(a=0)selsct_2(f,t); /假設a=0則在第二個數(shù)碼管上顯示測量溫度的十位或- if(a=1)

10、 /假設a=1則在第二個數(shù)碼管上顯示上限報警溫度的百位或- if(s=0) selsct_1(f_ma*,ma*);/假設s=0則顯示第二個數(shù)碼管,否則不顯示 else P0=temperature30; /通過s標志位的變化實現(xiàn)調節(jié)上下限報警溫度時數(shù)碼管的閃爍 if(s1=1) selsct_1(f_ma*,ma*);/假設s1=1則顯示第二個數(shù)碼管s1標志位用于上下限查看時的顯示 if(a=2) /假設a=2則在第二個數(shù)碼管上顯示下限報警溫度的百位或- if(s=0) selsct_1(f_min,min); else P0=temperature30; if(s1=1) selsct_1

11、(f_min,min); break; case 2: /選通第三個數(shù)碼管 wei1=1; wei2=1; wei4=1; wei3=0; if(a=0)P0=temperature2t%10;/假設a=0則在第三個數(shù)碼管上顯示測量溫度的個位 if(a=1) /假設a=1則在第三個數(shù)碼管上顯示上限報警溫度的十位或- if(s=0) selsct_2(f_ma*,ma*);/假設s=0則顯示第三個數(shù)碼管,否則不顯示 else P0=temperature30; if(s1=1) selsct_2(f_ma*,ma*);/假設s1=1則顯示第三個數(shù)碼管 if(a=2) /假設a=2則在第三個數(shù)碼管

12、上顯示下限報警溫度的十位或- if(s=0) selsct_2(f_min,min); else P0=temperature30; if(s1=1) selsct_2(f_min,min); break; case 3: /選通第四個數(shù)碼管 wei1=1; wei2=1; wei3=1; wei4=0; if(a=0)P0=temperature1t_d;/假設a=0則在第四個數(shù)碼管上顯示測量溫度的小數(shù)位 if(a=1) /假設a=1則在第四個數(shù)碼管上顯示上限報警溫度的個位 if(s=0) P0=temperature1ma*%10;/假設s=0則顯示第四個數(shù)碼管,否則不顯示 else P0

13、=temperature30; if(s1=1) P0=temperature1ma*%10;/假設s1=1則顯示第四個數(shù)碼管 if(a=2) /假設a=2則在第四個數(shù)碼管上顯示下限報警溫度的個位 if(s=0) P0=temperature1min%10; else P0=temperature30; if(s1=1) P0=temperature1min%10; break; display_delay(10); /每個數(shù)碼管顯示3ms左右/*開機顯示函數(shù)*/void display1(uint z) /用于開機動畫的顯示 uchar i,j; bit f=0; for(i=0;iz;i+

14、) /z是顯示遍數(shù)的設定 for(j=0;j4;j+) /依次從左至右顯示- switch(j) case 0: wei2=1; wei3=1; wei4=1; wei1=0; break; P0=temperature32;/第一個數(shù)碼管顯示 case 1: wei1=1; wei3=1; wei4=1; wei2=0;break; P0=temperature32;/第二個數(shù)碼管顯示 case 2: wei1=1; wei2=1; wei4=1; wei3=0;break; P0=temperature32;/第三個數(shù)碼管顯示 case 3: wei1=1; wei2=1; wei3=1;

15、 wei4=0;break; P0=temperature32;/第四個數(shù)碼管顯示 display_delay(400); /每個數(shù)碼管顯示200ms左右 *endif程序名; 基于DS18B20的測溫系統(tǒng)* 功 能: 實時測量溫度,超過上下限報警,報警溫度可手動調整。K1是用來* 進入上下限調節(jié)模式的,當按一下K1進入上限調節(jié)模式,再按一下進入下限* 調節(jié)模式。在正常模式下,按一下K2進入查看上限溫度模式,顯示1s左右自動* 退出;按一下K3進入查看下限溫度模式,顯示1s左右自動退出;按一下K4消除* 按鍵音,再按一下啟動按鍵音。在調節(jié)上下限溫度模式下,K2是實現(xiàn)加1功能,* K1是實現(xiàn)減1

16、功能,K3是用來設定上下限溫度正負的。 * 編程者: ZPZ* 編程時間:2009/10/2* 學習交流 .zicreate. (建立中)2012-5-21*/*include /將AT89*52.h頭文件包含到主程序*include /將intrins.h頭文件包含到主程序調用其中的_nop_()空操作函數(shù)延時*define uint unsigned int /變量類型宏定義,用uint表示無符號整形16位*define uchar unsigned char /變量類型宏定義,用uchar表示無符號字符型8位uchar ma*=0*00,min=0*00; /ma*是上限報警溫度,min

17、是下限報警溫度bit s=0; /s是調整上下限溫度時溫度閃爍的標志位,s=0不顯示200ms,s=1顯示1s左右bit s1=0; /s1標志位用于上下限查看時的顯示void display1(uint z); /聲明display1函數(shù)display.h頭文件中的函數(shù),ds18b20.h要用應先聲明*includeds18b20.h /將ds18b20.h頭文件包含到主程序*includekeyscan.h /將keyscan.h頭文件包含到主程序*includedisplay.h /將display.h頭文件包含到主程序/*主函數(shù)*/void main() beer=1; /關閉蜂鳴器

18、led=1; /關閉LED燈 timer1_init(0); /初始化定時器1未啟動定時器1 get_temperature(1); /首次啟動DS18B20獲取溫度DS18B20上點后自動將EEPROM中的上下限溫度復制到TH和TL存放器 while(1) /主循環(huán) keyscan(); /按鍵掃面函數(shù) get_temperature(0); /獲取溫度函數(shù) /keyscan(); /按鍵掃面函數(shù) display(temp,temp_d*0.625);/顯示函數(shù) alarm(); /報警函數(shù) /keyscan(); /按鍵掃面函數(shù) 程序名; _ds18b20_h_* 功 能: DS18B20

19、的c51編程頭文件* * 編程者: ZPZ* 編程時間:2009/10/2* 說 明:用到的全局變量是:無符號字符型變量temp(測得的溫度整數(shù)局部),temp_d * (測得的溫度小數(shù)局部),標志位f測量溫度的標志位0表示正溫度1表* 示負溫度,標志位f_ma*上限溫度的標志位0表示正溫度、1表* 示負溫度,標志位f_min下限溫度的標志位0表示正溫度、1表* 示負溫度,標志位w(報警標志位1啟動報警0關閉報警)。 */*ifndef _ds18b20_h_ /定義頭文件*define _ds18b20_h_*define uint unsigned int /變量類型宏定義,用uint表示

20、無符號整形16位*define uchar unsigned char /變量類型宏定義,用uchar表示無符號字符型8位sbit DQ= P23; /可位尋址變量定義,用DQ表示P2.3口sbit beer=P10; /用beer表示P1.0sbit led=P11; /用led表示P1.1uchar temp=0; /測量溫度的整數(shù)局部uchar temp_d=0; /測量溫度的小數(shù)部bit f=0; /測量溫度的標志位,0表示正溫度1表示負溫度bit f_ma*=0; /上限溫度的標志位0表示正溫度1表示負溫度bit f_min=0; /下限溫度的標志位0表示正溫度、1表示負溫度bit

21、w=0; /報警標志位1啟動報警0關閉報警)/*延時子函數(shù)*/void ds18b20_delayus(uint t) /延時幾s while(t-);void ds18b20_delayms(uint t) /延時1ms左右uint i,j;for(i=t;i0;i-) for(j=120;j0;j-);/*ds18b20初始化函數(shù)*/void ds18b20_init() / DS18B20初始化 uchar c=0; DQ=1;DQ=0; /控制器向DS18B20發(fā)低電平脈沖ds18b20_delayus(80); /延時15-80sDQ=1;/控制器拉高總線,while(DQ); /等

22、待DS18B20拉低總線,在60-240s之間ds18b20_delayus(150);/延時,等待上拉電阻拉高總線DQ=1; /拉高數(shù)據(jù)線,準備數(shù)據(jù)傳輸;/*ds18b20字節(jié)讀函數(shù)*/uchar ds18b20_read() /DS18B20 字節(jié)讀取uchar i;uchar d = 0;DQ = 1;/準備讀;for(i=8;i0;i-) d = 1; /低位先發(fā);DQ = 0;_nop_();_nop_();DQ = 1;/必須寫1,否則讀出來的將是不預期的數(shù)據(jù);if(DQ)/在12us處讀取數(shù)據(jù);d |= 0*80;ds18b20_delayus(10);return d; /返回

23、讀取的值/*ds18b20字節(jié)寫函數(shù)*/void ds18b20_write(uchar d) / ds18b20字節(jié)寫 uchar i; for(i=8;i0;i-) DQ=0; DQ=d&0*01; ds18b20_delayus(5); DQ=1; d = 1; /*獲取溫度函數(shù)*/ void get_temperature(bit flag)uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); /DS18B20初始化ds18b20_write(0*cc);/向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0*44);/寫啟動DS18B

24、20進展溫度轉換命令,轉換結果存入部RAMif(flag=1)/首次啟動DS18B20進展溫度轉換需要500ms,假設轉換時間不夠就出錯,讀出的是85度的錯誤值。 display1(1);/用開機動畫耗時elseds18b20_delayms(1);ds18b20_init(); /DS18B20初始化ds18b20_write(0*cc); /向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0*be);/寫讀部RAM中9字節(jié)的容命令a=ds18b20_read();/讀部RAM LSBb=ds18b20_read();/讀部RAM MSBif(flag=1)/局部位變量f=1時

25、讀上下線報警溫度 ma*=ds18b20_read(); /讀部RAM TH min=ds18b20_read(); /讀部RAM Tlif(ma*&0*80)=0*80) /假設讀取的上限溫度的最高位符號位為1說明是負溫度f_ma*=1;ma*=(ma*-0*80); /將上限溫度符號標志位置1表示負溫度,將上限溫度裝換成無符號數(shù)。 if(min&0*80)=0*80) /假設讀取的下限溫度的最高位符號位為1說明是負溫度f_min=1;min=(min-0*80); /將下限溫度符號標志位置1表示負溫度,將下限溫度裝換成無符號數(shù)。i=b;i=4;if (i=0) f=0; /i為0,正溫度,

26、設立正溫度標記 temp=(a4)|(b4)|(b4);/整數(shù)局部 a=(a&0*0f);/小數(shù)局部 temp_d=a; /*存儲極限溫度函數(shù)*/ void store_t() if(f_ma*=1) /假設上限溫度為負,將上限溫度轉換成有符號數(shù)最高位為1是負,為0是正ma*=ma*+0*80;if(f_min=1) /假設下限溫度為負,將上限溫度轉換成有符號數(shù)min=min+0*80; ds18b20_init(); /DS18B20初始化ds18b20_write(0*cc); /向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0*4e); /向DS18B20發(fā)寫字節(jié)至暫存器

27、2和3TH和TL命令ds18b20_write(ma*); /向暫存器TH上限溫度暫存器寫溫度ds18b20_write(min); /向暫存器TL下限溫度暫存器寫溫度ds18b20_write(0*ff); /向配置存放器寫命令,進展溫度值分辨率設置ds18b20_init(); /DS18B20初始化ds18b20_write(0*cc); /向DS18B20發(fā)跳過讀ROM命令ds18b20_write(0*48); /向DS18B20發(fā)將RAM中2、3字節(jié)的容寫入EEPROM /DS18B20上電后會自動將EEPROM中的上下限溫度拷貝到TH、TL暫存器/*溫度超限報警函數(shù)*/ void

28、 alarm() /假設上限值是正值 if(f_ma*=0) if(f_min=0) /假設下限值是正值 if(f=0) /假設測量值是正值 if(temp=ma*) w=1;TR1=1; /當測量值小于最小值或大于最大值時報警 if(tempmin) w=0; /當測量值大于最小值且小于最大值時不報警 if(f=1)w=1;TR1=1; /假設測量值是負值時報警 if(f_min=1) /假設下限值是負值 if(f=0) /假設測量值是正值 if(temp=ma*)/當測量值大于最大值時報警 w=1;TR1=1; if(temp=min)/當測量值大于最小值時報警 w=1;TR1=1; if

29、(tempmin)/當測量值小于最小值時不報警 w=0; if(f_ma*=1) /假設下限值是負值 if(f_min=1) /假設下限值是負值 if(f=1) /假設測量值是負值 if(temp=min) w=1;TR1=1; /當測量值小于最大值或大于最小值時報警 if(tempma*) w=0; /當測量值小于最小值且大于最大值時不報警 if(f=0)w=1;TR1=1; /假設測量值是正值時報警 *endif程序名; ds18b20鍵盤頭文件* 功 能: 通過鍵盤設定設定上下限報警溫度* 編程者: ZPZ* 編程時間:2009/10/2*/*ifndef _keyscan_H_/定義頭

30、文件*define _keyscan_H_sbit key1=P22; /可位尋址變量定義,用key1表示P2.2口sbit key2=P21; /用key2表示P2.1口sbit key3=P20;/用key3表示P2.0口sbit key4=P33;/用key4表示P3.3口uchar i=0;/定義全局變量i用于不同功能模式的選擇,0正常模式,1上限調節(jié)模式,2下限調節(jié)模式uchar a=0; /定義全局變量a用于不同模式下數(shù)碼管顯示的選擇bit k4=0;/K4按鍵雙功能選擇位,k4=0時K4按鍵選擇消按鍵音的功能,k4=1時K4按鍵選擇正負溫度設定功能bit v=0;/K2、K3按鍵

31、雙功能選擇位,v=0時選擇上下限查看功能,v=1時選擇上下限溫度加減功能bit v1=0;/v1=1時定時1250ms時間到自動關閉報警上下限查看功能bit v2=0; /消按鍵音功能調整位,為0時開按鍵音,為1時關按鍵音/*讀鍵盤延時子函數(shù)*/void keyscan_delay(uint z)/延時1ms左右 uint i,j; for(i=z;i0;i-)for(j=120;j0;j-);/*溫度調節(jié)函數(shù)*/int temp_change(int count,bit f)/上下限溫度調整 if(key2=0)/判斷K2是否按下 if(v2=0)beer=0;/v2=0開按鍵音,否則消按鍵

32、音keyscan_delay(10);/延時10msif(key2=0)/再次判斷K2是否按下實現(xiàn)按按鍵時消抖 beer=1;/K2按下關按鍵音 if(f=0)/假設溫度為正 count+;/每按一下K2溫度上調1 if(a=1)if(count125) count=125;/當溫度值大于125時不上調 if(a=2)if(count125) count=125; if(f!=0)/假設溫度為負 count+;/每按一下K2溫度下調1 if(a=1)if(count55) count=55;/當溫度值小于-55時不再下調 if(a=2)if(count55) count=55; while(k

33、ey2=0);/K2松開按鍵時消抖keyscan_delay(10);if(key3=0) if(v2=0)beer=0;keyscan_delay(10);if(key3=0) /K3按按鍵時消抖 beer=1; count-;/每按一下K3溫度為正時下調1,為負時上調1if(a=1)if(count0) count=0;/當溫度值到達0時不再調if(a=2)if(count2)/K1按下三次后退出調節(jié)模式 i=0;/進入正常模式 TR1=0;/關定時器1 k4=0;/在正常模式下選擇K4的消按鍵音功能 v=0;/在正常模式下選擇K2、K3的查看上下限報警溫度功能 store_t();/存儲調整后的上下限報警溫度 switch(i)/顯示選擇 case 0:a=0;break;/a=0選擇顯示測得的溫度 case 1:a=1;break; /a=1選擇顯示上限溫度 case 2:a=2;break; /a=2選擇顯示下限溫度 default:break; while(key1=0);/K1松按鍵時消抖keyscan_delay(10);if(a=1&v=1)/a=1選擇顯示上限溫度且v=1時選擇上下限溫度加功能led=0;ma*=te

溫馨提示

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

評論

0/150

提交評論