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

下載本文檔

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

文檔簡介

1、<p>  單片機原理及應(yīng)用課程設(shè)計任務(wù)書</p><p><b>  目錄</b></p><p>  1.硬件電路及原理5</p><p><b>  2.軟件設(shè)計8</b></p><p><b>  3.調(diào)試結(jié)果20</b></p><

2、;p><b>  4.操作說明21</b></p><p><b>  5心得體會21</b></p><p><b>  參考文獻22</b></p><p><b>  1.硬件電路及原理</b></p><p>  1.1方案的總體設(shè)計框

3、圖</p><p>  溫度計電路設(shè)計總體設(shè)計方框圖如圖1所示,控制器采用單片機AT89c51,溫度傳感器采用DS18B20,用12864以串口傳送數(shù)據(jù)實現(xiàn)溫度顯示。</p><p>  圖1 總體設(shè)計方框圖</p><p>  1.1.1 主控制器</p><p>  單片機AT89c51具有低電壓供電和體積小等特點,四個端口只需要兩個口就

4、能滿足電路系統(tǒng)的設(shè)計需要,很適合便攜手持式產(chǎn)品的設(shè)計使用系統(tǒng)可用二節(jié)電池供電。</p><p>  1.1.2 顯示電路</p><p>  顯示電路采用12864液晶顯示,從P0口輸出段碼。</p><p>  1.1.3溫度傳感器</p><p>  DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進型智能溫度傳感器,

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

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

7、器件;</p><p>  ●負(fù)電壓特性,電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; </p><p>  DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部結(jié)構(gòu)框圖如圖2所示。</p><p>  圖2 DS18B20內(nèi)部結(jié)構(gòu)</p><p>  64位ROM的結(jié)構(gòu)開始8位是產(chǎn)品類型的編號,接著是每個器件的惟一的序

8、號,共有48位,最后8位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器TH和TL,可通過軟件寫入戶報警上下限。</p><p>  DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存RAM和一個非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲器,結(jié)構(gòu)如圖3所示。頭2個字節(jié)包含測得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電復(fù)位

9、時被刷新。第5個字節(jié),為配置寄存器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低5位一直為1,TM是工作模式位,用于設(shè)置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設(shè)置為0,用戶要去改動,R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來設(shè)置分辨率。</p><p>  圖3  DS18B20字節(jié)定義</p>

10、;<p>  由表1可見,DS18B20溫度轉(zhuǎn)換的時間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時間越長。因此,在實際應(yīng)用中要將分辨率和轉(zhuǎn)換時間權(quán)衡考慮。</p><p>  高速暫存RAM的第6、7、8字節(jié)保留未用,表現(xiàn)為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。</p><p>  當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開

11、始啟動轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第1、2字節(jié)。單片機可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示。</p><p>  當(dāng)符號位S=0時,表示測得的溫度值為正值,可以直接將二進制位轉(zhuǎn)換為十進制;當(dāng)符號位S=1時,表示測得的溫度值為負(fù)值,要先將補碼變成原碼,再計算十進制數(shù)值。表2是一部分溫度值對應(yīng)的二進制溫度

12、數(shù)據(jù)。</p><p>  表1 DS18B20溫度轉(zhuǎn)換時間表</p><p>  DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比較。若T>TH或T<TL,則將該器件內(nèi)的報警標(biāo)志位置位,并對主機發(fā)出的報警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時測量溫度并進行報警搜索。</p><p>  在64位ROM的最高有效字節(jié)中存儲

13、有循環(huán)冗余檢驗碼(CRC)。主機ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到的ROM數(shù)據(jù)是否正確。</p><p>  表2 一部分溫度對應(yīng)值表</p><p>  另外,由于DS18B20單線通信功能是分時完成的,它有嚴(yán)格的時隙概念,因此讀寫時序很重要。系統(tǒng)對DS18B20的各種操作按協(xié)議進行。操作協(xié)議為:初使化DS18B20(發(fā)復(fù)位脈沖)→發(fā)R

