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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

基于51單片機設計的數(shù)字溫度計設計

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

一、項目介紹

數(shù)字溫度計是一種廣泛應用于日常生活和工業(yè)領域中的電子測量儀器,用于檢測環(huán)境溫度并將其轉(zhuǎn)換為數(shù)字信號進行顯示。隨著現(xiàn)代科技的發(fā)展,數(shù)字溫度計逐漸取代了傳統(tǒng)的水銀溫度計等方式,具有快速響應、高精度、便攜式等優(yōu)點。

基于51單片機設計的數(shù)字溫度計具體應用于制造業(yè)中的溫度檢測,例如溫度控制器、烤箱溫度控制、食品加工、工業(yè)爐等領域。通過DS18B20這種數(shù)字溫度傳感器來進行溫度采集,使用STC89C52這種常用的單片機控制芯片,配合4位共陽數(shù)碼管實現(xiàn)溫度數(shù)據(jù)顯示,并通過按鍵設置溫度上限閥值,一旦溫度超過閥值,系統(tǒng)會觸發(fā)蜂鳴器進行報警提示,從而保證了溫度的精準控制和安全性。

DS18B20是一種數(shù)字溫度傳感器,由Maxim Integrated公司生產(chǎn)。采用1-Wire總線接口,只需要一個數(shù)據(jù)線就可以同時實現(xiàn)數(shù)據(jù)傳輸和供電。主要特點是精度高、響應速度快、體積小、價格低廉,被廣泛應用于各種溫度測量場合。

DS18B20可以測量的溫度范圍為-55℃~+125℃,精度為±0.5℃(在-10℃~+85℃范圍內(nèi))。內(nèi)部集成了溫度傳感器、A/D轉(zhuǎn)換器和數(shù)字信號處理電路,可以直接輸出數(shù)字溫度值。

DS18B20的工作原理是利用溫度對半導體材料電阻值的影響,將溫度轉(zhuǎn)化為電阻值,再通過A/D轉(zhuǎn)換器將電阻值轉(zhuǎn)化為數(shù)字信號輸出。1-Wire總線接口可以實現(xiàn)多個DS18B20傳感器的串聯(lián),只需要一個控制器就可以同時讀取多個傳感器的溫度數(shù)據(jù)。

在熱敏電阻測溫系統(tǒng)中,可以使用DS18B20傳感器來測量環(huán)境溫度,并將溫度值傳輸?shù)娇刂破髦羞M行處理和顯示。

下面是仿真圖:

image-20230607175253647

二、設計思路

2.1 系統(tǒng)架構(gòu)

系統(tǒng)硬件主要由單片機控制模塊、溫度傳感器模塊、數(shù)碼管顯示模塊、按鍵模塊、蜂鳴器模塊組成。其中單片機控制模塊采用STC89C52作為主控芯片,通過連接數(shù)碼管、按鍵、蜂鳴器、溫度傳感器等外圍電路實現(xiàn)溫度檢測、控制和報警功能。

2.2 技術(shù)方案

(1)溫度傳感器模塊 本項目采用DS18B20數(shù)字式溫度傳感器進行溫度檢測,該傳感器具有精度高、響應快、可靠性強等優(yōu)點。通過將其與單片機進行串口通信,實現(xiàn)溫度數(shù)據(jù)的采集。

(2)數(shù)碼管顯示模塊 本項目采用4位共陽數(shù)碼管進行溫度數(shù)據(jù)的顯示,通過設置單片機控制IO口實現(xiàn)數(shù)據(jù)的動態(tài)掃描和顯示。

(3)按鍵模塊 本項目通過設置按鍵模塊實現(xiàn)對溫度上限閥值的設定,采用矩陣按鍵實現(xiàn)多個按鍵功能。

(4)蜂鳴器模塊 本項目采用蜂鳴器作為報警提示器,當溫度超過上限閥值時,觸發(fā)單片機控制后,蜂鳴器會發(fā)出一定頻率的報警信號。

2.3 系統(tǒng)實現(xiàn)流程

(1)主程序初始化:設置IO口模式、串口配置、定時器中斷等參數(shù)。

(2)溫度檢測:通過DS18B20進行溫度采集,并將采集到的數(shù)據(jù)解析為實際溫度值。

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

(4)上限閥值設置:通過按鍵設置溫度上限閥值,將閥值存儲在單片機內(nèi)部的EEPROM中。

(5)報警提示:當溫度值超過閥值時,觸發(fā)蜂鳴器發(fā)出報警信號。

三、代碼實現(xiàn)

3.1 4位共陽極數(shù)碼管顯示代碼

下面是控制STC89C52通過P1口控制4位共陽極數(shù)碼管顯示數(shù)字1234的實現(xiàn)代碼:

#include < reg52.h >
 ?
 // 定義數(shù)碼管端口連接的IO口
 sbit Dig1 = P1^0;
 sbit Dig2 = P1^1;
 sbit Dig3 = P1^2;
 sbit Dig4 = P1^3;
 ?
 // 定義數(shù)碼管段碼
 unsigned char code SegCode[] = {
     0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
 };
 ?
 void main()
 {
     unsigned int num = 1234;  // 要顯示的數(shù)字
     unsigned char i, j, k, l;  // 分別表示千位、百位、十位和個位
 ?
     while (1) {
         // 將數(shù)字分解為千位、百位、十位和個位
         i = num / 1000;
         j = num % 1000 / 100;
         k = num % 100 / 10;
         l = num % 10;
 ?
         // 顯示千位
         Dig1 = 1;
         P0 = SegCode[i];
         Dig1 = 0;
 ?
         // 顯示百位
         Dig2 = 1;
         P0 = SegCode[j];
         Dig2 = 0;
 ?
         // 顯示十位
         Dig3 = 1;
         P0 = SegCode[k];
         Dig3 = 0;
 ?
         // 顯示個位
         Dig4 = 1;
         P0 = SegCode[l];
         Dig4 = 0;
     }
 }

這段代碼中,定義了數(shù)碼管端口連接的IO口,然后定義了數(shù)碼管段碼。在main函數(shù)中,將要顯示的數(shù)字1234分解為千位、百位、十位和個位,并通過控制P1口的四個IO口,依次顯示出來。這里使用共陽極數(shù)碼管,需要將對應位的IO口置為0才能點亮數(shù)碼管。

3.2 數(shù)字溫度計實現(xiàn)代碼

下面是數(shù)字溫度計完整的代碼。

