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

下載本文檔

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

文檔簡介

1、<p>  爐溫控制課程設(shè)計(jì)報(bào)告</p><p><b>  目 錄</b></p><p><b>  目 錄1</b></p><p><b>  引言3</b></p><p>  第1章 技術(shù)指標(biāo)4</p><p>  1.1基本

2、功能要求:4</p><p>  1.2 提高功能要求:4</p><p><b>  1.3設(shè)計(jì)條件4</b></p><p>  第2章 系統(tǒng)設(shè)計(jì)方案6</p><p>  2.1原理圖設(shè)計(jì)6</p><p><b>  2.2硬件設(shè)計(jì)6</b></p&

3、gt;<p><b>  7</b></p><p><b>  2.3軟件設(shè)計(jì)7</b></p><p>  2.3.1軟件設(shè)計(jì)方案7</p><p>  2.3.2程序清單(含必要的注釋)8</p><p>  第3章 單元電路設(shè)計(jì)26</p><p&g

4、t;  3.1控制部分電路設(shè)計(jì)26</p><p>  3.2矩陣鍵盤電路設(shè)計(jì)26</p><p>  3.3顯示部分電路設(shè)計(jì)28</p><p>  3.3.1數(shù)碼管內(nèi)部原理圖29</p><p>  3.4溫度采集模塊電路設(shè)計(jì)31</p><p>  3.4.1 DS18B20通信程序37</p&

5、gt;<p>  3.5繼電器電路設(shè)計(jì)39</p><p>  第4章 測試與調(diào)整40</p><p>  4.1電源電路檢測40</p><p>  4.2顯示電路測試40</p><p>  4.3單片機(jī)控制電路測試40</p><p>  4.4矩陣鍵盤電路檢測40</p>

6、<p>  4.5 控制信號輸出電路檢測40</p><p>  4.6溫度采集電路檢測40</p><p>  4.7控制電路檢測41</p><p>  4.7總體電路測試41</p><p>  第5章 加熱爐溫控系統(tǒng)使用方法42</p><p>  5.1系統(tǒng)連接方法42</p&g

7、t;<p>  5.2系統(tǒng)使用方法42</p><p>  第6章 設(shè)計(jì)小節(jié)43</p><p>  6.1 設(shè)計(jì)任務(wù)完成情況43</p><p>  6.2 問題及改進(jìn)43</p><p>  6.3 心得體會43</p><p><b>  參考文獻(xiàn)44</b><

8、;/p><p><b>  引言</b></p><p>  隨著計(jì)算機(jī)技術(shù)的發(fā)展和普及,以單片機(jī)為核心的小型嵌入式設(shè)備,已經(jīng)在工業(yè)自動化、辦公自動化等領(lǐng)域得到了日益廣泛的應(yīng)用 本課題對工業(yè)對象中主要的被控參數(shù)電阻爐爐溫進(jìn)行研究,設(shè)計(jì)了硬件電路和軟件程序。硬件電路選用STC12C5A60S2單片機(jī)及DS18B20, 以STC12C5A60S2單片機(jī)為主體,構(gòu)成一個(gè)

9、能進(jìn)行較復(fù)雜的數(shù)據(jù)處理和復(fù)雜控制功能的智能控制器,使其既可與微機(jī)配合構(gòu)成兩級控制系統(tǒng),又可作為一個(gè)獨(dú)立的單片機(jī)控制系統(tǒng),具有較高的靈活性和可靠性。單片機(jī)根據(jù)輸入的各種命令,進(jìn)行智能算法得到控制值,輸出控制和脈沖信號,從而加熱電阻爐。軟件程序脈沖采用中斷方式。</p><p>  關(guān)鍵詞 單片機(jī);溫度控制;計(jì)算機(jī)仿真;</p><p><b>  第1章 技術(shù)指標(biāo)</b>

10、;</p><p>  1.1基本功能要求:</p><p>  內(nèi)容:應(yīng)用計(jì)算機(jī)的實(shí)時(shí)監(jiān)控和溫度測量技術(shù),采用單片機(jī)、溫度檢測電路、溫度控制電路等,實(shí)現(xiàn)電阻爐爐溫的實(shí)時(shí)監(jiān)控。</p><p><b>  要求:</b></p><p>  1.1.1采用單片機(jī)及相應(yīng)的組成部件完成電阻爐溫度控制系統(tǒng)設(shè)計(jì),包括硬件電路和軟

11、件程序設(shè)計(jì);</p><p>  1.1.2測溫范圍0~100℃,使其系統(tǒng)控制的溫度保溫值的變化范圍為30~60℃;</p><p>  1.1.3可根據(jù)按鍵設(shè)定目標(biāo)溫度,能夠顯示控溫時(shí)的實(shí)際爐溫和恒溫時(shí)間等信息。 </p><p>  1.2 提高功能要求:</p><p>  1.2.1 對其主電路和控制電路設(shè)計(jì)相應(yīng)的保護(hù)電路,使其安全可

12、靠地工作;</p><p>  1.2.2對影響溫度控制時(shí)間和精度的因素進(jìn)行分析,改進(jìn)相應(yīng)的計(jì)算機(jī)控制算法,完成計(jì)算機(jī)控制高效的算法設(shè)計(jì)。</p><p><b>  1.3設(shè)計(jì)條件</b></p><p>  1.3.1電源條件:穩(wěn)壓電源5V可調(diào),220V直流電源</p><p>  1.3.2測試條件:萬用表<