14、OM功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。</p><p>  1.2 DS18B20溫度傳感器與單片機的接口電路</p><p>  DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源。另一種是寄生電源供電方式,如圖4 所示單片機端口接單線總線,為保證在有效的DS18B20時鐘周期內(nèi)提供足夠的電流,可用一個MOSFET管來

15、完成對總線的上拉。</p><p>  當(dāng)DS18B20處于寫存儲器操作和溫度A/D轉(zhuǎn)換操作時,總線上必須有強的上拉,上拉開啟時間最大為10us。采用寄生電源供電方式時VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。</p><p><b>  2.軟件設(shè)計</b></p><p>  #include<reg51.h>

16、;</p><p>  #include<intrins.h></p><p>  #include<math.h></p><p>  #define uchar unsigned char</p><p>  #define uint unsigned int</p><p>  #defi

17、ne port P0 //DB0~DB7數(shù)據(jù)口</p><p>  #define beep P2^6</p><p>  sbit e=P2^0;//使能</p><p>  sbit rw=P2^1;//讀寫</p><p>  sbit rs=P2^2;//數(shù)據(jù)/命令</p><p>  sbit cs2=P2

18、^3;//片選</p><p>  sbit cs1=P2^4;</p><p>  sbit busy=P0^7;//檢測忙</p><p>  sbit DQ=P3^0; //定義DS18B20數(shù)據(jù)端口</p><p>  uchar fuhao;//負(fù)號寄存器</p><p>  sbit P2_6=P2^6;

19、//蜂鳴器數(shù)據(jù)口</p><p>  sbit P1_0=P1^0;//下限加鍵</p><p>  sbit P1_1=P1^1;//下限減鍵</p><p>  sbit P1_2=P1^2;//上限加鍵</p><p>  sbit P1_3=P1^3;//上限減鍵</p><p><b>  u

20、int j=0;</b></p><p>  int th=10;//上限默認(rèn)值</p><p>  int tl=-12;//下限默認(rèn)值</p><p>  uint s=0,m=0,h=0;//時分秒初始值</p><p>  uchar code hz[][32]={</p><p>  {0x00,

21、0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,</p><p>  0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00},</p><p><b>  //"電

22、",2</b></p><p>  {0x40,0x20,0x58,0x47,0x54,0x54,0x54,0x54,0x54,0x54,0xD4,0x14,0x06,0x04,0x00,0x00,</p><p>  0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x40,0x80,0x70,

23、0x00},</p><p><b>  //"氣",3</b></p><p>  {0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00,</p><p>  0x10,0x10,0x10,0x10,0x10,0x1

24、0,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00},</p><p><b>  //"二",4</b></p><p>  {0x84,0x84,0xFC,0x84,0x06,0xF4,0x00,0xFF,0x00,0x84,0x84,0xFC,0x84,0x86,0x04,0x00,<

25、/p><p>  0x20,0x60,0x3F,0x10,0x92,0x41,0x38,0x07,0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00},</p><p><b>  //"班",5</b></p><p>  {0x00,0xFE,0x22,0x5A,0x86,0x08,0x88,0x

26、48,0x38,0x0F,0xE8,0x08,0x88,0x0C,0x08,0x00,</p><p>  0x00,0xFF,0x04,0x08,0x07,0x20,0x11,0x0D,0x41,0x81,0x7F,0x01,0x05,0x19,0x30,0x00},</p><p><b>  /*"陳",4*/</b></p>

27、<p>  {0x50,0x4C,0x44,0x44,0x44,0x44,0x45,0xC6,0x44,0x44,0x44,0x44,0x44,0x54,0x4C,0x00,</p><p>  0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p><p><

28、;b>  /*"寧",5*/</b></p><p><b>  };</b></p><p>  uchar code time[][32]={</p><p>  {0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,0x90,0x10,0x10,0x10,0xFF,0x10

29、,0x10,0x00,</p><p>  0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00},</p><p><b>  //"時",0</b></p><p>  {0x00,0x80,0x40,0x20,0x

30、98,0x86,0x80,0x80,0x83,0x8C,0x90,0x20,0xC0,0x80,0x80,0x00,</p><p>  0x01,0x00,0x80,0x40,0x20,0x1F,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x01,0x00,0x00},</p><p><b>  //"分",1</b>

