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

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

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

STC89C52+DS18B20實現(xiàn)環(huán)境溫度檢測(數(shù)碼管顯示溫度)

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

一、項目介紹

溫度檢測是工業(yè)自動化、生產(chǎn)線等眾多領(lǐng)域中常見的應(yīng)用場景之一,能及時準確地監(jiān)測溫度對于保障生產(chǎn)安全和提高生產(chǎn)效率有著非常重要的作用。而在現(xiàn)代的電子制造行業(yè)中,使用單片機傳感器電子元器件進行溫度檢測已經(jīng)成為了一個比較成熟的技術(shù)方案。

本項目選擇STC89C52單片機和DS18B20數(shù)字溫度傳感器,通過讀取傳感器輸出的溫度值,經(jīng)過計算和處理后,并將結(jié)果顯示在數(shù)碼管上,實現(xiàn)環(huán)境溫度的實時監(jiān)測和顯示。其中,STC89C52單片機為主控芯片,負責接收和處理數(shù)字溫度傳感器的數(shù)據(jù),并通過數(shù)碼管將溫度值進行顯示。

image-20230530212356913

image-20230530212224268

二、整體設(shè)計

【1】設(shè)計思路

使用 STC89C52 單片機和 DS18B20 數(shù)字溫度傳感器,通過 I/O 口進行連接,讀取傳感器輸出的溫度值。通過計算和處理后,將溫度值在數(shù)碼管上進行顯示。其中,STC89C52 單片機為主控芯片,負責接收和處理數(shù)字溫度傳感器的數(shù)據(jù),并通過數(shù)碼管將溫度值進行顯示。

【2】硬件連接

硬件方面,需要使用 STC89C52 單片機和 DS18B20 數(shù)字溫度傳感器。其中,STC89C52 單片機通過 P1 口連接4位數(shù)碼管的動態(tài)掃描信號線,并與 DS18B20 傳感器的 DQ 線相連。DS18B20需要使用一個2.2K歐姆上拉電阻和一個10K歐姆下拉電阻。

【3】軟件設(shè)計

在軟件方面,主要進行以下操作:

(1)初始化函數(shù)

初始化串行總線,設(shè)置為推挽輸出,并將數(shù)碼管段選端口初始化為高電平輸出,數(shù)碼管位選端口初始化為低電平輸出。

(2)讀取溫度值函數(shù)

通過發(fā)送讀取命令,從 DS18B20 數(shù)字溫度傳感器中讀取溫度值。

(3)溫度值計算函數(shù)

根據(jù) DS18B20 數(shù)字溫度傳感器的溫度值計算方法,將讀取到的數(shù)值進行轉(zhuǎn)換,得到實際溫度值。

(4)數(shù)碼管顯示函數(shù)

將溫度值分離出整數(shù)和小數(shù)部分,然后經(jīng)過數(shù)碼管驅(qū)動程序,通過數(shù)碼管進行顯示。

三、具體代碼實現(xiàn)

【1】DS18B20溫度讀取

DS18B20 是一種數(shù)字溫度傳感器,采用單總線接口進行通訊。它可以在較長的距離內(nèi)實現(xiàn)溫度值的準確測量,并且不需要調(diào)零或校準,被廣泛應(yīng)用于各種計算機控制系統(tǒng)、電子設(shè)備和溫度控制應(yīng)用中。其分辨率為 12 位,溫度范圍為 -55 度 Celsius 到 +125 度 Celsius。

下面代碼實現(xiàn)的功能是:讀取DS18B20溫度再通過串口打印出來。

