基于51單片機設(shè)計簡單的溫度計畢業(yè)論文_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于51單片機設(shè)計簡單的溫度計</p><p>  摘要 隨著科技的不斷發(fā)展,電子設(shè)備的應(yīng)用已經(jīng)取得了非凡的成就。即使是高度集成化的今天,單片機技術(shù)依舊在我們的日常生活中占據(jù)著重要的地位。溫度是日常生活、工業(yè)、醫(yī)學(xué)、環(huán)境保護、化工、石油等領(lǐng)域最常用到的一個物理量。測量溫度的基本方法是使用溫度計直接讀取溫度。最常見到得測量溫度的工具是各種各樣的溫度計。它們常常以刻度的形式表示溫度的高低,人們

2、必須通過讀取刻度值的多少來測量溫度。利用單片機和溫度傳感器構(gòu)成的電子式智能溫度計就可以直接測量溫度,得到溫度的數(shù)字值,既簡單方便,有直觀準確。本文講敘了一種基于51系列單片機的數(shù)字溫度計的設(shè)計過程與仿真結(jié)果。通過Proteus畫圖以及Keil編程,成功的仿真出了能夠?qū)崟r測量溫度并顯示溫度的數(shù)字溫度計。</p><p>  關(guān)鍵字單片機,溫度計,仿真,AT89C52,DS18B20</p><

3、p>  The Design of The Intelligence IC card Ammeter</p><p>  Abstract With the continuous development of science and technology,the application of electronic equipment has made remarkable achievements.Eve

4、n the highly integrated single-chip technology today,still in our daily life plays an important role in.Temperature is the daily life, industry, medicine, environmental protection,chemical industry,petroleum and other ar

5、eas of the most commonly used of a physical quantity.Temperature measurement is the basic method used to directly read temperature therm</p><p>  Keywords:Single-chip Microcomputer,Thermometer,simulation,AT8

6、9C52,DS18B20。</p><p><b>  目 錄</b></p><p><b>  1 引言1</b></p><p>  1.1設(shè)計的目的1</p><p>  1.2設(shè)計的背景1</p><p><b>  2 方案設(shè)計2</b&

7、gt;</p><p>  2.1 DS18b20的選取2</p><p>  2.2 AT89C51單片機的選取2</p><p>  2.3 LCD1602液晶的選取2</p><p><b>  3 硬件設(shè)計3</b></p><p>  3.1 時鐘電路3</p>

8、<p>  3.2 復(fù)位電路3</p><p>  3.3 DS18b20溫度傳感電路4</p><p>  3.4 1602液晶顯示電路4</p><p><b>  4 軟件設(shè)計6</b></p><p>  4.1 DS18b20與單片機之間的信息交換程序7</p><p&g

9、t;  4.2 單片機向1602發(fā)送命令及數(shù)據(jù)的程序7</p><p>  4.3 主函數(shù)對各子函數(shù)的調(diào)用過程7</p><p><b>  5 仿真結(jié)果9</b></p><p>  6 總結(jié)與體會10</p><p><b>  參考文獻11</b></p><p&

10、gt;<b>  附錄112</b></p><p><b>  1 引言</b></p><p><b>  1.1設(shè)計的目的</b></p><p>  通過本次設(shè)計,鍛煉自己的動手能力,加深對protel,protues等軟件的了解,加深對單片機原理、接口課程的全面認識、復(fù)習(xí)和掌握,對單片機的

11、應(yīng)用進一步的了解。</p><p><b>  1.2設(shè)計的背景</b></p><p>  溫度計在現(xiàn)在的生活、工業(yè)生產(chǎn)方面都有著廣泛的應(yīng)用,好多場合都需要測量溫度,溫度計的精度是選擇溫度計的重要指標,尤其許多重要場合溫度的測定,誤差必須限定在某一很小的范圍內(nèi),因此要設(shè)計一個溫度計,做好測量精度誤差也是最重要的工作之一。</p><p>  

12、本課程設(shè)計要求能夠測量的溫度范圍是-50攝氏度到+110攝氏度,測量誤差在±0.5ºC之內(nèi)。綜合這兩個條件,經(jīng)過查找分析,可以選擇溫度傳感器。該傳感器測量范圍是-55ºC到+125ºC,其溫度控制寄存器為16位,其中高5位是符號位,0表示正,1表示負,低11位表示溫度數(shù)值,負溫度用補碼形式表示,在分辨率為0.0625ºC,即最低位的一代表0.0625ºC,符合精度要求。設(shè)計時,