31、;</p><p>  {0x20,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x80,0x70,0x00,0xFF,0x00,0x10,0x20,0x60,0x00,</p><p>  0x10,0x08,0x06,0x01,0xFF,0x00,0x81,0x80,0x40,0x20,0x17,0x08,0x04,0x03,0x00,0x00}</p>

32、<p><b>  //"秒",2</b></p><p><b>  };</b></p><p>  uchar code num[][16]={</p><p>  {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,

33、0x20,0x10,0x0F,0x00},</p><p><b>  //"0",0</b></p><p>  {0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00},</p><p><b>  //&

34、quot;1",1</b></p><p>  {0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00},</p><p><b>  //"2",2</b></p><p>  {0x00,0x3

35、0,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00},</p><p><b>  //"3",3</b></p><p>  {0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24

36、,0x3F,0x24,0x00},</p><p><b>  //"4",4</b></p><p>  {0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00},</p><p><b>  //"

37、;5",5</b></p><p>  {0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00},</p><p><b>  //"6",6</b></p><p>  {0x00,0x38,0x

38、08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00},</p><p><b>  //"7",7</b></p><p>  {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x2

39、2,0x1C,0x00},</p><p><b>  //"8",8</b></p><p>  {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00}</p><p><b>  //"9&qu

40、ot;,9</b></p><p><b>  };</b></p><p>  uchar code sign[][16]={</p><p>  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},</p>

41、<p><b>  //"-",0</b></p><p>  {0x00,0xC0,0xE0,0x30,0x10,0x10,0x10,0x20,0x00,0x07,0x0F,0x18,0x10,0x10,0x10,0x08},</p><p><b>  //"C",1</b></p&

42、gt;<p>  {0x00,0x00,0x30,0x48,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p><p><b>  //"°",2</b></p><p>  {0x00,0x00,0x00,0x00,0x00,0x00,0x00

43、,0x00,0x00,0x30,0x30,0x30,0x00,0x00,0x00,0x00},</p><p><b>  //".",3</b></p><p>  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},</p>

44、;<p><b>  //" ",4</b></p><p>  {0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x31,0x00,0x00,0x00,0x00},</p><p><b>  //":",5</b></

45、p><p>  {0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},</p><p><b>  //"|",6</b></p><p>  {0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x

46、00,0x00,0x01,0x01,0x01,0x0F,0x01,0x01,0x01},</p><p><b>  //"+",7</b></p><p><b>  };</b></p><p><b>  //延時</b></p><p>  void

47、 delay(uint n)</p><p><b>  {</b></p><p><b>  uint i;</b></p><p>  for(;n>0;n--)</p><p>  for(i=200;i>0;i--);</p><p><b>

48、  }</b></p><p><b>  //判斷是否忙</b></p><p>  void check()</p><p><b>  {</b></p><p><b>  rs=0; </b></p><p>  rw=1;

49、 //讀 e=1;</p><p>  port=0x00;</p><p><b>  e=1; </b></p><p>  while(busy);</p><p><b>  e=0;</b></p><p><b>  }</b></p

50、><p><b>  //寫指令</b></p><p>  void sendcommand(uchar command)</p><p><b>  {</b></p><p><b>  check();</b></p><p>  rs=0; //

51、指令</p><p>  rw=0; //寫 e=0;</p><p>  port=command;</p><p><b>  e=1;</b></p><p>  e=0;//寫入指令</p><p><b>  }</b></p><p>

52、<b>  //寫數(shù)據(jù)</b></p><p>  void writedata(uchar dat)</p><p><b>  {</b></p><p><b>  check();</b></p><p>  rs=1; //數(shù)據(jù)</p><p

53、><b>  rw=0;</b></p><p><b>  port=dat;</b></p><p><b>  e=1;</b></p><p><b>  e=0;</b></p><p><b>  }</b><

