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

下載本文檔

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

文檔簡介

1、<p>  計算機控制技術(shù)綜合應(yīng)用設(shè)計</p><p>  題目 數(shù)字溫度計 </p><p>  二級學(xué)院 電子信息與自動化學(xué)院 </p><p>  專 業(yè) 電氣工程及其自動化 </p><

2、;p>  班 級 電氣三班 </p><p><b>  目錄</b></p><p><b>  1、緒論1</b></p><p>  2、設(shè)計的準備工作1</p><p><b>  3、原件介紹1<

3、;/b></p><p>  3.1、 STC89C52的功能特性1</p><p>  3.2、 DS18B20的特點3</p><p>  4、設(shè)計步驟及原理4</p><p><b>  4.1方案框圖4</b></p><p>  4.2、程序設(shè)計4</p>

4、<p>  4.2.1程序流程圖4</p><p>  4.2.2定義變量5</p><p>  4.2.3 主程序6</p><p>  4.2.4 初始化DS18B20. ... ... ... ... ... ... ... ... ... ... 7</p><p>  4.2.5 DS18B20讀寫字節(jié)... .

5、.. ... ... ... ... ... ... ... ... 8</p><p>  4.2.6 讀取溫度... ... ... ... ... ... ... ... ... ... ... ...8</p><p>  4.2.7 數(shù)碼管顯示9</p><p>  4.3、電路硬件設(shè)計及Proteus軟件仿真9</p><p&g

6、t;  4.3.1、時鐘電路與復(fù)位電路9</p><p>  4.3.2 數(shù)碼管顯示10</p><p>  4.3.3 鍵位控制11</p><p>  4.3.4 總仿真圖11</p><p>  5、設(shè)計結(jié)果及分析12</p><p>  6、總結(jié)及心得體會12</p><p>

7、;<b>  7、附錄13</b></p><p>  (1)、元器件清單13</p><p> ?。?)、源程序:13</p><p><b>  1、緒論</b></p><p>  隨著人們生活水平的不斷提高,單片機控制無疑是人們追求的目標之一,它所給人帶來的方便也是不可否定的,其中數(shù)字

8、溫度計就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活提供更好的更方便的設(shè)施就需要從單片機技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展。</p><p>  本次課程設(shè)計,就是用單片機實現(xiàn)溫度控制,傳統(tǒng)的溫度檢測大多以熱敏電阻為溫度傳感器,但熱敏電阻的可靠性差,測量溫度準確率低,而且必須經(jīng)過專門的接口電路轉(zhuǎn)換成數(shù)字信號才能由單片機進行處理。本次采用DS18B20數(shù)字溫度傳感器來實現(xiàn)基于

9、51單片機的數(shù)字溫度計的設(shè)計。</p><p>  本次課程設(shè)計的具體要求:</p><p>  a)、使用溫度傳感器(模擬或數(shù)字式)測量環(huán)境溫度</p><p>  b)、測量結(jié)果顯示到LED數(shù)碼管上</p><p>  c)、系統(tǒng)工作滿足一般的溫度檢測要求</p><p><b>  擴展要求:</

10、b></p><p>  *、可設(shè)定溫度報警閾值</p><p>  *、可存儲、查看最高溫度和最低溫度</p><p><b>  2、設(shè)計的準備工作</b></p><p>  由于本設(shè)計是測溫電路,功能不是太復(fù)雜,STC89C52單片機完全可以滿足要求,而測溫部分采用可以使用熱敏電阻之類的器件利用其感溫效應(yīng),

11、在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉(zhuǎn)換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,但是這種設(shè)計需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。進而考慮到用溫度傳感器,在單片機電路設(shè)計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉(zhuǎn)換,就可以滿足設(shè)計要求。在顯示部分設(shè)計要求中要求溫度顯示在數(shù)碼管上,我們考慮到傳感

