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

下載本文檔

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

文檔簡介

1、<p><b>  摘要:3</b></p><p><b>  一、系統設計3</b></p><p>  1.1 項目概要3</p><p>  1.2設計任務和要求:4</p><p><b>  二、 硬件設計4</b></p><

2、;p>  2.1 硬件設計概要4</p><p>  2.2 信息處理模塊4</p><p>  2.3 溫度采集模塊5</p><p>  2.3.1傳感器DS18b20簡介5</p><p>  2.3.2實驗模擬電路圖6</p><p>  2.3.3程序流程圖7</p><

3、p>  2.4控制調節模塊8</p><p>  2.4.1升溫調節系統8</p><p>  2.4.2溫度上下限調節系統9</p><p>  2.5顯示模塊11</p><p>  三、仿真后,部分顯示成果12</p><p>  四、兩周實習總結15</p><p>&

4、lt;b>  五、致謝15</b></p><p><b>  六、參考文獻15</b></p><p><b>  七、附錄16</b></p><p><b>  7.1原理圖16</b></p><p>  7.2參考程序16</p>

5、;<p><b>  摘要:</b></p><p>  在現代工業生產中,溫度是常用的測量被控因素。本設計是基于51單片機控制,將DS18B20溫度傳感器實時溫度轉化,并通過1602液晶對溫度實行實時顯示,并通過加熱片(PWM波,改變其占空比)加熱與步進電機降溫逐次逼近的方式,將溫度保持在設定溫度,通過按鍵調節溫度報警區域,實現對溫度在0℃-99℃控制的自動化。實驗結果表明此

6、結構完全可行,溫度偏差可達0.1℃以內。</p><p>  關鍵字:AT89C51單片機;溫控;DS18b20</p><p>  Abstract: In modern industrial production, the temperature is commonly measured controlled factors.The design is based on the 51

7、 SCM control, the DS18B20 temperature sensor real time temperature transformation, and through the 1602 LCD on the temperature of the real-time display, and by heating the sheet (PWM wave, changing its duty cycle) heatin

8、g and stepper motor cooling successive approximation approach, keeping the temperature at the set temperature, through the buttons adjust temperature a</p><p>  Key word: AT89C51Monolithic integrated circuit

9、 ; Temperature control; DS18B20</p><p><b>  一、系統設計</b></p><p><b>  1.1 項目概要</b></p><p>  溫度控制系統無論是工業生產過程,還是日常生活都起著非常重要的作用,過低或過高的溫度環境不僅是一種資源的浪費,同時也會對機器和工作人員的壽

10、命產生嚴重影響,極有可能造成嚴重的經濟財產損失,給生活生產帶來許多利的因素,基于AT89C51的單片機溫度控制系統與傳統的溫度控制相比具有操作方便、價價格便宜、精確度高和開展容易等優點,因此市場前景好。</p><p>  1.2設計任務和基本要求:</p><p>  采用DS18B20作為溫度傳感器進行溫度檢測。</p><p>  對采集溫度用LCD1602進

11、行顯示(顯示溫度分辨率0.1℃);采集溫度數值應采用數字濾波措施,保證顯示數據穩定。</p><p>  設計相應的溫度控制電路,根據測得的溫度情況對加熱器進行控制,將溫度保持在設定溫度。</p><p>  通過按鍵設置溫度上下限,超限通過蜂鳴器報警。</p><p>  采用DS1302時鐘芯片顯示當前時間,并可以對時間進行設置。</p><

12、p><b>  二、 硬件設計</b></p><p>  2.1 硬件設計概要</p><p>  根據需求,我們將系統分為五個模塊,信息處理模塊,溫度采集模塊、時間模塊、控制調節模塊、報警電路模塊,顯示模塊。</p><p>  2.2 信息處理模塊</p><p>  AT89C51是一種帶4K字節閃爍可編程

13、可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS8位微處理器,俗稱單片機。AT89C2051是一種帶2K字節閃爍可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個

14、芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統提供了一種靈活性高且價廉的方案。單片機模塊如圖(1) 所示。</p><p><b>  圖(1)單片機模塊</b></p><p>  2.3 溫度采集模塊</p><p>  2.3.1傳感器DS18b20簡介&l

