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

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

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

3天內不再提示

STC89C52+DS18B20實現環境溫度檢測(數碼管顯示溫度)

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

一、項目介紹

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

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

image-20230530212356913

image-20230530212224268

二、整體設計

【1】設計思路

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

【2】硬件連接

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

【3】軟件設計

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

(1)初始化函數

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

(2)讀取溫度值函數

通過發送讀取命令,從 DS18B20 數字溫度傳感器中讀取溫度值。

(3)溫度值計算函數

根據 DS18B20 數字溫度傳感器的溫度值計算方法,將讀取到的數值進行轉換,得到實際溫度值。

(4)數碼管顯示函數

將溫度值分離出整數和小數部分,然后經過數碼管驅動程序,通過數碼管進行顯示。

三、具體代碼實現

【1】DS18B20溫度讀取

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

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

#include < reg51.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit DQ = P1^0;  // DS18B20 數字溫度傳感器數據線連接到 P1.0 引腳
 ?
 // DS18B20 數據傳輸函數
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 ?
 // 初始化函數
 void init();
 ?
 // 串口初始化函數
 void uart_init();
 ?
 // 串口發送函數
 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); // 發送溫度轉換指令
         DS18B20_End(); // 結束傳輸
 ?
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發送讀取指令
 ?
         // 讀取溫度值
         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(); // 結束傳輸
     }
 }
 ?
 // DS18B20 數據傳輸函數
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 寫時序開始
         DQ = dat & 0x01; // 寫數據
         DS18B20_Delay(1); // 延時 1us
         DQ = 1; // 寫時序結束
         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; // 讀時序結束
     }
     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--);
 }
 ?
 // 初始化函數
 void init()
 {
     TMOD |= 0x20; // 定時器 1 工作在模式 2
     TH1 = 0xfd; // 設置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動定時器
 }
 ?
 // 串口初始化函數
 void uart_init()
 {
     SCON = 0x50; // 8 位數據,可變波特率,允許接收
     ES = 1; // 允許串口中斷
     EA = 1; // 允許總中斷
 }
 ?
 // 串口發送函數
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }

【2】讀取溫度數碼管顯示

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

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

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

#include < reg51.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit DQ = P1^0; // DS18B20 數字溫度傳感器數據線連接到 P1.0 引腳
 sbit DIO = P2^0;  // 數碼管數據總線 DIO 連接到 P2.0 引腳
 sbit RCLK = P2^1; // 數碼管存儲總線 RCLK 連接到 P2.1 引腳
 sbit SRCLK = P2^2; // 數碼管移位總線 SRCLK 連接到 P2.2 引腳
 ?
 // DS18B20 數據傳輸函數
 void DS18B20_WriteByte(uchar dat);
 uchar DS18B20_ReadByte();
 void DS18B20_Start();
 void DS18B20_End();
 void DS18B20_Delay(uint i);
 ?
 // 初始化函數
 void init();
 ?
 // 串口初始化函數
 void uart_init();
 ?
 // 串口發送函數
 void send_string(char *s);
 ?
 // 數碼管顯示函數
 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); // 發送溫度轉換指令
         DS18B20_End(); // 結束傳輸
 ?
         DS18B20_Start(); // 啟動傳輸
         DS18B20_WriteByte(0xCC); // 忽略 ROM 指令
         DS18B20_WriteByte(0xBE); // 發送讀取指令
 ?
         // 讀取溫度值
         temp_l = DS18B20_ReadByte(); // 讀取低位溫度值
         temp_h = DS18B20_ReadByte(); // 讀取高位溫度值
 ?
         // 計算溫度值
         temp = (temp_h < < 8) + temp_l;
         temp = (float)temp / 16;
 ?
         // 數碼管顯示溫度
         display(temp);
 ?
         send_string("The temperature is: ");
         send_string(temp);
         send_string("
");
 ?
         DS18B20_End(); // 結束傳輸
     }
 }
 ?
 // DS18B20 數據傳輸函數
 void DS18B20_WriteByte(uchar dat)
 {
     uchar i;
 ?
     for (i = 0; i < 8; i++)
     {
         DQ = 0; // 寫時序開始
         DQ = dat & 0x01; // 寫數據
         DS18B20_Delay(1); // 延時 1us
         DQ = 1; // 寫時序結束
         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; // 讀時序結束
     }
     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--);
 }
 ?
 // 初始化函數
 void init()
 {
     TMOD |= 0x20; // 定時器 1 工作在模式 2
     TH1 = 0xfd; // 設置波特率,4800 bps
     TL1 = 0xfd;
     TR1 = 1; // 啟動定時器
 }
 ?
 // 串口初始化函數
 void uart_init()
 {
     SCON = 0x50; // 8 位數據,可變波特率,允許接收
     ES = 1; // 允許串口中斷
     EA = 1; // 允許總中斷
 }
 ?
 // 串口發送函數
 void send_string(char *s)
 {
     while(*s)
     {
         SBUF = *s;
         while(!TI);
         TI = 0;
         s++;
     }
 }
 ?
 // 數碼管顯示函數
 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]; // 取出個位數碼
         num /= 10; // 取下一位數
         SRCLK = 1;
         SRCLK = 0;
     }
 ?
     RCLK = 1;
     RCLK = 0;
 }

審核編輯:湯梓紅

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

    關注

    2903

    文章

    44273

    瀏覽量

    371238
  • STC89C52
    +關注

    關注

    41

    文章

    330

    瀏覽量

    82001
  • 溫度檢測
    +關注

    關注

    5

    文章

    109

    瀏覽量

    23445
  • 數碼管
    +關注

    關注

    32

    文章

    1874

    瀏覽量

    90943
收藏 人收藏

    評論

    相關推薦

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

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

    求at89c51,ds18b20數碼管溫度控制

    求at89c51,ds18b20數碼管溫度控制。實現溫度控制與報警
    發表于 05-09 00:42

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

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

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

    系統由STC89C52單片機+DS18B20溫度傳感器+數碼管+風扇+按鍵+電源構成。具體功能:1、采用DS18B20
    發表于 09-08 06:18

    設計DS18B20溫度檢測電路的資料大合集

    相應的輸入參數;可通過按鍵改變溫度設定值。二、實驗內容首先利用溫度傳感器DS18B20檢測環境溫度并直接輸出數字
    發表于 11-30 06:47

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

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

    DS18B20溫度顯示報警控制設計

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

    DS18B20溫度測試實驗

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

    基于STC89C52_ds18B20_DS1302的C語言程序

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

    基于8051的Proteus仿真-數碼管DS18B20設計溫度

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

    18b20溫度傳感器數碼管顯示

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

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

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

    STC15WXXX+DS18B20溫度檢測

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

    利用DS18B20和LED數碼管實現單總線溫度測量系統

    利用 DS18B20 和 LED 數碼管實現單總線溫度測量系統。DS18B20的測量范圍是-5℃~128℃。由于只接有兩個 LED
    的頭像 發表于 09-26 15:08 ?3930次閱讀

    基于AT89C51單片機用數碼管DS18B20設計溫度報警器

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