13、要求顯示到小數(shù)點后一位,由于誤差在±0.5ºC之間,因此可以只讓小數(shù)點后的數(shù)顯示0與5,當(dāng)實際溫度的小數(shù)點位為0到4時,顯示0,當(dāng)實際溫度的小數(shù)點位為5到9時,顯示5。</p><p><b>  2 方案設(shè)計</b></p><p>  要求用單片機設(shè)計溫度計并在液晶上顯示,這就要求必須有個溫度傳感器來收集溫度信息,送入主控部分,再由主控部分將數(shù)

14、據(jù)送顯示部分顯示。</p><p><b>  總體設(shè)計框圖為:</b></p><p>  2.1 DS18b20的選取</p><p>  DS18B20的集成度很高導(dǎo)致該元器件需要的外圍電路相當(dāng)簡單。并且DS18B20體積小,輸出方便也使得該方案更加節(jié)省空間資,需要的元器件少更加經(jīng)濟實惠。</p><p>  準確

15、度:DS18B20是高封裝的傳感器件,能夠直接和單片機進行串口通信,獲取溫度值較為簡便。測溫范圍-55℃~+125℃,固有測溫分辨率0.5℃。通信信號為數(shù)字信號,抗干擾能力強。綜上所述,本設(shè)計選取DS18b20作為溫度傳感芯片。</p><p>  2.2 AT89C51單片機的選取</p><p>  本次設(shè)計電路相對簡單,轉(zhuǎn)換速率要求不高一般的單片機便可以擔(dān)此任務(wù),因此,單片機的選取應(yīng)

16、本著低成本的原則。AT89C51是一種帶4K字節(jié)FLASH存儲器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復(fù)擦除1000次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標準的MCS-51指令集和輸出管腳

17、相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案。因此本設(shè)計選取AT89C51單片機作為控制器。</p><p>  2.3 LCD1602液晶的選取</p><p>  由于本次設(shè)計要求顯示的內(nèi)容簡單且全是字符形式的,因此液晶的

18、選取應(yīng)本著簡單、節(jié)約成本的原則。LCD1602是字符型液晶,顯示字母和數(shù)字比較方便,控制簡單,成本較低。因此選取LCD1602液晶作為顯示器。</p><p><b>  3 硬件設(shè)計</b></p><p>  用到的器件有DS18b20、1602液晶及AT89C51(含晶振與復(fù)位電路)。</p><p><b>  硬件設(shè)計框圖為

19、:</b></p><p><b>  3.1 時鐘電路</b></p><p>  晶振電路由一個晶振與兩個電容連接組成,與單片機的18、19管腳相連,另一端接地,電路圖為:</p><p>  電容大小沒有固定值,一般5到30pf,晶振是給單片機提供工作信號脈沖的。這個脈沖就是單片機的工作速度。一般用內(nèi)部振蕩方式,這種方式比較穩(wěn)

20、定。晶振頻率為12MHZ,單片機工作速度就是每秒 12M。單片機的工作頻率是有范圍的,不能太大,一般 24M就不上去了,不然不穩(wěn)定。</p><p><b>  3.2 復(fù)位電路</b></p><p>  復(fù)位電路由一個有極性電容、一個電阻與一個按鍵連接而成,一端連單片機的RST端,另一端接電源,電源另一端接單片機的EA。</p><p> 

21、 其中電容是通過充放電來實現(xiàn)維持一段時間的高電平,電容充電時間與R C的值成正比,當(dāng)按下按鍵時,由于電容充電,RST維持一段時間高電平以達到復(fù)位的目的。</p><p>  一般情況下,選擇大小為10到30uF的電容,而電阻一般選用1到10K?的。</p><p><b>  電路圖為:</b></p><p>  3.3 DS18b20溫度傳

22、感電路</p><p>  此部分電路負責(zé)溫度信號的采集、將溫度信號轉(zhuǎn)換成數(shù)字代碼儲存在溫度控制寄存器中,向單片機發(fā)送溫度數(shù)據(jù)等重要功能,主要由DS18b20芯片來完成,該電路的電路圖為:</p><p>  其中DQ為DS18b20的數(shù)據(jù)輸入/輸出端引腳,與單片機的P2.0口相連,單片機通過P2.0口向DS18b20發(fā)出各種命令,并讀取其轉(zhuǎn)換后的溫度數(shù)據(jù)。</p><

