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

下載本文檔

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

文檔簡介

1、<p><b>  單片機(jī)應(yīng)用技術(shù)</b></p><p><b>  課程設(shè)計</b></p><p>  學(xué) 生 姓 名: </p><p>  學(xué) 號: </p><p>  年級/

2、專業(yè)/班: 2012級機(jī)電2班 </p><p>  學(xué) 院: 應(yīng)用技術(shù)學(xué)院 </p><p>  指 導(dǎo) 教 師: </p><p><b>  2014年1月</b></p><p><b>  目 錄</b&g

3、t;</p><p><b>  任務(wù)書</b></p><p>  1 單片機(jī)多功能測量儀的設(shè)計1</p><p>  1.1 主要功能1</p><p>  1.2 電路總體方案1</p><p>  1.3 各個功能模塊的說明1</p><p>  1

4、.3.1 STC89C52的主要特點1</p><p>  1.3.2 LCM1602顯示電路2</p><p>  1.3.3 鍵盤電路3</p><p>  1.3.4 光電計數(shù)電路3</p><p>  1.3.5 直流電壓測量電路3</p><p>  1.3.6 溫度測量電路4<

5、/p><p>  1.4 電路原理圖(SCH)4</p><p>  2 應(yīng)用程序設(shè)計5</p><p>  2.1 程序的總體設(shè)計5</p><p>  2.1.1 程序結(jié)構(gòu)框圖5</p><p>  2.1.2 所需要的程序模塊5</p><p>  2.2 主程序的設(shè)計

6、6</p><p>  3 仿真及實際效果圖9</p><p>  3.1 Protues仿真效果圖9</p><p>  4 總結(jié)與致謝11</p><p>  參 考 文 獻(xiàn)11</p><p><b>  附 程序清單</b></p><p>  1 單

7、片機(jī)多功能測量儀的設(shè)計</p><p><b>  1.1 主要功能</b></p><p><b>  主要功能如下:</b></p><p> ?。?) 測量0-5V的直流電壓;用LCM1602液晶顯示電壓值(小數(shù)點后一位);</p><p> ?。?) 測量-30-100℃溫度;用LCM16

8、02液晶顯示溫度值(整數(shù));</p><p>  (3) 對光電傳感器的遮擋次數(shù)進(jìn)行計數(shù)(000-255)。 </p

9、><p>  (4) 按下鍵key1、key2、key3分別顯示電壓、溫度、計數(shù)值。</p><p>  1.2 電路總體方案</p><p>  根據(jù)以上功能,設(shè)計的電路總體方案框圖如下:</p><p>  采用增強(qiáng)型51系列單片機(jī)STC89c52為核心控制器;字符型LCM1602液晶顯示模塊;三個獨立鍵盤;光電計數(shù)單元;一線制的DS18B

10、20集成測溫芯片測量溫度;TLC549為AD,采集直流的0-5v電壓值。</p><p>  1.3 各個功能模塊的說明</p><p>  以下分別描述各功能模塊的電路設(shè)計。</p><p>  1.3.1 STC89C52的主要特點</p><p>  STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS8位微控制器,具有 8

11、K 在系統(tǒng)可編程Flash存儲器。STC89C52使用經(jīng)典的MCS-51內(nèi)核,但做了很多的改進(jìn)使得芯片具有傳統(tǒng)51單片機(jī)不具備的功能。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。 </p><p><b>  主要特性如下:</b></p><p>  增強(qiáng)型8051

12、單片機(jī),6時鐘/機(jī)器周期和12時鐘/機(jī)器周期可以任意選擇,指令代碼完全兼容傳統(tǒng)8051;</p><p>  工作電壓:5.5V~3.3V(5V單片機(jī))/3.8V~2.0V(3V單片機(jī));</p><p>  工作頻率范圍:0~40MHz,相當(dāng)于普通8051的0~80MHz,實際工作頻率可達(dá)48MHz;</p><p>  用戶應(yīng)用程序空間為8K字節(jié);</p&

13、gt;<p>  片上集成512字節(jié)RAM;</p><p>  通用I/O口(32個),復(fù)位后為:P1/P2/P3/P4是準(zhǔn)雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴(kuò)展用時,不用加上拉電阻,作為I/O口用時,需加上拉電阻。</p><p>  ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程),無需專用編程器,無需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1