15、t;/p><p>  DALLAS最新單線數字溫度傳感器DS18b20簡介新的“一線器件”,體積更小、適用電壓更寬、更經濟。Dallas半導體公司的數字化溫度傳感器DS18b20是世界上第一片支持“一線總線”接口溫度傳感器。一線總線獨特而且經濟的特點,使用戶可輕松地組建傳感器網絡,為測量系統的構建引入全新的概念。DS18b20、DS1822“一線總線”數字化溫度傳感器同DS1820一樣,DS18b20也支持“一線總線

16、”接口,測量溫度范圍為-55℃ ~ +125℃,在-10℃~ +85℃范圍內,精度為0.5℃。DS18b20的精度較差為2℃?,F場溫度直接以“一線總線”的數字方式傳輸,大大提高了系統的抗干擾性。適合于惡劣環境的現場溫度測量,如:環境控制、設備或過程控制、測量類消費電子產品等。與前一代產品不同,新的產品支持3V~ 5V的電壓范圍,使系統設計更靈活、方便。而且新一代產品更便宜,體積更小。DS18b20內部結構主要由四部分組成:64位光刻RO

17、M、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。DS18b20的實驗板原理接線圖如圖(2):</p><p>  圖(2) DS18b20的實驗板接線圖</p><p>  其中:DQ為數字信號輸入/輸出端;GND為電源地;VDD為外接供電電源輸入端(在寄生電源接線方式時接地)</p><p>  2.3.2實驗模擬電路圖</p><

18、;p>  溫度檢測控制模擬電路圖Ds18b20原件及其連線如圖(3),此溫度傳感器上顯示的溫度同步顯示到LCD1602上,并有加溫,減溫按鈕。</p><p>  圖(3)溫度檢測控制模擬電路圖</p><p>  2.3.3程序流程圖</p><p>  圖(4)主程序流程圖</p><p>  圖(5)DS18B20初始化子程序流程

19、圖</p><p>  圖(6)DS18B20讀寫的程序流程圖</p><p><b>  2.4控制調節模塊</b></p><p>  2.4.1升溫調節系統</p><p>  通過繼電器的開合來控制加熱片電路的通斷,來達到設溫效果,我們預設溫度為25度,當溫度低于25度時,單片機P3.6引腳輸出高電平,繼電器導通