12、器的測溫范圍大致為—55℃~125℃,精度也可精確到小數(shù),所以決定采用四位共陽極數(shù)碼管。</p><p>  軟件方面,編程用C語言,我們決定采用常用的keil軟件來進行程序的編寫與編譯,并生成.hex文件。再用proteus仿真軟件畫出電路圖,進行仿真,其中proteus軟件是目前最好的仿真單片機及外圍器件的工具。雖然目前國內(nèi)推廣剛起步,但已受到單片機愛好者、從事單片機教學(xué)的教師、致力于單片機開發(fā)應(yīng)用的科技工作

13、者的青睞。</p><p>  除此之外,就是準備焊接實物的工具,焊鐵、導(dǎo)線等等。</p><p><b>  3、原件介紹</b></p><p>  3.1、 STC89C52的功能特性</p><p>  STC89C52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash 存儲器。在單芯片

14、上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 具有以下標準功能: 8K字節(jié)Flash,512字節(jié)RAM, 32 位I/O 口線,看門狗定時器,內(nèi)置4KB EEPROM,MAX810復(fù)位電路,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口。另外 STC89X52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式。空閑模式下,CPU

15、 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。最高運作頻率35Mhz,6T/12T可選。 </p><p>  3.2、 DS18B20的特點</p><p>  本設(shè)計的測溫系統(tǒng)采用芯片DS18B20,DS18B20是DALLAS公司的最新單線數(shù)字溫度傳感器,它的體積更小,適用

16、電壓更寬,更經(jīng)濟。</p><p><b>  實現(xiàn)方法簡介</b></p><p>  DS18B20采用外接電源方式工作,一線測溫一線與STC89C51連接,測出的數(shù)據(jù)放在寄存器中,將數(shù)據(jù)經(jīng)過BCD碼轉(zhuǎn)換后送到LED顯示。</p><p>  DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱

17、敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下:</p><p>  ●獨特的單線接口僅需要一個端口引腳進行通信;</p><p>  ●多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能;</p><p><b>  ●無須外部器件;</b>&l

18、t;/p><p>  ●可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;</p><p><b>  ●零待機功耗;</b></p><p>  ●溫度以9或12位數(shù)字;</p><p>  ●用戶可定義報警設(shè)置;</p><p>  ●報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;&l

19、t;/p><p>  ●負電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p>  圖1.DS18B20的原理圖</p><p>  圖2.DS18B20的內(nèi)部結(jié)構(gòu)</p><p><b>  4、設(shè)計步驟及原理</b></p><p><b>  4.1方案

20、框圖</b></p><p>  基于STC89C52單片機的數(shù)字溫度計設(shè)計由STC89C52單片機控制器、電源、顯示電路、溫度傳感器、復(fù)位電路和時鐘電路組成,系統(tǒng)框圖如圖1所示。電源給整個電路供電,顯示電路顯示溫度值,時鐘電路為STC89C52提供時鐘頻率。傳感器采用美國DALLAS半導(dǎo)體公司生產(chǎn)的一種智能溫度傳感器DS18B20,其測溫范圍為-55~125℃,最高分辨率可達0.0625℃,完全符合

21、設(shè)計要求。</p><p><b>  圖3.系統(tǒng)框圖</b></p><p><b>  4.2、程序設(shè)計</b></p><p>  4.2.1程序流程圖</p><p>  主程序的主要功能是負責(zé)溫度的實時顯示、讀出并處理DS18B20測量的當前溫度值,溫度測試每1S進行一次。這樣可以在1S之

22、內(nèi)測量一次被測溫度,其程序流程圖如下圖所示。</p><p>  讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),其程序流程圖下圖所示。</p><p><b>  圖4.程序流程圖</b></p><p>  溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,采用12位分辨率轉(zhuǎn)換時間約為750ms。程序設(shè)計中采用1s顯示程序延時等待轉(zhuǎn)換的完成。計算

23、溫度子程序?qū)AM中讀取值進行BCD碼地轉(zhuǎn)換運算,并進行溫度值正負的判定,顯示數(shù)據(jù)刷新子程序主要是對顯示緩沖器中的顯示數(shù)據(jù)進行刷新操作,當最高顯示位為0時將符號顯示位移入下一位</p><p><b>  4.2.2定義變量</b></p><p>  sbit DATA = P1^1; //DS18B20接入口</p><p>  ucha

