【51單片機(jī)系列】DS18B20溫度傳感器擴(kuò)展實(shí)驗(yàn)之設(shè)計(jì)一個(gè)智能溫控系統(tǒng)

本文是關(guān)于DS18B20溫度傳感器的一個(gè)擴(kuò)展實(shí)驗(yàn)。

本擴(kuò)展實(shí)驗(yàn)實(shí)現(xiàn)的功能:利用DS18B20設(shè)計(jì)一個(gè)智能溫度控制系統(tǒng),具有溫度上下限值設(shè)定。當(dāng)溫度高于上限值時(shí),電機(jī)開(kāi)啟,同時(shí)蜂鳴器報(bào)警;當(dāng)溫度低于下限值時(shí)繼電器工作加熱,同時(shí)蜂鳴器報(bào)警,當(dāng)溫度處于上下限間正常工作。

首先系統(tǒng)運(yùn)行后,可以通過(guò)按鍵設(shè)置溫度上下限,當(dāng)按下開(kāi)始運(yùn)行按鍵后溫控系統(tǒng)開(kāi)始工作。默認(rèn)溫度上下限為23~25°C。溫控系統(tǒng)開(kāi)始運(yùn)行后會(huì)在數(shù)碼管中顯示當(dāng)前溫度。

使用到的硬件資源有:

  • 獨(dú)立按鍵;
  • 蜂鳴器+ULN2003;
  • 直流電機(jī);
  • 繼電器;
  • 共陰極數(shù)碼管+74HC128+74HC245;
  • DS18B20溫度傳感器;

一、相關(guān)元件介紹

當(dāng)按鍵按下時(shí),按鍵兩端管腳電平一致,按鍵處理時(shí)需要延時(shí)消抖+二次確認(rèn)。

要驅(qū)動(dòng)蜂鳴器發(fā)聲,分為有源蜂鳴器和無(wú)源蜂鳴器。對(duì)于有源蜂鳴器控制其中一端管腳為高電平或低電平即可發(fā)聲;對(duì)于無(wú)源蜂鳴器,需要一定頻率的脈沖才可發(fā)聲。驅(qū)動(dòng)蜂鳴器需要比較大的電流,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能。本實(shí)驗(yàn)使用有源蜂鳴器。

要驅(qū)動(dòng)直流電機(jī)轉(zhuǎn)動(dòng),在其一端管腳輸入高電平,另一端管腳輸入低電平,使直流電機(jī)有電流通過(guò)即可轉(zhuǎn)動(dòng),高低電平在不同位置,僅控制轉(zhuǎn)動(dòng)的方向。要驅(qū)動(dòng)直流電機(jī)也需要比較大的電流,使用ULN2003芯片實(shí)現(xiàn)放大電流的功能。

使用一個(gè)PNP三極管驅(qū)動(dòng)繼電器,添加一個(gè)二極管用于保護(hù)繼電器。

使用74HC138芯片控制數(shù)碼管的位選,74HC245控制數(shù)碼管的段選。

DS1302溫度傳感器是單總線(xiàn)通信,不需要外圍元件。具有可編程的分辨率,內(nèi)含64位的ROM(64位的序列號(hào),識(shí)別當(dāng)前使用的芯片)、一個(gè)包含9字節(jié)的高速暫存器RAM和一個(gè)非易失性可電擦除EEPROM。

不考慮64位ROM序列號(hào),DS1302讀取溫度過(guò)程:初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送溫度轉(zhuǎn)換命令44H→延時(shí)→初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送讀RAM命令BEH→連續(xù)讀出數(shù)據(jù)。

設(shè)置溫度上下限過(guò)程:初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送48H命令將RAM2、3字節(jié)的內(nèi)容復(fù)制到EEPROM中→延時(shí)→初始化→發(fā)送CCH命令跳過(guò)ROM→發(fā)送4EH命令將溫度限值寫(xiě)入RAM→發(fā)送連個(gè)字節(jié)的數(shù)據(jù)。

二、實(shí)驗(yàn)分析

本實(shí)驗(yàn)實(shí)現(xiàn)的是一個(gè)溫度控制系統(tǒng),當(dāng)溫度超過(guò)設(shè)定范圍時(shí)觸發(fā)一定操作。溫度超過(guò)上限時(shí),電機(jī)開(kāi)啟同時(shí)蜂鳴器報(bào)警;溫度低于下限時(shí),繼電器工作同時(shí)蜂鳴器報(bào)警;溫度處于上下限之間時(shí),系統(tǒng)正常工作。系統(tǒng)通過(guò)按鍵調(diào)節(jié)上限、下限和工作開(kāi)始或停止。

本系統(tǒng)的需求包括:

  • 按鍵控制系統(tǒng)的開(kāi)始和停止;
  • 按鍵調(diào)節(jié)上限和下限;
  • 溫度超過(guò)范圍報(bào)警,溫度在范圍內(nèi)正常工作;
  • 調(diào)節(jié)溫度上下限時(shí)對(duì)應(yīng)的上下限溫度會(huì)顯示在數(shù)碼管中;
  • 系統(tǒng)工作時(shí)的溫度實(shí)時(shí)顯示在數(shù)碼管中;