23、p>  3.4 1602液晶顯示電路</p><p><b>  其電路圖為:</b></p><p>  圖3.5 1602液晶電路</p><p>  該電路為我們?nèi)庋壑苯佑^看的部分,它會時時的將DS18b20收集到的溫度信息顯示出來。數(shù)據(jù)端口接P3口,數(shù)據(jù)/命令控制端、讀寫控制端、與使能端分別接單片機的P2.5、P2.6與P2.7口

24、,單片機也是通過這3個口向1602液晶發(fā)送命令及數(shù)據(jù),以達到控制1602顯示的功能。</p><p><b>  4 軟件設(shè)計</b></p><p>  軟件部分的設(shè)計主要是寫程序的一個過程,寫程序前先應(yīng)畫一個整體流程如下:</p><p>  4.1 DS18b20與單片機之間的信息交換程序</p><p>  首先

25、對DS18b20進行初始化,以釋放輸入/輸出總線并延時,由于只用到一片DS18b20,因此可以發(fā)命令跳過ROM指令,跳過的指令是向DS18b20發(fā)送命令字0xcc,然后向DS18b20發(fā)出命令字0x44,來啟動溫度轉(zhuǎn)換,然后延時一段時間,確保溫度轉(zhuǎn)換完成。</p><p>  溫度轉(zhuǎn)換完成后要獲取轉(zhuǎn)換的數(shù)據(jù),同樣要先對DS18b20進行初始化并延時,并跳過ROM指令,要獲取轉(zhuǎn)換結(jié)果要從字節(jié)0開始,直到字節(jié)9結(jié)束,

26、要用到讀暫存器指令0xbe,然后便開始讀取轉(zhuǎn)換的數(shù)據(jù),由于轉(zhuǎn)換結(jié)果的數(shù)據(jù)是16位的,而每次讀取8位,要讀取兩次,先讀取低8位,再讀取高8位,分別存起來,由于獲得的數(shù)據(jù)都是補碼形式,而負溫度的補碼與原碼又不相同,因此讀完之后要進行符號位的判定,根據(jù)溫度的正負不同分別對數(shù)據(jù)進行不同的處理,都轉(zhuǎn)換成我們要的溫度數(shù)值,但要顯示數(shù)據(jù)是將各位數(shù)據(jù)分離出來,而小數(shù)點后一位的數(shù)據(jù)不好分離,為方便分離,將實際溫度數(shù)值乘以10,將其挪到小數(shù)點前。</

27、p><p>  4.2 單片機向1602發(fā)送命令及數(shù)據(jù)的程序</p><p>  1602液晶,能夠同時顯示16x2即32個字符(16列2行)。對1602進行操作首先要知道如何向1602液晶寫數(shù)據(jù)與寫指令,對1602的寫操作是將讀/寫選擇端R/W端置地,然后通過控制數(shù)據(jù)/命令選擇端RS來控制。</p><p>  當(dāng)寫指令時,將RS置低,然后給使能端一個從低到高跳變的脈

28、沖并延時一段時間便可以了,最后釋放使能端置為低電平;當(dāng)寫數(shù)據(jù)時,將RS置高,然后給使能端一個從低到高跳變的脈沖同樣延時一段時間,最后也要釋放使能端置為低電平。</p><p>  知道了如何向1602中寫數(shù)據(jù)與寫命令便可以控制1602顯示,但在讓1602正式顯示之前還要對其進行初始化。</p><p>  對1602的初始化首先要寫入顯示模式設(shè)置命令字0X80,用來設(shè)置16x2顯示,5x7

29、點陣,8位數(shù)據(jù)端口;然后再寫入顯示開/關(guān)及光標設(shè)置指令,這里我們寫入0X0C,設(shè)置開顯示,不顯示光標,光標不顯示;再寫入顯示開/關(guān)及光標設(shè)置指令0X06,設(shè)置當(dāng)讀或?qū)懸粋€字符后地址指針加一且光標加一,當(dāng)寫一個字符,整屏顯示不左移;最后寫入清屏指令0X01進行顯示清屏操作。</p><p>  4.3 主函數(shù)對各子函數(shù)的調(diào)用過程</p><p>  首先整體初始化,然后將液晶初始化,由于上電

