簡易數(shù)字式溫度計的_第1頁
簡易數(shù)字式溫度計的_第2頁
簡易數(shù)字式溫度計的_第3頁
簡易數(shù)字式溫度計的_第4頁
簡易數(shù)字式溫度計的_第5頁
已閱讀5頁,還剩14頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.分數(shù):單片機技能+電子初級工程師認證培訓(xùn)設(shè)計報告題目:簡易數(shù)字式溫度計的設(shè)計指導(dǎo)老師: 文麗 完成時間: 2012-5-15 華南理工大學(xué)廣州學(xué)院電子信息工程學(xué)院目 錄1 引言2方案設(shè)計3 系統(tǒng)的硬件設(shè)計4 proteus 仿真圖5 系統(tǒng)的軟件設(shè)計6 心理體會7 參考文獻1 引言在當(dāng)下,人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設(shè)施就需要從數(shù)單片機技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。本設(shè)計所介紹的數(shù)字溫度計與傳統(tǒng)的溫度計相

2、比,具有讀數(shù)方便,測溫范圍廣,測溫準確,其輸出溫度采用數(shù)字顯示,主要用于對測溫比較準確的場所,或科研實驗室使用,該設(shè)計控制器使用單片機AT89S51,測溫傳感器使用DS18B20,用3位共陽極LED數(shù)碼管以串口傳送數(shù)據(jù),實現(xiàn)溫度顯示,能準確達到以上要求。目前的智能溫度傳感器(亦稱數(shù)字溫度傳感器)是在20世紀90年代中期問世的,它是微電子技術(shù)、計算機技術(shù)和自動測試技術(shù)(ATE)的結(jié)晶,特點是能輸出溫度數(shù)據(jù)及相關(guān)的溫度控制量,適配各種微控制器(MCU)。社會的發(fā)展使人們對傳感器的要求也越來越高,現(xiàn)在的溫度傳感器正在基于單片機的基礎(chǔ)上從模擬式向數(shù)字式,從集成化向智能化、網(wǎng)絡(luò)化的方向飛速發(fā)展,并朝著高

3、精度、多功能、總線標準化、高可靠性及安全性、開發(fā)虛擬傳感器和網(wǎng)絡(luò)傳感器、研制單片測溫系統(tǒng)等高科技的方向迅速發(fā)展,本文將介紹智能集成溫度傳感器DS18B20的結(jié)構(gòu)特征及控制方法,并對以此傳感器,89S51單片機為控制器構(gòu)成的數(shù)字溫度測量裝置的工作原理及程序設(shè)計作了詳細的介紹。2方案設(shè)計本設(shè)計主要是介紹了單片機控制下的溫度檢測系統(tǒng),詳細介紹了其硬件和軟件設(shè)計,并對其各功能模塊做了詳細介紹,其主要功能和指標如下:利用溫度傳感器(DS18B20)測量某一環(huán)境溫度測量范圍為-55127,精度為±0.5如果測量范圍超過127或低于-55蜂鳴器就會自動進行報警用液晶顯示器LCD進行實際溫度值顯示采

4、用AT89S52單片機P3 .5口控制溫度傳感器DS18B20的溫度測量,以液晶顯示器LCD形式輸出測量溫度。圖2.1原理圖3 系統(tǒng)的硬件設(shè)計 3.1 主控制器 AT89S52 是一種低功耗、高性能CMOS8位微控制器,具有8K在系統(tǒng)可編程Flash 存儲器。使用Atmel 公司高密度非 易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完 全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng) 可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提 供高靈活、超有效的解決方案。AT89S52具有以下標準功能: 3.2 溫度

5、傳感器工作原理DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下: 獨特的單線接口僅需一個端口引腳進行通訊 簡單的多點分布應(yīng)用 無需外部器件 可通過數(shù)據(jù)線供電 零待機功耗 測溫范圍-55+125,以0.5遞增。華氏器件-67+2570F,以0.90F 遞增 溫度以9 位數(shù)字量讀出 溫度數(shù)字量轉(zhuǎn)換時間200ms(典型值) 用戶可定義的非易失性溫度報警設(shè)置 報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件3.3

6、溫度傳感器接口電路4 proteus 仿真圖4.1 仿真圖利用proteus按電路圖排放元器件以及連接線路,用keil C51將寫好的C語言進行仿真,獲得的仿真圖如下所示:圖4.1電路仿真圖4.2 仿真程序/DS18B20溫度檢測及其液晶顯示#include<reg52.h> /包含單片機寄存器的頭文件#include<intrins.h> /包含_nop_()函數(shù)定義的頭文件#include<stdio.h>#define uint unsigned int/宏定義unsigned int為 uint,為了使程序更簡潔與出現(xiàn)少錯誤。以下uchar同#def

