0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于51單片機設(shè)計的熱敏電阻測溫系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-06-13 08:49 ? 次閱讀

一、項目介紹

當(dāng)前文章介紹基于51單片機的熱敏電阻測溫系統(tǒng)的設(shè)計過程,用于實時監(jiān)測環(huán)境溫度,并在溫度超過預(yù)設(shè)閾值時進行報警。由于采用的是熱敏電阻測溫技術(shù),無需外置溫度傳感器,使得系統(tǒng)具有結(jié)構(gòu)簡單、成本較低等優(yōu)點。

主控芯片采用STC89C52,具有良好的穩(wěn)定性和可靠性,適應(yīng)于工業(yè)控制等領(lǐng)域的應(yīng)用需要。ADC采集模塊采用PCF8591模塊,可方便地實現(xiàn)對熱敏電阻溫度數(shù)據(jù)的轉(zhuǎn)換和采集,提高了系統(tǒng)的準(zhǔn)確度和實用性。

系統(tǒng)通過4位數(shù)碼管顯示出溫度值,同時通過按鍵設(shè)置溫度上限閥值,當(dāng)溫度超過閥值時,會通過蜂鳴器報警,提醒用戶注意環(huán)境溫度的變化情況。

在項目中主要是用到了熱敏電阻和PCF8591模塊。

(1)熱敏電阻介紹

熱敏電阻(Thermistor)是一種基于材料的電阻元件,其電阻值隨溫度的變化而發(fā)生相應(yīng)的變化。通常情況下,熱敏電阻的電阻值隨溫度升高而降低,反之則隨溫度降低而升高,這種特性被稱為負(fù)溫度系數(shù)(NTC)或正溫度系數(shù)(PTC)。

熱敏電阻的工作原理是基于材料的溫度敏感性質(zhì)。在熱敏電阻中,存在許多導(dǎo)電粒子,當(dāng)溫度升高時,導(dǎo)電粒子與材料中的離子激發(fā)程度增強,導(dǎo)致導(dǎo)電粒子的數(shù)量變多,因此電阻值降低;反之,當(dāng)溫度降低時,導(dǎo)電粒子的數(shù)量變少,電阻值增加。

image-20230607174607073

(2)PCF8591

PCF8591是一款4通道、8位模數(shù)轉(zhuǎn)換器ADC)和1通道、8位數(shù)模轉(zhuǎn)換器DAC)的集成電路芯片。可以通過I2C總線與微控制器進行通信,實現(xiàn)模擬信號的輸入和輸出。

PCF8591的輸入電壓范圍為0V~VCC(通常為5V),可以通過外部電阻進行放大或縮小。它還有一個內(nèi)部參考電壓源,可以通過軟件控制選擇使用。

PCF8591的輸出電壓范圍也是0V~VCC,可以用于控制模擬信號的輸出,比如控制電機的轉(zhuǎn)速、LED的亮度等。

在熱敏電阻測溫系統(tǒng)中,使用PCF8591模塊來采集熱敏電阻的電壓信號,并將其轉(zhuǎn)換為數(shù)字信號,進而計算出溫度值。

image-20230607175024034

image-20230607174642810

image-20230607175143298

二、設(shè)計思路

2.1 系統(tǒng)結(jié)構(gòu)

系統(tǒng)采用單片機作為主控芯片,熱敏電阻用于測量環(huán)境溫度,PCF8591模塊采集熱敏電阻的溫度數(shù)據(jù)并將其轉(zhuǎn)換為正常溫度值,通過數(shù)碼管進行顯示。同時,系統(tǒng)設(shè)置上限閥值,當(dāng)溫度超過該值時,系統(tǒng)會通過蜂鳴器報警。

2.2 硬件設(shè)計

(1)主控芯片

本系統(tǒng)采用STC89C52單片機作為主控芯片,具有強大的計算能力、穩(wěn)定的性能和較低的功耗,支持多種外設(shè)接口,適合于工業(yè)控制等領(lǐng)域的應(yīng)用需求。

(2)溫度傳感器

本系統(tǒng)采用熱敏電阻作為溫度傳感器,其結(jié)構(gòu)簡單、價格便宜,且無需額外的電源供應(yīng),可直接通過PC8591模塊的輸入端口進行檢測。

(3)ADC采集模塊