30、后DS18b20默認85攝氏度,因此要在顯示前先進行溫度轉(zhuǎn)換并加程序延時,使顯示的時候直接顯示我們要的溫度值,然后進入正式顯示部分,正式顯示部分為循環(huán)執(zhí)行的,包括每次都進行一次溫度轉(zhuǎn)換,并讀取轉(zhuǎn)換結(jié)果,之后再將溫度數(shù)據(jù)中的各位分離出來,然后確定液晶顯示字符的位置,依次顯示符號、百位、十位、個位、小數(shù)點及小數(shù)點后一位等字符,每顯示一個字符,都要延時一段時間。整體程序設(shè)計見附錄1。</p><p><b>

31、  5 仿真結(jié)果</b></p><p>  在Proteus中畫好連線圖,然后往單片機中下載好編譯程序后生成的hex文件,就可以進行仿真了,其結(jié)果如圖所示:</p><p><b>  6 總結(jié)與體會</b></p><p><b>  附錄1</b></p><p>  /*****

32、********** writer:shopping.w ******************/</p><p>  #include <reg52.h></p><p>  #include <intrins.h></p><p>  #define uint unsigned int</p><p>  #

33、define uchar unsigned char</p><p>  #define delayNOP() {_nop_();_nop_();_nop_();_nop_();}</p><p>  /********************** DS18B20 指令*********************/ </p><p>  #define ds18B

34、20_READ_ROM 0x33 // 讀 ROM 指令 </p><p>  #define ds18B20_MATCH_ROM 0x55 // 匹配 ROM 指令 </p><p>  #define ds18B20_SKIP_ROM 0xCC // 跳過 ROM 指令 </p>

35、;<p>  #define ds18B20_SEARCH_ROM 0xF0 // 搜索 ROM 指令 </p><p>  #define ds18B20_ALARM_SEARCH 0xEC // 報警搜索指令 </p><p>  #define ds18B20_WRITE_SCRATCHPAD 0x4E

36、// 寫暫存寄存器指令 </p><p>  #define ds18B20_READ_SCRATCHPAD 0xBE // 讀暫存寄存器指令 </p><p>  #define ds18B20_COPY_SCRATCHPAD 0x48 // 復(fù)制暫存寄存器指令 </p><p>  #define ds18B20_CO

37、NVERT_T 0x44 // 啟動溫度轉(zhuǎn)換指令 </p><p>  #define ds18B20_RECALL_E2 0xB8 // 重新調(diào)出 E2PROM 的數(shù)據(jù) </p><p>  #define ds18B20_READ_POWER_SUPPLY 0xB4 // 讀電源</p><p

38、>  #define LCD_Data P0 //定義數(shù)據(jù)指令端口</p><p>  sbit ds18B20_data = P2^0; //溫度探頭(DQ)數(shù)據(jù)端口對應(yīng)的單片機引腳 </p><p>  sbit LCD_RS = P2^5;</p><p>  sbit LCD_RW = P2^6;</p>

39、<p>  sbit LCD_EN = P2^7;</p><p>  uchar Minus_Flag=0;</p><p>  uchar code Temp_Disp_Title[]={"Current Temp : "};</p><p>  uchar Current_Temp_Display_Buffer[]={&

40、quot;TEMP: "};</p><p>  uchar Temp_Value[]={0x00,0x00};</p><p>  uchar Display_Digit[]={0,0,0};</p><p>  void Delay(uint x)</p><p><b>  {</b&g

41、t;</p><p>  while(--x);</p><p><b>  }</b></p><p>  /****************************延時10us*************************/ </p><p>  //先執(zhí)行一個LCALL指令(2 μs),然后執(zhí)行6個_NOP_(

42、 )語句(6 μs),最后執(zhí)行了一個RET指令(2 μs) </p><p>  void Delay_10us(void) </p><p>  { _nop_(); </p><p>  _nop_(); </p><p>  _nop_(); </p><p>  _nop_(); </p&g

43、t;<p>  _nop_(); </p><p><b>  _nop_(); </b></p><p><b>  } </b></p><p>  /***************************延時 time*15us******************** */</p>&l

44、t;p>  void delay_15us(uint time) </p><p><b>  { </b></p><p><b>  uint i; </b></p><p>  for (i=0;i<time;i++); </p><p><b>  }</