14、)直接下載用戶程序,數(shù)秒即可完成一片;</p><p>  具有EEPROM功能;</p><p><b>  具有看門狗功能;</b></p><p>  共3個16位定時器/計數(shù)器。即定時器T0、T1、T2;</p><p>  外部中斷2個,下降沿中斷或低電平觸發(fā)電路,Power Down模式可由外部中斷低電平觸發(fā)

15、中斷方式喚醒;</p><p>  通用異步串行口(UART),還可用定時器軟件實現(xiàn)多個UART;</p><p>  工作溫度范圍:-40~+85℃(工業(yè)級)/0~75℃(商業(yè)級)。</p><p>  1.3.2 LCM1602顯示電路</p><p><b>  顯示電路如下;</b></p>&l

16、t;p>  這是一種四線數(shù)據(jù)、2根控制線的接口方法,它與單片機(jī)需要六線連接。</p><p>  1.3.3 鍵盤電路</p><p>  這是一種獨立式鍵盤的電路。</p><p>  1.3.4 光電計數(shù)電路</p><p><b>  電路原理如右;</b></p><p>  采

17、用的是反射式光電開關(guān),如圖OP。74LS14為施密特觸發(fā)器,起整形作用。</p><p>  整形后的信號進(jìn)入89c52的T1計數(shù)器進(jìn)行計數(shù)。</p><p>  1.3.5 直流電壓測量電路</p><p><b>  電路原理圖如下;</b></p><p>  采用TLC549作為AD轉(zhuǎn)換器,TLC549是美國德

18、州儀器公司生產(chǎn)的8位串行A/D轉(zhuǎn)換器芯片,可與通用微處理器、控制器通過CLK、CS、DATA OUT三條口線進(jìn)行串行接口。具有4MHz片內(nèi)系統(tǒng)時鐘和軟、硬件控制電路,轉(zhuǎn)換時間最長17μs, TLC549為40 000次/s。總失調(diào)誤差最大為±0.5LSB,典型功耗值為6mW。</p><p>  TLC549均有片內(nèi)系統(tǒng)時鐘,該時鐘與I/O CLOCK是獨立工作的,無須特殊的速度或相位匹配。</p

19、><p>  仿真時,用一個10k的可調(diào)電阻獲取0-5V的直流電壓。如在實際應(yīng)用中,這個電壓來源于實際被測的直流電壓。</p><p>  1.3.6 溫度測量電路</p><p>  DS18B20是DALLAS公司生產(chǎn)的單總線式數(shù)字溫度傳感器,它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配處理器等優(yōu)點,特別適用于構(gòu)成多點溫度測控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信

20、號(提供9位二進(jìn)制數(shù)字)給單片機(jī)處理,且在同一總線上可以掛接多個傳感器芯片。它具有3引腳TO-92小體積封裝形式,溫度測量范圍為-55℃~+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測溫分辨率可達(dá)0.0625℃ ,被測溫度用符號擴(kuò)展的16位數(shù)字量方式串行輸出,其工作電源既可在遠(yuǎn)端引人,也可采用寄生電源方式產(chǎn)生,多個DS18B20可以并聯(lián)到3根或2根線上,CPU只需一根端口線就能與多個DS18B20通信,占用微處理器的端口較少,可節(jié)省

21、大量的引線和邏輯電路。本儀器采用P3.4作為接口。如左圖。</p><p>  1.4 電路原理圖(SCH)</p><p><b>  2 應(yīng)用程序設(shè)計</b></p><p>  2.1 程序的總體設(shè)計</p><p>  2.1.1 程序結(jié)構(gòu)框圖</p><p>  2.1.2 所

22、需要的程序模塊</p><p>  LCD1602-4.H</p><p><b>  3KEY.H</b></p><p><b>  TLC595.H</b></p><p><b>  DS18B20.H</b></p><p>  2.2 主程

23、序的設(shè)計</p><p>  #include"key.h"</p><p>  #include<lcd1602.h></p><p>  #include<tlc549.h></p><p>  #include<ds18b20.h></p><p>  sb

