數(shù)字溫度計課程設計 (2)_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)字溫度計</b></p><p><b>  概述:</b></p><p>  由于單片機體積小、功能全、價格低、編程容易等優(yōu)點,在工業(yè)領域的應用越來越廣泛。本文數(shù)字溫度計的實現(xiàn),主要基于芯片DS18B20和數(shù)碼管的顯示功能,把現(xiàn)場測得的溫度顯示出來。</p><p>  DS18B20是

2、美國Dallas公司生產的單總線數(shù)字輸出型集成溫度傳感器,能夠直接讀出被測溫度值,并且可根據(jù)實際要求通過編程實現(xiàn)9~12位的數(shù)字量輸出,將溫度值轉化為9位數(shù)字量所需時間為93.75 ms,轉化為12位數(shù)字量所需時間為750 ms。測試溫度范圍為 -55~+125,精度可達0.0675℃。</p><p><b>  二、工作原理:</b></p><p>  本電路包

3、含了單片機最小系統(tǒng)(包括復位按鈕、晶振電路)、單總線接口的溫度傳感器芯片DS18B20、LED數(shù)碼管顯示電路的設計。</p><p>  本電路采用8位單片機 AT89C51,工作原理圖如下頁所示:</p><p>  1、AT89C51單片機引腳資源及分配如下:</p><p><b>  2、復位電路:</b></p><

4、;p>  RST引腳是復位信號的輸入端。復位信號是高電平有效,其有效時間應持續(xù)24個振蕩脈沖周期以上,整個復位電路包括芯片內、外兩部分。外部電路產生的復位信號送施密特觸發(fā)器,再由片內復位電路在每個機器周期的S5P2時刻對施密特觸發(fā)器的輸出進行采樣,然后才得到內部復位操作所需要的信號。</p><p>  復位操作有上電自動復位、按鍵電平復位和外部脈沖復位三種方式,本文采用按鍵電平復位的方式,復位電路如下:&

5、lt;/p><p>  按下按鈕并持續(xù)兩個機器周期以上,則RES位高電平,單片機復位。</p><p><b>  3、晶振電路:</b></p><p>  在89C51內部有一個高增益反相放大器,其輸入端為引腳XTAL1,其輸出端為引腳XTAL2。只需要在片外通過XTAL1和XTAL2引腳跨接晶體振蕩器或在引腳與地之間加接微調電容,形成反饋電路

6、,振蕩器即可工作。振蕩電路的工作原理如下圖:</p><p>  由于電容的大小影響振蕩器震蕩的穩(wěn)定性和起振的快速性,通常選擇范圍10~30 pF。</p><p>  當由外部輸入時鐘信號時,外部信號接入XTAL1端,XTAL2端懸空不用。對外部信號的占空比沒有要求,高低電平持續(xù)時間不小于20 ns。</p><p>  4、溫度傳感器的接口:</p>

7、<p>  前面已經(jīng)略微介紹過芯片DS18B20,下面主要介紹其使用方法:</p><p>  (1)引腳分配圖如下:</p><p>  GND:地 DQ:數(shù)據(jù)I/O NC:空腳</p><p><b> ?。?)軟件操作:</b></p><p>  a、主機先作復位操作<

8、;/p><p>  b、主機再寫跳過ROM的操作(CCH)命令</p><p>  c、然后主機接著寫個轉換溫度的操作命令,后面釋放總線至少一秒,讓DS18B20完成轉換的操作。整個操作的總線狀態(tài)如下圖:</p><p><b>  初始化時序:</b></p><p>  bit Init_DS18B20(void)&l