#include < reg51.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit DQ = P1^0;  // DS18B20 數(shù)字溫度傳感器數(shù)據(jù)線連接到 P1.0 引腳
 ?
 // DS18B20 數(shù)據(jù)傳輸函數(shù)
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 ?
 // 初始化函數(shù)
 void init();
 ?
 // 串口初始化函數(shù)
 void uart_init();
 ?
 // 串口發(fā)送函數(shù)
 void send_string(char *s);
 ?
 void main() 
 {
     uchar temp_h, temp_l;
     uint temp;
 ?
     init();
     uart_init(); // 串口初始化
 ?
     while(1)
     {
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
         DS18B20_End(); // 結(jié)束傳輸
 ?
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發(fā)送讀取指令
 ?
         // 讀取溫度值
         temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
         temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
 ?
         // 計算溫度值
         temp = (temp_h < < 8) + temp_l;
         temp = (float)temp / 16;
         send_string("The temperature is: ");
         send_string(temp);
         send_string("
");
 ?
         DS18B20_End(); // 結(jié)束傳輸
     }
 }
 ?
 // DS18B20 數(shù)據(jù)傳輸函數(shù)
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 寫時序開始
         DQ = dat & 0x01; // 寫數(shù)據(jù)
         DS18B20_Delay(1); // 延時 1us
         DQ = 1; // 寫時序結(jié)束
         dat > >= 1;
     }
 }
 ?
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 讀時序開始
         DS18B20_Delay(1); // 延時 1us
         dat > >= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延時 5us
         DQ = 1; // 讀時序結(jié)束
     }
     return dat;
 }
 ?
 void DS18B20_Start()
 {
     DQ = 1;
     DS18B20_Delay(1);
     DQ = 0;
     DS18B20_Delay(480);
     DQ = 1;
     DS18B20_Delay(60);
 }
 ?
 void DS18B20_End()
 {
     DQ = 1;
     DS18B20_Delay(1);
 }
 ?
 void DS18B20_Delay(uint i)
 {
     while(i--);
 }
 ?
 // 初始化函數(shù)
 void init()
 {
     TMOD |= 0x20; // 定時器 1 工作在模式 2
     TH1 = 0xfd; // 設(shè)置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動定時器
 }
 ?
 // 串口初始化函數(shù)
 void uart_init()
 {
     SCON = 0x50; // 8 位數(shù)據(jù),可變波特率,允許接收
     ES = 1; // 允許串口中斷
     EA = 1; // 允許總中斷
 }
 ?
 // 串口發(fā)送函數(shù)
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }

【2】讀取溫度數(shù)碼管顯示

數(shù)碼管是一種數(shù)碼顯示裝置,通常由一個數(shù)碼管的陣列組成,可以用來顯示數(shù)字、字母和一些特殊符號。廣泛應(yīng)用于各種電子裝置中,如計算器、時鐘、溫度計、電壓表、檔位指示器等。數(shù)碼管通??煞譃楣碴枠O和共陰極兩種類型,其中共陽極的數(shù)碼管是將陽極連接在一起,通過控制對應(yīng)的陰極接口以實現(xiàn)顯示數(shù)字,而共陰極則是將陰極連接在一起,通過控制對應(yīng)的陽極接口以實現(xiàn)顯示。

數(shù)碼管的顯示原理是通過不同的電信號按照一定的邏輯在數(shù)碼管內(nèi)部的小燈泡上點亮不同的線段,從而形成所需的數(shù)字、字母或符號。要實現(xiàn)數(shù)碼管的顯示控制,需要使用微控制器或其他數(shù)字電路實現(xiàn)對數(shù)碼管各個位的控制,在采集到數(shù)據(jù)后將其轉(zhuǎn)換為可顯示的信息,并將其顯示在相應(yīng)的數(shù)碼管上。

下面是通過DS18B20 溫度傳感器讀取溫度再通過數(shù)碼管顯示溫度:

#include < reg51.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit DQ = P1^0; // DS18B20 數(shù)字溫度傳感器數(shù)據(jù)線連接到 P1.0 引腳
 sbit DIO = P2^0;  // 數(shù)碼管數(shù)據(jù)總線 DIO 連接到 P2.0 引腳
 sbit RCLK = P2^1; // 數(shù)碼管存儲總線 RCLK 連接到 P2.1 引腳
 sbit SRCLK = P2^2; // 數(shù)碼管移位總線 SRCLK 連接到 P2.2 引腳
 ?
 // DS18B20 數(shù)據(jù)傳輸函數(shù)
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 ?
 // 初始化函數(shù)
 void init();
 ?
 // 串口初始化函數(shù)
 void uart_init();
 ?
 // 串口發(fā)送函數(shù)
 void send_string(char *s);
 ?
 // 數(shù)碼管顯示函數(shù)
 void display(uchar num);
 ?
 void main() 
 {
     uchar temp_h, temp_l;
     uint temp;
 ?
     init();
     uart_init(); // 串口初始化
 ?
     while(1)
     {
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
         DS18B20_End(); // 結(jié)束傳輸
 ?
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發(fā)送讀取指令
 ?
         // 讀取溫度值
         temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
         temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
 ?
         // 計算溫度值
         temp = (temp_h < < 8) + temp_l;
         temp = (float)temp / 16;
 ?
         // 數(shù)碼管顯示溫度
         display(temp);
 ?
         send_string("The temperature is: ");
         send_string(temp);
         send_string("
");
 ?
         DS18B20_End(); // 結(jié)束傳輸
     }
 }
 ?
 // DS18B20 數(shù)據(jù)傳輸函數(shù)
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 寫時序開始
         DQ = dat & 0x01; // 寫數(shù)據(jù)
         DS18B20_Delay(1); // 延時 1us
         DQ = 1; // 寫時序結(jié)束
         dat > >= 1;
     }
 }
 ?
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 讀時序開始
         DS18B20_Delay(1); // 延時 1us
         dat > >= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延時 5us
         DQ = 1; // 讀時序結(jié)束
     }
     return dat;
 }
 ?
 void DS18B20_Start()
 {
     DQ = 1;
     DS18B20_Delay(1);
     DQ = 0;
     DS18B20_Delay(480);
     DQ = 1;
     DS18B20_Delay(60);
 }
 ?
 void DS18B20_End()
 {
     DQ = 1;
     DS18B20_Delay(1);
 }
 ?
 void DS18B20_Delay(uint i)
 {
     while(i--);
 }
 ?
 // 初始化函數(shù)
 void init()
 {
     TMOD |= 0x20; // 定時器 1 工作在模式 2
     TH1 = 0xfd; // 設(shè)置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動定時器
 }
 ?
 // 串口初始化函數(shù)
 void uart_init()
 {
     SCON = 0x50; // 8 位數(shù)據(jù),可變波特率,允許接收
     ES = 1; // 允許串口中斷
     EA = 1; // 允許總中斷
 }
 ?
 // 串口發(fā)送函數(shù)
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }
 ?
 // 數(shù)碼管顯示函數(shù)
 void display(uchar num)
 {
     uchar code table[] = { 
         0x3f, // '0'
         0x06, // '1'
         0x5b, // '2'
         0x4f, // '3'
         0x66, // '4'
         0x6d, // '5'
         0x7d, // '6'
         0x07, // '7'
         0x7f, // '8'
         0x6f, // '9'
     };
     uchar i;
 ?
     for (i = 0; i < 8; i++)
     {
         RCLK = 0;
         DS = table[num % 10]; // 取出個位數(shù)碼
         num /= 10; // 取下一位數(shù)
         SRCLK = 1;
         SRCLK = 0;
     }
 ?
     RCLK = 1;
     RCLK = 0;
 }

審核編輯:湯梓紅

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

    關(guān)注

    2900

    文章

    44062

    瀏覽量

    370245
  • STC89C52
    +關(guān)注

    關(guān)注

    41

    文章

    330

    瀏覽量

    81966
  • 溫度檢測
    +關(guān)注

    關(guān)注

    5

    文章

    107

    瀏覽量

    23434
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1873

    瀏覽量

    90865