13、/p><p>  1.3.2元件清單:如表1.1示。</p><p><b>  元件清單</b></p><p>  另有剪刀、鑷子等工具</p><p><b>  表1-1</b></p><p>  第2章 系統(tǒng)設(shè)計(jì)方案</p><p><b

14、>  2.1原理圖設(shè)計(jì)</b></p><p>  根據(jù)設(shè)計(jì)要求設(shè)計(jì)原理圖如2-1所示。</p><p><b>  圖2-1原理圖</b></p><p><b>  圖2-1</b></p><p><b>  2.2硬件設(shè)計(jì)</b></p>

15、<p>  該設(shè)計(jì)本系統(tǒng)由STC12C5A60S 單片機(jī)最小系統(tǒng)及其外圍電路組成,單片機(jī)系統(tǒng)有自己的電源模塊、顯示模塊、溫度采集模塊,如圖2-1所示。根據(jù)實(shí)驗(yàn)箱設(shè)計(jì)電路圖如圖2-2所示。</p><p>  圖2-2硬件電路方框圖</p><p><b>  2.3軟件設(shè)計(jì)</b></p><p>  2.3.1軟件設(shè)計(jì)方案<

16、/p><p>  為了更簡單的完成溫度控制的任務(wù),采用如下算法控制繼電器,程序的軟件流程圖如下:</p><p><b>  圖2-3軟件流程圖</b></p><p>  首先在程序的開頭先讀取用戶的按鍵命令,當(dāng)沒有按鍵時(shí),數(shù)碼管僅顯示實(shí)際溫度;若按下“b”鍵,則數(shù)碼管顯示用戶的設(shè)定溫度;按下“c”鍵,則進(jìn)入設(shè)置溫度子程序,用戶通過1~9數(shù)字鍵就

17、可以設(shè)置用戶所需溫度,這樣就完成了用戶的操作。接下來讀取DS18B20的數(shù)據(jù),并按格式裝配成數(shù)碼管可以顯示的類型。最后根據(jù)當(dāng)前的溫度值控制繼電器的通斷。</p><p>  主程序就是以上述流程往復(fù)運(yùn)行。</p><p>  2.3.2程序清單(含必要的注釋)</p><p>  #include<STC12C5A60S2.h></p>&

18、lt;p>  #include<intrins.h></p><p>  #define uchar unsigned char</p><p>  #define DELAY_TIME1 8</p><p>  #define uint unsigned int</p><p>  extern unsigned char

19、 KeyCounter;</p><p>  extern bit KeyFlag;</p><p>  extern bit SetFlag;</p><p>  extern bit DisFlag;</p><p>  extern bit ShowTimeFlag;</p><p>  unsigned cha

20、r data DisData[2]; //溫度顯示值</p><p>  unsigned char data SetData[2]; //溫度設(shè)定值</p><p>  unsigned char KeyCounter; //設(shè)置溫度位數(shù)計(jì)數(shù)器</p><p>  float RTValue; //實(shí)際溫度值</p

21、><p>  unsigned char STValue=50; //設(shè)置溫度值</p><p>  unsigned char ShowTime[3]={0};//恒溫時(shí)間值 </p><p>  unsigned int m;//定義粗略延遲變量</p><p>  unsigned int cc;//計(jì)數(shù)次數(shù)<

22、/p><p>  unsigned int CountFlag;</p><p>  unsigned int TimeCounter=0;//設(shè)置恒溫時(shí)間計(jì)數(shù)器</p><p>  unsigned char code keycode[16]={</p><p>  0x77,0x7b,0x7d,0x7e, //1,2,3,A<

23、;/p><p>  0xb7,0xbb,0xbd,0xbe, //4,5,6,B</p><p>  0xd7,0xdb,0xdd,0xde, //7,8,9,C</p><p>  0xe7,0xeb,0xed,0xee, //*,0,#,D</p><p><b>  };</b></p&g

24、t;<p>  unsigned char code Seg_Table[13] = {</p><p>  0xC0,/*0*/</p><p>  0xF9,/*1*/</p><p>  0xA4,/*2*/</p><p>  0xB0,/*3*/</p><p>  0x99,/*4*/<

25、/p><p>  0x92,/*5*/</p><p>  0x82,/*6*/</p><p>  0xF8,/*7*/</p><p>  0x80,/*8*/</p><p>  0x90,/*9*/</p><p>  0x9c,/*10*/ //上框 代表實(shí)際溫度</p>

26、<p>  0xa3,/*11*/ //下框 代表設(shè)定溫度 </p><p>  0xff//all off</p><p><b>  };</b></p><p>  unsigned char code Pos_Dis_Buf[5] = {0xef,0xdf,0xbf,0x7f,0xf

27、f};</p><p>  unsigned char Digit[3] = {0};</p><p>  bit ShowTimeFlag=0;//是否顯示恒溫時(shí)間</p><p>  bit KeyFlag=0;//是否接收到有用鍵值 1有</p><p>  bit SetFlag=0;//是否設(shè)定鍵按下 1按下</p&g

28、t;<p>  bit DisFlag=0; //1顯示設(shè)定值 0顯示實(shí)際值</p><p>  sbit Beep = P3^5;</p><p>  sbit Heat = P3^0;</p><p>  sbit DQ=P3^1; //改成P3^0</p><p>  sbit SegDin=P3^6; //顯示數(shù)據(jù)高地

29、位</p><p>  sbit SegClk=P3^7; //數(shù)據(jù)顯示時(shí)鐘</p><p>  void InitSys()</p><p><b>  {</b></p><p>  TMOD=0X01;//MODE 1</p><p>  TH0=(65536-50000)/256;<

