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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

8、;/p><p>  b、主機(jī)再寫跳過(guò)ROM的操作(CCH)命令</p><p>  c、然后主機(jī)接著寫個(gè)轉(zhuǎn)換溫度的操作命令,后面釋放總線至少一秒,讓DS18B20完成轉(zhuǎn)換的操作。整個(gè)操作的總線狀態(tài)如下圖:</p><p><b>  初始化時(shí)序:</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++) ;//略微延時(shí)約6微秒,再將數(shù)據(jù)線從高拉低,要求保持480~960us</p><p>  DQ = 0;

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

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

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

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

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

15、lt;2;time++) ; //延時(shí)約6us,使主機(jī)在15us內(nèi)采樣</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++); //延時(shí)3us,兩個(gè)讀時(shí)序之間必須有大于1us的恢復(fù)期</p><p>  } </p><p>  return(dat); //返回讀出的十六進(jìn)制數(shù)據(jù)</p><p>

17、<b>  }</b></p><p><b>  寫時(shí)序:</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_(); //等待一個(gè)機(jī)器周期 </p><p>  DQ=0; //將數(shù)據(jù)線從高拉低時(shí)即啟動(dòng)寫時(shí)序 </p><p>  DQ=da

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

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

21、時(shí),給硬件一點(diǎn)反應(yīng)時(shí)間</p><p><b>  }</b></p><p><b>  (3)硬件接口</b></p><p>  5、LED顯示電路;</p><p>  7SEG-MPX4-CC是 四個(gè)共陰二極管顯示器 ,1234 是陰公共端。單片機(jī)可以直接驅(qū)動(dòng),不另加驅(qū)動(dòng)電路。本文中,P1

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

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

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

25、51.h"</p><p>  #include "intrins.h" //延時(shí)函數(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ù)點(diǎn)控制</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}; /* 共陽(yáng)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個(gè)數(shù)據(jù),一個(gè)運(yùn)算暫存用</p><p>  void delay(uint t)//11微秒延時(shí)函數(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復(fù)位函數(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); //延時(shí)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)//從總線上讀取一個(gè)字節(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(); //總線復(fù)位</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ā)轉(zhuǎn)換命令</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>  }//負(fù)溫度求補(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時(shí)都不顯示</p><p>  if(n){display[3]=0x0B;}//負(fù)溫度時(shí)最高位顯示"-"</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;}//開機(jī)顯示8888</p><p>  ow_reset(); // 開機(jī)先轉(zhuǎn)換一次</p><p>  write_byte(0xCC); // Skip ROM</p><p>

50、;  write_byte(0x44); // 發(fā)轉(zhuǎn)換命令</p><p>  for(h=0;h<500;h++)</p><p>  {scan();} //開機(jī)顯示"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ù)很簡(jiǎn)單,主要是調(diào)用子函數(shù)。這里用到的子函數(shù)有延時(shí)函數(shù)、掃描顯示函數(shù)、總線讀字節(jié)函數(shù)、DS18B20復(fù)位函數(shù)和寫命令函數(shù)、溫

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

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

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

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

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

溫馨提示

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

評(píng)論

0/150

提交評(píng)論