24、it guangdian=P3^5;</p><p>  uchar i,num1,nummm=2;</p><p>  void Guangdian(void) //光電計數(shù)子程序</p><p><b>  {</b></p><p>  uchar DispBuffer[4];</p><p&g

25、t;  uchar num;</p><p>  num=TH1*256+TL1;</p><p>  DispBuffer[0]=TL1/100+0x30;</p><p>  DispBuffer[1]=TL1%100/10+0x30;</p><p>  DispBuffer[2]=TL1%10+0x30;</p><

26、;p>  DispBuffer[3]='\0';</p><p>  LCD_Prints(6,1," ");</p><p>  LCD_Prints(8,1,DispBuffer);</p><p><b>  }</b></p><p>  void DianYa(voi

27、d) //測量電壓和A/D轉(zhuǎn)換子程序</p><p><b>  {</b></p><p>  uchar bis[6];</p><p><b>  uchar DA;</b></p><p>  DA= AD_TLC549()*50.5/255;</p><p>  

28、bis[0]=DA/10+0x30;</p><p>  bis[1]='.';</p><p>  bis[2]=DA%10+0x30;</p><p>  bis[3]=' ';</p><p>  bis[4]='V';</p><p>  bis[5]='

29、\0';</p><p>  LCD_Prints(6,1,bis);</p><p><b>  }</b></p><p>  void wendu(void)//溫度測量子程序</p><p><b>  {</b></p><p>  char DB[6];

30、 </p><p>  uchar wd=0;</p><p>  Init_DS18B20();</p><p>  wd=ReadTemp();</p><p>  if(wd>128)</p><p>  {wd=256-wd;</p><p>  DB[0]='-'

31、;</p><p><b>  }</b></p><p>  else DB[0]=wd/100+0x30;</p><p>  DB[1]=wd%100/10+0x30;</p><p>  DB[2]=wd%10+0x30;</p><p>  DB[3]=0xdf;</p>

32、<p>  DB[4]='C';</p><p>  DB[5]='\0';</p><p>  LCD_Prints(6,1,DB);</p><p><b>  }</b></p><p>  void caidan (uchar num1)</p><p

33、><b>  {</b></p><p>  switch(num1)</p><p><b>  {</b></p><p>  case 0:{Guangdian();}break;</p><p>  case 1:{DianYa();}break;</p><p&g

34、t;  case 2:{wendu();}break;</p><p><b>  } </b></p><p><b>  }</b></p><p>  void KeyProc(void) //按鍵處理程序</p><p><b>  {</b></p>