45、b></p><p>  void DelayXus(uint x)</p><p><b>  {</b></p><p><b>  uchar i;</b></p><p>  while(x--)</p><p><b>  {</b>&l

46、t;/p><p>  for(i=0;i<200;i++);</p><p><b>  }</b></p><p><b>  }</b></p><p>  bit LCD_Busy_Check()</p><p><b>  {</b></

47、p><p>  bit result;</p><p>  LCD_RS = 0; //zhi ling</p><p>  LCD_RW = 1; //du zhuang tai</p><p>  LCD_EN = 1;</p><p>  delayNOP();</p><p&g

48、t;  result = (bit)(LCD_Data&0x80);</p><p><b>  LCD_EN=0;</b></p><p>  return result;</p><p><b>  }</b></p><p>  void Write_LCD_Command(uchar

49、 cmd)</p><p><b>  {</b></p><p>  while(LCD_Busy_Check()); //bu mang lu</p><p>  LCD_RS = 0;</p><p>  LCD_RW = 0;</p><p>  LCD_EN = 0;</p&g

50、t;<p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  LCD_Data = cmd;</p><p>  delayNOP();</p><p>  LCD_EN = 1;</p><p> 

51、 delayNOP();</p><p>  LCD_EN = 0;</p><p><b>  }</b></p><p>  void Write_LCD_Data(uchar dat)</p><p><b>  {</b></p><p>  while(LCD_Bu

52、sy_Check());</p><p>  LCD_RS = 1;</p><p>  LCD_RW = 0;</p><p>  LCD_EN = 0;</p><p>  LCD_Data = dat;</p><p>  delayNOP();</p><p>  LCD_EN = 1;

53、</p><p>  delayNOP();</p><p>  LCD_EN = 0;</p><p><b>  }</b></p><p>  void LCD_Initialise()</p><p><b>  {</b></p><p> 

54、 Write_LCD_Command(0x01); //清屏</p><p>  DelayXus(5); </p><p>  Write_LCD_Command(0x38); //設(shè)置16*2顯示,5*7點陣,8位數(shù)據(jù)接口</p><p>  DelayXus(5);</p><p>  Writ

55、e_LCD_Command(0x0c);//畫面開,禁止光標顯示閃爍</p><p>  DelayXus(5);</p><p>  Write_LCD_Command(0x06); //當(dāng)讀寫一個字節(jié)后,光標自動加1</p><p>  DelayXus(5);</p><p><b>  }</b

56、></p><p>  void Set_LCD_POS(uchar pos)</p><p><b>  {</b></p><p>  Write_LCD_Command(pos|0x80);</p><p><b>  }</b></p><p>  /****

57、********************溫度探頭程序************************/ </p><p>  bit Rstds18B20(void); // DS18B20 復(fù)位程序, 返回 0-有設(shè)備連接,1-無設(shè)</p><p>  void Writeds18B20(uchar ); // 寫一個字節(jié) ds18B20 數(shù)據(jù)

58、、命令子程序 </p><p>  uchar Readds18B20(void); // 讀一個字節(jié)ds18B20 數(shù)據(jù)子程序 </p><p>  uint GetTempValue(void); // 啟動 ds18B20 溫度轉(zhuǎn)換程序 </p><p>  /***********************ds18

59、B20 復(fù)位程序**********************/ </p><p>  bit Rstds18B20(void) // 返回,0-有設(shè)備連接;1-無設(shè)備連接 </p><p><b>  { </b></p><p>  uchar i; </p><p>  bit R

60、stFlag; </p><p>  RstFlag = 1; </p><p>  ds18B20_data = 1; </p><p>  _nop_(); </p><p>  ds18B20_data=0; // 發(fā)送復(fù)位脈沖,時間>480us </p><p>  del

61、ay_15us(40); // 延時 480--960us </p><p>  ds18B20_data = 1; // 拉高總線,延時 15us-60us 后等待ds18B20 響應(yīng) </p><p>  delay_15us(2); // 15us-60us </p><p>  for (

62、i=0;i<6;i++) // 60us-240us </p><p><b>  { </b></p><p>  delay_15us(1); </p><p>  if (ds18B20_data==0) </p><p>  RstFlag=0; // 接收

63、ds18B20 的存在信號 </p><p><b>  } </b></p><p>  delay_15us(20); // 240us </p><p>  return RstFlag; </p><p><b>  } </b></p>&l