30、/p><p>  TL0=(65536-50000)%256;</p><p>  EA=1; //開中斷</p><p>  ET0=1;//開定時(shí)器0中斷</p><p>  P4SW=0xf0; </p><p><b>  }</b></p><p><b>

31、;  /*</b></p><p>  函數(shù):Delay()</p><p><b>  功能:不精確延時(shí)</b></p><p><b>  參數(shù):延時(shí)參數(shù)</b></p><p><b>  返回值:無</b></p><p><b

32、>  */</b></p><p>  void Delay(unsigned int n)</p><p><b>  {</b></p><p>  while(--n);</p><p><b>  }</b></p><p>  void ds18b

33、20_delay(int time)//延時(shí)時(shí)間為(time * 6 us)</p><p><b>  {</b></p><p>  int i,temp;</p><p>  temp=time;</p><p>  for(i=0;i<temp;i++)</p><p><b&

34、gt;  {</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b><

35、/p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><

36、;b>  _nop_();</b></p><p><b>  _nop_();</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //18B20復(fù)位函數(shù)</p><p>  v

37、oid Init_DS18B20(void)</p><p><b>  {</b></p><p>  unsigned char x=1;</p><p>  DQ=1;//先將數(shù)據(jù)口拉高</p><p>  ds18b20_delay(2);</p><p>  while(x)

38、 //進(jìn)行判斷,當(dāng)數(shù)據(jù)口返回一個(gè)0時(shí),跳出循環(huán)。初始化成功</p><p><b>  { </b></p><p>  DQ=0; //拉低</p><p>  ds18b20_delay(140);//延時(shí)大約850us,晶振為11.0592</p><p>  DQ=1;//拉高</p&

39、gt;<p>  ds18b20_delay(8);//延時(shí)50us</p><p>  if(DQ==1) //設(shè)置判斷條件,看ds1820的返回值,0則跳出while循環(huán)</p><p><b>  x=1;</b></p><p><b>  else</b></p><p&g

40、t;<b>  { x=0;</b></p><p>  ds18b20_delay(35);//延時(shí)500us</p><p><b>  DQ=1;</b></p><p>  ds18b20_delay(40);</p><p><b>  }</b></p>

41、<p><b>  }</b></p><p><b>  }</b></p><p>  //18B20寫命令函數(shù)</p><p>  void WriteOneChar(uchar dat)</p><p><b>  {</b></p><

42、;p>  uchar i = 0;</p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p><p>  DQ = 0; //拉低總線</p><p>  _nop_(); /

43、/至少維持了1us,表示寫時(shí)序(包括寫0時(shí)序或?qū)?時(shí)序)開始</p><p>  DQ = dat&0x01; //從字節(jié)的最低位開始傳輸</p><p>  //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),</p><p>  //因?yàn)?5us后DS18B20會對總線采樣。</p><p&

44、gt;  ds18b20_delay(10); //必須讓寫時(shí)序持續(xù)至少60us</p><p>  DQ = 1; //寫完后,必須釋放總線,</p><p>  dat >>= 1;</p><p>  ds18b20_delay(1);</p>&l

45、t;p><b>  }</b></p><p><b>  }</b></p><p>  //18B20讀1個(gè)字節(jié)函數(shù)</p><p>  uchar ReadOneChar(void)</p><p><b>  {</b></p><p> 

46、 uchar i = 0;</p><p>  uchar dat = 0;</p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p><p>  DQ = 0; //將總線拉低,要在1us之后釋放總線</p><

47、p>  //單片機(jī)要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。</p><p>  _nop_(); //至少維持了1us,表示讀時(shí)序開始</p><p><b>  _nop_();</b></p><p>  dat >>= 1; //讓從總線上讀到的位數(shù)據(jù),依次從

48、高位移動到低位。</p><p>  DQ = 1; //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩€上</p><p>  ds18b20_delay(1); //延時(shí)7us,此處參照推薦的讀時(shí)序圖,盡量把控制器采樣時(shí)間放到讀時(shí)序后的15us內(nèi)的最后部分</p><p>  if(DQ)

49、 //控制器進(jìn)行采樣</p><p><b>  {</b></p><p>  dat |= 0x80; //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進(jìn)行處理,保持為0</p><p><b>  } </b></p>

50、;<p>  ds18b20_delay(8); //此延時(shí)不能少,確保讀時(shí)序的長度60us。</p><p><b>  }</b></p><p>  return (dat);</p><p><b>  }</b></p><p>  float R

51、eadTemperature(void)</p><p><b>  {</b></p><p>  uchar n = 0; //存儲符號</p><p>  unsigned int t;</p><p>  uchar a,b;</p><p><b>  //讀出溫度函&

52、lt;/b></p><p>  Init_DS18B20(); //總線復(fù)位</p><p>  WriteOneChar(0xCC); // 發(fā)Skip ROM命令</p><p>  WriteOneChar(0xBE); // 發(fā)讀命令</p><p>  a = ReadOneChar(); //溫度低8位&l

53、t;/p><p>  b = ReadOneChar(); //溫度高8位</p><p>  Init_DS18B20();</p><p>  WriteOneChar(0xCC); // Skip ROM</p><p>  WriteOneChar(0x44); // 發(fā)轉(zhuǎn)換命令</p><p>  t = (b

54、 << 8) + a;</p><p>  return (t*0.0625);</p><p><b>  }</b></p><p>  unsigned char Key_Scan() //返回的是keycode[]數(shù)組的位數(shù)</p><p><b>  {</b></p