24、r code table[]={0xc0,0xf9,0xa4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xc1,0x86,0x8e};//共陽極字型碼</p><p>  int temp; //溫度值</p><p>  int ss;//中間的一個變量</p><p><b>  i

25、nt dd;</b></p><p><b>  int j;</b></p><p>  uchar data b;//定時器中斷次數(shù)</p><p>  uchar data buf[4];//字型顯示中間變量</p><p>  int alarmH=300; //默認報警值</p>

26、<p>  int alarmL=100;</p><p>  //定義開關(guān)的接入口</p><p>  sbit k1=P2^5;//+</p><p>  sbit k2=P2^6;//-</p><p>  sbit k3=P2^7;//確認</p><p>  sbit k4=P2^4; //

27、切換</p><p>  sbit bell=P1^0; //蜂鳴器</p><p>  sbit HLight=P1^2; //正溫指示燈</p><p>  sbit LLight=P1^3; //負溫度指示燈</p><p>  sbit Red=P1^6; //溫度上限設(shè)置指示燈</p><p> 

28、 sbit Green=P1^7; //溫度下限設(shè)置指示燈</p><p>  bit set=0;//初始化</p><p>  bit Flag=0;//設(shè)置標志</p><p><b>  int n;</b></p><p><b>  //函數(shù)的聲明區(qū)</b></p>

29、<p>  void key_to1();</p><p>  void key_to2();</p><p>  void delay(uint); </p><p>  void key();</p><p>  void Show();</p><p><b>  4.2.3 主程序</

30、b></p><p>  void Show() //顯示函數(shù),分別表示溫度正負值</p><p>  { if(temp>=0)</p><p>  {display();}</p><p>  if(temp<0)</p><p>  {display00();}</p>

31、<p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  TCON=0x01; //定時器T0工作在01模式下</p><p>  TMOD=0X01;</p><p>  TH0=

32、0XD8;//裝入初值</p><p><b>  TL0=0XF0;</b></p><p>  EA=1; //開總中斷</p><p>  ET0=1; //開T0中斷</p><p>  TR0=1; //T0開始運行計數(shù)</p><p>  EX0=1; //開外部中斷0</p&

33、gt;<p>  for(n=0;n<500;n++)//顯示啟動LOGo"- - - -"</p><p>  {bell=1;warn=1;logo();}</p><p><b>  Red=0;</b></p><p><b>  while(1)</b></p>

34、<p><b>  {</b></p><p><b>  key(); </b></p><p>  ss=ReadTemperature();</p><p><b>  Show();</b></p><p>  alarm(); //報警函數(shù)</

35、p><p>  if(Flag==1)</p><p>  {bell=!bell;</p><p>  4.2.4初始化DS18B20</p><p>  Init_DS18B20(void) //傳感器初始化</p><p><b>  {</b></p><p>

36、  uchar x=0;</p><p>  DATA = 1; //DQ復(fù)位</p><p>  delay(10); //稍做延時</p><p>  DATA = 0; //單片機將DQ拉低</p><p>  delay(80); //精確延時 大于 480us //450</p><p>

37、  DATA = 1; //拉高總線</p><p>  delay(20);</p><p>  x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><p>  delay(30);</p><p><b>  }</b></p><p>  4.

38、2.5 DS18B20讀寫字節(jié)</p><p>  ReadOneChar(void) //讀一個字節(jié)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat = 0;</p><p>  for (i=8;i>0;i--

39、)</p><p><b>  {</b></p><p>  DATA = 0; // 給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DATA = 1; // 給脈沖信號</p><p><b>  if(DAT

40、A)</b></p><p>  dat|=0x80;</p><p><b>  delay(8);</b></p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b><

41、;/p><p>  WriteOneChar(unsigned char dat)//寫一個字節(jié)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  for (i=8; i>0; i--)</p><p><b>  {</b&

42、gt;</p><p><b>  DATA = 0;</b></p><p>  DATA = dat&0x01;</p><p>  delay(10);</p><p><b>  DATA = 1;</b></p><p><b>  dat>

43、>=1;</b></p><p><b>  }</b></p><p><b>  delay(8);</b></p><p><b>  }</b></p><p>  4.2.6 讀取溫度</p><p>  int ReadTe

