新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機-溫度控制器設計詳解+電路+代碼

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

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

        下面是EEPROM里面的數據儲存結構[嘻嘻,圖畫得有點不好,技術問題請見諒啦..]

        本文引用地址:http://www.104case.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位里面的數據來和EEPROM起始數據位標志進行對比,判斷這個EEPROM的數據格式的正確性,由于沒有讓

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

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

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

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

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

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

        主要代碼:

        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()指定了的函數不需要加上while 循環,僅且把上面的代碼當作線程來看待,讓這個線程運行的代碼段永遠

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

        先從DS18B02里面讀取出來溫度值,然后再對溫度進行轉換,把轉換好的溫度再和從EEPROM里面讀取出來的數據結構進行比較

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

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

        5V供電電路:

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

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


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 准格尔旗| 宁陕县| 隆化县| 深水埗区| 宁夏| 铜鼓县| 林州市| 牙克石市| 阿坝县| 远安县| 榆林市| 上犹县| 乐山市| 嘉黎县| 吉林省| 昌都县| 永仁县| 玛沁县| 白河县| 阿克苏市| 繁峙县| 辽中县| 舟山市| 方正县| 海城市| 称多县| 江口县| 大田县| 鹿泉市| 吉木萨尔县| 桓台县| 饶阳县| 清远市| 溧阳市| 名山县| 晋城| 县级市| 怀安县| 海口市| 白沙| 闵行区|