35、<p>  uchar key;</p><p>  key=KeyScanNUM();</p><p>  if(key==UP||key==DOWN||key==ENTER)</p><p><b>  {</b></p><p>  switch(key)</p><p>&l

36、t;b>  {</b></p><p>  case UP:{nummm=0;LCD_Prints(1,0,"Photoelectric ");}break;</p><p>  case DOWN:{nummm=1;LCD_Prints(1,0,"Voltage ");}break;</p>&l

37、t;p>  case ENTER:{nummm=2;LCD_Prints(1,0,"Temperature ");}break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  caidan(nummm);</p>&l

38、t;p><b>  }</b></p><p>  void main(void)</p><p><b>  {</b></p><p>  TMOD=0x50;</p><p><b>  TL1=0;</b></p><p><b>

39、;  TH1=0;</b></p><p><b>  TR1=1;</b></p><p>  LCD_Init();</p><p>  LCD_Prints(1,0,"Temperature ");</p><p><b>  while(1)</b>

40、;</p><p><b>  {</b></p><p>  KeyProc();</p><p><b>  }</b></p><p><b>  }</b></p><p>  3 仿真及實際效果圖 </p><p> 

41、 3.1 Protues仿真效果圖</p><p><b>  課程設(shè)計總結(jié)</b></p><p>  這個學(xué)期的單片機(jī)課已經(jīng)早早的上完了,但是理論純屬理論,沒有與實踐的結(jié)合總讓我們學(xué)的不踏實,感覺沒有達(dá)到學(xué)以致用的效果。所慶幸的是在課程介紹考試完之后,老師給我們安排了這次單片機(jī)課程設(shè)計,給了我們學(xué)以致用的做好的實踐。 關(guān)于這次課程設(shè)計,我們花費了比較多的心思,既

42、是對課程理論內(nèi)容的一次復(fù)習(xí)和鞏固,還讓我們豐富了更多與該專業(yè)相關(guān)的其他知識,比如軟件應(yīng)用等,在摸索中學(xué)習(xí),在摸索中成長,在學(xué)習(xí)的過程中帶著問題去學(xué)我發(fā)現(xiàn)效率很高,這是我做這次課程設(shè)計的又一收獲,在真正設(shè)計之前我們做了相當(dāng)豐富的準(zhǔn)備,首先鞏固一下課程理論,再一遍熟悉課程知識的構(gòu)架,然后結(jié)合加以理論分析、總結(jié),有了一個清晰的思路和一個完整的的軟件流程圖之后才著手設(shè)計。在設(shè)計程序時,我們不能妄想一次就將整個程序設(shè)計好,反復(fù)修改、不斷改進(jìn)是程序

43、設(shè)計的必經(jīng)之路;養(yǎng)成注釋程序的好習(xí)慣是非常必要的,一個程序的完美與否不僅僅是實現(xiàn)功能,而應(yīng)該讓人一看就能明白你的思路,這樣也能為資料的保存和交流提供了方便;我覺得在設(shè)計課程過程中遇到問題是很正常,但我們應(yīng)該將每次遇到的問題記錄下來,并分析清楚,以免下次再碰到同樣的問題的課程設(shè)計又出錯了。 除了</p><p><b>  參考文獻(xiàn)</b></p><p>  黃惟公

44、等《單片機(jī)原理及接口技術(shù)》 西安電子科大出版社 2007</p><p>  周景潤等 《基于PROTEUS的電路及單片機(jī)系統(tǒng)設(shè)計與仿真》 北航出版社 2006.5</p><p>  ]韓曉東等《Pretel電路設(shè)計入門與應(yīng)用》 中國鐵道出版社 </p><p><b>  附

45、程序清單 </b></p><p><b>  綜合測量儀程序</b></p><p><b>  主程序</b></p><p>  #include"key.h"</p><p>  #include<lcd1602.h></p>&l

46、t;p>  #include<tlc549.h></p><p>  #include<ds18b20.h></p><p>  sbit LED1=P1^4;</p><p>  sbit LED2=P1^5;</p><p>  sbit LED3=P1^6;</p><p>  sb

47、it guangdian=P3^5;</p><p>  sbit E1 = P2^4;</p><p>  sbit E2 = P2^5;</p><p><b>  uchar i;</b></p><p>  void KeyProc(void) //紅黃燈亮子程序</p><

48、;p><b>  {</b></p><p>  uchar key;</p><p>  key=KeyScanNUM();</p><p>  switch(key)</p><p><b>  {</b></p><p>  case UP:{LED1=1;LED

49、2=1;LED3=0;}break;</p><p>  case DOWN:{LED1=1;LED2=0;LED3=1;}break;</p><p>  case ENTER:{LED1=0;LED2=1;LED3=1;}break;</p><p><b>  }</b></p><p><b>  ke

50、y=0;</b></p><p><b>  }</b></p><p>  void Guangdian(void) //光電計數(shù)子程序</p><p><b>  {</b></p><p>  uchar code dis[]={0xc0,0xf3,0x98,0x92,0xa3,0

51、x86,0x84,0xd3,0x80,0x82,0xff};</p><p>  uchar num;</p><p>  num=TH1*256+TL1;</p><p><b>  switch(i)</b></p><p><b>  {</b></p><p>  c

52、ase 0:P0=dis[num/10];E1=1;E2=0;i=1;break;</p><p>  case 1:P0=dis[num%10];E1=0;E2=1;i=0;break;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void

53、DianYa(void) //測量電壓和A/D轉(zhuǎn)換子程序</p><p><b>  {</b></p><p>  uchar bis[6];</p><p><b>  uchar DA;</b></p><p>  DA= AD_TLC549()*50.5/255;</p>&

54、lt;p>  bis[0]=DA/10+0x30;</p><p>  bis[1]='.';</p><p>  bis[2]=DA%10+0x30;</p><p>  bis[3]=' ';</p><p>  bis[4]='V';</p><p>  bi

55、s[5]='\0';</p><p>  LCD_Prints(0,1,bis);</p><p><b>  }</b></p><p>  void wendu(void)//溫度測量子程序</p><p><b>  {</b></p><p>  c