44、mperature(void) //讀取溫度</p><p><b>  {</b></p><p>  uchar a=0;</p><p>  uchar b=0;</p><p><b>  int t=0;</b></p><p>  float tt=0;</

45、p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC)

46、; //跳過讀序號列號的操作</p><p>  WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p>  a=ReadOneChar();//低位</p><p>  b=ReadOneChar();//高位</p><p><b>  t=b;</b><

47、;/p><p><b>  t<<=8;</b></p><p><b>  t=t|a;</b></p><p>  tt=t*0.0625;</p><p>  t= tt*10+0.5; </p><p>  return(t);</p><

48、p><b>  }</b></p><p>  4.2.7 數(shù)碼管顯示</p><p><b>  P0=0xff;</b></p><p>  P2=0xf2; //顯示小數(shù)點</p><p>  P0=0x7f; //顯示小數(shù)點</p><p>  delay(30

49、0);</p><p>  P2=0xf0; // 初始燈為滅的</p><p><b>  P0=0xff;</b></p><p>  P2=0xf8; //片選LCD1</p><p>  P0=table[buf[1]];</p><

50、;p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0xf4; //片選LCD2</p><p>  P0=table[buf[2]];</p

51、><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0Xf2; //片選LCD3</p><p>  P0=table[buf

52、[3]];</p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p><b>  P2=0Xf1;</b></p><p>  P0=table

53、[buf[0]]; //片選LCD4</p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  }</b></p><p>  4.3、電路硬件設(shè)計及Proteus軟件仿真</p><p>  4.3

54、.1、時鐘電路與復(fù)位電路</p><p>  8k字節(jié)Flash,256字節(jié)RAM, 32 位I/O 口線,看門狗定時器,2 個數(shù)據(jù)指針,三個16 位 定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全雙工串行口, 片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏 輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU 停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工 作。掉電保護方式下,RAM內(nèi)容被

55、保存,振蕩器被凍結(jié),單片機一切工作停止,直到下一個中斷或硬件復(fù)位為止。8 位微控制器 8K 字節(jié)在系統(tǒng)可編程 Flash AT89S52</p><p>  圖5.時鐘電路與復(fù)位電路</p><p>  4.3.2數(shù)碼管顯示</p><p>  圖6.數(shù)碼顯示部分仿真圖</p><p>  其中P0.0~P0.7分別控制數(shù)碼管的管段、小數(shù)點。

56、P2.0~P2.3分別控制片選位,丄拉電阻為4.7KΩ,上拉就是將不確定的信號通過一個電阻鉗位在高電平,電阻同時起限流作用,上拉電阻是用來解決總線驅(qū)動能力不足時提供電流的問題的。一般說法是上拉增大電流,下拉電阻是用來吸收電流。數(shù)碼管為4位共陽極數(shù)碼管。</p><p><b>  4.3.3鍵位控制</b></p><p>  圖7.鍵位控制部分仿真圖</p&g

57、t;<p>  如圖,P1.6、P1.7及P2.4~P2.7管腳為設(shè)置溫度閾值,發(fā)光二極管D5、D6為設(shè)置時的指示燈,D1、D2分別為超過超過最高設(shè)定溫度時的報警燈和低于最低設(shè)置溫度時的報警燈。</p><p>  4.3.4、總仿真圖</p><p>  圖8.總仿真圖 </p><p><b>  5、設(shè)計結(jié)果及分析<