64、t;p>  /***************寫一個字節(jié) ds18B20 數(shù)據(jù)、命令子程序****************** </p><p>  功能:向 ds18B20 寫入數(shù)據(jù)或命令 </p><p>  入口:待寫入 ds18B20 的數(shù)據(jù)或命令 </p><p><b>  出口:無 </b></p>&

65、lt;p>  ******************************************************************/ </p><p>  void Writeds18B20(uchar ch) </p><p><b>  { </b></p><p>  uchar i; </p>

66、<p>  ds18B20_data = 1; // 拉高總線,延時 1us,準備啟動 </p><p>  _nop_(); </p><p>  for (i=0;i<8;i++) </p><p><b>  { </b></p><p>  ds18B20_data

67、= 0; // 拉低總線 </p><p>  Delay_10us(); // 延時10us </p><p>  ds18B20_data = ch&0x1; // 發(fā)送待寫入的數(shù)據(jù), “1”或“0” </p><p>  delay_15us(2); // 保持寫入數(shù)據(jù)時間 45us

68、 </p><p>  ds18B20_data = 1; // 拉高總線,延時 1us 后準備下一位傳輸 </p><p>  ch = ch>>1; //先寫低位,后寫高位 </p><p>  _nop_(); </p><p><b>  } </b>&

69、lt;/p><p><b>  } </b></p><p>  /******************讀一個字節(jié) ds18B20 數(shù)據(jù)子程序******************** </p><p>  功能:從 ds18B20 讀出數(shù)據(jù) </p><p><b>  入口:無 </b><

70、;/p><p>  出口:讀出的 ds18B20 的數(shù)據(jù) </p><p>  ******************************************************************/ </p><p>  uchar Readds18B20(void) </p><p><b>  { </

71、b></p><p>  uchar i,ch; </p><p><b>  ch = 0; </b></p><p>  ds18B20_data = 1; // 拉高總線,延時 1us,準備啟動 </p><p>  _nop_(); </p><p>

72、;  for (i=0;i<8;i++) </p><p><b>  { </b></p><p>  ds18B20_data = 0; // 拉低總線 </p><p>  Delay_10us(); // 延時10us </p><p>  ds18B20_d

73、ata = 1; // 拉高總線,準備接收數(shù)據(jù) </p><p>  _nop_(); </p><p>  ch = ch>>1; </p><p>  if (ds18B20_data == 1) // 接收 ds18B20 的數(shù)據(jù) </p><p>  ch = ch+0x80; </

74、p><p>  delay_15us(2); // 延時 45us,保證整個讀命令有 60us </p><p><b>  } </b></p><p>  return ch; </p><p><b>  } </b></p><p>  /**

75、*****************啟動 ds18B20 溫度轉(zhuǎn)換程序******************* </p><p>  功能:讀取 18B20 的溫度值 </p><p><b>  入口:無 </b></p><p>  出口:0xffff-18B20 不正常 </p><p>  0x8000-溫

76、度低于零度 </p><p>  0~1250-攝氏溫度(0~125) </p><p>  **************************************************************/ </p><p>  uint GetTempValue(void) </p><p><b>  {

77、 </b></p><p>  uchar temp1=0,temp2=0; </p><p>  uint T=0; </p><p>  float TC; //TC(浮點數(shù))實際溫度 </p><p>  if(!Rstds18B20())

78、 //如果探頭連接正常 </p><p><b>  { </b></p><p>  Rstds18B20(); // 復(fù)位 ds18B20 </p><p>  Writeds18B20(ds18B20_SKIP_ROM); // 跳過

79、 ROM 操作 </p><p>  Writeds18B20(ds18B20_CONVERT_T); // 啟動 ds18B20 溫度轉(zhuǎn)換 </p><p>  if(!Rstds18B20()) // 如果探頭連接正常 </p><p><b>  { </b&

80、gt;</p><p>  Rstds18B20(); // 復(fù)位 ds18B20 </p><p>  Writeds18B20(ds18B20_SKIP_ROM); // 跳過 ROM 操作 </p><p>  Writeds18B20(ds18B20_READ_SCRATCHPAD

81、); /* 發(fā)讀 ds18B20 數(shù)據(jù), 前兩位是溫度值 */ </p><p>  temp1 = Readds18B20(); // 溫度值的低位數(shù)據(jù) </p><p>  temp2 = Readds18B20(); // 溫度值的高位數(shù)據(jù)</p><p>  

82、// temp1=0x56;</p><p>  // temp2=0x05; </p><p>  T = temp1+(temp2<<8); </p><p>  if((temp2&0xfc)==0xfc)</p><p><b>  {</b></p><p>

83、;  Minus_Flag=1;</p><p><b>  TC=~T+1;</b></p><p><b>  } </b></p><p><b>  else</b></p><p><b>  {</b></p><p>

84、  Minus_Flag=0;</p><p><b>  TC=T;</b></p><p><b>  }</b></p><p>  // TC=T*0.0625; //將測量的數(shù)據(jù)轉(zhuǎn)換成實際溫度 </p><p>  //TC=0x0556;</p>&l

85、t;p>  return (TC*0.625); //返回 TC </p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  return 0xffff

86、; </p><p><b>  } </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { </b></p><p>  return 0xff

87、ff; </p><p><b>  } </b></p><p><b>  }</b></p><p>  void Display_Temperature(uint num)</p><p><b>  {</b></p><p>  ucha

88、r m,n,q,i; </p><p>  m=num/100; //得到十位 </p><p>  n=num%100/10; //得到個位 </p><p>  q=num%10; //對上述整數(shù)求余得到小數(shù)點后第一位 </p><p>  Display_Digit[2] = m;</p>

89、;<p>  Display_Digit[1] = n;</p><p>  Display_Digit[0] = q; </p><p>  if(Minus_Flag)</p><p><b>  {</b></p><p>  Current_Temp_Display_Buffer[7] =&

90、#39;-';</p><p><b>  }</b></p><p>  else Current_Temp_Display_Buffer[7] = ' ';</p><p>  Current_Temp_Display_Buffer[11] = Display_Digit[0] + '0';</

91、p><p>  Current_Temp_Display_Buffer[10] = '.';</p><p>  Current_Temp_Display_Buffer[9] = Display_Digit[1] + '0';</p><p>  Current_Temp_Display_Buffer[8] = Display_Dig

92、it[2] + '0';</p><p>  if(Display_Digit[2] == 0)</p><p>  Current_Temp_Display_Buffer[8] = ' ';</p><p>  Set_LCD_POS(0x00);</p><p>  for(i=0;i<16;i++

93、)</p><p><b>  {</b></p><p>  Write_LCD_Data(Temp_Disp_Title[i]); </p><p>  }</p><p>  Set_LCD_POS(0x40);</p><p>  for(i=0;i<16

94、;i++)</p><p><b>  {</b></p><p>  Write_LCD_Data(Current_Temp_Display_Buffer[i]); </p><p><b>  }</b></p><p>  //Set_LCD_POS(0x4d);</p>

95、<p>  //Write_LCD_Data(0x00);</p><p>  Set_LCD_POS(0x4d);</p><p>  Write_LCD_Data('C');</p><p><b>  } </b></p><p>  void main()</p>

96、<p><b>  { </b></p><p>  uint Temperature;</p><p>  LCD_Initialise();</p><p>  Delay(50000);</p><p><b>  while(1)</b></p><p&

97、gt;<b>  {</b></p><p>  Temperature=GetTempValue();</p><p>  Display_Temperature(Temperature);</p><p>  //Display_Temperature(865);</p><p>  DelayXus(100);

98、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  致謝</b></p><p>  在論文完成之際,本人謹向我的指導(dǎo)老師**老師致以衷心的感謝,導(dǎo)師嚴謹?shù)闹螌W(xué)態(tài)度、敏銳的直覺和對科學(xué)的執(zhí)著追求都深深地影響了我,他對

99、我的嚴格要求,讓我學(xué)到了知識,掌握了科研的方法,也獲得了實踐鍛煉的機會。同時,他對論文中的文字斟酌,對論文要求的盡善盡美,都讓我覺得學(xué)習(xí)是一種享受,更使我終生受益。在此祝愿他身體健康、前程似錦。</p><p>  對于**我的師長和同學(xué)給予的指導(dǎo)和幫助,在此表示衷心的感謝!在他們的關(guān)心幫助下,我很順利完成了畢業(yè)論文,同時感謝物理系09級電子信息工程班我的同學(xué)們,感謝他們大學(xué)四年來在學(xué)習(xí)和生活上給予我的幫助和支持

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論