7、ine uchar unsigned charuchar code digit11="0123456789-" /定義字符數(shù)組顯示數(shù)字unsigned char code Str="MAX:" /說明顯示的是溫度unsigned char code Ostr="MIN:"uchar code str1="Welcome To Use"/開機啟動時的說明文字uchar code str2="My Work 2012" /開機說明文字uchar code Error=" DS18B20 E

8、RROR" /說明沒有檢測到DS18B20uchar code Error1=" PLEASE CHECK" /說明沒有檢測到DS18B20uchar code Temp="TEMP:" /說明顯示的是溫度uchar code User=0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00; /溫度單位uchar flag,tltemp;/負溫度標志 和臨時暫存變量/*以下是對液晶模塊的操作程序*/sbit RS=P20; /寄存器選擇位,將RS位定義為P2.0引腳sbit RW=P21; /讀寫選擇位,將RW位定義為

9、P2.1引腳sbit E=P22; /使能信號位,將E位定義為P2.2引腳sbit BF=P07; /忙碌標志位,將BF位定義為P0.7引腳/*函數(shù)功能:延時1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒*/void delay1ms() uchar i,j; for(i=0;i<4;i+) for(j=0;j<33;j+) ; /*函數(shù)功能:延時若干毫秒入口參數(shù):n*/ void delaynms(uint n) uint i;for(i=0;i<n;i+) delay1ms(); /*以下是對蜂鳴器的定義和操作*/s

10、bit beep=P36;void delay500us() uchar i,j; for(i=0;i<2;i+) for(j=0;j<33;j+); void BEEP( ) uint i; for(i=0;i<1000;i+) beep=0; delay500us(); beep=1; delay500us(); beep=1; delaynms(1000);/*函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙*/bit BusyTest(void) bit result;RS=0; /根據(jù)規(guī)定,RS為低電平,RW為高電

11、平時,可以讀狀態(tài) RW=1; E=1; /E=1,才允許讀寫 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 result=BF; /將忙碌標志電平賦給result E=0; /將E恢復(fù)低電平 return result; /*函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊入口參數(shù):dictate*/void WriteInstruction (uchar dictate) while(BusyTest()=1); /如果忙就等待 RS=0; /根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令 RW=0; E=0; /E

12、置低電平(根據(jù)書上表7.7,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0" _nop_(); _nop_(); /空操作兩個機器周期,給硬件反應(yīng)時間 P0=dictate; /將數(shù)據(jù)送入P0口,即寫入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=0; /當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:指定字符顯示的實際地址

13、入口參數(shù):x*/ void WriteAddress(uchar x) WriteInstruction(x|0x80); /顯示位置的確定方法規(guī)定為"80H+地址碼x" /*函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)*/ void WriteData(uchar y) while(BusyTest()=1); RS=1; /RS為高電平,RW為低電平時,可以寫入數(shù)據(jù) RW=0; E=0; /E置低電平(根據(jù)書上表7.7,寫指令時,E為高脈沖, / 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0" P0=y; /將數(shù)據(jù)送

14、入P0口,即將數(shù)據(jù)寫入液晶模塊 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=1; /E置高電平 _nop_(); _nop_(); _nop_(); _nop_(); /空操作四個機器周期,給硬件反應(yīng)時間 E=0; /當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令 /*函數(shù)功能:對LCD的顯示模式進行初始化設(shè)置*/void LcdInitiate(void) delaynms(15); /延時15ms,首次寫指令時應(yīng)給LCD一段較長的反應(yīng)時間 WriteInstruction(0x38); /顯示模式設(shè)置:16×

15、2顯示,5×7點陣,8位數(shù)據(jù)接口delaynms(5); /延時5ms,給硬件一點反應(yīng)時間 WriteInstruction(0x38);delaynms(5); /延時5ms,給硬件一點反應(yīng)時間WriteInstruction(0x38); /連續(xù)三次,確保初始化成功delaynms(5); /延時5ms,給硬件一點反應(yīng)時間WriteInstruction(0x0c); /顯示模式設(shè)置:顯示開,無光標,光標不閃爍delaynms(5); /延時5ms,給硬件一點反應(yīng)時間WriteInstruction(0x06); /顯示模式設(shè)置:光標右移,字符不移delaynms(5); /延時

16、5ms,給硬件一點反應(yīng)時間WriteInstruction(0x01); /清屏幕指令,將以前的顯示內(nèi)容清除delaynms(5); /延時5ms,給硬件一點反應(yīng)時間 /*以下是DS18B20的操作程序 */ sbit DQ=P32;uchar time; /設(shè)置全局變量,專門用于嚴格延時/*函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號出口參數(shù):flag */bit Init_DS18B20(void) bit flag; /儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先將數(shù)據(jù)線拉高 for(time=0;time<2;t

17、ime+) /略微延時約6微秒 ; DQ = 0; /再將數(shù)據(jù)線從高拉低,要求保持480960us for(time=0;time<200;time+) /略微延時約600微秒 ; /以向DS18B20發(fā)出一持續(xù)480960us的低電平復(fù)位脈沖 DQ = 1; /釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) for(time=0;time<10;time+) ; /延時約30us(釋放總線后需等待1560us讓DS18B20輸出存在脈沖) flag=DQ; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time<200;time+) /延時足夠長時間,等待存在脈沖