58、/b></p><p>  系統(tǒng)的性能調(diào)試以(1、主程序)為主。硬件調(diào)試比較簡單,首先檢查電路的焊接是否正確,然后用萬用表測試。軟件調(diào)試可以先編寫顯示程序并進行硬件的正確性檢驗,然后分別進行主程序、從程序的編寫和調(diào)試,由于DS18B20與單片機采用串行數(shù)據(jù)傳送,因此對DS18B20進行編程時必須嚴格地保證讀寫時序,否則將無法讀取測量結(jié)果。</p><p>  性能測試可用制作的溫度計

59、和已有的成品溫度計來同時測量比較,由于DS18B20精度較高,所以誤差指標可以限制在0.1°C以內(nèi),另外,-55°C至+125°C的測溫范圍使得該溫度計完全適用于一般的應(yīng)用場合,其低電壓供電的特性可做成電池供電的手持電子溫度計。</p><p><b>  6、總結(jié)及心得體會</b></p><p>  兩個星期的課程設(shè)計,從了解各個芯片

60、的性能特點到合理設(shè)計硬件電路,從從數(shù)字溫度計設(shè)計方案框圖到編寫相應(yīng)的程序,從proteus仿真到模塊焊接,再到系統(tǒng)性能調(diào)試。每一步都深深地體會到其中的不容易。</p><p>  開始設(shè)計方案時,必須熟悉原件的特點,引腳的含義,這都靠自己翻閱書籍和上網(wǎng)查找。為后面的總體設(shè)計打好基礎(chǔ)。編寫程序必須與Proteus相結(jié)合,才能保證程序的準確性。模塊焊接就是考驗?zāi)愕膭邮帜芰?。這過程中,需要耐心,耐心,再耐心,細心,細心

61、,再細心。最后的性能調(diào)試,不斷發(fā)現(xiàn)問題,然后解決問題。</p><p>  這次課程設(shè)計很好地全方位地培養(yǎng)了我們的能力,我們的專業(yè)知識,動手能力,獨立工作能力與創(chuàng)造力,書寫技術(shù)報告和編制技術(shù)資料的能力。在專業(yè)知識與研究方法方面為日后的畢業(yè)設(shè)計乃至畢業(yè)后的工作奠定良好的基礎(chǔ)</p><p>  根據(jù)設(shè)計,基于單片機的數(shù)字溫度計由單片機控制器,電源,顯示電路,溫度傳感器,復(fù)位電路和時鐘電路組成

62、。制作簡單,測溫范圍在10度到32度。根據(jù)情況,加入設(shè)置溫度上限和下限的功能以及溫度報警器,誤差范圍控制在0.1℃。這樣會使這個設(shè)計應(yīng)用更廣,性價比更高。</p><p>  針對編寫好的程序進行軟件調(diào)試,在proteus軟件中模擬,電路溫度測試正常。證明系統(tǒng)程序編寫正確。</p><p>  根據(jù)設(shè)計的電路圖焊接實物。針對個各種芯片的引腳特點檢查硬件焊接是否正確。</p>

63、<p>  性能調(diào)試過程中出現(xiàn)的問題及解決方案</p><p> ?。?)LED數(shù)碼管只顯示初始溫度85℃。檢查DS18B20溫度傳感器。發(fā)現(xiàn)焊接電路沒有問題,重新焊接。溫度顯示仍然是85℃,最后發(fā)現(xiàn)是傳感器燒壞,更換后顯示正常。</p><p> ?。?)LED數(shù)碼管顯示不全亮度不夠。檢查LED數(shù)碼管焊接電路。</p><p> ?。?)在proteus

64、模擬的電路圖,在實際焊接時,并不可行。必須查找芯片對應(yīng)的引腳功能。</p><p><b>  參考文獻</b></p><p>  [1] 倪曉軍.單片機原理與接口技術(shù)教程.北京:清華大學(xué)出版社,2009</p><p>  [2] 林立 張俊亮 《單片機原理及應(yīng)用》 北京:電子工業(yè)出版社,2009</p><p

65、>  [3]  李廣弟.單片機基礎(chǔ). 北京:北京航空航天大學(xué)出版社,1994</p><p><b>  7、附錄</b></p><p><b>  (1)、元器件清單</b></p><p>  表1 基于AT89S52單片機的數(shù)字溫度計元件清單</p><p><b> ?。?