55、><p>  unsigned char i,X,Y;</p><p>  unsigned char KeyCode;</p><p>  P2 = 0x0f;</p><p>  if(P2 != 0x0f)</p><p><b>  {</b></p><p>  De

56、lay(500);</p><p>  if(P2 != 0x0f)</p><p><b>  {</b></p><p><b>  X = P2;</b></p><p>  P2 = 0xf0;</p><p>  if(P2 != 0xf0)</p>

57、<p><b>  {</b></p><p><b>  Y = P2;</b></p><p>  while(P2!=0xf0); //如果不松鍵 則一直停在這邊</p><p><b>  }</b></p><p>  KeyCode = X|Y;

58、</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  KeyCode = 0xff; </

59、p><p><b>  }</b></p><p>  for(i=0;i<16;i++)</p><p>  if(KeyCode==keycode[i])</p><p><b>  return i;</b></p><p>  return 255; </

60、p><p><b>  }</b></p><p>  unsigned char Get_Code()</p><p><b>  {</b></p><p>  unsigned char i=0xff,j=0xff;</p><p>  i=Key_Scan();</

61、p><p><b>  switch(i)</b></p><p><b>  {</b></p><p>  case 0:j=1;KeyFlag=1;break;</p><p>  case 1:j=2;KeyFlag=1;break;</p><p>  case 2:j

62、=3;KeyFlag=1;break;</p><p>  case 3:break; //'A"</p><p>  case 4:j=4;KeyFlag=1;break;</p><p>  case 5:j=5;KeyFlag=1;break;</p><p>  case 6:j=6;KeyFlag=1;bre

63、ak;</p><p>  case 7:break; //'B'</p><p>  case 8:j=7;KeyFlag=1;break;</p><p>  case 9:j=8;KeyFlag=1;break;</p><p>  case 10:j=9;KeyFlag=1;break;</p>&

64、lt;p>  case 11:break; //'C'</p><p>  case 12:j='a';KeyFlag=1;SetFlag=1;KeyCounter=0;break;</p><p>  case 13:j=0;KeyFlag=1;break;</p><p>  case 14:j='b';

65、KeyFlag=1;DisFlag=~DisFlag;</p><p><b>  break;</b></p><p>  case 15:j='c';KeyFlag=1;ShowTimeFlag=~ShowTimeFlag;break; //'D' //'D'</p><p>  de

66、fault:KeyFlag=0;break;</p><p><b>  }</b></p><p><b>  return j;</b></p><p><b>  }</b></p><p><b>  /*</b></p><p

67、>  函數(shù):Seg_Display()</p><p>  功能:數(shù)碼管在指定位置顯示指定的數(shù)</p><p>  參數(shù):Pos 顯示位置(0 1 2 3) ucDATA (0~9)待顯示的數(shù)字 Point 為1則顯示小數(shù)點(diǎn),否則不顯示</p><p><b>  返回值:無</b></p><p><b&g

68、t;  */</b></p><p>  void Bit_Display(unsigned char Pos, unsigned char ucDATA, bit Point)</p><p><b>  {</b></p><p>  unsigned char i;</p><p>  unsigned

69、 char ucTemp;</p><p>  ucTemp = Seg_Table[ucDATA];//查段碼表</p><p><b>  if(Point)</b></p><p><b>  {</b></p><p>  ucTemp &= 0x7f; </p>

70、;<p><b>  }</b></p><p>  P4 = Pos_Dis_Buf[4];//關(guān)閉所有顯示</p><p>  for(i = 0; i < 8; i++)</p><p><b>  {</b></p><p>  SegDin = ucTemp &

71、 0x80;/*每次取最高位,最高位為1,則SEG_DIN=1;反之亦然*/</p><p>  SegClk = 0;</p><p>  SegClk = 1; /*產(chǎn)生74164移位時(shí)鐘上升沿*/</p><p>  ucTemp <<= 1;</p><p><b>  }</b></p&g

72、t;<p>  P4 = Pos_Dis_Buf[Pos];//使能位選</p><p><b>  }</b></p><p><b>  /*</b></p><p>  函數(shù):Seg_Display()</p><p>  功能:數(shù)碼管上顯示指定的數(shù)</p><

73、;p>  參數(shù):uiData (0~9999)待顯示的數(shù)字</p><p><b>  返回值:無</b></p><p><b>  */</b></p><p>  void Seg_Display(float uiData)</p><p><b>  {</b>&

74、lt;/p><p>  unsigned char i;</p><p>  Digit[0] = (unsigned int)(uiData/10)%10; //十位</p><p>  Digit[1] = (unsigned int)uiData%10; //個(gè)位</p><p>  Digit[2] = (unsigned int

75、)(uiData*10)%10; //小數(shù)后一位</p><p>  for(i = 0; i < 3; i++)</p><p><b>  {</b></p><p><b>  if(i!=1)</b></p><p>  Bit_Display(i,Digit[i],0); /

76、/不顯示小數(shù)點(diǎn)</p><p><b>  else</b></p><p>  Bit_Display(i,Digit[i],1); //顯示小數(shù)點(diǎn)</p><p>  Delay(50);</p><p><b>  }</b></p><p><b>