54、/p><p>  //選屏幕 0--全屏,1--左屏,2--右屏;</p><p>  void select(uint n)</p><p><b>  {</b></p><p><b>  switch(n)</b></p><p><b>  {</b&g

55、t;</p><p>  case 0:cs1=0;cs2=0;break; //低電平選中</p><p>  case 1:cs1=0;cs2=1;break; //cs1左屏</p><p>  case 2:cs1=1;cs2=0;break; //cs2右屏</p><p><b>  } </b&g

56、t;</p><p><b>  }</b></p><p><b>  //頁</b></p><p>  void setpage(uchar page)</p><p><b>  {</b></p><p>  page=page&0x0

57、7;</p><p>  page=page|0xb8;</p><p>  sendcommand(page);</p><p><b>  }</b></p><p><b>  //列</b></p><p>  void setcolumn(uchar column)

58、</p><p><b>  {</b></p><p>  column=column&0x3f;</p><p>  column=column|0x40;</p><p>  sendcommand(column);</p><p><b>  }</b><

59、;/p><p><b>  //起始行</b></p><p>  void setline(uchar line)</p><p><b>  {</b></p><p>  line=line&0x3f;</p><p>  line=line|0xc0;</p

60、><p>  sendcommand(line);</p><p><b>  }</b></p><p>  //屏幕開關(guān)顯示 0--關(guān),1--開;</p><p>  void seton(uint n)</p><p><b>  {</b></p><

61、p><b>  n=n|0x3e;</b></p><p>  sendcommand(n);</p><p><b>  }</b></p><p>  //清屏 0--全屏,1--左屏,2--右屏;</p><p>  void clear(uint n)</p><p

62、><b>  {</b></p><p>  uchar i,j;</p><p>  select(n);</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  setpage(i);</p>

63、;<p>  setcolumn(0);</p><p>  for(j=0;j<64;j++)</p><p>  writedata(0); //置0清空</p><p><b>  }</b></p><p><b>  }</b></p><p>

64、;<b>  //初始化</b></p><p>  void init()</p><p><b>  {</b></p><p><b>  check();</b></p><p><b>  seton(1);</b></p><

65、;p><b>  clear(0);</b></p><p>  setline(0);</p><p><b>  }</b></p><p>  //顯示漢字 16*16顯示</p><p>  void show16(uchar page,uchar column,uchar scree

66、n,uchar method,uchar *str)</p><p><b>  {</b></p><p>  uchar i,j;</p><p>  select(screen);</p><p><b>  j=0;</b></p><p>  setpage(pag

67、e);</p><p>  setcolumn(column);</p><p>  for(i=0;i<16;i++)</p><p>  { if(method==1) writedata(~str[j++]);//method為顯示方式。當(dāng)?shù)扔?時,反白。</p><p>  else writeda

68、ta(str[j++]); </p><p><b>  }</b></p><p>  setpage(page+1);</p><p>  setcolumn(column);</p><p>  for(i=0;i<16;i++)</p><p>  { if(method

69、==1) writedata(~str[j++]);</p><p>  else writedata(str[j++]); </p><p><b>  }</b></p><p><b>  } </b></p><p>  //顯示數(shù)字 8*8顯示<