#include < reg52.h >
 ?
 // 定義溫度傳感器引腳
 sbit DQ = P3^7;
 // 定義數(shù)碼管引腳
 sbit DIG_1 = P2^0;
 sbit DIG_2 = P2^1;
 sbit DIG_3 = P2^2;
 sbit DIG_4 = P2^3;
 sbit SEG_A = P1^0;
 sbit SEG_B = P1^1;
 sbit SEG_C = P1^2;
 sbit SEG_D = P1^3;
 sbit SEG_E = P1^4;
 sbit SEG_F = P1^5;
 sbit SEG_G = P1^6;
 sbit SEG_DP = P1^7;
 // 定義按鍵引腳
 sbit KEY_SET = P0^0;
 sbit KEY_ADD = P0^1;
 sbit KEY_SUB = P0^2;
 ?
 // 定義全局變量
 unsigned char code DisplayChar[] = {
     0xc0, 0xf9, 0xa4, 0xb0, 0x99,
     0x92, 0x82, 0xf8, 0x80, 0x90}; // 數(shù)碼管顯示字符編碼
 unsigned char TempData[4] = {0, 0, 0, 0}; // 顯示溫度值的數(shù)組
 unsigned char SetTemp = 25; // 設定溫度上限閥值
 unsigned char LastKeyStatus = 0x07; // 按鍵狀態(tài)
 unsigned char Count = 0; // 數(shù)碼管掃描計數(shù)器
 bit IsAlarm = 0; // 報警狀態(tài)
 ?
 // 定時器中斷服務函數(shù)
 void Timer0_ISR() interrupt 1 {
     TH0 = 0xfc;
     TL0 = 0x67;
 ?
     DIG_1 = DIG_2 = DIG_3 = DIG_4 = 1; // 關閉所有數(shù)碼管
     Count++; // 數(shù)碼管掃描計數(shù)器加1
 ?
     switch (Count) {
         case 1: // 掃描第1位數(shù)碼管
             DIG_1 = 0;
             P0 = TempData[3];
             break;
         case 2: // 掃描第2位數(shù)碼管
             DIG_2 = 0;
             P0 = TempData[2];
             break;
         case 3: // 掃描第3位數(shù)碼管
             DIG_3 = 0;
             P0 = TempData[1];
             break;
         case 4: // 掃描第4位數(shù)碼管
             DIG_4 = 0;
             P0 = TempData[0];
             break;
         default:
             Count = 0;
             break;
     }
 }
 ?
 // 延時函數(shù)
 void Delay(unsigned int n) {
     unsigned int i, j;
 ?
     for(i=0; i< n; i++) {
         for(j=0; j< 125; j++);
     }
 }
 ?
 // 數(shù)字溫度計初始化函數(shù)
 void Init() {
     TMOD |= 0x01; // 定時器0工作在模式1
     TH0 = 0xfc; // 定時器0初始值
     TL0 = 0x67;
     ET0 = 1; // 允許定時器0中斷
     TR0 = 1; // 啟動定時器0
 ?
     EA = 1; // 允許中斷
 }
 ?
 // DS18B20復位函數(shù)
 bit Reset() {
     bit res;
 ?
     DQ = 0;
     Delay(480);
     DQ = 1;
     Delay(60);
     res = DQ;
     Delay(420);
 ?
     return res;
 }
 ?
 // DS18B20寫字節(jié)函數(shù)
 void WriteByte(unsigned char dat) {
     unsigned char i;
 ?
     for(i=0; i< 8; i++) {
         DQ = 0;
         Delay(2);
         DQ = dat & 0x01;
         Delay(60);
         DQ = 1;
         Delay(2);
         dat > >= 1;
     }
 }
 ?
 // DS18B20讀字節(jié)函數(shù)
 unsigned char ReadByte() {
     unsigned char i, j, dat = 0;
 ?
     for(i=0; i< 8; i++) {
         DQ = 0;
         Delay(2);
         DQ = 1;
         Delay(2);
         j = DQ;
         Delay(60);
         dat |= (j < < i);
     }
 ?
     return dat;
 }
 ?
 // DS18B20溫度轉(zhuǎn)換函數(shù)
 void TempConv() {
     if(!Reset()) {
         WriteByte(0xCC); // 跳過ROM操作,直接訪問DS18B20
         WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換命令
     }
 }
 ?
 // DS18B20讀取溫度函數(shù)
 void ReadTemp() {
     unsigned char TL, TH;
 ?
     if(!Reset()) {
         WriteByte(0xCC); // 跳過ROM操作,直接訪問DS18B20
         WriteByte(0xBE); // 發(fā)送讀取溫度命令
         TL = ReadByte(); // 讀取溫度值低8位
         TH = ReadByte(); // 讀取溫度值高8位
 ?
         if(TH > 7) { // 溫度值為負數(shù),進行補碼轉(zhuǎn)換
             TH = ~TH;
             TL = ~TL;
             TempData[0] = ((unsigned short)(TH < < 8) | TL) * -0.0625 * 10 + 0.5; // 計算溫度值并保存
             TempData[1] = DisplayChar[10]; // 顯示字符“-”
         } else { // 溫度值為正數(shù)
             TempData[0] = ((unsigned short)(TH < < 8) | TL) * 0.0625 * 10 + 0.5; // 計算溫度值并保存
             TempData[1] = DisplayChar[TempData[0] / 10]; // 顯示整數(shù)部分
         }
 ?
         TempData[2] = DisplayChar[TempData[0] % 10]; // 顯示小數(shù)部分
     }
 }
 ?
 // 按鍵檢測函數(shù)
 void KeyCheck() {
     unsigned char key_status = 0;
 ?
     if(KEY_SET == 0) { // 設定按鍵被按下
         key_status |= 0x01;
     }
     if(KEY_ADD == 0) { // 加溫按鍵被按下
         key_status |= 0x02;
     }
     if(KEY_SUB == 0) { // 減溫按鍵被按下
         key_status |= 0x04;
     }
 ?
     if(key_status != LastKeyStatus) { // 判斷是否有按鍵事件發(fā)生
         Delay(10); // 延時去抖
         if(key_status != LastKeyStatus) { // 再次判斷是否有按鍵事件發(fā)生
             switch(key_status) {
                 case 0x01: // 設定按鍵被按下
                     SetTemp++; // 溫度上限閥值加1
                     if(SetTemp > 50) { // 上限閥值不能超過50℃
                         SetTemp = 50;
                     }
                     break;
                 case 0x02: // 加溫按鍵被按下
                     break;
                 case 0x04: // 減溫按鍵被按下
                     break;
                 default:
                     break;
             }
         }
         LastKeyStatus = key_status; // 保存當前按鍵狀態(tài)
     }
 }
 ?
 // 報警函數(shù)
 void Alarm() {
     if(TempData[0] > SetTemp * 10 && !IsAlarm) { // 當溫度超過設定的閥值且沒有報警時觸發(fā)報警
         IsAlarm = 1; // 設置報警標志
         while(TempData[0] > SetTemp * 10) { // 循環(huán)等待
             P1 = 0xff; // 關閉數(shù)碼管
             P0 = 0x00; // 關閉蜂鳴器
             Delay(500); // 延時
             P1 = 0x00; // 打開數(shù)碼管
             P0 = 0xff; // 打開蜂鳴器
             Delay(500); // 延時
         }
     } else if(TempData[0] <= SetTemp * 10) { // 當溫度低于等于設定的閥值時,取消報警
         IsAlarm = 0; // 清除報警標志
     }
 }
 ?
 // 主函數(shù)
 void main() {
     Init(); // 初始化數(shù)字溫度計
 ?
     while(1) {
         TempConv(); // 溫度轉(zhuǎn)換
         ReadTemp(); // 讀取溫度值
         KeyCheck(); // 按鍵檢測
         Alarm(); // 報警處理
     }
 }

