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

下載本文檔

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

文檔簡介

1、<p><b>  單片機實訓</b></p><p>  課題 溫度檢測 </p><p>  班級 11電氣一班 </p><p>  學號 </p><p>  姓名 </p><p>  指導教師

2、 </p><p>  日期 2013.1.4~2014.1.15 </p><p><b>  摘要 </b></p><p>  隨著人們生活水平的不斷提高,單片機技術已經普及到我們生活,工作,科研等各個領域。單片機控制無疑是人們追求的目標之一,它所給人帶來的方便是不可否定的,其中數字溫度計就是一個典型

3、的例子,但人們對它的要求越來越高,要為現代人工作、科研、生活提供更好的更方便的設施就需要從數單片機技術入手,一切向著數字化控制,智能化控制方向發(fā)展。本文利用單片機結合傳感器技術開發(fā)設計,把傳感器理論與單片機實際應用有機結合,詳細地講述了利用溫度傳感器DS18B20測量環(huán)境溫度,設置上下報警溫度,當溫度不在設置范圍內是,可以報警。同時51單片機在現代電子產品中廣泛應用以及其技術已經非常成熟,DS18B20可以直接讀出被測溫度值,而且采用一

4、線制與單片機相連,減少了外部的硬件電路,具有低成本和易使用的特點。</p><p>  關鍵詞:DS18B20;單片機控制;溫度檢測;溫度傳感器</p><p><b>  目錄</b></p><p>  一、設計目的:..............................................1</p><

5、;p>  二、設計要求:..............................................1</p><p>  三、數字溫度傳感器DS18B20:.................................1</p><p>  四、基本設計思想:..........................................3</p>

6、;<p>  五、實施方案論述:..........................................3</p><p>  六、系統(tǒng)分析與設計:........................................3</p><p>  1、程序流程圖及說明.....................................3</p>

7、;<p>  2、溫度計的的電路設計...................................7</p><p>  七、實物圖:................................................7</p><p>  八、程序設計:..............................................8<

8、/p><p><b>  一、設計目的 </b></p><p>  使用單片機AT89c51和溫度傳感器DS18B20實現基本范圍-55℃-125℃的測量,顯示精度誤差小于1℃,用1602lcd直接讀出溫度。</p><p><b>  二、設計要求 </b></p><p>  

9、1.綜合運用課程中所學到的理論知識完成一個設計課題</p><p>  2.通過查閱手冊和文獻資料,培養(yǎng)分析和解決實際問題的能力 </p><p>  進一步熟悉常用電子器件的類型和特性,并掌握合理選用的原則</p><p>  4.熟練掌握單片機電路的設計和焊接 </p><p>  5.撰寫課程設計總結報告</p

10、><p>  6. 培養(yǎng)嚴肅認真的工作作風</p><p>  三、數字溫度傳感器DS18B20 </p><p>  本次設計的硬件電路簡單,關鍵的地方在DS18B20,也是最復雜難懂的。 由DALLAS半導體公司生產的DS18B20型單線智能溫度傳感器,屬于新一代適配微處理器的智能溫度傳感器,可廣泛用于工業(yè)、民用、軍事等領域的溫度測量及

11、控制儀器、測控系統(tǒng)和大型設備中。它具有體積小,接口方便,傳輸距離遠等特點。 </p><p>  DS18B20的性能特點: </p><p> ?、?#160;采用單總線專用技術,既可通過串行口線,也可通過其它I/O口線與微機接口,無須經過其它變換電路,直接輸出被測溫度值(9位二進制數,含符號位) </p><p> ?、?#160;

12、測溫范圍為-55℃-+125℃,測量分辨率最小為0.0625℃ </p><p> ?、?#160;內含64位經過激光修正的只讀存儲器ROM </p><p> ?、?#160;DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉換電路集成在形如一只三極管的集成電路內</p><p> ?、?#160;適配各種單片機或系統(tǒng)機 &l

13、t;/p><p>  ⑥ 測量結果直接輸出數字溫度信號,以“一線總線“串行傳送給CPU,同時可傳送CRC校驗碼,具有極強的抗干擾糾錯能力</p><p> ?、?#160;用戶可分別設定各路溫度的上、下限 </p><p> ?、?#160;適應電壓范圍寬,3.0~5.5V,在寄生電源方式下可由數據線供電</p><p>  