70、/p><p>  void show8(uchar page,uchar column,uchar screen,uchar method,uchar *str)</p><p><b>  {</b></p><p>  uchar i,j;</p><p>  select(screen);j=0;</p>

71、<p>  setpage(page);</p><p>  setcolumn(column);</p><p>  for(i=0;i<8;i++)</p><p>  { if(method==1) writedata(~str[j++]);</p><p>  else writedata

72、(str[j++]); </p><p><b>  }</b></p><p>  setpage(page+1);setcolumn(column);</p><p>  for(i=0;i<8;i++)</p><p>  { if(method==1) writedata(~str[j++]

73、);</p><p>  else writedata(str[j++]); </p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //顯示時間</b></p><p&g

74、t;  void showtime()</p><p><b>  {</b></p><p>  show16(2,24,2,0,time[0]);</p><p>  show16(4,24,2,0,time[1]);</p><p>  show16(6,24,2,0,time[2]);</p>&l

75、t;p>  show8(2,40,2,0,sign[5]);</p><p>  show8(4,40,2,0,sign[5]);</p><p>  show8(6,40,2,0,sign[5]);</p><p>  show8(2,48,2,0,num[h/10]);</p><p>  show8(4,48,2,0,num[m/

76、10]);</p><p>  show8(6,48,2,0,num[s/10]);</p><p>  show8(2,56,2,0,num[h%10]);</p><p>  show8(4,56,2,0,num[m%10]);</p><p>  show8(6,56,2,0,num[s%10]);</p><p&g

77、t;<b>  }</b></p><p><b>  //中斷服務(wù)程序</b></p><p>  timer0() interrupt 1 using 1</p><p><b>  {</b></p><p><b>  j++;</b></p

78、><p>  TH0=15536/256;</p><p>  TL0=15536%256;</p><p>  if(j==20){</p><p><b>  j=0;</b></p><p>  if(++s==60){</p><p>  s=0;if(++m==60)

79、{</p><p>  m=0;if(++h==24)h=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></

80、p><p><b>  //顯示個人信息</b></p><p>  void welcome()</p><p><b>  {</b></p><p>  show16(0,0,1,0,hz[0]);</p><p>  show16(0,16,1,0,hz[1]);<

81、/p><p>  show16(0,32,1,0,hz[2]);</p><p>  show16(0,48,1,0,hz[3]);</p><p>  show16(0,8,2,0,hz[4]);</p><p>  show16(0,40,2,0,hz[5]);</p><p>  show8(2,0,1,0,num[

82、2]);</p><p>  show8(2,8,1,0,num[0]);</p><p>  show8(2,16,1,0,num[0]);</p><p>  show8(2,24,1,0,num[8]);</p><p>  show8(2,32,1,0,num[0]);</p><p>  show8(2,40

83、,1,0,num[4]);</p><p>  show8(2,48,1,0,num[2]);</p><p>  show8(2,56,1,0,num[2]);</p><p>  show8(2,0,2,0,num[3]);</p><p>  show8(2,8,2,0,num[3]);</p><p><

84、b>  }</b></p><p><b>  //蜂鳴器</b></p><p>  void Beep()</p><p><b>  {</b></p><p><b>  uchar y;</b></p><p>  for(y

85、=0;y<200;y++)</p><p><b>  {</b></p><p><b>  delay(1);</b></p><p>  P2_6=!P2_6;</p><p><b>  }</b></p><p><b>  }

86、</b></p><p>  // *******延時函數(shù)******</p><p>  void delay1(unsigned int i)</p><p><b>  {</b></p><p>  while(i--);</p><p><b>  }</b&

87、gt;</p><p>  //*******顯示溫度并判斷是否調(diào)用蜂鳴器函數(shù)******</p><p>  void display(int k)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  if(fuhao!=0) //判斷負(fù)號是否

88、有效</p><p><b>  {</b></p><p>  show8(6,0,1,0,sign[0]);</p><p>  if(tl<0&&k>=abs(tl)*100)Beep();</p><p>  elseif(tl>=0)Beep();</p>&l

89、t;p>  if(th<0&&k<=abs(th)*100)Beep();</p><p><b>  }</b></p><p>  else{show8(6,0,1,0,sign[4]);if(k>=th*100||k<tl*100)Beep();}</p><p>  if(k/10000=

90、=0)show8(6,8,1,0,sign[4]);</p><p>  elseshow8(6,8,1,0,num[k/10000]);</p><p>  if(k/1000==0)show8(6,16,1,0,sign[4]);</p><p>  elseshow8(6,16,1,0,num[k/1000%10]);</p><p&g

91、t;  show8(6,24,1,0,num[k/100%10]);</p><p>  show8(6,32,1,0,sign[3]);</p><p>  show8(6,40,1,0,num[k/10%10]);</p><p>  show8(6,48,1,0,num[k%10]);</p><p>  show8(6,56,1,0,

92、sign[2]);</p><p>  show8(6,0,2,0,sign[1]);</p><p><b>  }</b></p><p>  //*******初始化函數(shù)*******</p><p>  Init_DS18B20(void)</p><p><b>  {<

93、/b></p><p>  uchar x=0;</p><p>  DQ=1;//DQ復(fù)位</p><p>  delay1(8); //稍作延時</p><p>  DQ=0; //單片機將DQ拉低</p><p>  delay1(80); //精確延時大于480us</p&

94、gt;<p>  DQ=1; //拉高總線</p><p>  delay1(14); </p><p>  x=DQ;//稍做延時后,如果x=0則初始化成功;x=1則初始化失敗</p><p>  delay1(20);</p><p><b>  }</b></p>&

95、lt;p>  //*******讀一個字節(jié)*******</p><p>  ReadOneChar(void)</p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uint dat=0;</p><p>  for(i=8;i>0;i

96、--)</p><p><b>  {</b></p><p>  DQ=0; //給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DQ=1; //給脈沖信號</p><p><b>  if(DQ)&l

97、t;/b></p><p>  dat|=0x80;</p><p>  delay1(4);</p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b></p><p>  //

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

99、  {</b></p><p><b>  DQ=0;</b></p><p>  DQ=dat&0x01;</p><p>  delay1(5);</p><p><b>  DQ=1;</b></p><p><b>  dat>&g

100、t;=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //******讀取溫度*******</p><p>  ReadTemperature(void)</p><p><b>  {

101、</b></p><p>  uchar a=0;</p><p>  uchar b=0;</p><p><b>  uint t=0;</b></p><p>  float tt=0;</p><p>  Init_DS18B20();</p><p>

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

103、/讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度</p><p>  a=ReadOneChar(); //低位</p><p>  b=ReadOneChar(); //高位</p><p>  fuhao=b&0x80;</p><p>  if(fuhao!=0) //判斷溫度是否為負(fù)</p>&

104、lt;p>  { //負(fù)溫度的計算方法</p><p><b>  b=~b;</b></p><p><b>  a=~a;</b></p><p>  tt=((b*256)+a+1)*0.0625;</p><p>  tt=tt*100;</p><p&

105、gt;  t=(int)tt;</p><p><b>  }</b></p><p><b>  else </b></p><p>  { //正溫度的計算方法</p><p>  tt=((b*256)+a)*0.0625;</p><p>  tt=

106、tt*100;</p><p>  t=(int)tt;</p><p><b>  }</b></p><p>  return (t);</p><p><b>  }</b></p><p>  //顯示溫度上下限值</p><p>  void

107、 showT()</p><p><b>  {</b></p><p>  if(tl<0)show8(4,0,1,0,sign[0]);</p><p>  elseshow8(4,0,1,0,sign[4]);</p><p>  if(abs(tl)/100==0)show8(4,8,1,0,sign[4

108、]);</p><p>  elseshow8(4,8,1,0,num[abs(tl)/100]);</p><p>  if(abs(tl)/10==0)show8(4,16,1,0,sign[4]);</p><p>  elseshow8(4,16,1,0,num[abs(tl)/10%10]);</p><p>  show8(4

109、,24,1,0,num[abs(tl)%100%10]);</p><p>  show8(4,32,1,0,sign[6]);</p><p>  if(th<0)show8(4,40,1,0,sign[0]);</p><p>  elseshow8(4,40,1,0,sign[4]);</p><p>  if(abs(th)/

110、100==0)show8(4,48,1,0,sign[4]);</p><p>  elseshow8(4,48,1,0,num[abs(th)/100]);</p><p>  if(abs(th)/10==0)show8(4,56,1,0,sign[4]);</p><p>  elseshow8(4,56,1,0,num[abs(th)/10%10]);&

111、lt;/p><p>  show8(4,0,2,0,num[abs(th)%100%10]);</p><p><b>  }</b></p><p>  //按鍵調(diào)節(jié)溫度上下限值</p><p>  void welcome1()</p><p><b>  {</b>&l

112、t;/p><p>  if(P1_0==0){delay(250);tl+=1;}</p><p>  if(P1_1==0){delay(300);tl-=1;}</p><p>  if(P1_2==0){delay(300);th+=1;}</p><p>  if(P1_3==0){delay(300);th-=1;}</p>

113、;<p><b>  showT();</b></p><p><b>  }</b></p><p>  //********主函數(shù)*******</p><p>  void main(void)</p><p><b>  {</b></p>