66、)、源程序:</b></p><p>  #include<reg52.h></p><p>  #include <intrins.h></p><p>  #define uchar unsigned char </p><p>  #define uint unsigned int<

67、;/p><p>  sbit DATA = P1^1; //DS18B20接入口</p><p>  uchar code table[]={0xc0,0xf9,0xa4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xc1,0x86,0x8e};//共陰極字型碼</p><p>  int temp; /

68、/溫度值</p><p>  int ss;//中間的一個變量</p><p><b>  int dd;</b></p><p><b>  int j;</b></p><p>  uchar data b;//定時器中斷次數(shù)</p><p>  uchar data

69、 buf[4];//字型顯示中間變量</p><p>  int alarmH=300; //默認報警值</p><p>  int alarmL=100;</p><p>  //定義開關(guān)的接入口</p><p>  sbit k1=P2^5;//+</p><p>  sbit k2=P2^6;//-<

70、;/p><p>  sbit k3=P2^7;//確認</p><p>  sbit k4=P2^4; //切換</p><p>  sbit bell=P1^0; //蜂鳴器</p><p>  sbit HLight=P1^2; //正溫指示燈</p><p>  sbit LLight=P1^3; //負溫

71、度指示燈</p><p>  sbit warn=P1^4; //報警指示燈</p><p>  sbit Red=P1^6; //溫度上限設(shè)置指示燈</p><p>  sbit Green=P1^7; //溫度下限設(shè)置指示燈</p><p>  bit set=0;//初始化</p><p>  bi

72、t Flag=0;//設(shè)置標志</p><p><b>  int n;</b></p><p><b>  //函數(shù)的聲明區(qū)</b></p><p>  void key_to1();</p><p>  void key_to2();</p><p>  void de

73、lay(uint); </p><p>  void key();</p><p>  void Show();</p><p><b>  //函數(shù)的定義區(qū)</b></p><p><b>  /*延時子函數(shù)*/</b></p><p>  void delay(uint

74、num)</p><p><b>  {</b></p><p>  while(num--) ;</p><p><b>  }</b></p><p>  //DS18b20溫度傳感器所需函數(shù),分為初始化,讀寫字節(jié),讀取溫度4個函數(shù)</p><p>  Init_DS18

75、B20(void) //傳感器初始化</p><p><b>  {</b></p><p>  uchar x=0;</p><p>  DATA = 1; //DQ復(fù)位</p><p>  delay(10); //稍做延時</p><p>  DATA = 0; //單

76、片機將DQ拉低</p><p>  delay(80); //精確延時 大于 480us //450</p><p>  DATA = 1; //拉高總線</p><p>  delay(20);</p><p>  x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗</p><

77、;p>  delay(30);</p><p><b>  }</b></p><p>  ReadOneChar(void) //讀一個字節(jié)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat =

78、 0;</p><p>  for (i=8;i>0;i--)</p><p><b>  {</b></p><p>  DATA = 0; // 給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DATA = 1; /

79、/ 給脈沖信號</p><p><b>  if(DATA)</b></p><p>  dat|=0x80;</p><p><b>  delay(8);</b></p><p><b>  }</b></p><p>  return(dat);&

80、lt;/p><p><b>  }</b></p><p>  WriteOneChar(unsigned char dat)//寫一個字節(jié)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  for (i=8; i>0;

81、 i--)</p><p><b>  {</b></p><p><b>  DATA = 0;</b></p><p>  DATA = dat&0x01;</p><p>  delay(10);</p><p><b>  DATA = 1;<

82、/b></p><p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  delay(8);</b></p><p><b>  }</b></p><p>

83、  int ReadTemperature(void) //讀取溫度</p><p><b>  {</b></p><p>  uchar a=0;</p><p>  uchar b=0;</p><p><b>  int t=0;</b></p><p>  floa

84、t tt=0;</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); // 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p>  Init_DS18B20();</p><p>  WriteO