14、如圖為其引腳功能圖:</p><p><b>  圖1</b></p><p>  DS18B20溫度值格式</p><p>  默認的12位轉化后得到的12位數據,存儲在18B20的兩個8比特的RAM中,二進制中的前面5位是符號位,如果測得的溫度大于0,這5位為0,只要將測到的數值乘于0.0625即可得到實際溫度;如果溫度小于0,這5位為1,

15、測到的數值需要取反加1再乘于0.0625即可得到實際溫度。</p><p><b>  如圖:</b></p><p><b>  表1:ROM指令表</b></p><p><b>  表2:RAM指令表</b></p><p><b>  四、基本設計思想<

16、/b></p><p>  基本設計方案:根據DS18B20的通訊協議,單片機控制DS18B20完成溫度轉換必須經過三個步驟:每一次讀寫之前都要對DS18B20進行復位操作,復位成功后發(fā)送一條ROM指令,最后發(fā)送RAM指令,這樣才能對DS18B20進行預定的操作。復位要求主CPU將數據線下拉500微秒,然后釋放,當DS18B20收到信號后等待16~60微秒左右,后發(fā)出60~240微秒的存在低脈沖,主CPU收

17、到此信號表示復位成功。</p><p>  于是,給DS18B20不同的時序,可以讀取溫度傳感器的值,根據溫度算法算出當時的溫度值,在給顯示部分,通過LCD顯示出來。</p><p><b>  五、實施方案論述</b></p><p>  這個課題主要實現溫度的檢測以及通過數碼管顯示這兩個大功能,以及讀取這個相對較為容易的功能。因此在溫度檢測

18、這一模塊上,利用DS18B20這一目前比較先進的溫度傳感器,可以很精確地感測實時溫度,對于DS18B20的通訊協議的控制,讀取測量的溫度值,經過一定的算法,可以把溫度轉化為十進制,分別為高位和低位,先暫存起來。經顯示模塊調用,最終在LCD上顯示。</p><p><b>  六、系統(tǒng)分析與設計</b></p><p>  1、程序流程圖及說明</p>&

19、lt;p>  主函數完成對DS18B20的初始化,讀取溫度的轉換值,調用數據處理的子程序然后再生成顯示代碼,再將溫度顯示出來,然后根據溫度顯示的代碼判斷溫度值可以判斷它的值是否超出了預設的范圍。然后返回到主函數開始的位置,無論溫度值是否超出預設值,程序都會返回開始的位置,重復循環(huán)。</p><p><b>  主函數流程圖</b></p><p>  DS18B

20、20復位子程序</p><p><b>  溫度值子程序</b></p><p>  2、溫度計的的電路設計</p><p>  溫度計采用AT89C51單片機作為微處理器,溫度計系統(tǒng)的外圍接口電路由晶振、LCD顯示電路、復位電路、溫度檢測電路、LCD驅動電路。溫度計系統(tǒng)的的硬件電路圖如下圖所示。</p><p>  溫

21、度計的工作過程是:初始化其接收需要檢測的溫度,并一直處于檢測狀態(tài),并將檢測到的溫度值讀取,并轉化為十進制數值,通過LCD顯示出來,再顯示溫度,方便用戶來讀數使用記錄數據。</p><p>  具體實現方法是:單片機將從P3.4管腳讀進來的數據進行處理,P0.1到P0.7為數碼管的段選端口,通過上拉電阻的驅動對LCD進行驅動。</p><p><b>  七、實物圖</b&g

22、t;</p><p><b>  八、程序設計</b></p><p>  //DS18B20溫度檢測及其液晶顯示</p><p>  #include<reg51.h> //包含單片機寄存器的頭文件</p><p>  #include<intrins.h> //包含_nop_()函數定

23、義的頭文件</p><p>  unsigned char code digit[10]={"0123456789"}; //定義字符數組顯示數字</p><p>  unsigned char code Str[]={"ai shi bi"}; //說明顯示的是溫度</p><p>  unsigned cha

24、r code Error[]={"Error!Check!"}; //說明沒有檢測到DS18B20</p><p>  unsigned char code Temp[]={"Temp:"}; //說明顯示的是溫度</p><p>  unsigned char code Cent[]={"Cent"