9、t;/p><p>  { bit flag; // flag=0,存在;flag=1,不存在</p><p>  DQ = 1; //先將數(shù)據(jù)線拉高</p><p>  for(time=0;time<2;time++) ;//略微延時約6微秒,再將數(shù)據(jù)線從高拉低,要求保持480~960us</p><p>  DQ = 0;

10、 </p><p>  for(time=0;time<200;time++) ; //略微延時約600微秒,以向DS18B20發(fā)出一持續(xù)480~960us的低電平復位脈沖 </p><p>  DQ = 1; //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) </p><p>  for(time=0;time<10;time++)

11、; //延時約30us(釋放總線后需等待15~60us,讓DS18B20輸出存在脈沖)</p><p>  flag=DQ; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) </p><p>  for(time=0;time<200;time++) ; //延時足夠長時間,等待存在脈沖輸出完畢</p><p>  re

12、turn (flag); //返回檢測成功標志</p><p><b>  }</b></p><p><b>  讀時序:</b></p><p>  ReadOneChar(void)</p><p>  { unsigned char i=0;</p>&l

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

14、 //單片機從DS18B20讀數(shù)據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序</p><p>  _nop_( ); //等待一個機器周期 </p><p>  DQ = 1; //將數(shù)據(jù)線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備</p><p>  for(time=0;time&

15、lt;2;time++) ; //延時約6us,使主機在15us內采樣</p><p><b>  dat>>=1;</b></p><p>  if(DQ==1) dat|=0x80; //如果讀到的數(shù)據(jù)是1,則將1存入dat</p><p>  else dat|=0x00;//如果讀unsigned

16、char到的數(shù)據(jù)是0,則將0存入dat </p><p>  for(time=0;time<8;time++); //延時3us,兩個讀時序之間必須有大于1us的恢復期</p><p>  } </p><p>  return(dat); //返回讀出的十六進制數(shù)據(jù)</p><p>

17、<b>  }</b></p><p><b>  寫時序:</b></p><p>  WriteOneChar(unsigned char dat)</p><p>  { unsigned char i=0;</p><p>  for (i=0; i<8; i++)</p&

18、gt;<p><b>  {</b></p><p>  DQ =1; // 先將數(shù)據(jù)線拉高</p><p>  _nop_(); //等待一個機器周期 </p><p>  DQ=0; //將數(shù)據(jù)線從高拉低時即啟動寫時序 </p><p>  DQ=da

19、t&0x01; //利用與運算取出要寫的某位二進制數(shù)據(jù),并將其送到數(shù)據(jù)線上等待DS18B20采樣</p><p>  for(time=0;time<10;time++);//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣</p><p>  DQ=1; //釋放數(shù)據(jù)線 </p><p> 

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

21、時,給硬件一點反應時間</p><p><b>  }</b></p><p><b> ?。?)硬件接口</b></p><p>  5、LED顯示電路;</p><p>  7SEG-MPX4-CC是 四個共陰二極管顯示器 ,1234 是陰公共端。單片機可以直接驅動,不另加驅動電路。本文中,P1

22、接段碼,P3的4 位IO口接位選。動態(tài)顯示驅動,將所有數(shù)碼管的8個顯示筆"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數(shù)碼管都接收到相同的字形碼,但究竟是那個數(shù)碼管會顯示出字形,取決于單片機對位選通COM端電路的控制,所以只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮。

23、通過分時輪流控制各個數(shù)碼管的的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅動。在輪流顯示過程中,每位數(shù)碼管的點亮時間為1~2ms,由于視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應,盡管實際上各位數(shù)碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低。</p><p><b>  三、電路工作過程:&

24、lt;/b></p><p>  首先,通電后顯示8888,由于DS18B20的轉換速度僅幾百毫秒,所以在2秒之后即可顯示測得的溫度。隨著現(xiàn)場溫度的改變,LED數(shù)碼管顯示的溫度也在隨時改變。如果需要復位單片機,只需按下復位按鈕即可。</p><p><b>  四、源程序:</b></p><p>  #include "reg

25、51.h"</p><p>  #include "intrins.h" //延時函數(shù)用</p><p>  #define Disdata P1 //段碼輸出口</p><p>  #define discan P3 //掃描口</p><p>  #define uchar

26、unsigned char</p><p>  #define uint unsigned int</p><p>  sbit DQ=P3^7; //溫度輸入口</p><p>  sbit DIN=P1^7; //LED小數(shù)點控制</p><p><b>  uint h;</b>&

27、lt;/p><p>  uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,</p><p>  0x06,0x06,0x07,0x08,0x08,0x09,0x09};//溫度小數(shù)部分用查表法</p><p>  uchar code dis_7[12]={0xC0,0xF9,0xA4,

28、0xB0,0x99,0x92,0x82,0xF8,0x80,</p><p>  0x90,0xff,0xbf}; /* 共陽LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8&quo

29、t; "9" "不亮" "-" */ </p><p>  uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; // 列掃描控制字</p><p>  uchar data temp_data[2]={0x00,0x00}; // 讀出溫度暫放<

