<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 51單片機-溫度控制器設(shè)計詳解+電路+代碼

          51單片機-溫度控制器設(shè)計詳解+電路+代碼

          作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
          這個51單片機電路里面,需要用到:
          AT89C51 x1 主要控制單片機
          AT24C02 x1 EEPROM-2K儲存器
          DS180B2 x1溫度傳感器
          10uF x1 , 47uF x1 有極電容
          104[0.1uF] x3 , 30pF x2 無極電容
          12MHz x1石英晶體振蕩器
          1K[1千歐姆] x2 電阻
          7cmx9cm x1 萬能洞洞電路板
          繼電器若干[根據(jù)需要用到的繼電器數(shù)目安裝到電路上,主控芯片設(shè)計可以控制八位繼電器(整一個P1端口)]
          總價好像12塊左右吧,建議淘寶一下,不同的商家出售器件的價格不同..
          Q1:EEPROM的作用
          A1:因為EEPROM[電壓式可擦寫ROM]可以讓單片機進行IIC讀寫外部儲存數(shù)據(jù),也方便以后換一個控制電路溫度值,單片機不可能每換一個控制溫
          度值的時候就重新對主控芯片進行編程..
          Q2:為什么EEPROM要2K大小呢?
          A2:太大的儲存空間沒有實質(zhì)上的意義,最多使用的數(shù)據(jù)只用26位數(shù)據(jù)位,而且更大的儲存空間的EEPROM造價也貴,T24C02-DIP8[直插八個引
          腳]需要0.8元左右,AT24C512-DIP8[數(shù)據(jù)存儲空間512KB]需要17元左右..
          Q3:主控芯片可以用其它的51系列代替嗎?
          A3:完全可以的,只需要在原代碼文件中修改一下頭文件就可以把程序移植到另一個型號的芯片,同理也可以把程序移植到AT89C2051中,
          AT89C2051比AT89C51的一個好處就是C2051系列的芯片體積比C51系列的芯片小,可以把電路更小化,如果還要求電路更小化的話選用SOP封
          裝[貼片型封裝]的電子元件是一個不錯的選擇,不過太小的SOP元件焊接到電路上會另你很頭疼,電路布局一定程度上也會影響電路板的整體大
          小..
          EEPROM儲存數(shù)據(jù)的方式解析:

          下面是EEPROM里面的數(shù)據(jù)儲存結(jié)構(gòu)[嘻嘻,圖畫得有點不好,技術(shù)問題請見諒啦..]

          本文引用地址:http://www.ex-cimer.com/article/201612/324239.htm

          首先從主控入口代碼處進行分析:

          #define EEPROM_StartAddr 0x4E

          #define EEPROM_StartFlag 0xB0

          LED=1;

          BitData=read_add(EEPROM_StartAddr);

          if (BitData!=EEPROM_StartFlag) while(1);

          ListTotal=read_add(EEPROM_StartAddr+1);

          for(i=0;i

          {

          CtrlList[i].AlarmTemp=read_add((EEPROM_StartAddr+2)+i*3);

          CtrlList[i].CtrlPort =read_add((EEPROM_StartAddr+2)+i*3+1);

          }

          LED=0;

          代碼首先會從EEPROM里面讀取0x4E位里面的數(shù)據(jù)來和EEPROM起始數(shù)據(jù)位標(biāo)志進行對比,判斷這個EEPROM的數(shù)據(jù)格式的正確性,由于沒有讓

          主控芯片對每一個數(shù)據(jù)位進行校驗,那么這就是一個簡單的驗證方法,要是對每一位數(shù)據(jù)都要進行的驗證的話得需要一個可靠,高效的算法,這樣雖

          然安全,不過會對主控芯片初始化有一定的性能影響

          判斷起始數(shù)據(jù)位失敗后,主控芯片會進入到卡死狀態(tài)[見代碼 while(1); ,死循環(huán),處理器永遠也跳不出這個循環(huán)到外面]

          判斷起始數(shù)據(jù)位成功后,下一步就從EEPROM的0x4F位讀取出需要控制溫度的項目總數(shù),然后再按照這個項目總數(shù)來進行數(shù)據(jù)位偏移來讀取將要

          控制的溫度數(shù)值和警報控制端口,注意兩個控制數(shù)據(jù)結(jié)構(gòu)中間需要用一個NULL[即0x00]來隔開來,防止數(shù)據(jù)結(jié)構(gòu)被打亂

          從EEPROM里面讀取完成數(shù)據(jù)后,主控芯片工作指示燈發(fā)光,開始進入溫度控制

          主要代碼:

          while(1)

          {

          TempData=get_temp();

          BitData=(TempData%1000/100)*10;//十位溫度。

          BitData=(TempData%1000%100/10)+BitData;//個位溫度。

          for(i=0;i

          {

          CtrlElec=(CtrlList[i].AlarmTemp>=BitData)?0:1;

          CtrlListPort=CtrlList[i].CtrlPort;

          CtrlPort(CtrlListPort,CtrlElec); //符合條件輸出底電,不符合輸出高電

          delayb(100);

          }

          delayb(200);

          }

          這個可不像SetTimer()一樣,用SetTimer()指定了的函數(shù)不需要加上while 循環(huán),僅且把上面的代碼當(dāng)作線程來看待,讓這個線程運行的代碼段永遠

          都是這個,假如線程的代碼一旦執(zhí)行完畢[也就是說跳出了while 死循環(huán)],那么它就會關(guān)閉掉自己和釋放屬于自己的TLS[線程本地儲存]

          先從DS18B02里面讀取出來溫度值,然后再對溫度進行轉(zhuǎn)換,把轉(zhuǎn)換好的溫度再和從EEPROM里面讀取出來的數(shù)據(jù)結(jié)構(gòu)進行比較

          一個溫度控制判斷周期約一秒[以12MHz來計算的話,應(yīng)該是略大于一秒而不會小于一秒]..

          下面是溫度控制器的電路:

          5V供電電路:

          主控芯片及外圍器件電路:

          電路中用繼電器來控制外部電路的開閉,G[公共端] B[常閉端] K[常開端] 就是讓繼電器控制外部電路的開關(guān),5V電壓和P1^0端口是用來控制繼電器的G端和B,K端通路.原理如下


          上一頁 1 2 下一頁

          關(guān)鍵詞: 51單片機溫度控制器代

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();