收藏 人收藏

    評論

    相關(guān)推薦

    基于STC89C52、DS18B20的電子溫度計源程序+仿真+照片

    `基于STC89C52DS18B20的電子溫度計源程序+仿真+照片,直接下載可用。溫度值用LED數(shù)碼管
    發(fā)表于 06-15 00:55

    求at89c51,ds18b20數(shù)碼管溫度控制

    求at89c51,ds18b20數(shù)碼管溫度控制。實現(xiàn)溫度控制與報警
    發(fā)表于 05-09 00:42

    如何用STC89C51和DS18B20溫度檢測顯示

    新手學習求教我用STC89C51和4位數(shù)碼管DS18B20怎么做溫度檢測顯示,求硬件電路圖,
    發(fā)表于 09-29 02:27

    采用DS18B20溫度傳感器測溫并用數(shù)碼管實時顯示

    系統(tǒng)由STC89C52單片機+DS18B20溫度傳感器+數(shù)碼管+風扇+按鍵+電源構(gòu)成。具體功能:1、采用DS18B20
    發(fā)表于 09-08 06:18

    設(shè)計DS18B20溫度檢測電路的資料大合集

    相應(yīng)的輸入?yún)?shù);可通過按鍵改變溫度設(shè)定值。二、實驗內(nèi)容首先利用溫度傳感器DS18B20檢測環(huán)境溫度并直接輸出數(shù)字
    發(fā)表于 11-30 06:47

    怎樣通過STC89C52單片機與溫度芯片DS18B20通信

    主要是通過STC89C52單片機與溫度芯片DS18B20通信,讓LCD1602來顯示溫度,其電路原理圖如下:注意:
    發(fā)表于 12-07 07:22

    DS18B20溫度顯示報警控制設(shè)計

    本文設(shè)計了一種基于AT89C51 單片機與DS18B20溫度控制系統(tǒng)。該設(shè)計通過AT89S52 單片機驅(qū)動數(shù)字溫度傳感器
    發(fā)表于 12-17 00:24 ?696次下載
    <b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>顯示</b>報警控制設(shè)計

    DS18B20溫度測試實驗

    基于單片機STC89C52DS18B20數(shù)字溫度計,測量實時溫度。
    發(fā)表于 12-31 14:36 ?10次下載

    基于STC89C52_ds18B20_DS1302的C語言程序

    溫度計時,基于STC89C52 ds18B20 DS1302的C語言程序
    發(fā)表于 06-21 16:27 ?39次下載

    基于8051的Proteus仿真-數(shù)碼管DS18B20設(shè)計溫度

    基于8051的Proteus仿真-數(shù)碼管DS18B20設(shè)計溫度報警器
    發(fā)表于 09-01 23:37 ?71次下載

    18b20溫度傳感器數(shù)碼管顯示

    stc51單片機18b20溫度傳感器數(shù)碼管顯示,數(shù)碼管共陽極。
    發(fā)表于 12-20 22:26 ?22次下載

    數(shù)碼管顯示51單片機DS18B20溫度測量源程序及仿真

    數(shù)碼管顯示51單片機DS18B20溫度測量源程序及仿真
    發(fā)表于 12-15 22:16 ?199次下載

    STC15WXXX+DS18B20溫度檢測

    /*本程序使用STC15WXXX,晶振無特殊聲明使用12MHz數(shù)碼管4位共陰,帶負溫度顯示。溫度傳感器是使用
    發(fā)表于 12-23 19:13 ?5次下載
    <b class='flag-5'>STC15WXXX+DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>檢測</b>

    利用DS18B20和LED數(shù)碼管實現(xiàn)單總線溫度測量系統(tǒng)

    利用 DS18B20 和 LED 數(shù)碼管實現(xiàn)單總線溫度測量系統(tǒng)。DS18B20的測量范圍是-5℃~128℃。由于只接有兩個 LED
    的頭像 發(fā)表于 09-26 15:08 ?3840次閱讀

    基于AT89C51單片機用數(shù)碼管DS18B20設(shè)計溫度報警器

    基于AT89C51單片機用數(shù)碼管DS18B20設(shè)計溫度報警器Proteus仿真及程序
    發(fā)表于 05-04 15:31 ?33次下載