20、,對溫度傳感器加熱,加熱模塊如圖(7)所示。</p><p>  圖(7)加溫控制電路</p><p>  2.4.2溫度上下限調節系統</p><p>  通過按鍵控制鍵選著調節對象,通過上升下降調節值大小,模擬電路圖如圖(78主控電路:我們設定溫度為10--20度,為表示方便,這里設控制開關,升溫開關,降溫開關分別為,k1,k2,k3,開始顯示的是當前溫度,K1

21、主控開關,用來控制進入的是當前溫度,溫度上限,下限的調節界面。按k1,一次進入三個界面。按K2為加1開關,按一下,加1,k3減1開關,按一下,減1.</p><p>  例如:開始時顯示的是當前溫度界面,按下k1進入高溫設定界面,顯示器上顯示當前溫度和溫度上限,按k2,上限加1,按k3,上限減1,再按k1進入顯現設定界面,顯示器顯示當前溫度,和溫度下限,按k2,下限加1,按k3,下限減1,再按k1,進入顯示當前溫

22、度界面。如圖(8)</p><p>  2.4.3 報警電路系統</p><p>  通過蜂鳴器的鳴叫實現報警,如果溫度超過上限蜂鳴器鳴叫,溫度低于下限蜂鳴器鳴叫。如圖(8)、(9)。</p><p>  圖(8)溫度設定開關</p><p><b>  圖(9)報警模塊</b></p><p>

23、<b>  2.5顯示模塊</b></p><p>  通過采集DS18B20的溫度,同步顯示到LCD1602上,精確到小數點后第一位。如下圖</p><p>  圖(10)溫度顯示界面</p><p>  通過DS1302時鐘芯片將時間同步顯示到LCD1602上。如下圖(時間可以設置在此沒有設置)</p><p>  

24、圖(11)時間顯示界面</p><p>  通過2402記錄超過設定值的溫度,如下圖:</p><p>  圖(12)記錄超過設定值的溫度顯示界面</p><p>  三、仿真后,部分顯示成果</p><p>  圖(10)開始啟動時,顯示時間信息</p><p>  圖(11)顯示當前溫度</p>&l

25、t;p>  圖(12)溫度低于低溫下限,蜂鳴器鳴叫</p><p>  圖(13)溫度高于溫度上限,蜂鳴器鳴叫</p><p>  圖(14)顯示學號界面</p><p><b>  四、兩周實習總結</b></p><p>  這次單片機實習我們做的是溫度控制系統??吹竭@個題目我們還是比較有信心的,對基本功能的設

26、計,我們比較熟練,關鍵問題在于一些拓展功能的時限。第一周我們找了很多資料,</p><p>  通過兩周的實習,我們 學到了很多的知識,也對DS18B20的用法以及DS1302的用法有了一個更深入的學習。</p><p><b>  五、參考文獻</b></p><p>  [1] 郭天祥.新概念51單片機C語音教程——入門提高開發拓展攻略[

27、M].北 京:北京:電子工業出版社,2009.</p><p>  [2] 韓廣興.電子元器件與實用電路基礎[M].北京:電子工業出版社,2005.</p><p>  [3] 方大千,朱麗.電子控制系統裝置制作入門[M].北京:國防出版社,2006.</p><p>  [4] 劉向舉,劉麗娜. 基于單片機的智能溫度測控系統的設計[J]. 齊齊哈爾大 學學報

28、(自然科學版). 2012(03)</p><p>  [5] 黃文力,鄧小磊. DS18B20數字溫度傳感器接口程序的時序[J]. 儀器儀表 用戶. 2011(06)</p><p>  [6] 黃曉林. 一種實用型智能恒溫控制系統設計[J]. 自動化技術與應用. </p><p><b>  2011(11)</b></p

29、><p>  [7] 王文,王直. 基于ARM和DS18B20的溫度監測系統[J]. 電子設計工程. 2011(20)</p><p>  [8] 陳錫華,賈磊磊. 溫度傳感器DS18B20序列號批量搜索算法[J]. 單片機與 嵌入式系統應用. 2011(09)</p><p><b>  六、附錄</b></p><

30、p><b>  6.1原理圖</b></p><p><b>  6.2參考程序</b></p><p><b>  main.c文件:</b></p><p>  #include"STC89C51RC.H"</p><p>  #include&l

31、t;absacc.h></p><p>  #include"ds18b20.h"</p><p>  #include"lcd1602.h"</p><p>  #include"ds1302.h"</p><p>  #include"2402.h"&

32、lt;/p><p>  uchar data datadis[]={0x00,0x00,0x00,0x00,0x00};</p><p>  uint temp=0;</p><p>  sbit K1=P1^0;</p><p>  sbit K2=P1^1;</p><p>  sbit K3=P1^2;</p&

33、gt;<p>  sbit K4=P1^3;</p><p>  sbit K5=P1^4;</p><p>  sbit L1=P1^6;</p><p>  sbit K7=P1^7;</p><p>  sbit beep=P1^5;</p><p>  //sbit K1=P1^4;</p&

34、gt;<p>  //sbit K2=P1^5;</p><p>  //sbit K3=P1^6;</p><p>  //sbit K4=P1^7;</p><p>  //sbit K5=P3^3;</p><p>  //sbit L1=P2^5;</p><p>  //sbit speaker

35、=P3^2;</p><p>  uchar keynum=1,flag,flag1,flag2,flag4,adder,q;</p><p>  uint k,count=1,th,tl,set;</p><p>  systemtime realtime;//CurrentTime;</p><p>  uchar th1=8;</

36、p><p>  uchar th2=5;</p><p>  uchar th3=2;</p><p>  uchar th4=0;</p><p>  uchar tab,w;</p><p>  void delay(uchar z)</p><p><b>  {</b>

37、</p><p>  uchar x,y;</p><p>  for(x=z;x>0;x--)</p><p>  for(y=110;y>0;y--);</p><p><b>  }</b></p><p>  /*控制頁面 1-4頁*/</p><p>

38、  uchar key4() </p><p><b>  {</b></p><p><b>  if(K4==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><

39、p><b>  if(K4==0)</b></p><p><b>  {</b></p><p>  while(!K4);</p><p><b>  keynum++;</b></p><p>  if(keynum==6)keynum=1;</p>

40、<p><b>  }</b></p><p><b>  }</b></p><p>  return keynum;</p><p><b>  }</b></p><p>  /*****設置時間鍵盤函數*********/</p><p&g

41、t;  void key_time() </p><p><b>  {</b></p><p>  if(flag4==1&&k==1)</p><p><b>  {</b></p><p><b>  if(K7==0)</b></p>

42、<p><b>  {</b></p><p><b>  delay(5);</b></p><p><b>  if(K7==0)</b></p><p><b>  {</b></p><p>  while(!K7);</p>

43、<p><b>  count++;</b></p><p>  if(count==8) count=2;</p><p><b>  }</b></p><p><b>  }</b></p><p>  switch(count)</p>&

44、lt;p><b>  {</b></p><p><b>  case 2:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b><

45、/p><p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(

46、!K1);</p><p>  if(set==60)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</

47、b></p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>

48、;  while(!K2);</p><p>  if(set==-1)set=59;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x80, set); break; //設置秒</p><

49、;p><b>  }</b></p><p><b>  case 3:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></

50、p><p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(!

51、K1);</p><p>  if(set==60)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b

52、></p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>

53、  while(!K2);</p><p>  if(set==-1)set=59;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x82, set); break; //設置分</p><

54、p><b>  }</b></p><p><b>  case 4:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p&