85、neChar(0xCC); //跳過讀序號列號的操作</p><p>  WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度</p><p>  a=ReadOneChar();//低位</p><p>  b=ReadOneChar();//高位</p><p><b>  t=b;&

86、lt;/b></p><p><b>  t<<=8;</b></p><p><b>  t=t|a;</b></p><p>  tt=t*0.0625;</p><p>  t= tt*10+0.5; </p><p>  return(t);<

87、/p><p><b>  }</b></p><p>  void display00() //*********顯示負值子函數(shù)</p><p><b>  {</b></p><p>  dd=-(temp-1);</p><p>  buf[1]=dd/100;&

88、lt;/p><p>  buf[2]=dd/100;</p><p>  buf[3]=dd%100/10;</p><p>  buf[0]=dd%10;</p><p><b>  //動態(tài)顯示</b></p><p>  for(j=0;j<5;j++)</p><p&

89、gt;<b>  {</b></p><p>  P2=0xf0; // 初始燈為滅的</p><p><b>  P0=0xff;</b></p><p>  P2=0xf2; //顯示小數(shù)點</p><p>  P0=0x7f; //顯示小數(shù)點</p>

90、<p>  delay(300);</p><p>  P2=0xf0; // 初始燈為滅的</p><p><b>  P0=0xff;</b></p><p>  P2=0xf8; //片選LCD1</p><p><b>  P0=0

91、xbf;</b></p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0xf4; //片選LCD2</p><p

92、>  P0=table[buf[2]];</p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0Xf2; //片選LCD3</p><p>

93、;  P0=table[buf[3]];</p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p><b>  P2=0Xf1;</b></p><

94、p>  P0=table[buf[0]]; //片選LCD4</p><p>  delay(300);</p><p><b>  P2=0xf0;</b></p><p><b>  }</b></p><p><b>  }</b></p>&

95、lt;p><b>  //顯示正值子函數(shù)</b></p><p>  void display()</p><p><b>  {</b></p><p>  buf[1]=temp/1000;//顯示百位</p><p>  buf[2]=temp/100%10;//顯示十位</

96、p><p>  buf[3]=temp%100/10;//顯示個位</p><p>  buf[0]=temp%10; //小數(shù)位</p><p>  for(j=0;j<3;j++) </p><p><b>  {</b></p><p>  P2=0xf0; /

97、/ 初始燈為滅的</p><p><b>  P0=0xff;</b></p><p>  P2=0xf2; //顯示小數(shù)點</p><p>  P0=0x7f; //顯示小數(shù)點</p><p>  delay(300);</p><p>  P2=0xf0; //

98、 初始燈為滅的</p><p><b>  P0=0xff;</b></p><p>  P2=0xf8; //片選LCD1</p><p>  P0=table[buf[1]];</p><p>  delay(300);</p><p><b>  P2

99、=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0xf4; //片選LCD2</p><p>  P0=table[buf[2]];</p><p>  delay(300);</p><p><

100、b>  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p>  P2=0Xf2; //片選LCD3</p><p>  P0=table[buf[3]];</p><p>  delay(300);</p><p><b&g

101、t;  P2=0xf0;</b></p><p><b>  P0=0xff;</b></p><p><b>  P2=0Xf1;</b></p><p>  P0=table[buf[0]]; //片選LCD4</p><p>  delay(300);</p>

102、<p><b>  P2=0xf0;</b></p><p><b>  }</b></p><p>  if (temp>alarmH )</p><p>  {HLight=1;LLight=0;}</p><p>  else if(temp<alarmL

103、)</p><p>  {HLight=0;LLight=1;}</p><p><b>  else</b></p><p>  {HLight=0;LLight=0;}</p><p><b>  }</b></p><p>  void key()//按鍵掃描子