系統(tǒng)采用PCF8591模塊進行ADC采集,具有4路模擬輸入通道和一個模擬輸出通道,采樣精度高達8位,能夠滿足本系統(tǒng)對溫度信號的準(zhǔn)確采集需求。

(4)數(shù)碼管顯示模塊

系統(tǒng)采用4位共陽數(shù)碼管進行數(shù)據(jù)顯示,其顯示范圍為-999~+9999,可滿足本系統(tǒng)對溫度數(shù)據(jù)的實時顯示需求。

(5)蜂鳴器報警模塊

系統(tǒng)采用蜂鳴器進行報警提示,當(dāng)溫度超過預(yù)設(shè)閾值時,蜂鳴器會發(fā)出持續(xù)聲響,提醒用戶注意環(huán)境溫度的變化情況。

(6)按鍵模塊

按鍵模塊,方便用戶進行閥值的設(shè)置和調(diào)整操作。

2.3 軟件設(shè)計

(1)溫度采集與轉(zhuǎn)換

系統(tǒng)使用ADC采集熱敏電阻的溫度信號,并將采集到的數(shù)字信號轉(zhuǎn)換成溫度值進行顯示。轉(zhuǎn)換公式為: T=(adc_value/255.0)*330,其中adc_value為AD轉(zhuǎn)換器輸出的數(shù)字值,330是熱敏電阻的參考電阻值。

(2)溫度上限閥值設(shè)置

系統(tǒng)通過按鍵實現(xiàn)溫度上限閥值的設(shè)置和調(diào)整操作,用戶可以根據(jù)自己的需求進行設(shè)定。

(3)報警功能設(shè)計

系統(tǒng)在采集到溫度超過預(yù)設(shè)閾值時,蜂鳴器會發(fā)出聲響進行提醒,并且LED指示燈會亮起。

2.4 總體流程

(1)初始化各個模塊,包括單片機、PCF8591、數(shù)碼管、蜂鳴器和按鍵等。

(2)采集熱敏電阻的溫度信號,并將數(shù)字信號轉(zhuǎn)換為溫度值。

(3)將溫度值通過數(shù)碼管進行顯示。

(4)檢測當(dāng)前溫度是否超過預(yù)設(shè)閾值,若超過,則觸發(fā)報警并點亮LED指示燈。

(5)用戶可以通過按鍵設(shè)置溫度上限閥值,系統(tǒng)會保存設(shè)置的閾值并進行下一次溫度比較。

三、代碼實現(xiàn)

以下是基于51單片機設(shè)計的熱敏電阻測溫系統(tǒng)的實現(xiàn)代碼。