55、gt;<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(!K1

56、);</p><p>  if(set==60)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b&g

57、t;</p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>  

58、while(!K2);</p><p>  if(set==-1)set=59;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x84, set); break; //設置時</p><p&

59、gt;<b>  }</b></p><p><b>  case 5:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p>

60、;<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(!K1);

61、</p><p>  if(set==31)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b>

62、</p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>  wh

63、ile(!K2);</p><p>  if(set==-1)set=30;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x86, set); break; //設置日</p><p>

64、;<b>  }</b></p><p><b>  case 6:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p>

65、<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(!K1);&l

66、t;/p><p>  if(set==13)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b>&l

67、t;/p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>  whil

68、e(!K2);</p><p>  if(set==-1)set=12;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x88, set); break; //設置月</p><p>&

69、lt;b>  }</b></p><p><b>  case 7:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p>

70、<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  set++;</b></p><p>  while(!K1);<

71、;/p><p>  if(set==100)set=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b>&l

72、t;/p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  set--;</b></p><p>  whil

73、e(!K2);</p><p>  if(set==-1)set=99;</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302_SetTime(0x8c, set); break; //設置年</p><p>&

74、lt;b>  }</b></p><p>  default: break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else </b></p><p><

75、;b>  flag4=0;</b></p><p><b>  }</b></p><p>  /*******設置溫度的鍵盤掃描函數******/</p><p>  void key_lcd()</p><p><b>  {</b></p><p>

76、  if(flag1==1&&k==3) //k一定不能掉,不然會在其他菜單里出現亂碼</p><p><b>  {</b></p><p>  if(K3==0)//按鍵判斷,選擇設置溫度的光標</p><p><b>  {</b></p><p><

77、b>  delay(5);</b></p><p><b>  if(K3==0)</b></p><p><b>  {</b></p><p>  while(!K3);</p><p>  flag++; //按鍵標識位</p><p>  i

78、f(flag==5)flag=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  switch(flag)</p><p><b>  {</b></p><p><b>  case 1:

79、</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p><p>&

80、lt;b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  th1++;</b></p><p>  while(!K1);</p><p>  if(th1==10)th1=0;</p><p><

81、;b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b></p>&

82、lt;p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  th1--;</b></p><p>  while(!K2);</p><p>  if(th1==-1)th1=9;</p><

83、;p><b>  }</b></p><p><b>  }</b></p><p>  LCD_pos(0x43);</p><p>  write_dat(th1+0x30);</p><p><b>  }break;</b></p><p>

84、;<b>  case 2:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p><b>  delay(5);</b><