25、;}; //溫度單位</p><p>  /*******************************************************************************</p><p>  以下是對液晶模塊的操作程序</p><p>  ***********************************

26、********************************************/</p><p>  sbit RS=P3^5; //寄存器選擇位,將RS位定義為P2.0引腳</p><p>  sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳</p><p>  sbit E=P3^4;

27、 //使能信號位,將E位定義為P2.2引腳</p><p>  sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳</p><p>  /*****************************************************</p><p>  函數功能:延時1ms</p>

28、<p>  (3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒</p><p>  ***************************************************/</p><p>  void delay1ms()</p><p><b>  {</b></

29、p><p>  unsigned char i,j;</p><p>  for(i=0;i<4;i++)</p><p>  for(j=0;j<33;j++)</p><p><b>  ; </b></p><p><b>  }</b></p>

30、;<p>  /*****************************************************</p><p>  函數功能:延時若干毫秒</p><p><b>  入口參數:n</b></p><p>  ***********************************************

31、****/</p><p>  void delaynms(unsigned char n)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  for(i=0;i<n;i++)</p><p>  delay1ms();<

32、/p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:判斷液晶模塊的忙碌狀態(tài)</p><p>  返回值:result。result=1,忙碌;result=0,不忙</p&g

33、t;<p>  ***************************************************/</p><p>  bit BusyTest(void)</p><p><b>  {</b></p><p>  bit result;</p><p>  RS=0;

34、//根據規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)</p><p><b>  RW=1;</b></p><p>  E=1; //E=1,才允許讀寫</p><p>  _nop_(); //空操作</p><p><b>  _nop_();</b></p>

35、<p><b>  _nop_(); </b></p><p>  _nop_(); //空操作四個機器周期,給硬件反應時間</p><p>  result=BF; //將忙碌標志電平賦給result</p><p>  E=0; //將E恢復低電平</p><p>  return

36、 result;</p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:將模式設置指令或顯示地址寫入液晶模塊</p><p>  入口參數:dictate</p>

37、<p>  ***************************************************/</p><p>  void WriteInstruction (unsigned char dictate)</p><p><b>  { </b></p><p>  while(BusyTest()==1

38、); //如果忙就等待</p><p>  RS=0; //根據規(guī)定,RS和R/W同時為低電平時,可以寫入指令</p><p><b>  RW=0; </b></p><p>  E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,</p>

39、<p>  // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"</p><p><b>  _nop_();</b></p><p>  _nop_(); //空操作兩個機器周期,給硬件反應時間</p><p>  P0=dictate; //將數據送入P0口,即寫

40、入指令或地址</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  _nop_(); //空操作四個機器周期,給硬件反應時

41、間</p><p>  E=1; //E置高電平</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><

42、p>  _nop_(); //空操作四個機器周期,給硬件反應時間</p><p>  E=0; //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令</p><p><b>  }</b></p><p>  /*********************************

43、********************</p><p>  函數功能:指定字符顯示的實際地址</p><p><b>  入口參數:x</b></p><p>  ***************************************************/</p><p>  void WriteAddre

44、ss(unsigned char x)</p><p><b>  {</b></p><p>  WriteInstruction(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"</p><p><b>  }</b></p><p>  /********

45、*********************************************</p><p>  函數功能:將數據(字符的標準ASCII碼)寫入液晶模塊</p><p>  入口參數:y(為字符常量)</p><p>  ***************************************************/</p>&l

46、t;p>  void WriteData(unsigned char y)</p><p><b>  {</b></p><p>  while(BusyTest()==1); </p><p>  RS=1; //RS為高電平,RW為低電平時,可以寫入數據</p><p><b>

47、;  RW=0;</b></p><p>  E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,</p><p>  // 就是讓E從0到1發(fā)生正跳變,所以應先置"0"</p><p>  P0=y; //將數據送入P0口,即將數據寫入液晶模塊</p><p&g

48、t;<b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  _nop_(); //空操作四個機器周期,給硬件反應時間</p><p>  E=1;

49、 //E置高電平</p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p>  _nop_(); //空操作四個機器周期,給硬件反應時

50、間</p><p>  E=0; //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令</p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:對LCD的顯

51、示模式進行初始化設置</p><p>  ***************************************************/</p><p>  void LcdInitiate(void)</p><p><b>  {</b></p><p>  delaynms(15);

52、 //延時15ms,首次寫指令時應給LCD一段較長的反應時間</p><p>  WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據接口</p><p>  delaynms(5); //延時5ms ,給硬件一點反應時間</p><p>  WriteI

53、nstruction(0x38);</p><p>  delaynms(5); //延時5ms ,給硬件一點反應時間</p><p>  WriteInstruction(0x38); //連續(xù)三次,確保初始化成功</p><p>  delaynms(5); //延時5ms ,給硬件一點反應時間&l

54、t;/p><p>  WriteInstruction(0x0c); //顯示模式設置:顯示開,無光標,光標不閃爍</p><p>  delaynms(5); //延時5ms ,給硬件一點反應時間</p><p>  WriteInstruction(0x06); //顯示模式設置:光標右移,字符不移</p>

55、<p>  delaynms(5); //延時5ms ,給硬件一點反應時間</p><p>  WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除</p><p>  delaynms(5); //延時5ms ,給硬件一點反應時間</p><p><b&g

56、t;  } </b></p><p>  /************************************************************************</p><p>  以下是DS18B20的操作程序</p><p>  ***********************************************

57、*************************/ </p><p>  sbit DQ=P3^3;</p><p>  unsigned char time; //設置全局變量,專門用于嚴格延時</p><p>  /*****************************************************</p><p&

58、gt;  函數功能:將DS18B20傳感器初始化,讀取應答信號</p><p>  出口參數:flag </p><p>  ***************************************************/</p><p>  bit Init_DS18B20(void)</p><p><b>  {&l

59、t;/b></p><p>  bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在</p><p>  DQ = 1; //先將數據線拉高</p><p>  for(time=0;time<2;time++) //略微延時約6微秒</p><

60、p><b>  ;</b></p><p>  DQ = 0; //再將數據線從高拉低,要求保持480~960us</p><p>  for(time=0;time<200;time++) //略微延時約600微秒</p><p>  ; //以向DS18B20發(fā)出一持續(xù)480~960us的低

61、電平復位脈沖 </p><p>  DQ = 1; //釋放數據線(將數據線拉高) </p><p>  for(time=0;time<10;time++)</p><p>  ; //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)</p><p>  flag=DQ;

62、 //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) </p><p>  for(time=0;time<200;time++) //延時足夠長時間,等待存在脈沖輸出完畢</p><p><b>  ;</b></p><p>  return (flag); //返回檢測成功標志</p><

63、;p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:從DS18B20讀取一個字節(jié)數據</p><p><b>  出口參數:dat</b></p><p>

64、  ***************************************************/ </p><p>  unsigned char ReadOneChar(void)</p><p><b>  {</b></p><p>  unsigned char i=0;</p><p>  uns

65、igned char dat; //儲存讀出的一個字節(jié)數據</p><p>  for (i=0;i<8;i++)</p><p><b>  {</b></p><p>  DQ =1; // 先將數據線拉高</p><p>  _nop_(); //等待一個機器周期 </p>

66、<p>  DQ = 0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序</p><p><b>  dat>>=1;</b></p><p>  _nop_(); //等待一個機器周期 </p><p>  DQ = 1; //將數據線"人為"

67、拉高,為單片機檢測DS18B20的輸出電平作準備</p><p>  for(time=0;time<2;time++)</p><p>  ; //延時約6us,使主機在15us內采樣</p><p><b>  if(DQ==1)</b></p><p>  dat|=0x80; //如果讀到的數據

68、是1,則將1存入dat</p><p><b>  else</b></p><p>  dat|=0x00;//如果讀到的數據是0,則將0存入dat</p><p>  //將單片機檢測到的電平信號DQ存入r[i]</p><p>  for(time=0;time<8;time++)</p>&

69、lt;p>  ; //延時3us,兩個讀時序之間必須有大于1us的恢復期</p><p>  } </p><p>  return(dat); //返回讀出的十進制數據</p><p><b>  }</b></p><p>  /****

70、*************************************************</p><p>  函數功能:向DS18B20寫入一個字節(jié)數據</p><p><b>  入口參數:dat</b></p><p>  ***************************************************/

71、</p><p>  WriteOneChar(unsigned char dat)</p><p><b>  {</b></p><p>  unsigned char i=0;</p><p>  for (i=0; i<8; i++)</p><p><b>  {<

72、/b></p><p>  DQ =1; // 先將數據線拉高</p><p>  _nop_(); //等待一個機器周期 </p><p>  DQ=0; //將數據線從高拉低時即啟動寫時序 </p><p>  DQ=dat&0x01; //利用與運算取出要寫的某

73、位二進制數據,</p><p>  //并將其送到數據線上等待DS18B20采樣</p><p>  for(time=0;time<10;time++)</p><p>  ;//延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣</p><p>  DQ=1; //釋放數據線

74、</p><p>  for(time=0;time<1;time++)</p><p>  ;//延時3us,兩個寫時序間至少需要1us的恢復期</p><p>  dat>>=1; //將dat中的各二進制位數據右移1位</p><p><b>  }</b></p>&l

75、t;p>  for(time=0;time<4;time++)</p><p>  ; //稍作延時,給硬件一點反應時間</p><p><b>  }</b></p><p>  /***************************************************************************

76、***</p><p>  以下是與溫度有關的顯示設置</p><p>  ******************************************************************************/</p><p>  /*****************************************************&l

77、t;/p><p>  函數功能:顯示沒有檢測到DS18B20</p><p>  ***************************************************/ </p><p>  void display_error(void)</p><p><b>  {</b></p>

78、<p>  unsigned char i;</p><p>  WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示</p><p>  i = 0; //從第一個字符開始顯示</p><p>  while(Error[i] != '\0') //只要沒有寫到結束標志,就

79、繼續(xù)寫</p><p><b>  {</b></p><p>  WriteData(Error[i]); //將字符常量寫入LCD</p><p>  i++; //指向下一個字符</p><p>  delaynms(100); //延時100ms較長時

80、間,以看清關于顯示的說明</p><p><b>  }</b></p><p>  while(1) //進入死循環(huán),等待查明原因</p><p><b>  ;</b></p><p><b>  }</b></p><p&g

81、t;  /*****************************************************</p><p>  函數功能:顯示說明信息</p><p>  ***************************************************/ </p><p>  void display_explain(void)&

82、lt;/p><p><b>  {</b></p><p>  unsigned char i;</p><p>  WriteAddress(0x00); //寫顯示地址,將在第1行第1列開始顯示</p><p>  i = 0; //從第一個字符開始顯示</p><

83、p>  while(Str[i] != '\0') //只要沒有寫到結束標志,就繼續(xù)寫</p><p><b>  {</b></p><p>  WriteData(Str[i]); //將字符常量寫入LCD</p><p>  i++; //指向下一個字符</p&

84、gt;<p>  delaynms(100); //延時100ms較長時間,以看清關于顯示的說明</p><p><b>  }</b></p><p><b>  }</b></p><p>  /***********************************************

85、******</p><p>  函數功能:顯示溫度符號</p><p>  ***************************************************/ </p><p>  void display_symbol(void)</p><p><b>  {</b></p>

86、<p>  unsigned char i;</p><p>  WriteAddress(0x40); //寫顯示地址,將在第2行第1列開始顯示</p><p>  i = 0; //從第一個字符開始顯示</p><p>  while(Temp[i] != '\0') //只要沒有寫到結束標志,就

87、繼續(xù)寫</p><p><b>  {</b></p><p>  WriteData(Temp[i]); //將字符常量寫入LCD</p><p>  i++; //指向下一個字符</p><p>  delaynms(50); //延時1ms給硬件一點反應

88、時間</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:顯示溫度的小數點</p><p&

89、gt;  ***************************************************/ </p><p>  void display_dot(void)</p><p>  { </p><p>  WriteAddress(0x49); //寫顯示地址,將在第2行第10列開始顯示 </p>

90、<p>  WriteData('.'); //將小數點的字符常量寫入LCD</p><p>  delaynms(50); //延時1ms給硬件一點反應時間</p><p><b>  }</b></p><p>  /********************************

91、*********************</p><p>  函數功能:顯示溫度的單位(Cent)</p><p>  ***************************************************/ </p><p>  void display_cent(void)</p><p><b>  {

92、</b></p><p>  unsigned char i; </p><p>  WriteAddress(0x4c); //寫顯示地址,將在第2行第13列開始顯示</p><p>  i = 0; //從第一個字符開始顯示 </p><p>  while(Cent

93、[i] != '\0') //只要沒有寫到結束標志,就繼續(xù)寫</p><p><b>  {</b></p><p>  WriteData(Cent[i]); //將字符常量寫入LCD</p><p>  i++; //指向下一個字符</p><p&

94、gt;  delaynms(50); //延時1ms給硬件一點反應時間</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*****************************************************</p>&l

95、t;p>  函數功能:顯示溫度的整數部分</p><p><b>  入口參數:x</b></p><p>  ***************************************************/ </p><p>  void display_temp1(unsigned char x)</p><

96、;p><b>  {</b></p><p>  unsigned char j,k,l; //j,k,l分別儲存溫度的百位、十位和個位</p><p>  j=x/100; //取百位</p><p>  k=(x%100)/10; //取十位</p><p>  l=x%

97、10; //取個位 </p><p>  WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示</p><p>  WriteData(digit[j]); //將百位數字的字符常量寫入LCD</p><p>  WriteData(digit[k]); //將十位數字的字符常量寫入LCD<

98、;/p><p>  WriteData(digit[l]); //將個位數字的字符常量寫入LCD</p><p>  delaynms(50); //延時1ms給硬件一點反應時間 </p><p><b>  }</b></p><p>  /**************************

99、***************************</p><p>  函數功能:顯示溫度的小數數部分</p><p><b>  入口參數:x</b></p><p>  ***************************************************/ </p><p>  void dis

100、play_temp2(unsigned char x)</p><p><b>  {</b></p><p>  WriteAddress(0x4a); //寫顯示地址,將在第2行第11列開始顯示</p><p>  WriteData(digit[x]); //將小數部分的第一位數字字符常量寫入LCD</p>

101、<p>  delaynms(50); //延時1ms給硬件一點反應時間</p><p><b>  }</b></p><p>  /*****************************************************</p><p>  函數功能:做好讀溫度的準備</p>&

102、lt;p>  ***************************************************/ </p><p>  void ReadyReadTemp(void)</p><p><b>  {</b></p><p>  Init_DS18B20(); //將DS18B20初始化</p>

103、<p>  WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動溫度轉換 </p><p>  for(time=0;time<100;time++)</p><p>  ; //溫度轉換需要一點時間</p><p>  Init_D

104、S18B20(); //將DS18B20初始化</p><p>  WriteOneChar(0xCC); //跳過讀序號列號的操作</p><p>  WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位</p><p><b>  }</b></p><p>  /***

105、**************************************************</p><p><b>  函數功能:主函數</b></p><p>  ***************************************************/ </p><p>  void main(void)</p

106、><p><b>  { </b></p><p>  unsigned char TL; //儲存暫存器的溫度低位</p><p>  unsigned char TH; //儲存暫存器的溫度高位</p><p>  unsigned char TN; //儲存溫度的整數部分</p>

107、<p>  unsigned char TD; //儲存溫度的小數部分</p><p>  LcdInitiate(); //將液晶初始化</p><p>  delaynms(5); //延時5ms給硬件一點反應時間</p><p>  if(Init_DS18B20()==1)</p>&l

108、t;p>  display_error();</p><p>  display_explain();</p><p>  display_symbol(); //顯示溫度說明</p><p>  display_dot(); //顯示溫度的小數點</p><p>  display_cent(); //顯示

109、溫度的單位</p><p>  while(1) //不斷檢測并顯示溫度</p><p><b>  {</b></p><p>  ReadyReadTemp(); //讀溫度準備</p><p>  TL=ReadOneChar(); //先讀的是溫度值低位</p&

110、gt;<p>  TH=ReadOneChar(); //接著讀的是溫度值高位</p><p>  TN=TH*16+TL/16; //實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16</p><p>  //這樣得出的是溫度的整數部分,小數部分被丟棄了</p><p>  TD=(TL%16)*10/16;

111、//計算溫度的小數部分,將余數乘以10再除以16取整,</p><p>  //這樣得到的是溫度小數部分的第一位數字(保留1位小數)</p><p>  display_temp1(TN); //顯示溫度的整數部分</p><p>  display_temp2(TD); //顯示溫度的小數部分</p><p>  delaynm

溫馨提示

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

評論

0/150

提交評論