2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

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

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

7、gt;</p><p>  2.1 DS18b20的選取2</p><p>  2.2 AT89C51單片機(jī)的選取2</p><p>  2.3 LCD1602液晶的選取2</p><p><b>  3 硬件設(shè)計(jì)3</b></p><p>  3.1 時(shí)鐘電路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è)計(jì)6</b></p><p>  4.1 DS18b20與單片機(jī)之間的信息交換程序7</p><p&g

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

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

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

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

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

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

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

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

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

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

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

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

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

22、感電路</p><p>  此部分電路負(fù)責(zé)溫度信號(hào)的采集、將溫度信號(hào)轉(zhuǎn)換成數(shù)字代碼儲(chǔ)存在溫度控制寄存器中,向單片機(jī)發(fā)送溫度數(shù)據(jù)等重要功能,主要由DS18b20芯片來完成,該電路的電路圖為:</p><p>  其中DQ為DS18b20的數(shù)據(jù)輸入/輸出端引腳,與單片機(jī)的P2.0口相連,單片機(jī)通過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)庋壑苯佑^看的部分,它會(huì)時(shí)時(shí)的將DS18b20收集到的溫度信息顯示出來。數(shù)據(jù)端口接P3口,數(shù)據(jù)/命令控制端、讀寫控制端、與使能端分別接單片機(jī)的P2.5、P2.6與P2.7口

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

25、對(duì)DS18b20進(jìn)行初始化,以釋放輸入/輸出總線并延時(shí),由于只用到一片DS18b20,因此可以發(fā)命令跳過ROM指令,跳過的指令是向DS18b20發(fā)送命令字0xcc,然后向DS18b20發(fā)出命令字0x44,來啟動(dòng)溫度轉(zhuǎn)換,然后延時(shí)一段時(shí)間,確保溫度轉(zhuǎn)換完成。</p><p>  溫度轉(zhuǎn)換完成后要獲取轉(zhuǎn)換的數(shù)據(jù),同樣要先對(duì)DS18b20進(jìn)行初始化并延時(shí),并跳過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ù)都是補(bǔ)碼形式,而負(fù)溫度的補(bǔ)碼與原碼又不相同,因此讀完之后要進(jìn)行符號(hào)位的判定,根據(jù)溫度的正負(fù)不同分別對(duì)數(shù)據(jù)進(jìn)行不同的處理,都轉(zhuǎn)換成我們要的溫度數(shù)值,但要顯示數(shù)據(jù)是將各位數(shù)據(jù)分離出來,而小數(shù)點(diǎn)后一位的數(shù)據(jù)不好分離,為方便分離,將實(shí)際溫度數(shù)值乘以10,將其挪到小數(shù)點(diǎn)前。</

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

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

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

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

31、  5 仿真結(jié)果</b></p><p>  在Proteus中畫好連線圖,然后往單片機(jī)中下載好編譯程序后生成的hex文件,就可以進(jìn)行仿真了,其結(jié)果如圖所示:</p><p><b>  6 總結(jié)與體會(huì)</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 // 報(bào)警搜索指令 </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 // 啟動(dòng)溫度轉(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ù)端口對(duì)應(yīng)的單片機(jī)引腳 </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>  /****************************延時(shí)10us*************************/ </p><p>  //先執(zhí)行一個(gè)LCALL指令(2 μs),然后執(zhí)行6個(gè)_NOP_(

42、 )語句(6 μs),最后執(zhí)行了一個(gè)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>  /***************************延時(shí) 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點(diǎn)陣,8位數(shù)據(jù)接口</p><p>  DelayXus(5);</p><p>  Writ

55、e_LCD_Command(0x0c);//畫面開,禁止光標(biāo)顯示閃爍</p><p>  DelayXus(5);</p><p>  Write_LCD_Command(0x06); //當(dāng)讀寫一個(gè)字節(jié)后,光標(biāo)自動(dòng)加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 ); // 寫一個(gè)字節(jié) ds18B20 數(shù)據(jù)

58、、命令子程序 </p><p>  uchar Readds18B20(void); // 讀一個(gè)字節(jié)ds18B20 數(shù)據(jù)子程序 </p><p>  uint GetTempValue(void); // 啟動(dòng) 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ù)位脈沖,時(shí)間>480us </p><p>  del

61、ay_15us(40); // 延時(shí) 480--960us </p><p>  ds18B20_data = 1; // 拉高總線,延時(shí) 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 的存在信號(hào) </p><p><b>  } </b></p><p>  delay_15us(20); // 240us </p><p>  return RstFlag; </p><p><b>  } </b></p>&l

64、t;p>  /***************寫一個(gè)字節(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; // 拉高總線,延時(shí) 1us,準(zhǔn)備啟動(dòng) </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(); // 延時(shí)10us </p><p>  ds18B20_data = ch&0x1; // 發(fā)送待寫入的數(shù)據(jù), “1”或“0” </p><p>  delay_15us(2); // 保持寫入數(shù)據(jù)時(shí)間 45us

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

69、lt;/p><p><b>  } </b></p><p>  /******************讀一個(gè)字節(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; // 拉高總線,延時(shí) 1us,準(zhǔn)備啟動(dòng) </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(); // 延時(shí)10us </p><p>  ds18B20_d

73、ata = 1; // 拉高總線,準(zhǔn)備接收數(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); // 延時(shí) 45us,保證整個(gè)讀命令有 60us </p><p><b>  } </b></p><p>  return ch; </p><p><b>  } </b></p><p>  /**

75、*****************啟動(dòng) 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(浮點(diǎn)數(shù))實(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); // 啟動(dòng) 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; //將測(cè)量的數(shù)據(jù)轉(zhuǎn)換成實(shí)際溫度 </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; //得到個(gè)位 </p><p>  q=num%10; //對(duì)上述整數(shù)求余得到小數(shù)點(diǎn)后第一位 </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>  在論文完成之際,本人謹(jǐn)向我的指導(dǎo)老師**老師致以衷心的感謝,導(dǎo)師嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度、敏銳的直覺和對(duì)科學(xué)的執(zhí)著追求都深深地影響了我,他對(duì)

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論