85、;/p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  th2++;</b></p><p>  while(!K1);</p><p>  if(th2==10)th2=0;</

86、p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p><b>  delay(5);<

87、/b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  th2--;</b></p><p>  while(!K2);</p><p>  if(th2==-1)th

88、2=9;</p><p><b>  }</b></p><p><b>  }</b></p><p>  LCD_pos(0x44);//位置設定</p><p>  write_dat(th2+0x30);</p><p><b>  }break;</

89、b></p><p><b>  case 3:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p><p><b>

90、;  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  th3++;</b></p><p>  while(!K1);</p><p>

91、;  if(th3==10)th3=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b></p><p>

92、;<b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  th3--;</b></p><p>  while(!K2);</p>

93、<p>  if(th3==-1)th3=9;</p><p><b>  }</b></p><p><b>  }</b></p><p>  LCD_pos(0x4c);</p><p>  write_dat(th3+0x30);</p><p><

94、b>  }break;</b></p><p><b>  case 4:</b></p><p><b>  {</b></p><p><b>  if(K1==0)</b></p><p><b>  {</b></p>

95、<p><b>  delay(5);</b></p><p><b>  if(K1==0)</b></p><p><b>  { </b></p><p><b>  th4++;</b></p><p>  while(!K1);&

96、lt;/p><p>  if(th4==10)th4=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  if(K2==0)</b></p><p><b>  {</b>&

97、lt;/p><p><b>  delay(5);</b></p><p><b>  if(K2==0)</b></p><p><b>  { </b></p><p><b>  th4--;</b></p><p>  whi

98、le(!K2);</p><p>  if(th4==-1)th4=9;</p><p><b>  }</b></p><p><b>  }</b></p><p>  LCD_pos(0x4d);</p><p>  write_dat(th4+0x30);</p

99、><p><b>  }break;</b></p><p>  default:break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  else flag1=0; //m一定不能掉,否

100、則在調節溫度的時候會影響其他菜單</p><p>  th=th1*10+th2; //獲取設置溫度的高位</p><p>  tl=th3*10+th4; //獲取設置溫度的低位</p><p><b>  }</b></p><p>  void alarm_beep() //報警系統與當前溫度進行比

101、較并處理</p><p><b>  {</b></p><p>  if(temp>(th*10)||temp<(tl*10))</p><p><b>  {</b></p><p>  beep=~beep;</p><p><b>  L1=0

102、;</b></p><p><b>  adder++;</b></p><p>  tab=temp/10;</p><p>  write_add(adder,tab);</p><p><b>  }</b></p><p><b>  else

103、 </b></p><p><b>  {</b></p><p><b>  beep=1;</b></p><p><b>  L1=1;</b></p><p><b>  }</b></p><p><b&

104、gt;  }</b></p><p>  /*****主函數*******/</p><p>  void main()</p><p><b>  {</b></p><p>  init_18b20();</p><p>  init_lcd();</p><

105、p>  init_2402();</p><p><b>  beep=1;</b></p><p>  //Set_RTC();</p><p><b>  count=7;</b></p><p><b>  while(1)</b></p><

106、p><b>  {</b></p><p>  k=key4(); </p><p>  get_ds1302(&realtime);//取時間</p><p>  temp=read_temp(); //取溫度</p><p>  delay(200); //延時 保持數據穩定 避免數據刷

107、新</p><p><b>  switch(k)</b></p><p><b>  {</b></p><p>  case 1: //菜單一,顯示時間并且可以設置時間</p><p><b>  {</b></p><p>  //key

108、_time();</p><p>  //get_ds1302(&realtime);</p><p>  LCD_pos(0);</p><p>  print(" Time: ");</p><p>  print(realtime.TimeString);</p><p>  LCD

109、_pos(0x40);</p><p>  print(" Date: "); </p><p>  print(realtime.DateString);</p><p>  flag4=1; </p><p>  } break; </p><p>  case 2:

110、 //菜單二,顯示溫度</p><p><b>  { </b></p><p>  LCD_pos(0);</p><p>  print(" DS18B20 is OK ");</p><p>  LCD_pos(0x40);</p><p>  print("

111、;NOW TEMP: ");</p><p>  if(flagt==1)datadis[0]=0x2d;</p><p>  else datadis[0]=temp/1000+0x30;</p><p>  datadis[1]=temp/100%10+0x30;</p><p>  datadis[2]=temp/1

112、0%10+0x30;</p><p>  datadis[3]=0x2e;</p><p>  datadis[4]=temp%10+0x30;</p><p>  LCD_pos(0x49);</p><p>  print(datadis);</p><p>  LCD_pos(0x4e); //寫入攝氏度符號&

113、lt;/p><p>  write_dat(0xdf);</p><p>  LCD_pos(0x4f);</p><p>  write_dat(0x43);</p><p><b>  }break; </b></p><p>  case 3: //菜單三,顯示溫度設置值</

114、p><p><b>  {</b></p><p>  LCD_pos(0);</p><p>  print(" change temp: ");</p><p>  LCD_pos(0x40);</p><p>  print("TH= TL= &

115、quot;);</p><p>  LCD_pos(0x43);</p><p>  write_dat(th1+0x30);</p><p>  LCD_pos(0x44);</p><p>  write_dat(th2+0x30);</p><p>  LCD_pos(0x45); //攝氏度符號</

116、p><p>  write_dat(0xdf); </p><p>  LCD_pos(0x46);</p><p>  write_dat(0x43);</p><p>  LCD_pos(0x4c);</p><p>  write_dat(th3+0x30);</p><p>  LCD_

117、pos(0x4d);</p><p>  write_dat(th4+0x30);</p><p>  LCD_pos(0x4e); //攝氏度符號</p><p>  write_dat(0xdf); </p><p>  LCD_pos(0x4f);</p><p>  write_dat(0x43);&l

118、t;/p><p>  flag1=1; </p><p><b>  }break;</b></p><p>  case 4: //菜單四,記錄報警溫度</p><p><b>  {</b></p><p>  write_cmd(0x80);</p>

119、;<p>  print(" ALARM TEMP ");</p><p>  write_cmd(0xc0);</p><p>  print(" RECORD: ");</p><p>  write_cmd(0xcb);</p><p>  write_da

120、t(0xdf); </p><p>  write_cmd(0xcc);</p><p>  write_dat(0x43);</p><p><b>  flag2=1;</b></p><p><b>  }break;</b></p><p>  case 5:

121、 //菜單五,顯示學號</p><p><b>  {</b></p><p>  LCD_pos(0x00);</p><p>  print("AUTO llk32210309"); //顯示學號</p><p>  LCD_pos(0x40);</p><p&g

122、t;  print("AUTO wyp32210304"); //顯示學號</p><p>  }break; </p><p>  default:break; </p><p><b>  }</b></p><p>  key_time();</p><p>

123、  key_lcd();//菜單三中溫度設置的按鍵掃描</p><p>  alarm_beep(); //報警系統通過2402存儲超出的溫度,并記錄</p><p>  if(K5==0)//按下K5,就記錄當前報警的溫度</p><p><b>  {</b></p><p><b>

124、  delay(5);</b></p><p><b>  if(K5==0)</b></p><p><b>  {</b></p><p>  while(!K5);</p><p>  q=read_add(adder);</p><p><b>

125、  }</b></p><p><b>  };</b></p><p>  if(flag2==1&&k==4) //k一定不能掉,不然會在其他菜單里出現亂碼,菜單四中需要顯示存儲的報警數據</p><p><b>  {</b></p><p&g

126、t;  write_cmd(0xc9);</p><p>  write_dat(q/10%10+0x30);</p><p>  write_cmd(0xca);</p><p>  write_dat(q%10+0x30);</p><p><b>  }</b></p><p><b&