56、har DB[6]; </p><p>  uchar wd=0;</p><p>  Init_DS18B20();</p><p>  wd=ReadTemp();</p><p>  if(wd>127)</p><p>  {i=256-wd;</p><p>  DB[0]=&

57、#39;-';</p><p><b>  }</b></p><p>  else DB[0]=i/100+0x30;</p><p>  DB[1]=wd%100/10+0x30;</p><p>  DB[2]=wd%10+0x30;</p><p>  DB[3]=0xdf;<

58、;/p><p>  DB[4]='C';</p><p>  DB[5]='\0';</p><p>  LCD_Prints(10,1,DB);</p><p><b>  }</b></p><p>  void main(void)</p><

59、p><b>  {</b></p><p>  TMOD=0x50;</p><p><b>  TL1=0;</b></p><p><b>  TH1=0;</b></p><p><b>  TR1=1;</b></p><

60、p>  LCD_Init();</p><p>  LCD_Prints(0,0,"DianYa");</p><p>  LCD_Prints(10,0,"WenDu");</p><p><b>  while(1)</b></p><p><b>  {<

61、;/b></p><p>  KeyProc();</p><p>  Guangdian();</p><p><b>  DianYa();</b></p><p><b>  wendu();</b></p><p><b>  }</b>&

62、lt;/p><p><b>  }</b></p><p>  LCM1602驅(qū)動函數(shù):LCD1602.h</p><p>  #ifndef __LCD1602_H__</p><p>  #define __LCD1602_H__</p><p>  #include<reg52.h>

63、</p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sfr LCD_DATA=0x90;</p><p>  sbit LCD_RS=P2^6;</p><p>  sbit LCD_EN=P2^7

64、;</p><p>  void LCD_Init(void);</p><p>  void LCD_Prints(uchar x,uchar y,uchar *str);</p><p><b>  #endif</b></p><p>  LCM1602驅(qū)動程序:LCD1602.c</p><p

65、>  #include"lcd1602.h"</p><p>  void LCD_Delay(uchar x)</p><p><b>  {</b></p><p>  while(--x);</p><p><b>  }</b></p><p&g

66、t;  void LCD_En(void)</p><p><b>  {</b></p><p><b>  LCD_EN=1;</b></p><p>  LCD_Delay(4);</p><p><b>  LCD_EN=0;</b></p><p&

67、gt;<b>  }</b></p><p>  void LCD_cmd(uchar cmd)</p><p><b>  {</b></p><p>  uchar cmd1;</p><p><b>  cmd1=cmd;</b></p><p>

68、<b>  cmd1>>=4;</b></p><p>  LCD_Delay(18);</p><p><b>  LCD_RS=0;</b></p><p>  LCD_DATA &=0xf0;</p><p>  LCD_DATA |=cmd1&0x0f;</

69、p><p><b>  LCD_En();</b></p><p>  LCD_DATA &=0xf0;</p><p>  LCD_DATA |=cmd&0x0f;</p><p><b>  LCD_En();</b></p><p><b>  }

70、</b></p><p>  void LCD_Clr(void)</p><p><b>  {</b></p><p>  LCD_cmd(0x01);</p><p>  LCD_Delay(255);</p><p>  LCD_Delay(255);</p>&

71、lt;p>  LCD_Delay(255);</p><p>  LCD_Delay(200);</p><p><b>  }</b></p><p>  void LCD_Init(void)</p><p><b>  {</b></p><p>  LCD_cm

72、d(0x28);</p><p><b>  LCD_En();</b></p><p>  LCD_cmd(0x28);</p><p>  LCD_cmd(0x0c);</p><p>  LCD_Clr();</p><p><b>  }</b></p>