104、程序</p><p>  { if(k1!=1)</p><p><b>  {</b></p><p>  delay(20);</p><p><b>  if(k1!=1)</b></p><p><b>  {</b></p>

105、<p>  while(k1!=1)</p><p>  { key_to1();</p><p>  for(n=0;n<8;n++)</p><p><b>  Show();</b></p><p><b>  }</b></p><p><b&g

106、t;  }</b></p><p><b>  }</b></p><p><b>  if(k2!=1)</b></p><p><b>  {</b></p><p>  delay(20);</p><p><b>  if(

107、k2!=1)</b></p><p><b>  {</b></p><p>  while(k2!=1)</p><p>  { key_to2(); </p><p>  for(n=0;n<8;n++)</p><p><b>  Show();</b>

108、;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p><b>  if(k3!=1)</b></p><p>  {TR0=1; //復(fù)位,

109、開定時</p><p>  temp=ReadTemperature();</p><p><b>  }</b></p><p><b>  if(k4!=1)</b></p><p>  { delay(20);</p><p><b>  if(k4!=1)

110、</b></p><p>  { while(k4!=1);</p><p><b>  set=!set;</b></p><p>  if(set==0)</p><p>  { Red=0;Green=1;}</p><p>  else { Green=0;Red=1;}&l

111、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  void key_to1()</p><p><b>  {</b></p>&

112、lt;p>  TR0=0; //關(guān)定時器</p><p><b>  temp+=10;</b></p><p>  if(temp>=1100)</p><p>  {temp=-550;}</p><p>  if(set==0)</p><p>  {alarmH=

113、temp;}</p><p>  else {alarmL=temp;}</p><p><b>  }</b></p><p>  void key_to2()</p><p><b>  {</b></p><p><b>  TR0=0;</b>

114、</p><p><b>  //關(guān)定時器</b></p><p><b>  temp-=10;</b></p><p>  if(temp<=-550)</p><p>  {temp=1100;}</p><p>  if(set==0)</p>&

115、lt;p>  { alarmH=temp;}</p><p>  else { alarmL=temp;}</p><p><b>  }</b></p><p>  void alarm(void)</p><p><b>  {</b></p><p>  if(t

116、emp>alarmH||temp<alarmL) </p><p>  { //bell=1;</p><p>  //delay(50);</p><p><b>  //bell=0;</b></p><p><b>  Flag=1;</b></p><p&

117、gt;  }else {Flag=0;}</p><p><b>  }</b></p><p>  logo()//開機的Logo </p><p>  { P0=0x40;</p><p><b>  P2=0xf7;</b></p><p>  delay(50)

118、;</p><p><b>  P2=0xfb;</b></p><p>  delay(50);</p><p><b>  P2=0Xfd;</b></p><p>  delay(50);</p><p><b>  P2=0Xfe;</b><

119、;/p><p>  delay(50);</p><p>  P1 = 0xff; //關(guān)閉顯示</p><p><b>  }</b></p><p>  void Show() //顯示函數(shù),分別表示溫度正負值</p><p>  { if(temp>=0)<

120、/p><p>  {display();}</p><p>  if(temp<0)</p><p>  {display00();}</p><p><b>  }</b></p><p>  void main()</p><p><b>  {<

121、/b></p><p>  TCON=0x01; //定時器T0工作在01模式下</p><p>  TMOD=0X01;</p><p>  TH0=0XD8;//裝入初值</p><p><b>  TL0=0XF0;</b></p><p>  EA=1; //開總中斷</p

122、><p>  ET0=1; //開T0中斷</p><p>  TR0=1; //T0開始運行計數(shù)</p><p>  EX0=1; //開外部中斷0</p><p>  for(n=0;n<500;n++)//顯示啟動LOGo"- - - -"</p><p>  {bell=1;warn=1;

123、logo();}</p><p><b>  Red=0;</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p><b>  key(); </b></p><p> 

124、 ss=ReadTemperature();</p><p><b>  Show();</b></p><p>  alarm(); //報警函數(shù)</p><p>  if(Flag==1)</p><p>  {bell=!bell;</p><p>  warn=!warn;} //蜂

125、鳴器滴滴響</p><p>  else {bell=1;</p><p><b>  warn=1;}</b></p><p><b>  } </b></p><p><b>  }</b></p><p>  void time0(void)

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論