#include < reg52.h >
 #include < intrins.h >
 ?
 typedef unsigned char u8;
 typedef unsigned int u16;
 ?
 #define PCF8591_address_write 0x90
 #define PCF8591_address_read  0x91
 ?
 sbit SCLK = P1^0;      //PCF8591模塊時鐘
 sbit DOUT = P1^1;      //PCF8591模塊數(shù)據(jù)線
 sbit DIN = P1^2;       //PCF8591模塊數(shù)據(jù)線
 sbit CS = P1^3;        //PCF8591模塊片選線
 ?
 sbit LATCH1 = P3^4;    //鎖存器1
 sbit LATCH2 = P3^5;    //鎖存器2
 ?
 sbit KEY1 = P2^0;      //按鍵1
 sbit KEY2 = P2^1;      //按鍵2
 ?
 sbit BUZZ = P2^3;      //蜂鳴器
 ?
 u16 ADC_value;         //采集到的ADC值
 float temperature;     //計算得到的溫度值
 ?
 u8 table[] = {  //共陽數(shù)碼管段碼表
     0xc0,   //0
     0xf9,   //1
     0xa4,   //2
     0xb0,   //3
     0x99,   //4
     0x92,   //5
     0x82,   //6
     0xf8,   //7
     0x80,   //8
     0x90,   //9
     0xbf,   //-
 };
 ?
 void delay(u16 i){
     while(i--);
 }
 ?
 void delay_ms(u16 ms){
     u16 i, j;
     for(i=0; i< ms; i++){
         for(j=0; j< 110; j++);
     }
 }
 ?
 void write_PCF8591(u8 data){
     u8 i;
     DIN = 1;
     SCLK = 0;
     CS = 0;
     for(i=0; i< 8; i++){
         DOUT = (data & 0x80) > > 7;
         data < <= 1;
         SCLK = 1;
         SCLK = 0;
     }
     CS = 1;
 }
 ?
 u16 read_ADC(){
     u16 value;
     CS = 0;
     DIN = 1;
     SCLK = 0;
     DIN = 0;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     SCLK = 1;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     value = P1;
     SCLK = 0;
     value < <= 8;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     SCLK = 1;
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     _nop_();
     value |= P1;
     CS = 1;
     return value;
 }
 ?
 void display(u8 addr, u8 dat){
     LATCH1 = 0;
     LATCH2 = 0;
     P0 = addr;
     LATCH1 = 1;
     LATCH1 = 0;
     P0 = table[dat];
     LATCH2 = 1;
     LATCH2 = 0;
 }
 ?
 void main(){
     u8 set_value = 40;  //溫度上限閥值
     u8 temp;
     write_PCF8591(0x40);
     while(1){
         ADC_value = read_ADC();
         temperature = (float)ADC_value * 330 / 255;
         temperature -= 50;
         if(temperature > set_value){  //溫度超過上限閥值,觸發(fā)報警
             BUZZ = 1;
         }
         else{
             BUZZ = 0;
         }
         if(temperature < -99){
             temp = '-';
             display(0x00, temp);
             display(0x01, 10);
             display(0x02, 10);
             display(0x03, 10);
         }
         else if(temperature < 0){
             temp = '-';
             display(0x00, temp);
             temp = ~(int)temperature + 1;
             display(0x01, temp/10);
             display(0x02, temp%10);
             display(0x03, 11);  //小數(shù)點
         }
         else if(temperature > 999){
             display(0x00, 10);
             display(0x01, 9);
             display(0x02, 9);
             display(0x03, 9);
         }
         else{
             display(0x00, temperature/100);
             display(0x01, temperature/10%10);
             display(0x02, temperature%10);
             display(0x03, 11);  //小數(shù)點
         }
         if(KEY1 == 0){  //按鍵1按下,增加上限閥值
             delay_ms(10);
             if(KEY1 == 0){
                 set_value++;
                 while(!KEY1);
             }
         }
         if(KEY2 == 0){  //按鍵2按下,減小上限閥值
             delay_ms(10);
             if(KEY2 == 0){
                 set_value--;
                 while(!KEY2);
             }
         }
         delay_ms(10);
     }
 }

代碼中采用了共陽數(shù)碼管,通過采集熱敏電阻產(chǎn)生的電壓值,計算得到環(huán)境溫度值,再通過數(shù)碼管進行顯示;當(dāng)溫度超過設(shè)定的上限值時,會觸發(fā)蜂鳴器報警。可以通過按鍵對溫度上限閥值進行設(shè)置和調(diào)整操作。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2545

    文章

    50445

    瀏覽量

    751069
  • 熱敏電阻
    +關(guān)注

    關(guān)注

    14

    文章

    1122

    瀏覽量

    101415
  • NTC
    NTC
    +關(guān)注

    關(guān)注

    7

    文章

    402

    瀏覽量

    51984
  • 51單片機
    +關(guān)注

    關(guān)注

    273

    文章

    5697

    瀏覽量

    122996
  • 測溫系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    21975
