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

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

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

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

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

一、項(xiàng)目介紹

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

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

image-20230530212356913

image-20230530212224268

二、整體設(shè)計(jì)

【1】設(shè)計(jì)思路

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

【2】硬件連接

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

【3】軟件設(shè)計(jì)

在軟件方面,主要進(jìn)行以下操作:

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

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

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

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

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

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

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

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

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

【1】DS18B20溫度讀取

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

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

#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(); // 啟動(dòng)傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
         DS18B20_End(); // 結(jié)束傳輸
 ?
         DS18B20_Start(); // 啟動(dòng)傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發(fā)送讀取指令
 ?
         // 讀取溫度值
         temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
         temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
 ?
         // 計(jì)算溫度值
         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; // 寫時(shí)序開(kāi)始
         DQ = dat & 0x01; // 寫數(shù)據(jù)
         DS18B20_Delay(1); // 延時(shí) 1us
         DQ = 1; // 寫時(shí)序結(jié)束
         dat > >= 1;
     }
 }
 ?
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 讀時(shí)序開(kāi)始
         DS18B20_Delay(1); // 延時(shí) 1us
         dat > >= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延時(shí) 5us
         DQ = 1; // 讀時(shí)序結(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; // 定時(shí)器 1 工作在模式 2
     TH1 = 0xfd; // 設(shè)置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動(dòng)定時(shí)器
 }
 ?
 // 串口初始化函數(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ù)碼顯示裝置,通常由一個(gè)數(shù)碼管的陣列組成,可以用來(lái)顯示數(shù)字、字母和一些特殊符號(hào)。廣泛應(yīng)用于各種電子裝置中,如計(jì)算器、時(shí)鐘、溫度計(jì)、電壓表、檔位指示器等。數(shù)碼管通??煞譃楣碴?yáng)極和共陰極兩種類型,其中共陽(yáng)極的數(shù)碼管是將陽(yáng)極連接在一起,通過(guò)控制對(duì)應(yīng)的陰極接口以實(shí)現(xiàn)顯示數(shù)字,而共陰極則是將陰極連接在一起,通過(guò)控制對(duì)應(yīng)的陽(yáng)極接口以實(shí)現(xiàn)顯示。

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

下面是通過(guò)DS18B20 溫度傳感器讀取溫度再通過(guò)數(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ù)碼管存儲(chǔ)總線 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(); // 啟動(dòng)傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0x44); // 發(fā)送溫度轉(zhuǎn)換指令
         DS18B20_End(); // 結(jié)束傳輸
 ?
         DS18B20_Start(); // 啟動(dòng)傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發(fā)送讀取指令
 ?
         // 讀取溫度值
         temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
         temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
 ?
         // 計(jì)算溫度值
         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; // 寫時(shí)序開(kāi)始
         DQ = dat & 0x01; // 寫數(shù)據(jù)
         DS18B20_Delay(1); // 延時(shí) 1us
         DQ = 1; // 寫時(shí)序結(jié)束
         dat > >= 1;
     }
 }
 ?
 uchar DS18B20_ReadByte()
 {
     uchar i, dat = 0;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 讀時(shí)序開(kāi)始
         DS18B20_Delay(1); // 延時(shí) 1us
         dat > >= 1;
         if(DQ) 
             dat |= 0x80;
         DS18B20_Delay(5); // 延時(shí) 5us
         DQ = 1; // 讀時(shí)序結(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; // 定時(shí)器 1 工作在模式 2
     TH1 = 0xfd; // 設(shè)置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動(dòng)定時(shí)器
 }
 ?
 // 串口初始化函數(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]; // 取出個(gè)位數(shù)碼
         num /= 10; // 取下一位數(shù)
         SRCLK = 1;
         SRCLK = 0;
     }
 ?
     RCLK = 1;
     RCLK = 0;
 }

審核編輯:湯梓紅

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

    關(guān)注

    2899

    文章

    43822

    瀏覽量

    369289
  • STC89C52
    +關(guān)注

    關(guān)注

    41

    文章

    330

    瀏覽量

    81939
  • 溫度檢測(cè)
    +關(guān)注

    關(guān)注

    5

    文章

    107

    瀏覽量

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

    關(guān)注

    32

    文章

    1873

    瀏覽量

    90748
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

    如何用STC89C51和DS18B20溫度檢測(cè)顯示?

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

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

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

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

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

    怎樣通過(guò)STC89C52單片機(jī)與溫度芯片DS18B20通信

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

    DS18B20溫度顯示報(bào)警控制設(shè)計(jì)

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

    DS18B20溫度測(cè)試實(shí)驗(yàn)

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

    基于STC89C52_ds18B20_DS1302的C語(yǔ)言程序

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

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

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

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

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

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

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

    STC15WXXX+DS18B20溫度檢測(cè)

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

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

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

    基于AT89C51單片機(jī)用數(shù)碼管DS18B20設(shè)計(jì)溫度報(bào)警器

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