三、proteus原理圖設(shè)計(jì)

proteus仿真原理圖如下。P3.0~P3.3口控制獨(dú)立按鍵K1 ~ K4,P3.0 ~ 03.3口為低電平時(shí)表示按鍵按下。K1向上調(diào)溫度上限,K2向下調(diào)溫度下限,按K3確定溫度的上下限,按K4 溫度控制系統(tǒng)開(kāi)始工作。P3.7口作為溫度傳感器DS18B20的輸入/輸出。

通過(guò)ULN2003芯片起到放大電流的作用,用來(lái)控制蜂鳴器、繼電器和直流電機(jī)。P1.0控制直流電機(jī),P1.0為高電平時(shí)直流電機(jī)工作,為低電平時(shí)直流電機(jī)不工作。P1.5控制蜂鳴器,P1.5為低電平是蜂鳴器不發(fā)聲,為高電平時(shí)蜂鳴器發(fā)聲。P1.1口控制繼電器,P1.1為低電平時(shí)繼電器工作,為高電平時(shí)繼電器不工作。

獨(dú)立按鍵-溫度傳感器-蜂鳴器-直流電機(jī)-繼電器模塊

P0口通過(guò)74HC245控制數(shù)碼管的段選,P2.2~P2.4通過(guò)74HC138控制數(shù)碼管的位選。P0口為高電平時(shí),對(duì)應(yīng)數(shù)碼管的段亮。

共陰極數(shù)碼管模塊

四、軟件設(shè)計(jì)

按鍵函數(shù)處理如下:

void DataPros()
{
    int temp=curTmp*100;
    if(temp<0)
    {
        display[0]=0x40;  // -
    } 
    else
    {
        display[0]=0x00;
    }
    display[1]=smg[temp%10000/1000];
    display[2]=smg[temp%1000/100]|0x80;  // |0x80顯示小數(shù)點(diǎn)
    display[3]=smg[temp%100/10];
    display[4]=smg[temp%10/1];
    display[5]=0x39;
    
}

// 按鍵處理函數(shù)
void KeyPros()
{
    u8 i;
    // K1上調(diào)溫度上限
    if(0==K1)
    {
        delay1ms(10);
        if(0 == K1)
        {
            tmpH=tmpH+1;
            if(tmpH>125)
                tmpH=125;
            curTmp=tmpH;
            DataPros();
        }
        while(!K1);
    }
    
    // K2下調(diào)溫度下限
    if(0==K2)
    {
        delay1ms(10);
        if(0 == K2)
        {
            tmpL=tmpL-1;
            if(tmpL<-55)
                tmpL=-55;
            curTmp=tmpL;
            DataPros();
        }
        while(!K2);
    }
    
    // 按K4,系統(tǒng)開(kāi)始運(yùn)行,讀取當(dāng)前溫度,判斷是否超過(guò)溫度范圍
    if(0==K4)
    {
        delay1ms(10);
        if(0==K4)
        {
            enRead=~enRead;
            if(0==enRead)
            {
                for(i=0;i<8;i++)
                {
                    display[i]=0;
                }
            }
        }
        while(!K4);
    }
}

溫度處理函數(shù)如下:

// 溫度處理函數(shù)
void TempPros(int temp)
{
    float tp;
    if(temp<0)
    {
        display[0]=0x40;  // -
        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*100+0.5;
    }
    else
    {
        display[0]=0x00;
        tp=temp;
        temp=tp*0.0625*100+0.5;
    }
    
    // 如果溫度超過(guò)上限,蜂鳴器發(fā)聲,電機(jī)轉(zhuǎn)動(dòng)
    if((tp*0.0625)>tmpH)
    {
        BEEP=1;
        MOTOR=1;
        RELAY=1;
        
    }
    else if((tp*0.0625)<tmpL)  // 如果溫度低于下限,蜂鳴器發(fā)聲,繼電器工作
    {
        BEEP=1;
        MOTOR=0;
        RELAY=0;
    }
    else
    {
        BEEP=0;
        MOTOR=0;
        RELAY=1;
    }
    
    display[1]=smg[temp%10000/1000];
    display[2]=smg[temp%1000/100]|0x80;  // |0x80顯示小數(shù)點(diǎn)
    display[3]=smg[temp%100/10];
    display[4]=smg[temp%10/1];
    display[5]=0x39;
}

主函數(shù):

void main()
{
    enRead=0;
    BEEP=0;
    MOTOR=0;
    RELAY=1;

    while(1)
    {
        if(0!=enRead)
            TempPros(DS18B20ReadTemp());  // 系統(tǒng)運(yùn)行時(shí)默認(rèn)數(shù)碼管不顯示,當(dāng)按了K4時(shí)顯示實(shí)時(shí)溫度
        KeyPros();
        DigDisplay();
    }
}

仿真結(jié)果:

溫度控制系統(tǒng)仿真結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容