收藏 人收藏

    評論

    相關(guān)推薦

    如何去實現(xiàn)一種基于51單片機熱敏電阻測溫系統(tǒng)

    本設(shè)計以51系列單片機STC89C52為控制核心,以液晶顯示模塊、鍵盤為人機接口,負(fù)溫度系數(shù)熱敏電阻器(NTC)為采樣傳感器,實現(xiàn)了一個基于51單片
    發(fā)表于 07-14 08:33

    如何實現(xiàn)一個基于51單片機熱敏電阻測溫設(shè)計

    如何實現(xiàn)一個基于51單片機熱敏電阻測溫設(shè)計?基于51單片機
    發(fā)表于 10-18 06:14

    基于單片機熱敏電阻測溫設(shè)計資料分享

    基于單片機熱敏電阻測溫設(shè)計1.基本功能1)具有聲光報警功能;2)使用液晶顯示;3)溫度上、下限報警值設(shè)定;溫度上、下限報警;4)手動方式設(shè)定溫度上下限;總體方案設(shè)計溫度控制系統(tǒng)主要由
    發(fā)表于 02-18 07:49

    簡述熱敏電阻測溫原理

    熱敏電阻測溫原理與熱電偶的測溫原理不同的是,熱電阻是基于電阻的熱效應(yīng)進行溫度測量的,即電阻體的阻
    的頭像 發(fā)表于 01-19 14:03 ?3w次閱讀

    基于51單片機熱敏電阻溫度計仿真設(shè)計

    基于51單片機熱敏電阻溫度計仿真設(shè)計
    發(fā)表于 10-25 10:14 ?8次下載

    39-基于51單片機熱敏電阻測溫設(shè)計

    本設(shè)計以51系列單片機STC89C52為控制核心,以液晶顯示模塊、鍵盤為人機接口,負(fù)溫度系數(shù)熱敏電阻器(NTC)為采樣傳感器,實現(xiàn)了一個基于51單片
    發(fā)表于 11-05 12:21 ?45次下載
    39-基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>熱敏電阻</b><b class='flag-5'>測溫</b>設(shè)計

    39-基于51單片機熱敏電阻測溫設(shè)計

    系統(tǒng)由STC89C52單片機+熱敏電阻+TLC2543AD模塊+LCD1602顯示模塊+報警模塊+電源構(gòu)成。具體功能:1、LCD1602顯示測得的溫度值與設(shè)定的溫度范圍2、按鍵可以設(shè)置溫度范圍;3、超過設(shè)置的溫度范圍,開始報警;
    發(fā)表于 11-23 16:36 ?10次下載
    39-基于<b class='flag-5'>51</b><b class='flag-5'>單片機</b>的<b class='flag-5'>熱敏電阻</b><b class='flag-5'>測溫</b>設(shè)計

    基于單片機熱敏電阻測溫設(shè)計

    基于單片機熱敏電阻測溫設(shè)計1.基本功能1)具有聲光報警功能;2)使用液晶顯示;3)溫度上、下限報警值設(shè)定;溫度上、下限報警;4)手動方式設(shè)定溫度上下限;總體方案設(shè)計溫度控制系統(tǒng)主要由
    發(fā)表于 12-23 19:19 ?16次下載
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>熱敏電阻</b><b class='flag-5'>測溫</b>設(shè)計

    基于51單片機熱敏電阻測溫仿真程序

    基于51單片機熱敏電阻測溫仿真設(shè)計(包含仿真及源程序)
    發(fā)表于 05-19 16:16 ?13次下載

    ntc熱敏電阻測溫電路

    ntc熱敏電阻測溫電路 NTC熱敏電阻測溫電路 NTC熱敏電阻測溫電路主要指利用負(fù)溫度系數(shù)
    的頭像 發(fā)表于 08-28 18:24 ?3969次閱讀

    ntc熱敏電阻測溫電路原理

    ntc熱敏電阻測溫電路原理 NTC熱敏電阻測溫電路是一種常見的溫度測量電路,它通過利用熱敏電阻的阻值和溫度的關(guān)系來實現(xiàn)溫度的測量。 一、
    的頭像 發(fā)表于 08-28 18:24 ?3846次閱讀

    ntc熱敏電阻測溫c程序

    ntc熱敏電阻測溫c程序? 熱敏電阻是一種溫度敏感的電阻,它的電阻值隨溫度變化而變化,可以用于溫度測量。在實際應(yīng)用中,我們可以利用NTC(N
    的頭像 發(fā)表于 08-28 18:24 ?2258次閱讀

    基于51單片機熱敏電阻數(shù)字溫度計設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機熱敏電阻數(shù)字溫度計設(shè)計.rar》資料免費下載
    發(fā)表于 01-03 11:17 ?33次下載

    基于51單片機熱敏電阻數(shù)字溫度計設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于51單片機熱敏電阻數(shù)字溫度計設(shè)計.rar》資料免費下載
    發(fā)表于 01-12 09:32 ?8次下載

    熱敏電阻測溫范圍小的原因

    熱敏電阻是一種利用材料電阻隨溫度變化的特性來測量溫度的傳感器。它廣泛應(yīng)用于各種領(lǐng)域,如工業(yè)自動化、家用電器、汽車電子等。然而,熱敏電阻測溫范圍相對較小,這主要是由于其工作原理和材料特
    的頭像 發(fā)表于 07-18 10:35 ?404次閱讀