30、/p><p>  uchar data display[5]={0x00,0x00,0x00,0x00,0x00};//顯示單元數(shù)據(jù),共4個數(shù)據(jù),一個運算暫存用</p><p>  void delay(uint t)//11微秒延時函數(shù)</p><p>  { for(;t>0;t--); }</p><p>  scan()//顯

31、示掃描函數(shù)</p><p>  { char k;</p><p>  for(k=0;k<4;k++) //四位LED掃描控制</p><p>  { Disdata=dis_7[display[k]];</p><p>  if(k==1){DIN=0;}</p><p>  disca

32、n=~scan_con[k];delay(90);discan=0x00;</p><p><b>  }</b></p><p><b>  }</b></p><p>  ow_reset(void) //18B20復位函數(shù)</p><p>  { char pre

33、sence=1;</p><p>  while(presence)</p><p>  {while(presence)</p><p><b>  {</b></p><p>  DQ=1;_nop_();_nop_();</p><p><b>  DQ=0; </b&g

34、t;</p><p>  delay(50); // 550us</p><p><b>  DQ=1; </b></p><p>  delay(6); // 66us</p><p>  presence=DQ; // presence=0繼續(xù)下一步</p><p><b> 

35、 }</b></p><p>  delay(45); //延時500us</p><p>  presence = ~DQ;</p><p><b>  }</b></p><p><b>  DQ=1;</b></p><p><b>  }

36、</b></p><p>  void write_byte(uchar val)//18B20寫命令函數(shù)</p><p>  { uchar i;</p><p>  for (i=8; i>0; i--) //</p><p><b>  {</b></p><p>  DQ

37、=1;_nop_();_nop_(); </p><p>  DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us</p><p>  DQ = val&0x01; //最低位移出</p><p>  delay(6); //66us</p><p> 

38、 val=val/2; //右移一位</p><p><b>  }</b></p><p><b>  DQ = 1;</b></p><p>  delay(1); </p><p><b>  }</b></p><p>  u

39、char read_byte(void)//從總線上讀取一個字節(jié)</p><p>  { uchar i;</p><p>  uchar value = 0;</p><p>  for (i=8;i>0;i--)</p><p>  { DQ=1;_nop_();_nop_();</p><p>  val

40、ue>>=1;</p><p>  DQ = 0; </p><p>  _nop_();_nop_();_nop_();_nop_(); //4us</p><p>  DQ = 1;_nop_();_nop_();_nop_();_nop_(); //4us </p><p>  if(DQ)v

41、alue|=0x80;</p><p>  delay(6); //66us</p><p><b>  }</b></p><p><b>  DQ=1;</b></p><p>  return(value);</p><p><b>  }

42、</b></p><p>  read_temp()//讀出溫度函數(shù)</p><p><b>  {</b></p><p>  ow_reset(); //總線復位</p><p>  write_byte(0xCC); // 發(fā)Skip ROM命令</p><p>  

43、write_byte(0xBE); // 發(fā)讀命令</p><p>  temp_data[0]=read_byte(); //溫度低8位</p><p>  temp_data[1]=read_byte(); //溫度高8位</p><p>  ow_reset();</p><p>  write_byte(0xCC); // Sk

44、ip ROM</p><p>  write_byte(0x44); // 發(fā)轉換命令</p><p><b>  }</b></p><p>  work_temp()//溫度數(shù)據(jù)處理函數(shù)</p><p><b>  {</b></p><p>  uchar n=0;

45、 </p><p>  if(temp_data[1]>127)</p><p>  {temp_data[1]=(256-temp_data[1]);temp_data[0]=(256-temp_data[0]);n=1;</p><p><b>  }//負溫度求補碼</b></p><p>  disp

46、lay[4]=temp_data[0]&0x0f;display[0]=ditab[display[4]];</p><p>  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);//</p><p>  display[3]=display[4]/100;</p&

