精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

基于51單片機設計的數字溫度計設計

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

一、項目介紹

數字溫度計是一種廣泛應用于日常生活和工業領域中的電子測量儀器,用于檢測環境溫度并將其轉換為數字信號進行顯示。隨著現代科技的發展,數字溫度計逐漸取代了傳統的水銀溫度計等方式,具有快速響應、高精度、便攜式等優點。

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

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

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

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

在熱敏電阻測溫系統中,可以使用DS18B20傳感器來測量環境溫度,并將溫度值傳輸到控制器中進行處理和顯示。

下面是仿真圖:

image-20230607175253647

二、設計思路

2.1 系統架構

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

2.2 技術方案

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

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

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

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

2.3 系統實現流程

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

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

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

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

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

三、代碼實現

3.1 4位共陽極數碼管顯示代碼

下面是控制STC89C52通過P1口控制4位共陽極數碼管顯示數字1234的實現代碼:

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

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

3.2 數字溫度計實現代碼

下面是數字溫度計完整的代碼。

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

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

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

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

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

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

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

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

    關注

    2548

    文章

    50675

    瀏覽量

    751991
  • 51單片機
    +關注

    關注

    273

    文章

    5697

    瀏覽量

    123188
  • 數字溫度計
    +關注

    關注

    2

    文章

    108

    瀏覽量

    21694
收藏 人收藏

    評論

    相關推薦

    數字溫度計

    `關于51單片機數字溫度計`
    發表于 11-18 15:33

    單片機數字溫度計

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

    基于D的數字溫度計的設計

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

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

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

    基于51單片機溫度計

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

    51單片機與DS18B20的數字溫度計

    51單片機與DS18B20的數字溫度計
    發表于 05-19 15:32 ?117次下載

    基于單片機數字溫度計資料

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

    基于單片機數字溫度計設計

    51單片機,數字溫度計
    發表于 01-04 14:52 ?56次下載

    基于單片機數字溫度計的設計及顯示

    基于單片機數字溫度計的設計及顯示
    發表于 01-14 12:29 ?77次下載

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

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

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

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

    基于單片機溫度計設計

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

    基于單片機數字溫度計設計-零妖

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

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

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

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

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