114、<p><b>  uint i=0;</b></p><p><b>  init();</b></p><p>  delay(300);//延時小于500MS</p><p>  welcome();</p><p>  TMOD=0x01;</p><p>

115、  TH0=15536/256;//定時器初值</p><p>  TL0=15536%256;</p><p>  EA=1; //開總中斷</p><p>  ET0=1;//開T0中斷</p><p>  TR0=1; //啟動T0</p><p><b>  while(1)</b><

116、;/p><p><b>  { </b></p><p>  showtime();</p><p>  welcome1();</p><p>  i=ReadTemperature(); //讀溫度</p><p>  display(i); //顯示溫度</p><p

117、><b>  }</b></p><p><b>  } </b></p><p><b>  3.調(diào)試結(jié)果</b></p><p><b>  結(jié)果如下圖所示:</b></p><p><b>  4.操作說明</b><

118、/p><p>  在實現(xiàn)數(shù)據(jù)顯示時,p1.0口與p1.1口接出的開關(guān)可以共同實現(xiàn)溫度下限的增大與減小,其中p1.0口的是實現(xiàn)下限值的增大,而p1.1口的是實現(xiàn)下限值的減小。P1.2口與p1.3口接出的開關(guān)可以共同實現(xiàn)溫度上限的增大與減小,其中p1.3口是實現(xiàn)上限值的增大,p1.3口是實現(xiàn)上限值的減小。而溫度的調(diào)節(jié)是通過調(diào)節(jié)DS18B20的兩個按鈕來實現(xiàn)的。</p><p>  5.心得體會