73、<p>  void LCD_Dat(uchar dat)</p><p><b>  {</b></p><p>  uchar dat1;</p><p><b>  dat1=dat;</b></p><p><b>  dat1>>=4;</b>

74、</p><p>  LCD_Delay(18);</p><p><b>  LCD_RS=1;</b></p><p>  LCD_DATA &=0xf0;</p><p>  LCD_DATA |=dat1&0x0f;</p><p><b>  LCD_En();

75、</b></p><p>  LCD_DATA &=0xf0;</p><p>  LCD_DATA |=dat&0x0f;</p><p><b>  LCD_En();</b></p><p><b>  }</b></p><p>  voi

76、d LCD_Pos(uchar x,uchar y)</p><p><b>  {</b></p><p>  if(y)LCD_cmd(x|0xc0);</p><p>  else LCD_cmd(x|0x80);</p><p><b>  }</b></p><p>

77、;  void LCD_Prints(uchar x,uchar y,uchar *str)</p><p><b>  {</b></p><p>  LCD_Pos(x,y);</p><p>  while(*str)</p><p><b>  {</b></p><p&

78、gt;  LCD_Dat(*str);</p><p><b>  str++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  按鍵驅(qū)動函數(shù)及程序KEY.h</p><p>  #ifndef

79、 _KEY_H_</p><p>  #define _KEY_H_</p><p>  #include<reg52.h></p><p>  #define uchar unsigned char</p><p>  #define UP 0x01</p><p>  #define DOWN 0x02

80、</p><p>  #define ENTER 0x03</p><p>  sbit UP_key=P2^2;</p><p>  sbit DOWN_key=P2^1;</p><p>  sbit ENTER_key=P2^0;</p><p>  void ys (unsigned int x)</p&

81、gt;<p><b>  {</b></p><p>  unsigned char j;</p><p>  while (x--)</p><p><b>  {</b></p><p>  for (j=0;j<123;j++){;}</p><p>

82、;<b>  }</b></p><p><b>  }</b></p><p>  uchar KeyScanNUM(void)</p><p><b>  {</b></p><p>  uchar key=0;</p><p>  UP_key=1

83、;DOWN_key=1;ENTER_key=1;</p><p>  if(UP_key==0){ys(10);if(UP_key==0)key=UP;else key=0;}</p><p>  if(DOWN_key==0){ys(10);if(DOWN_key==0)key=DOWN;else key=0;}</p><p>  if(ENTER_key==0

84、){ys(10);if(ENTER_key==0)key=ENTER;else key=0;}</p><p>  return key;</p><p><b>  }</b></p><p>  TCL549驅(qū)動函數(shù)及程序TCL549.h /*-------------------------------------------------

85、-----------</p><p>  功能:TCL549的頭文件</p><p>  ------------------------------------------------------------*/</p><p>  #ifndef __TCL549_H__</p><p>  #define __TCL549_H__&l

86、t;/p><p>  #include<reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  //ADC0832引腳與51單片機(jī)的連接</p><p>  sbit AD_CS

87、 =P3^3; </p><p>  sbit AD_DAT =P3^7; </p><p>  sbit AD_CLK =P3^6; </p><p>  void delay(uint x)</p><p><b>  {</b></p><p>  while(x--);</p&g

88、t;<p><b>  }</b></p><p>  uchar AD_TLC549()</p><p><b>  {</b></p><p>  uchar value=0,i=0;</p><p><b>  AD_CS=0;</b></p>

89、<p><b>  AD_DAT=1;</b></p><p>  for (i=0;i<8;i++)</p><p><b>  {</b></p><p>  if(AD_DAT)value|=(0x80)>>i;</p><p><b>  AD_CLK

90、=1;</b></p><p><b>  AD_CLK=0;</b></p><p>  delay(10);</p><p><b>  }</b></p><p><b>  AD_CS=1;</b></p><p>  delay(5

91、0);</p><p>  return value;</p><p><b>  }</b></p><p><b>  #endif</b></p><p>  智能溫度傳感器DS18B20驅(qū)動函數(shù)DS18B20.h</p><p>  #ifndef _DS18B20_

92、</p><p>  #define _DS18B20_</p><p>  #include<reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit DQ = P

93、3^4; //溫度傳送數(shù)據(jù)接口,根據(jù)實際電路修改</p><p>  //unsigned char temp_value; //存放溫度數(shù)據(jù)</p><p>  //unsigned char TempBuffer[6]; //存放轉(zhuǎn)換成液晶字符的數(shù)組 ××注意此數(shù)組的定義</p><p>  void

94、Init_DS18B20(void); //初始化DS18B20,</p><p>  uchar ReadTemp(void); //讀DS18B20溫度,存入temp_valu</p><p>  //轉(zhuǎn)換結(jié)果正溫度為3位整數(shù),負(fù)溫度為兩位整數(shù);都無小數(shù)部分</p><p>  //void temp_to_str(void);

95、 //溫度數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符(ASIC碼)</p><p><b>  #endif</b></p><p>  智能溫度傳感器DS18B20驅(qū)動程序DS18B20.c</p><p>  #include <REG52.H></p><p>  #include "ds18b20.h&quo

96、t;</p><p>  //sbit DQ = P1^0; //溫度傳送數(shù)據(jù)IO口</p><p>  unsigned char temp_value; //存放溫度數(shù)據(jù)</p><p>  unsigned char TempBuffer[3]; //volatile存放轉(zhuǎn)換成液晶字符的數(shù)組

97、 ××注意此數(shù)組的定義</p><p>  void delay_18B20(unsigned int i)</p><p><b>  {</b></p><p>  while(i--);</p><p><b>  }</b></p><p>  v

98、oid Init_DS18B20(void)</p><p><b>  {</b></p><p>  unsigned char x=0;</p><p>  DQ = 1; //DQ復(fù)位</p><p>  delay_18B20(8); //稍做延時</p><p> 

99、 DQ = 0; //單片機(jī)將DQ拉低</p><p>  delay_18B20(80); //精確延時 大于 480us</p><p>  DQ = 1; //拉高總線</p><p>  delay_18B20(14);</p><p>  x=DQ; //稍做延時后 如果x=

100、0則初始化成功 x=1則初始化失敗</p><p>  delay_18B20(20);</p><p><b>  }</b></p><p>  /***********ds18b20讀一個字節(jié)**************/ </p><p>  unsigned char ReadOneChar(void)<

101、;/p><p><b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat = 0;</p><p>  for (i=8;i>0;i--)</p><p><b>  {</b></p><p>  D

102、Q = 0; // 給脈沖信號</p><p><b>  dat>>=1;</b></p><p>  DQ = 1; // 給脈沖信號</p><p><b>  if(DQ)</b></p><p>  dat|=0x80;</p><p>  delay_

103、18B20(4);</p><p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b></p><p>  /*************ds18b20寫一個字節(jié)****************/ </p><p> 

104、 void WriteOneChar(uchar dat)</p><p><b>  {</b></p><p>  unsigned char i=0;</p><p>  for (i=8; i>0; i--)</p><p><b>  {</b></p><p&g

105、t;<b>  DQ = 0;</b></p><p>  DQ = dat&0x01;</p><p>  delay_18B20(5);</p><p><b>  DQ = 1;</b></p><p><b>  dat>>=1;</b></p

106、><p><b>  }</b></p><p><b>  }</b></p><p>  /**************讀取ds18b20當(dāng)前溫度************/</p><p>  uchar ReadTemp(void)</p><p><b>  {

107、</b></p><p>  unsigned char a=0;</p><p>  unsigned char b=0;</p><p>  unsigned char t=0;</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); //

108、 跳過讀序號列號的操作</p><p>  WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換</p><p>  delay_18B20(100); // this message is wery important</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0x

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

110、); //讀取溫度值高位</p><p>  temp_value=b<<4;</p><p>  temp_value+=(a&0xf0)>>4; </p><p>  return temp_value;</p><p><b>  }</b></p><p

111、>  /*void temp_to_str(void) //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p><p><b>  {</b></p><p>  //TempBuffer=temp_value; //百位</p><p>  TempBuffer[0]=temp_value%100/10+48; //十位</p>

溫馨提示

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

評論

0/150

提交評論