77、  }</b></p><p>  void main()</p><p><b>  {</b></p><p>  unsigned char i,j,num,k;</p><p>  unsigned char Counter=0;</p><p>  unsigned int

78、htime=0;</p><p>  unsigned int stime=0;</p><p>  InitSys();</p><p><b>  while(1)</b></p><p><b>  { </b></p><p>  RTValue=ReadTemp

79、erature(); //獲取實(shí)際溫度</p><p>  num=Get_Code();</p><p>  if(DisFlag==0&&SetFlag==0)//顯示實(shí)際溫度</p><p><b>  {</b></p><p>  for(j=0;j<50;j++)//每次用循環(huán)顯示

80、 也許可以提高亮度</p><p>  for(i=0;i<50;i++)</p><p><b>  {</b></p><p>  Bit_Display(3,10,0); //上方框 表示實(shí)際溫度</p><p>  Seg_Display(RTValue);</p><p>

81、;<b>  }</b></p><p><b>  }</b></p><p>  if(DisFlag==1&&SetFlag==0)//顯示設(shè)定溫度</p><p><b>  {</b></p><p>  for(j=0;j<50;j++)//

82、每次用循環(huán)顯示 也許可以提高亮度</p><p>  for(i=0;i<50;i++)</p><p><b>  {</b></p><p>  Bit_Display(3,11,0);//下方框 表示設(shè)定溫度</p><p>  Seg_Display(STValue);</p><p&

83、gt;<b>  }</b></p><p><b>  } </b></p><p>  if(TimeCounter==1000)</p><p><b>  {</b></p><p>  TimeCounter=0;</p><p><b&

84、gt;  }</b></p><p>  if(TimeCounter!=0)</p><p><b>  {</b></p><p>  stime=TimeCounter;</p><p>  ShowTime[0]=stime/100;</p><p>  ShowTime[1]

85、=(stime/10)%10;</p><p>  ShowTime[2]= stime%10;</p><p><b>  }</b></p><p>  if(DisFlag==0&&SetFlag==0&&ShowTimeFlag==1)//顯示恒溫時(shí)間</p><p><b