119、 本次課程設(shè)計長達兩周,在這兩周里,我收獲了很多。剛開始我們做了些基礎(chǔ)的程序設(shè)計,有的甚至是以前實驗做過的程序,這次再加以鞏固。從后面用12864顯示器顯示自己個人信息開始就基本上上進入了這次課程設(shè)計的題目。</p><p>  在設(shè)計數(shù)字溫度計的過程中,我接觸到了很多新的知識,比如:字模提取軟件、12864顯示器以及DS18B20溫度傳感器等。在面對這些新的知識時,我學(xué)會了更好的應(yīng)用現(xiàn)有的書籍、網(wǎng)絡(luò)、同學(xué)等

120、資源來學(xué)習(xí)這些新的知識,更好的應(yīng)用它們。最主要的是單個的元器件需要通過AT89C51芯片使它們連接在一起,更好的發(fā)揮作用,而本次課程設(shè)計感覺最難的就是在對這些元器件的綜合上,很難使它們發(fā)揮最大的功效,達到理想的效果,總是會出現(xiàn)這樣或者那樣的問題,而且由于自己以前C語言基礎(chǔ)不是特別好,所以在編程時遇到的困難就比較多,很多時候知道要通過怎樣的方式來實現(xiàn)這樣的功能,但就是不能將自己的邏輯思維轉(zhuǎn)化為程序。每次遇到這樣的問題,我就會和同學(xué)一起進行

121、一些討論,將每個人的優(yōu)勢進行整合,已達到我們想要的結(jié)果。</p><p>  通過這次課程設(shè)計,讓我更加清楚的知道了自己的劣勢,以便自己在以后的學(xué)習(xí)中能夠加強這方面的能力,同時,這次課程設(shè)計讓我學(xué)會了更好的利用自己的資源來解決問題,相信這點會對我以后的學(xué)習(xí)和工作起到很大的幫助。</p><p><b>  參考文獻</b></p><p>  

122、[1] 李朝青.單片機原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998</p><p>  [2] 李廣弟.單片機基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994</p><p>  [3] 閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989</p><p>  [4] 廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.</

溫馨提示

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

評論

0/150

提交評論