18、輸出完畢 ; return (flag); /返回檢測成功標志/*函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)出口參數(shù):dat*/ uchar ReadOneChar(void) uchar i=0;uchar dat; /儲存讀出的一個字節(jié)數(shù)據(jù)for (i=0;i<8;i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ = 0; /單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序 _nop_(); /等待一個機器周期 DQ = 1; /將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備 for(time=0;

19、time<2;time+) ; /延時約6us,使主機在15us內(nèi)采樣 dat>>=1; if(DQ=1) dat|=0x80; /如果讀到的數(shù)據(jù)是1,則將1存入datelsedat|=0x00;/如果讀到的數(shù)據(jù)是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(time=0;time<8;time+) ; /延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期 return(dat); /返回讀出的十六進制數(shù)據(jù)/*函數(shù)功能:向DS18B20寫入一個字節(jié)數(shù)據(jù)入口參數(shù):dat*/ WriteOneChar(uchar dat)uchar i=0;for

20、(i=0; i<8; i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ=0; /將數(shù)據(jù)線從高拉低時即啟動寫時序 DQ=dat&0x01; /利用與運算取出要寫的某位二進制數(shù)據(jù), /并將其送到數(shù)據(jù)線上等待DS18B20采樣 for(time=0;time<10;time+) ;/延時約30us,DS18B20在拉低后的約1560us期間從數(shù)據(jù)線上采樣 DQ=1; /釋放數(shù)據(jù)線 for(time=0;time<1;time+) ;/延時3us,兩個寫時序間至少需要1us的恢復(fù)期 dat>>=1; /將dat中的各二進制位數(shù)據(jù)

21、右移1位 for(time=0;time<4;time+) ; /稍作延時,給硬件一點反應(yīng)時間/*函數(shù)功能:做好讀溫度的準備*/ void ReadyReadTemp(void) Init_DS18B20(); /將DS18B20初始化WriteOneChar(0xCC); / 跳過讀序號列號的操作WriteOneChar(0x44); / 啟動溫度轉(zhuǎn)換 delaynms(200); /轉(zhuǎn)換一次需要延時一段時間 Init_DS18B20(); /將DS18B20初始化WriteOneChar(0xCC); /跳過讀序號列號的操作WriteOneChar(0xBE); /讀取溫度寄存器,前

22、兩個分別是溫度的低位和高位/*以下是與溫度有關(guān)的顯示設(shè)置 */ /*函數(shù)功能:顯示沒有檢測到DS18B20*/ void display_error(void) uchar i; WriteAddress(0x00); /寫顯示地址,將在第1行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Errori != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫WriteData(Errori); /將字符常量寫入LCDi+; /指向下一個字符delaynms(100); /延時100ms較長時間,以看清關(guān)于顯示的說明 WriteAddress(0x40); /寫顯示地址

23、,將在第1行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Error1i != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫WriteData(Error1i); /將字符常量寫入LCDi+; /指向下一個字符delaynms(100); /延時100ms較長時間,以看清關(guān)于顯示的說明while(1) /進入死循環(huán),等待查明原因 ;/*函數(shù)功能:顯示溫度符號*/ void display_symbol(void) uchar i; WriteAddress(0x40); /寫顯示地址,將在第2行第1列開始顯示 i = 0; /從第一個字符開始顯示while(Te

24、mpi != '0') /只要沒有寫到結(jié)束標志,就繼續(xù)寫WriteData(Tempi); /將字符常量寫入LCDi+; /指向下一個字符delaynms(50); /延時1ms給硬件一點反應(yīng)時間/*函數(shù)功能:顯示溫度的小數(shù)點*/ void display_dot(void) WriteAddress(0x49); /寫顯示地址,將在第2行第10列開始顯示 WriteData('.'); /將小數(shù)點的字符常量寫入LCD delaynms(50); /延時1ms給硬件一點反應(yīng)時間/*函數(shù)功能:顯示溫度的單位()*/ void display_cent(void)

25、uchar j; WriteInstruction(0x40); /設(shè)定CGRAM地址delaynms(5);for(j=0;j<8;j+ )WriteData(Userj);/寫入自定義圖形 WriteAddress(0x4b);/設(shè)定屏幕上的顯示位置 delaynms(5); WriteData(0x00); /從CGRAM里取出自定義圖形顯示/*函數(shù)功能:顯示溫度的整數(shù)部分入口參數(shù):x*/ void display_temp1(uchar x) uchar j,k,l; /j,k,l分別儲存溫度的百位、十位和個位j=x/100; /取百位k=(x%100)/10; /取十位l=x%

26、100%10; /取個位 WriteAddress(0x46); /寫顯示地址,將在第2行第7列開始顯示if(flag=1)/負溫度時 顯示“”WriteData(digit10); /將百位數(shù)字的字符常量寫入LCD elseWriteData(digitj); /將十位數(shù)字的字符常量寫入LCDWriteData(digitk); /將十位數(shù)字的字符常量寫入LCDWriteData(digitl); /將個位數(shù)字的字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應(yīng)時間 /*函數(shù)功能:顯示溫度的小數(shù)數(shù)部分入口參數(shù):x*/ void display_temp2(unsigne

27、d char x) WriteAddress(0x4a); /寫顯示地址,將在第2行第11列開始顯示W(wǎng)riteData(digitx); /將小數(shù)部分的第一位數(shù)字字符常量寫入LCDdelaynms(50); /延時1ms給硬件一點反應(yīng)時間 /*-按鍵掃描函數(shù),返回掃描鍵值-*/uchar keyscan(void ) uchar temp; P1=0xff; P1=0xf0; temp=P1; if(temp!=0xf0) delaynms(10); if(temp!=0xf0) P1=0xfe; temp=P1; switch(temp) case(0xee):return 1;break;

28、 case(0xde):return 2;break; case(0xbe):return 3;break; case(0x7e):return 5;break; /*- 寫入字符串函數(shù)-*/ void LCD_Write_String(uchar x,uchar y,uchar *s) if (y = 0) WriteInstruction(0x80 + x); /表示第一行 else WriteInstruction(0xC0 + x); /表示第二行 while (*s) WriteData(*s); s +; /*函數(shù)功能:主函數(shù)*/ void main(void) uchar num

29、,tem; char displaytemp7,displaytem7;int tempH=50,tempL=1; uchar i,j; uchar TL; /儲存暫存器的溫度低位 uchar TH; /儲存暫存器的溫度高位 uchar TN; /儲存溫度的整數(shù)部分 uchar TD; /儲存溫度的小數(shù)部分 LcdInitiate(); /將液晶初始化 delaynms(5); /延時5ms給硬件一點反應(yīng)時間 WriteAddress(0x02); i=0; while(str1i!='0') WriteData(str1i); i+; delaynms(100);WriteA

30、ddress(0x40); j=0;while(str2j!='0') WriteData(str2j); j+; delaynms(100); delaynms(3000); WriteInstruction(0x01); delaynms(5);if(Init_DS18B20()=1) display_error(); display_symbol(); /顯示溫度說明 display_dot(); /顯示溫度的小數(shù)點 display_cent(); /顯示溫度的單位 while(1) /不斷檢測并顯示溫度 beep=0; flag=0;ReadyReadTemp(); /

31、讀溫度準備 TL=ReadOneChar(); /先讀的是溫度值低位TH=ReadOneChar(); /接著讀的是溫度值高位if(TH&0xf8)!=0x00)/判斷高五位 得到溫度正負標志flag=1;TL=TL; /取反TH=TH; /取反tltemp=TL+1; /低位加1TL=tltemp;if(tltemp>255) TH+; /如果低8位大于255,向高8位進1 TN=TH*16+TL/16; /實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16 /這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了 TD=(TL%16)*10/16; /計算溫度的小數(shù)部

32、分,將余數(shù)乘以10再除以16取整,TN=TH*16+TL/16; /實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16 /這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了 TD=(TL%16)*10/16; /計算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整, /這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù)) display_temp1(TN); /顯示溫度的整數(shù)部分 display_temp2(TD); /顯示溫度的小數(shù)部分 delaynms(10); num=keyscan(); switch(num) case 1:if(tempH<127)tempH+;bre

33、ak;case 2:if(tempH>-55)tempH-;break;case 3:if(tempL<127)tempL+;break;case 5:if(tempL>-55)tempL-;break;default:break; sprintf(displaytemp,"MAX:%3d",tempH); LCD_Write_String(0x00,0,displaytemp); sprintf(displaytem,"MIN:%3d",tempL); LCD_Write_String(0x09,0,displaytem); tem=TN+(TD*0.1); if(tem>tempH) BEEP(); else if(tem<tempL) BEEP( ); 5 系統(tǒng)的軟件設(shè)計 系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計算溫度子程序5.1 主程序主程序的主要功能是負責(zé)溫度的實時顯示、讀出并處理DS18B20的測量的當(dāng)前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內(nèi)測量一次

溫馨提示

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

評論

0/150

提交評論