86、>  {</b></p><p>  for(j=0;j<50;j++)//每次用循環(huán)顯示 也許可以提高亮度</p><p>  for(i=0;i<50;i++)</p><p><b>  {</b></p><p>  Bit_Display(3,19,0); //P表

87、示恒溫時(shí)間</p><p><b>  m=50;</b></p><p>  while(--m);</p><p>  Bit_Display(0,ShowTime[0],0);</p><p><b>  m=50;</b></p><p>  while(--m);&

88、lt;/p><p>  Bit_Display(1,ShowTime[1],0);</p><p><b>  m=50;</b></p><p>  while(--m);</p><p>  Bit_Display(2,ShowTime[2],0);</p><p><b>  m=50

89、;</b></p><p>  while(--m);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(SetFlag)</p><p><b>  {</b></p>

90、<p>  if(KeyFlag&&num!='a')</p><p><b>  {</b></p><p>  SetData[KeyCounter]=num;</p><p>  Bit_Display(KeyCounter+1,num,0);</p><p>  KeyC

91、ounter++;</p><p>  if(KeyCounter>1)</p><p><b>  {</b></p><p>  KeyCounter=0;</p><p>  SetFlag=0;</p><p>  STValue=10*SetData[0]+SetData[1];&

92、lt;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if(RTValue<(STValue-5)) </p><p><b>  {</b>

93、;</p><p>  Beep=1; //不鳴叫</p><p>  Heat=0; //加熱</p><p><b>  }</b></p><p>  if((STValue-5)<=RTValue&&RTValue<(STValue-0.8))</p><p

94、><b>  {</b></p><p>  //TimeCounter=0;</p><p>  if(CountFlag == 1)</p><p><b>  {</b></p><p><b>  TR0=0;</b></p><p> 

95、 TimeCounter=0;</p><p>  CountFlag=0;</p><p><b>  }</b></p><p>  Counter++;</p><p><b>  Beep=1;</b></p><p>  k=Counter%10;</p&g

96、t;<p><b>  if(k>1)</b></p><p><b>  k=1;</b></p><p><b>  Heat=k;</b></p><p><b>  }</b></p><p>  if((STValue-0.8

97、)<=RTValue&&RTValue<=(STValue))</p><p><b>  {</b></p><p>  //TimeCounter++;</p><p>  if(CountFlag == 0 )</p><p><b>  {</b></p&g

98、t;<p>  CountFlag = 1;</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p>  Counter++;</p><p><b>  Beep=1;</b></p><p&

99、gt;  k=Counter%20;</p><p><b>  if(k>1)</b></p><p><b>  k=1;</b></p><p><b>  Heat=k;</b></p><p><b>  }</b></p>

100、<p>  if(STValue<RTValue&&RTValue<=(STValue+0.5))</p><p><b>  {</b></p><p>  //TimeCounter++;</p><p>  if(CountFlag == 0 )</p><p><b&g

101、t;  {</b></p><p>  CountFlag = 1;</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p>  Beep=1;//不鳴叫</p><p>  Heat=1;//不加熱</p&

102、gt;<p><b>  }</b></p><p>  if(RTValue>(STValue+0.5))</p><p><b>  {</b></p><p>  if(CountFlag == 1)</p><p><b>  {</b></

103、p><p><b>  TR0=0;</b></p><p>  TimeCounter=0;</p><p>  CountFlag=0;</p><p><b>  }</b></p><p>  Beep=0;//鳴叫</p><p>  He

104、at=1; //不加熱</p><p><b>  }</b></p><p><b>  }</b></p><p>  while(Counter==1000)</p><p>  Counter=0; </p><p><b>  }</b&g

105、t;</p><p>  void timer0() interrupt 1</p><p><b>  {</b></p><p>  TH0=(65536-50000)/256;</p><p>  TL0=(65536-50000)%256;</p><p><b>  cc++;

106、</b></p><p>  if(cc==20)</p><p><b>  {</b></p><p><b>  cc=0;</b></p><p>  TimeCounter++;</p><p><b>  }</b></p

107、><p><b>  }</b></p><p>  第3章 單元電路設(shè)計(jì)</p><p>  3.1控制部分電路設(shè)計(jì)</p><p>  控制部電路分即一個(gè)單片機(jī)最小系統(tǒng)板,如果需要,可以為單片機(jī)提供外部晶振電路和復(fù)位電路。如圖3-1.</p><p><b>  圖3-1</b&g

108、t;</p><p>  3.2矩陣鍵盤電路設(shè)計(jì)</p><p>  鍵盤用于外部輸入,本設(shè)計(jì)采用4*3矩陣鍵盤。如圖3-2示。</p><p>  彈性按鍵被按下時(shí)閉合,松手后自動斷開。單片機(jī)檢測按鍵的原理是:單片機(jī)的I/O口既可以作為輸出也可作為輸入使用,當(dāng)檢測按鍵時(shí)使用的是它的輸入功能,把按鍵的一端接地,另一端與單片機(jī)的某一個(gè)I/O口相連,開始時(shí)先給I/O口賦

109、一高電平,然后讓單片機(jī)不斷地檢測該I/O口是否變成低電平,當(dāng)按鍵閉合時(shí),即相當(dāng)于該I/O口通過按鍵與地相連,變成低電平,程序一旦檢測到I/O口變?yōu)榈碗娖絼t說明按鍵被按下,然后執(zhí)行相應(yīng)的指令。</p><p>  圖4.4 按鍵按下時(shí)電壓的變化</p><p>  從圖4.4可以看出,理想波形與實(shí)際波形之間是有區(qū)別的,實(shí)際波形在按下和釋放的瞬間都有抖動現(xiàn)象,抖動時(shí)間的長短和按鍵的機(jī)械特性有關(guān)

110、,一般為5~10ms。通常我們手動按時(shí)都要加上去抖動操作,有專用的去抖動電路,也有專用的去抖動芯片,但通常我們軟件延時(shí)的方法就能很容易解決抖動問題,而沒有必要再添加多余的硬件電路。</p><p><b>  按鍵檢測流程圖</b></p><p>  無論獨(dú)立鍵盤還是矩陣鍵盤,單片機(jī)檢測其是否被按下的依據(jù)都是一樣的,也就是檢測該鍵對應(yīng)的I/O口是否為低電平。獨(dú)立鍵盤

111、有一端固定為低電平,單片機(jī)寫程序檢測時(shí)比較方便。而矩陣鍵盤兩端都與單片機(jī)I/O口連接,因此在檢測時(shí)需人為通過單片機(jī)I/O口送出低電平。檢測時(shí),先送一列為低電平,其余幾列為高電平,然后然后立即輪流檢測一次各行是否有低電平,若檢測到某一行為低電平,就可以確定當(dāng)前被按下的按鍵是哪一行哪一列的,用同樣的方法輪流各列送一次低電平,再輪流檢測一次各行是否變?yōu)榈碗娖剑@樣既可檢測完所有的按鍵。</p><p><b>

112、;  圖3-2矩陣鍵盤</b></p><p>  3.3顯示部分電路設(shè)計(jì)</p><p>  數(shù)碼管的顯示原理不論是共陰還是共陽,其基本原理是一樣的,都是靠點(diǎn)亮內(nèi)部的LED來發(fā)光。一位數(shù)碼管的引腳是十個(gè),顯示一個(gè)8字需要7個(gè)小段,另外還有一個(gè)小數(shù)點(diǎn)。</p><p>  3.3.1數(shù)碼管內(nèi)部原理圖</p><p>  實(shí)際實(shí)驗(yàn)時(shí)

113、,為了保證編程的方便和通常將數(shù)碼管的數(shù)字所對應(yīng)的八位數(shù)字記錄在數(shù)組中,程序中直接使用查表的方法,可以提高程序的效率,也使程序的編寫更加簡單方便。</p><p>  我們實(shí)驗(yàn)箱中的LED數(shù)碼管是四位數(shù)碼管,因此為了控制方便,四個(gè)數(shù)碼管的“段選端”是連在一起的,他們的GND或VCC端作為“位選端”來輸入控制信號,這樣單片機(jī)就可以通過程序來控制顯示的字符。</p><p>  下圖是實(shí)驗(yàn)箱開發(fā)

114、板中的數(shù)碼管電路圖:</p><p><b>  實(shí)驗(yàn)箱數(shù)碼管電路</b></p><p><b>  數(shù)碼管顯示段選碼:</b></p><p>  unsigned char code Seg_Table[13] = {0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/

115、0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/</p><p>  0x9c,/*10*/ //上框 代表實(shí)際溫度 0xa3,/*11*/ //下框 代表設(shè)定溫度 </p><p>  0xff//all off</p>

116、;<p><b>  };</b></p><p>  3.4溫度采集模塊電路設(shè)計(jì)</p><p>  溫度采集采用直接輸出數(shù)字量的DS18B20;如圖3-6示</p><p><b>  圖3-6</b></p><p>  DS18B20的主要特征: </p><

117、;p>  􀂄?全數(shù)字溫度轉(zhuǎn)換及輸出。 </p><p>  􀂄?先進(jìn)的單總線數(shù)據(jù)通信。 </p><p>  􀂄?最高12位分辨率,精度可達(dá)土0.5攝氏度。 </p><p>  􀂄?12位分辨率時(shí)的最大工作周期為750毫秒。 </p><p>  𙦦

118、8;?可選擇寄生工作方式。 </p><p>  􀂄?檢測溫度范圍為–55°C ~+125°C (–67°F ~+257°F) </p><p>  􀂄?內(nèi)置EEPROM,限溫報(bào)警功能。 </p><p>  􀂄?64位光刻ROM,內(nèi)置產(chǎn)品序列號,方便多機(jī)掛接。 </

119、p><p>  􀂄?多樣封裝形式,適應(yīng)不同硬件系統(tǒng)。 </p><p>  DS18B20芯片封裝結(jié)構(gòu): </p><p>  DS18B20引腳功能: </p><p>  ·GND 電壓地 ·DQ 單數(shù)據(jù)總線 ·VDD 電源電壓 ·NC 空引腳 </p><p>

120、;  DS18B20工作原理及應(yīng)用: </p><p>  DS18B20的溫度檢測與數(shù)字?jǐn)?shù)據(jù)輸出全集成于一個(gè)芯片之上,從而抗干擾力更強(qiáng)。其一個(gè)工作周期可分為兩個(gè)部分,即溫度檢測和數(shù)據(jù)處理。在講解其工作流程之前我們有必要了解18B20的內(nèi)部存儲器資源。18B20共有三種形態(tài)的存儲器資源,它們分別是: </p><p>  ROM 只讀存儲器,用于存放DS18B20ID編碼,其前8位是單線系

121、列編碼(DS18B20的編碼是19H),后面48位是芯片唯一的序列號,最后8位是以上56的位的CRC碼(冗余校驗(yàn))。數(shù)據(jù)在出產(chǎn)時(shí)設(shè)置不由用戶更改。DS18B20共64位ROM。 </p><p>  RAM 數(shù)據(jù)暫存器,用于內(nèi)部計(jì)算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,DS18B20共9個(gè)字節(jié)RAM,每個(gè)字節(jié)為8位。第1、2個(gè)字節(jié)是溫度轉(zhuǎn)換后的數(shù)據(jù)值信息,第3、4個(gè)字節(jié)是用戶EEPROM(常用于溫度報(bào)警值儲存)的鏡像。在

122、上電復(fù)位時(shí)其值將被刷新。第5個(gè)字節(jié)則是用戶第3個(gè)EEPROM的鏡像。第6、7、8個(gè)字節(jié)為計(jì)數(shù)寄存器,是為了讓用戶得到更高的溫度分辨率而設(shè)計(jì)的,同樣也是內(nèi)部溫度轉(zhuǎn)換、計(jì)算的暫存單元。第9個(gè)字節(jié)為前8個(gè)字節(jié)的CRC碼。EEPROM 非易失性記憶體,用于存放長期需要保存的數(shù)據(jù),上下限溫度報(bào)警值和校驗(yàn)數(shù)據(jù),DS18B20共3位EEPROM,并在RAM都存在鏡像,以方便用戶操作。 </p><p>  RAM及EEPROM

123、結(jié)構(gòu)圖:</p><p><b>  圖2</b></p><p>  我們在每一次讀溫度之前都必須進(jìn)行復(fù)雜的且精準(zhǔn)時(shí)序的處理,因?yàn)镈S18B20的硬件簡單結(jié)果就會導(dǎo)致軟件的巨大開消,也是盡力減少有形資產(chǎn)轉(zhuǎn)化為無形資產(chǎn)的投入,是一種較好的節(jié)約之道。 </p><p>  控制器對18B20操作流程: </p><p> 

124、 1, 復(fù)位:首先我們必須對DS18B20芯片進(jìn)行復(fù)位,復(fù)位就是由控制器(單片機(jī))給DS18B20單總線至少480uS的低電平信號。當(dāng)18B20接到此復(fù)位信號后則會在15~60uS后回發(fā)一個(gè)芯片的存在脈沖。 </p><p>  2, 存在脈沖:在復(fù)位電平結(jié)束之后,控制器應(yīng)該將數(shù)據(jù)單總線拉高,以便于在15~60uS后接收存在脈沖,存在脈沖為一個(gè)60~240uS的低電平信號。至此,通信雙方已經(jīng)達(dá)成了基本的協(xié)議,接下

125、來將會是控制器與18B20間的數(shù)據(jù)通信。如果復(fù)位低電平的時(shí)間不足或是單總線的電路斷路都不會接到存在脈沖,在設(shè)計(jì)時(shí)要注意意外情況的處理。 </p><p>  3, 控制器發(fā)送ROM指令:雙方打完了招呼之后最要將進(jìn)行交流了,ROM指令共有5條,每一個(gè)工作周期只能發(fā)一條,ROM指令分別是讀ROM數(shù)據(jù)、指定匹配芯片、跳躍ROM、芯片搜索、報(bào)警芯片搜索。ROM指令為8位長度,功能是對片內(nèi)的64位光刻ROM進(jìn)行操作。其主要

126、目的是為了分辨一條總線上掛接的多個(gè)器件并作處理。誠然,單總線上可以同時(shí)掛接多個(gè)器件,并通過每個(gè)器件上所獨(dú)有的ID號來區(qū)別,一般只掛接單個(gè)18B20芯片時(shí)可以跳過ROM指令(注意:此處指的跳過ROM指令并非不發(fā)送ROM指令,而是用特有的一條“跳過指令”)。ROM指令在下文有詳細(xì)的介紹。 </p><p>  4, 控制器發(fā)送存儲器操作指令:在ROM指令發(fā)送給18B20之后,緊接著(不間斷)就是發(fā)送存儲器操作指令了。

127、操作指令同樣為8位,共6條,存儲器操作指令分別是寫RAM數(shù)據(jù)、讀RAM數(shù)據(jù)、將RAM數(shù)據(jù)復(fù)制到EEPROM、溫度轉(zhuǎn)換、將EEPROM中的報(bào)警值復(fù)制到RAM、工作方式切換。存儲器操作指令的功能是命令18B20作什么樣的工作,是芯片控制的關(guān)鍵。 </p><p>  5, 執(zhí)行或數(shù)據(jù)讀寫:一個(gè)存儲器操作指令結(jié)束后則將進(jìn)行指令執(zhí)行或數(shù)據(jù)的讀寫,這個(gè)操作要視存儲器操作指令而定。如執(zhí)行溫度轉(zhuǎn)換指令則控制器(單片機(jī))必須等待

128、18B20執(zhí)行其指令,一般轉(zhuǎn)換時(shí)間為500uS。如執(zhí)行數(shù)據(jù)讀寫指令則需要嚴(yán)格遵循18B20的讀寫時(shí)序來操作。數(shù)據(jù)的讀寫方法將有下文有詳細(xì)介紹。 </p><p>  若要讀出當(dāng)前的溫度數(shù)據(jù)我們需要執(zhí)行兩次工作周期,第一個(gè)周期為復(fù)位、跳過ROM指令、執(zhí)行溫度轉(zhuǎn)換存儲器操作指令、等待500uS溫度轉(zhuǎn)換時(shí)間。緊接著執(zhí)行第二個(gè)周期為復(fù)位、跳過ROM指令、執(zhí)行讀RAM的存儲器操作指令、讀數(shù)據(jù)(最多為9個(gè)字節(jié),中途可停止,只

129、讀簡單溫度值則讀前2個(gè)字節(jié)即可)。其它的操作流程也大同小異,在此不多介紹。</p><p>  DS18B20芯片與單片機(jī)的接口:</p><p><b>  圖3</b></p><p><b>  圖4</b></p><p>  如圖所示,DS18B20只需要接到控制器(單片機(jī))的一個(gè)I/O口

130、上,由于單總線為開漏所以需要外接一個(gè)4.7K的上拉電阻。如要采用寄生工作方式,只要將VDD電源引腳與單總線并聯(lián)即可。但在程序設(shè)計(jì)中,寄生工作方式將會對總線的狀態(tài)有一些特殊的要求。</p><p><b>  圖5</b></p><p>  DS28B20芯片ROM指令表: </p><p>  Read ROM(讀ROM)[33H] (方括號

131、中的為16進(jìn)制的命令字) </p><p>  這個(gè)命令允許總線控制器讀到DS18B20的64位ROM。只有當(dāng)總線上只存在一個(gè)DS18B20的時(shí)候才可以使用此指令,如果掛接不只一個(gè),當(dāng)通信時(shí)將會發(fā)生數(shù)據(jù)沖突。 </p><p>  Match ROM(指定匹配芯片)[55H] </p><p>  這個(gè)指令后面緊跟著由控制器發(fā)出了64位序列號,當(dāng)總線上有多只DS18

132、B20時(shí),只有與控制發(fā)出的序列號相同的芯片才可以做出反應(yīng),其它芯片將等待下一次復(fù)位。這條指令適應(yīng)單芯片和多芯片掛接。 </p><p>  Skip ROM(跳躍ROM指令)[CCH] </p><p>  這條指令使芯片不對ROM編碼做出反應(yīng),在單總線的情況之下,為了節(jié)省時(shí)間則可以選用此指令。如果在多芯片掛接時(shí)使用此指令將會出現(xiàn)數(shù)據(jù)沖突,導(dǎo)致錯(cuò)誤出現(xiàn)。 </p><p

133、>  Search ROM(搜索芯片)[F0H] </p><p>  在芯片初始化后,搜索指令允許總線上掛接多芯片時(shí)用排除法識別所有器件的64位ROM。 </p><p>  Alarm Search(報(bào)警芯片搜索)[ECH] </p><p>  在多芯片掛接的情況下,報(bào)警芯片搜索指令只對附合溫度高于TH或小于TL報(bào)警條件的芯片做出反應(yīng)。只要芯片不掉電,報(bào)

134、警狀態(tài)將被保持,直到再一次測得溫度什達(dá)不到報(bào)警條件為止。 </p><p>  DS28B20芯片存儲器操作指令表: </p><p>  Write Scratchpad (向RAM中寫數(shù)據(jù))[4EH] </p><p>  這是向RAM中寫入數(shù)據(jù)的指令,隨后寫入的兩個(gè)字節(jié)的數(shù)據(jù)將會被存到地址2(報(bào)警RAM之TH)和地址3(報(bào)警RAM之TL)。寫入過程中可以用復(fù)位

135、信號中止寫入。 </p><p>  Read Scratchpad (從RAM中讀數(shù)據(jù))[BEH] </p><p>  此指令將從RAM中讀數(shù)據(jù),讀地址從地址0開始,一直可以讀到地址9,完成整個(gè)RAM數(shù)據(jù)的讀出。芯片允許在讀過程中用復(fù)位信號中止讀取,即可以不讀后面不需要的字節(jié)以減少讀取時(shí)間。 </p><p>  Copy Scratchpad (將RAM數(shù)據(jù)復(fù)

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論