這份代碼的設計主要分為4個模塊:

(1)數(shù)碼管顯示模塊:使用四位共陰數(shù)碼管進行溫度值的顯示,采用定時中斷掃描四個數(shù)碼管的方式進行顯示。

(2)DS18B20模塊:通過DS18B20溫度傳感器獲取當前溫度值,并將溫度值保存到數(shù)組中,以便于數(shù)碼管顯示模塊進行顯示。

(3)按鍵檢測模塊:通過檢測按鍵狀態(tài),實現(xiàn)設定溫度上限閥值、加溫和減溫等操作。

(4)報警模塊:當當前溫度超過設定的溫度上限閥值時,觸發(fā)蜂鳴器報警。

代碼主要使用51單片機進行設計,其中主要包含了DS18B20溫度傳感器的讀取、按鍵檢測、數(shù)碼管顯示、蜂鳴器控制等多種功能。通過使用定時中斷和循環(huán)結(jié)構(gòu),實現(xiàn)了各個模塊之間的協(xié)作,從而一同完成數(shù)字溫度計的設計。
審核編輯 黃宇

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

    關注

    2551

    文章

    51099

    瀏覽量

    753572
  • 51單片機
    +關注

    關注

    274

    文章

    5702

    瀏覽量

    123617
  • 數(shù)字溫度計

    關注

    3

    文章

    108

    瀏覽量

    21726
收藏 人收藏

    評論

    相關推薦

    數(shù)字溫度計

    `關于51單片機數(shù)字溫度計`
    發(fā)表于 11-18 15:33

    單片機數(shù)字溫度計

    求大神來一個單片機數(shù)字溫度計的程序和仿真圖
    發(fā)表于 11-26 20:31

    基于D的數(shù)字溫度計的設計

    基于D的數(shù)字溫度計的設計:介紹了高分辨率數(shù)字溫度訃/恒溫器DSl626/DSl726的特點、功能和測溫原理,并以它為溫度傳感器,與89C
    發(fā)表于 09-14 09:49 ?68次下載

    單片機設計的超低功耗電子溫度計方案

    單片機設計的超低功耗電子溫度計方案 本文設計的超低功耗電子溫度計能夠通過溫度
    發(fā)表于 04-16 14:32 ?1573次閱讀
    <b class='flag-5'>單片機設</b>計的超低功耗電子<b class='flag-5'>溫度計</b>方案

    基于51單片機溫度計

    基于51單片機溫度計,包括protues仿真,程序。
    發(fā)表于 04-28 09:49 ?58次下載

    51單片機與DS18B20的數(shù)字溫度計

    51單片機與DS18B20的數(shù)字溫度計。
    發(fā)表于 05-19 15:32 ?117次下載

    基于單片機數(shù)字溫度計資料

    一款基于單片機設計的溫度計,有興趣的朋友可以下來看看。
    發(fā)表于 12-17 16:18 ?6次下載

    基于單片機數(shù)字溫度計設計

    51單片機,數(shù)字溫度計
    發(fā)表于 01-04 14:52 ?57次下載

    基于單片機數(shù)字溫度計的設計及顯示

    基于單片機數(shù)字溫度計的設計及顯示
    發(fā)表于 01-14 12:29 ?78次下載

    51單片機數(shù)字溫度計+燈光報警(仿真|+源程序)

    51單片機數(shù)字溫度計+燈光報警(仿真|+源程序)
    發(fā)表于 01-18 20:23 ?207次下載

    使用51單片機設溫度計的程序免費下載

    本文檔的主要內(nèi)容詳細介紹的是使用51單片機設溫度計的程序免費下載。通過溫度感應元件 DS18B20 能感應周圍的溫度,然后再通過數(shù)碼管顯示
    發(fā)表于 06-17 17:44 ?13次下載
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機設</b>計<b class='flag-5'>溫度計</b>的程序免費下載

    基于單片機溫度計設計

    文末下載完整資料摘要:隨著時代的進步和發(fā)展,單片機技術(shù)已經(jīng)普及到我們生活,工作,科研,各個領域,已經(jīng)成為一種比較成熟的技術(shù),本文將介紹一種基于單片機控制的數(shù)字溫度計,本
    發(fā)表于 11-04 12:21 ?39次下載
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>溫度計</b>設計

    基于單片機數(shù)字溫度計設計-零妖

    1,開發(fā)前規(guī)劃 基于單片機數(shù)字溫度計-開發(fā)前規(guī)劃 關鍵字 溫度計;51
    發(fā)表于 11-05 12:51 ?46次下載
    基于<b class='flag-5'>單片機</b>的<b class='flag-5'>數(shù)字</b><b class='flag-5'>溫度計</b>設計-零妖

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

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

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

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