47、gt;<p>  display[1]=display[4]%100;</p><p>  display[2]=display[1]/10;</p><p>  display[1]=display[1]%10;</p><p>  if(!display[3]){display[3]=0x0A;if(!display[2]){display[2]=

48、0x0A;}}//最高位為0時都不顯示</p><p>  if(n){display[3]=0x0B;}//負溫度時最高位顯示"-"</p><p><b>  }</b></p><p>  main()//主函數(shù)</p><p>  { Disdata=0xff; //初始化端口</

49、p><p>  discan=0xff;</p><p>  for(h=0;h<4;h++){display[h]=8;}//開機顯示8888</p><p>  ow_reset(); // 開機先轉換一次</p><p>  write_byte(0xCC); // Skip ROM</p><p>

50、;  write_byte(0x44); // 發(fā)轉換命令</p><p>  for(h=0;h<500;h++)</p><p>  {scan();} //開機顯示"8888"2秒</p><p><b>  while(1)</b></p><p><b> 

51、 {</b></p><p>  read_temp(); //讀出18B20溫度數(shù)據(jù)</p><p>  work_temp(); //處理溫度數(shù)據(jù)</p><p>  for(h=0;h<50;h++)</p><p>  {scan();} //顯示溫度值2秒</

52、p><p><b>  }</b></p><p><b>  }</b></p><p><b>  五、程序分析:</b></p><p>  本文的主函數(shù)很簡單,主要是調用子函數(shù)。這里用到的子函數(shù)有延時函數(shù)、掃描顯示函數(shù)、總線讀字節(jié)函數(shù)、DS18B20復位函數(shù)和寫命令函數(shù)、溫

53、度讀取函數(shù)和溫度處理函數(shù)。</p><p>  程序剛開始對要用到的端口進行初始化,并讓數(shù)碼管先顯示8888。由于沒有用到ROM操作指令,所以要用跳過ROM序列號檢測命令(CCH)。而后單片機發(fā)出開始轉換指令(44H),DS18B20收到該命令后立刻開始溫度轉換。當溫度轉換正在進行時主機讀總線結果為0,轉換結束則為1,并把轉換的結果暫存起來。</p><p>  當單片機發(fā)出讀取溫度指令時

54、,就把轉換結果(數(shù)字量)讀到單片機內部并經(jīng)過溫度轉換(負溫度時求補,最高位是0時不顯示等),然后經(jīng)P1端口送顯示器顯示,經(jīng)延時后可顯示下一個溫度值。</p><p>  另外,在每一次讀寫前要對 DS18B20 進行復位初始化。復位要求主CPU 將數(shù)據(jù)線下拉 500us ,然后釋放, DS18B20 收到信號后等待 16us~60us 左右,然后發(fā)出60us~240us 的存在低脈沖,主 CPU 收到此信號后表示

55、復位成功。</p><p><b>  附:程序流程圖</b></p><p><b>  六、設計心得:</b></p><p>  在這次課程設計之前,雖然已經(jīng)學習過單片機,但僅僅是了解單片機的內部結構,至于如何用C語言編程、如何外部接線并不知道。以前也沒有獨立做過這方面的設計,做實驗時的程序和仿真圖都是老師給的。這次

56、接觸到實際的應用問題,一直不知道該如何下手。后來上網(wǎng)查資料,結合老師給的芯片資料,尤其是DS18B20,測溫度必須用到的芯片,剛剛結束的計算機控制課程設計也用到了它。從獨立的模塊到繪制仿真圖,遇到了不少困難,不過在同學們和老師的指導下,逐一擊破。下面說說這次設計中遇到的最大困難:</p><p>  7SEG-MPX4-CC是四位共陰極數(shù)碼管,它的用法以前沒用過,這次全靠查資料,尤其是編程,主要是參照網(wǎng)上的程序。

57、還有DS18B20這個芯片,以前傳感器這本書上有介紹,但老師沒講過,這次把以前的課本找出來,仔細閱讀它的結構和工作原理,以及用軟件實現(xiàn)測溫和溫度轉換的步驟,對它有了進一步的認識。</p><p>  通過這次課程設計,知道單片機的用途很廣,和計算機比起來,雖然功能沒有計算機強大,但控制方便,易于編程實現(xiàn)。而且,各個學科之間的聯(lián)系很大,尤其是模電和數(shù)電,可以說是電子學的基礎。只有掌握了這門基礎學科,才能掌握好其他學

溫馨提示

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

評論

0/150

提交評論