127、gt;  }</b></p><p><b>  }</b></p><p>  DS18B20.h文件:</p><p>  #ifndef _ds18b20_h_</p><p>  #define _ds18b20_h_</p><p>  #define uchar uns

128、igned char</p><p>  #define uint unsigned int</p><p><b>  //晶振22MHZ</b></p><p><b>  //延時//</b></p><p>  sbit DQ=P3^7;</p><p>  b

129、it flagt;</p><p>  void delay_18b20(uint i)</p><p><b>  {</b></p><p>  while(i--);</p><p><b>  }</b></p><p>  /*****初始化程序****/ <

130、/p><p>  void init_18b20()</p><p><b>  {</b></p><p>  uchar x=0;</p><p><b>  DQ=1;</b></p><p>  delay_18b20(8);</p><p>&l

131、t;b>  DQ=0;</b></p><p>  delay_18b20(80);</p><p><b>  DQ=1;</b></p><p>  delay_18b20(15);</p><p><b>  x=DQ;</b></p><p>  d

132、elay_18b20(15);</p><p><b>  }</b></p><p>  /** 讀一個字節**/</p><p>  uchar read_byte()</p><p><b>  {</b></p><p>  uchar i=0;</p>

133、<p>  uchar dat=0;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p><b>  DQ=0;</b></p><p><b>  dat>>=1;</b></p&

134、gt;<p><b>  DQ=1;</b></p><p>  if(DQ)dat|=0x80;</p><p>  delay_18b20(5);</p><p><b>  }</b></p><p>  return dat;</p><p><b

135、>  }</b></p><p>  /**寫一個字節**/</p><p>  void write_byte(uchar dat)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  for(i=0;i<8;i++)&l

136、t;/p><p><b>  {</b></p><p><b>  DQ=0;</b></p><p>  DQ=dat&0x01;</p><p>  delay_18b20(5);</p><p><b>  DQ=1;</b></p&g

137、t;<p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /**溫度轉換并讀取溫度**/</p><p>  uint read_temp()</p>

138、;<p><b>  {</b></p><p>  uchar a=0;</p><p>  uchar b=0;</p><p><b>  uint t;</b></p><p>  init_18b20();</p><p>  write_byte(0

139、xcc); //跳過讀序號列號的操作</p><p>  write_byte(0x44);// 啟動溫度轉換 </p><p>  //delay_18b20(100);</p><p>  init_18b20();</p><p>  write_byte(0xcc);//跳過讀序號列號的操作</p><p&

140、gt;  write_byte(0xbe);//讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p>  a=read_byte(); //讀第八位</p><p>  b=read_byte(); //讀高八位</p><p>  if(b&0x80) //高八位的最高位于是否為1,若為1,則為負溫度,若為0,則是0-12

141、8;</p><p><b>  {</b></p><p><b>  flagt=1;</b></p><p><b>  a=~a;</b></p><p><b>  b=~b;</b></p><p><b> 

142、 }</b></p><p>  else flagt=0;</p><p>  t=(b*256+a)*5; //也可以寫成 t=(b*256+a)*0.625 ;return t;</p><p>  return (t>>3); //右移三位相當于5/8=0.625返回溫度有4位,千、百、十、個,轉化后有一位小數位,沒有千位<

143、;/p><p><b>  }</b></p><p><b>  #endif</b></p><p>  LCD1602.h文件:</p><p>  #ifndef _lcd1602_h_</p><p>  #define _lcd1602_h_</p>&

144、lt;p>  #include<ds1302.h></p><p>  #include <intrins.h></p><p>  #define LCD_DB P0 //定義LCD數據接口</p><p>  sbit LCD_RS=P2^6;</p><p>  sbit LCD_RW=P2^5

145、;</p><p>  sbit LCD_EN=P2^7;</p><p><b>  /*測忙信號*/</b></p><p>  bit LCD_check_busy() //檢查LCD是否繁忙函數</p><p><b>  {</b></p><p><b&

146、gt;  bit busy;</b></p><p><b>  LCD_EN=0;</b></p><p><b>  LCD_RS=0;</b></p><p><b>  LCD_RW=1;</b></p><p><b>  LCD_EN=1;&l

147、t;/b></p><p>  _nop_(); </p><p>  _nop_(); </p><p>  _

148、nop_(); </p><p>  //_nop_(); </p><p>  busy=(bit)(P0 & 0x80);</p><p><b>  LCD_EN=0;</b></p><

149、p>  return(busy);</p><p><b>  }</b></p><p><b>  /*寫數據*/</b></p><p>  void write_dat(uchar dat)</p><p><b>  {</b></p><

溫馨提示

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

評論

0/150

提交評論