在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

基于51單片機+SHT30設計的環境溫度與濕度檢測設備(IIC模擬時序)

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

一、項目介紹

當前文章介紹基于51單片機和SHT30傳感器設計的環境溫度與濕度檢測設備。設備采用IIC模擬時序通信協議,能夠實時監測環境的溫度和濕度,并將數據通過LCD顯示屏顯示出來;可以廣泛應用于室內環境監測、氣象觀測、農業溫室監測等領域。

在本項目中,使用了51單片機作為主控芯片,SHT30傳感器作為溫濕度傳感器,LCD顯示屏作為數據顯示模塊。通過51單片機的GPIO口模擬IIC通信協議,實現了與SHT30傳感器的數據通信。

image-20230618123229983

二、硬件設計

2.1 硬件構成

本次設計所需的硬件主要包括以下部分:

  • STC89C52單片機
  • SHT30溫濕度傳感器
  • 串口通信模塊
  • LCD1602顯示屏
  • 電源模塊
  • 杜邦線等連接線

2.2 硬件接口信號

本次設計使用51單片機通過IIC總線與SHT30傳感器進行通信,同時使用串口與上位機進行數據傳輸,并使用液晶顯示屏顯示當前溫濕度值。

具體接口和信號定義如下:

(1) 51單片機與SHT30傳感器之間的IIC接口:

端口 功能 說明
P2.0 SDA 數據線
P2.1 SCL 時鐘
P2.2 RESET 復位線

(2) 51單片機與串口通信模塊之間的接口:

端口 功能 說明
P3.0 TXD 發送線
P3.1 RXD 接收線
P3.2 GND 地線

(3) 51單片機與液晶屏之間的接口:

端口 功能 說明
P1.0-P1.7 DB0-DB7 數據線
P0.0 RS 指令/數據選擇線
P0.1 RW 讀/寫選擇線
P0.2 E 使能線
P0.3 CS 片選線
VCC 電源正極 5V
GND 電源地

三、軟件設計

3.1 SHT30傳感器代碼

下面代碼讀取SHT30傳感器的值并通過串口打印。

#include < REG52.h >
 #include < stdio.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit SDA=P2^0;
 sbit SCL=P2^1;
 ?
 void delay(int n)
 {
     int i;
     while(n--)
     {
         for(i=0; i< 120; i++);
     }
 }
 ?
 void start()
 {
     SDA = 1;
     _nop_();
     SCL = 1;
     _nop_();
     SDA = 0;
     _nop_();
     SCL = 0;
     _nop_();
 }
 ?
 void stop()
 {
     SDA = 0;
     _nop_();
     SCL = 1;
     _nop_();
     SDA = 1;
     _nop_();
 }
 ?
 void ack()
 {
     SDA = 0;
     _nop_();
     SCL = 1;
     _nop_();
     SCL = 0;
     _nop_();
     SDA = 1;
     _nop_();
 }
 ?
 void nack()
 {
     SDA = 1;
     _nop_();
     SCL = 1;
     _nop_();
     SCL = 0;
     _nop_();
 }
 ?
 void write_byte(uchar dat)
 {
     uchar i;
     for(i=0; i< 8; i++)
     {
         SDA = dat & 0x80;
         _nop_();
         SCL = 1;
         _nop_();
         SCL = 0;
         _nop_();
         dat < <= 1;
     }
     ack();
 }
 ?
 uchar read_byte()
 {
     uchar i, dat;
     for(i=0; i< 8; i++)
     {
         dat < <= 1;
         SCL = 1;
         _nop_();
         dat |= SDA;
         SCL = 0;
         _nop_();
     }
     return dat;
 }
 ?
 void init_sht30()
 {
     start();
     write_byte(0x80);
     if(read_byte() != 0x5A)
     {
         stop();
         return;
     }
     write_byte(0xBE);
     if(read_byte() != 0x08 || read_byte() != 0x00)
     {
         stop();
         return;
     }
     stop();
 }
 ?
 float measure_temp(void)
 {
     uchar temp_h, temp_l, crc;
     float temp;
 ?
     start();
     write_byte(0x80);  // 主機發送寫地址
     write_byte(0x2C);  // 選擇開始溫度測量命令
     write_byte(0x06);
     stop();
 ?
     delay(15);    // 延時等待溫度測量完成
 ?
     start();
     write_byte(0x81);  // 主機發送讀地址
     temp_h=read_byte();  
     ack();
     temp_l=read_byte(); 
     ack();
     crc=read_byte();
     stop();
 ?
     temp = ((temp_h< 8)+temp_l)*175.0/0xffff - 45.0; // 溫度值轉換公式
 ?
     return temp;
 }
 ?
 float measure_humi(void)
 {
     uchar humi_h, humi_l, crc;
     float humi;
 ?
     start();
     write_byte(0x80);  // 主機發送寫地址
     write_byte(0x2C);  // 選擇開始濕度測量命令
     write_byte(0x06);
     stop();
 ?
     delay(15);    // 延時等待濕度測量完成
 ?
     start();
     write_byte(0x81);  // 主機發送讀地址
     humi_h=read_byte();  
     ack();
     humi_l=read_byte(); 
     ack();
     crc=read_byte();
     stop();
 ?
     humi = ((humi_h< 8)+humi_l)*100.0/0xffff; // 濕度值轉換公式
 ?
     return humi;
 }
 ?
 void main()
 {   
     float temp, humi;
 ?
     init_sht30();   // SHT30 初始化
 ?
     TMOD=0x20;      // 定時器0工作方式2,8位定時器,用于波特率設置
     TH1=0xfd;       // 波特率9600
     TL1=0xfd;
     TR1=1;          // 啟動定時器0
 ?
     SCON=0x50;      // 設置串口工作方式1,允許接收,允許接收中斷
     ES=1;           // 允許串口中斷
 ?
     while(1)
     {
         temp = measure_temp();
         humi = measure_humi();
         printf("Temperature: %.1fC, Humidity: %.1f%\\n", temp, humi);
         delay(500); // 間隔時間500ms
     }
 }
 ?
 void ser() interrupt 4 using 2
 {
     if(RI)          // 接收到數據
     {
         RI=0;       // 清除標志位
     }
     if(TI)          // 發送完畢
     {
         TI=0;       // 清除標志位
     }
 }

在上面的代碼中,定義了兩個函數 measure_tempmeasure_humi,分別用于測量溫度和濕度值,并返回結果。在主函數中,利用這兩個函數得到當前的溫濕度值,然后通過串口打印出來。

3.2 LCD1602顯示屏代碼

下面代碼是LCD1602驅動代碼,完成數字字符顯示。

#include < REG52.h >
 ?
 #define LCD1602_DB P0
 sbit  RS = P2^5;
 sbit  RW = P2^6;
 sbit  E  = P2^7;
 ?
 void delay(int n)
 {
     int i;
     while(n--)
     {
         for(i=0; i< 120; i++);
     }
 }
 ?
 void main()
 {   
     //LCD 初始化
     delay(1000);
     LCD1602_DB = 0x38;
     E = 1;
     delay(5);
     E = 0;
 ?
     delay(500);
     LCD1602_DB = 0x08;
     E = 1;
     delay(5);
     E = 0;
 ?
     delay(500);
     LCD1602_DB = 0x01;
     E = 1;
     delay(5);
     E = 0;
 ?
     delay(500);
     LCD1602_DB = 0x06;
     E = 1;
     delay(5);
     E = 0;
 ?
     delay(500);
     LCD1602_DB = 0x0C;
     E = 1;
     delay(5);
     E = 0;
 ?
     while(1)
     {
         //向LCD中寫入數字12345
         RS = 0;  //選擇指令寄存器
 ?
         LCD1602_DB = 0x80;  //設置地址為第一行的第一個字符位置(0x80 + 0x00)
 ?
         E = 1;
         delay(5);
         E = 0;
 ?
         RS = 1;  //選擇數據寄存器
 ?
         LCD1602_DB = 0x31;  //寫入數字1
         E = 1;
         delay(5);
         E = 0;
 ?
         LCD1602_DB = 0x32;  //寫入數字2
         E = 1;
         delay(5);
         E = 0;
 ?
         LCD1602_DB = 0x33;  //寫入數字3
         E = 1;
         delay(5);
         E = 0;
 ?
         LCD1602_DB = 0x34;  //寫入數字4
         E = 1;
         delay(5);
         E = 0;
 ?
         LCD1602_DB = 0x35;  //寫入數字5
         E = 1;
         delay(5);
         E = 0;
 ?
         delay(500); //間隔時間為500ms
     }
 }

在上面的代碼中,定義了函數 delay 用于延時等待,并且實現了LCD1602的初始化和寫入操作。在主函數中,執行LCD1602的初始化操作,然后循環不斷向LCD中寫入數字12345,并且間隔時間為500ms。

3.3 完整代碼

#include< reg52.h >
 #include< intrins.h >
 ?
 #define uchar unsigned char
 #define uint unsigned int
 ?
 sbit SDA = P2^0;    //定義SDA引腳
 sbit SCL = P2^1;    //定義SCL引腳
 sbit CS = P0^3;     //定義液晶屏片選引腳
 sbit RW = P0^1;     //定義液晶屏讀/寫引腳
 sbit RS = P0^0;     //定義液晶屏指令/數據引腳
 sbit E = P0^2;      //定義液晶屏使能引腳
 ?
 void delay(int n)   //延時函數,n為延時時間
 {
     int i;
     while(n--)
     {
         for(i=0; i< 120; i++);
     }
 }
 ?
 void start()        //開始信號
 {
     SDA = 1;        //數據線高電平
     _nop_();
     SCL = 1;        //時鐘線高電平
     _nop_();
     SDA = 0;        //數據線低電平
     _nop_();
     SCL = 0;        //時鐘線低電平
     _nop_();
 }
 ?
 void stop()         //結束信號
 {
     SDA = 0;        //數據線低電平
     _nop_();
     SCL = 1;        //時鐘線高電平
     _nop_();
     SDA = 1;        //數據線高電平
     _nop_();
 }
 ?
 void ack()          //應答信號
 {
     SDA = 0;        //數據線低電平
     _nop_();
     SCL = 1;        //時鐘線高電平
     _nop_();
     SCL = 0;        //時鐘線低電平
     _nop_();
     SDA = 1;        //數據線高電平
     _nop_();
 }
 ?
 void nack()         //非應答信號
 {
     SDA = 1;        //數據線高電平
     _nop_();
     SCL = 1;        //時鐘線高電平
     _nop_();
     SCL = 0;        //時鐘線低電平
     _nop_();
 }
 ?
 void write_byte(uchar dat)  //寫一個字節
 {
     uchar i;
     for(i=0; i< 8; i++)
     {
         SDA = dat & 0x80;
         _nop_();
         SCL = 1;
         _nop_();
         SCL = 0;
         _nop_();
         dat < <= 1;
     }
     ack();
 }
 ?
 uchar read_byte()   //讀一個字節
 {
     uchar i, dat;
     for(i=0; i< 8; i++)
     {
         dat < <= 1;
         SCL = 1;
         _nop_();
         dat |= SDA;
         SCL = 0;
         _nop_();
     }
     return dat;
 }
 ?
 void init_sht30()   //SHT30初始化
 {
     start();
     write_byte(0x80);
     if(read_byte() != 0x5A)
     {
         stop();
         return;
     }
     write_byte(0xBE);
     if(read_byte() != 0x08 || read_byte() != 0x00)
     {
         stop();
         return;
     }
     stop();
 }
 ?
 void measure()          //測量溫濕度值
 {
     float humi, temp;
     uint i;
     start();
     write_byte(0x80);
     read_byte();
     read_byte();
     read_byte();
     write_byte(0x2C);
     write_byte(0x06);
     for(i=0; i< 40000; i++); //等待測量結果
     start();
     write_byte(0x80);
     read_byte();
     read_byte();
     read_byte();
     humi = read_byte() * 256;
     humi += read_byte();
     temp = read_byte() * 256;
     temp += read_byte();
     stop();
     temp = -45 + (175*temp)/65535;  //轉化溫度
     humi = 100 * humi / 65535;      //轉化濕度
     //將溫濕度值通過串口發送
     printf("Temperature: %.1fC\\n", temp);
     printf("Humidity: %.1f%%RH\\n", humi);
 }
 ?
 void init_lcd()         //液晶屏初始化
 {
     RW = 0;
     RS = 0;
     E = 0;
     delay(15);
     write_byte(0x30);
     delay(15);
     write_byte(0x30);
     delay(5);
     write_byte(0x30);
     delay(5);
     write_byte(0x38);
     write_byte(0x08);
     write_byte(0x01);
     write_byte(0x06);
     write_byte(0x0c);
 }
 ?
 void display(float temp, float humi)    //顯示溫濕度值
 {
     uchar i;
     uchar temp_str[5];
     uchar humi_str[5];
     //轉化為字符串
     sprintf(temp_str, "%.1f", temp);
     sprintf(humi_str, "%.1f", humi);
     //顯示溫度
     RS = 0;
     E = 1;
     P1 = 0x80;  //第一行第一個字符
     E = 0;
     RS = 1;
     for(i=0; i< 5; i++)
     {
         E = 1;
         P1 = temp_str[i];
         E = 0;
     }
     //顯示濕度
     RS = 0;
     E = 1;
     P1 = 0xc0;  //第二行第一個字符
     E = 0;
     RS = 1;
     for(i=0; i< 5; i++)
     {
         E = 1;
         P1 = humi_str[i];
         E = 0;
     }
 }
 ?
 void main()
 {
     init_sht30();   //SHT30初始化
     init_lcd();     //液晶屏初始化
     while(1)
     {
         measure();  //測量溫濕度值并通過串口發送
         delay(1000);
         display(temp, humi);    //顯示溫濕度值
     }
 }
 ?

審核編輯:湯梓紅

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

    關注

    6059

    文章

    44828

    瀏覽量

    644984
  • 51單片機
    +關注

    關注

    277

    文章

    5707

    瀏覽量

    126039
  • IIC
    IIC
    +關注

    關注

    11

    文章

    304

    瀏覽量

    39044
  • 檢測設備
    +關注

    關注

    0

    文章

    655

    瀏覽量

    17152
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    基于STM32+SHT30設計的環境溫度濕度檢測系統(IIC模擬時序)

    當前介紹基于STM32F103ZCT6芯片設計的環境溫度濕度檢測系統設計過程。當前系統通過SHT30濕度傳感器采集
    的頭像 發表于 06-20 09:16 ?2575次閱讀
    基于STM32+<b class='flag-5'>SHT30</b>設計的<b class='flag-5'>環境溫度</b>與<b class='flag-5'>濕度</b><b class='flag-5'>檢測</b>系統(<b class='flag-5'>IIC</b><b class='flag-5'>模擬</b><b class='flag-5'>時序</b>)

    SHT30濕度傳感器的51程序

    SHT30濕度傳感器的51程序
    發表于 05-16 22:22

    STM32+SHT30(DS18B20)+0.96寸OLED(IIC)的溫度濕度顯示程序

    程序,顯示SHT30濕度模塊的溫濕度。OLED(IIC接口)屏幕的溫濕度顯示,串口數據輸出。為了作對比,我順便把DS18B20的
    發表于 03-16 10:31

    SHT30溫度傳感器使用記錄

    SHT30使用記錄(基于AVR)文章目錄SHT30使用記錄(基于AVR)硬件篇軟件篇硬件篇硬件按照數據手冊連接到單片機IIC接口或者任意兩個IO口即可,加2個4.7K左右上拉電阻,本
    發表于 07-13 08:35

    STM32F103是如何讀取SHT30濕度數據的

    1 準備工作硬件設備:兩個激光測距SHT30模塊、六合一、USB-TTL、杜邦線、STM32F103C8T6單片機。給大家看下圖片。SHT30 STM32F103C8T62)軟件準備
    發表于 08-11 07:01

    怎樣去使用基于AVR的SHT30濕度傳感器

    怎樣去使用基于AVR的SHT30濕度傳感器?SHT30濕度傳感器的軟硬件分別是由哪些部分構成的?
    發表于 09-23 06:58

    SHT30濕度模塊怎么使用

    的STH30一般是用IIC(I2C)通信使用的,所以我們打開一個IIC通道,IIC默認配置就可以了。4、因為我們需要看見她的效果是什么,我開了一個串口,所有數據通過串口打印出來。5、然
    發表于 02-15 06:28

    怎樣通過單片機普通IO口去模擬IIC時序

    一、實驗目的:通過單片機普通IO口,模擬IIC時序,掌握IIC通訊協議。二、實驗用到的主控芯片:STM32F103RCT6,
    發表于 02-17 06:30

    如何用51單片機實現IIC通信

    在之前的MCS-51系列單片機中內部沒有IIC通信資源,所如果要想用51單片機實現IIC通信,就
    發表于 11-20 15:52 ?1.7w次閱讀
    如何用<b class='flag-5'>51</b><b class='flag-5'>單片機</b>實現<b class='flag-5'>IIC</b>通信

    dfrobot SHT30模擬濕度傳感器簡介

    SHT30高精度溫濕度測量,內部自動校準,線性模擬電壓輸出
    的頭像 發表于 01-07 10:45 ?1.8w次閱讀
    dfrobot <b class='flag-5'>SHT30</b><b class='flag-5'>模擬</b>溫<b class='flag-5'>濕度</b>傳感器簡介

    使用51單片機實現SHT11溫濕度傳感器檢測的程序和電路圖

    本文檔的主要內容詳細介紹的是使用51單片機實現SHT11溫濕度傳感器檢測的程序和電路圖
    的頭像 發表于 01-31 12:10 ?1.8w次閱讀
    使用<b class='flag-5'>51</b><b class='flag-5'>單片機</b>實現<b class='flag-5'>SHT</b>11溫<b class='flag-5'>濕度</b>傳感器<b class='flag-5'>檢測</b>的程序和電路圖

    濕度傳感器SHT30參考代碼資料

    濕度傳感器SHT30參考代碼資料
    發表于 08-30 16:40 ?39次下載

    SHT30濕度傳感器使用記錄(AVR atmega128)

    SHT30使用記錄(基于AVR)文章目錄SHT30使用記錄(基于AVR)硬件篇軟件篇硬件篇硬件按照數據手冊連接到單片機IIC接口或者任意兩個IO口即可,加2個4.7K左右上拉電阻,本
    發表于 11-15 20:06 ?23次下載
    <b class='flag-5'>SHT30</b>溫<b class='flag-5'>濕度</b>傳感器使用記錄(AVR atmega128)

    SHT30濕度模塊使用

    的STH30一般是用IIC(I2C)通信使用的,所以我們打開一個IIC通道,IIC默認配置就可以了。4、因為我們需要看見她的效果是什么,我開了一個串口,所有數據通過串口打印出來。5、然
    發表于 12-16 16:53 ?72次下載
    <b class='flag-5'>SHT30</b>溫<b class='flag-5'>濕度</b>模塊使用

    STM32之IIC通訊-SHT30濕度采集

    一、實驗目的:通過單片機普通IO口,模擬IIC時序,掌握IIC通訊協議。二、實驗用到的主控芯片:STM32F103RCT6,
    發表于 12-22 18:49 ?37次下載
    STM32之<b class='flag-5'>IIC</b>通訊-<b class='flag-5'>SHT30</b>溫<b class='flag-5'>濕度</b>采集
    主站蜘蛛池模板: 欧美美女福利视频 | 特黄三级 | 天天躁夜夜躁狠狠躁2021西西 | 高清毛片一区二区三区 | 性生生活三级视频在线观看 | 在线网址你懂的 | 91大神视频网站 | 99热最新网址 | 亚洲成年人影院 | 国产伦精品一区二区三区免 | 午夜影皖普通区 | 波多野结衣三个女人蕾丝边 | 亚洲 欧洲 日韩 | 亚洲一区二区三区网站 | 亚洲国产精品久久久久婷婷老年 | 国产成人啪午夜精品网站 | 国产欧美一区二区三区观看 | 国产成人毛片亚洲精品不卡 | 丁香婷婷基地 | 在线观看一二三区 | 国产成人在线网址 | 亚洲毛片网| 中日韩一级片 | a久久久久一级毛片护士免费 | 国产真实灌醉美女疯狂弄 | 免费国产综合视频在线看 | 天天做天天爱天天干 | www.4hu影院| 欧美美女福利视频 | 黄色网页在线播放 | 久久婷婷六月 | 欧美午夜精品一区二区三区 | 色无欲天天天影视综合网 | 天天操天天干天天摸 | 欧美影院 | 天天操天天舔天天射 | 好色999 | 久久国内| 深夜大尺度视频在线观看 | 东莞a级毛片 | 国产真实乱偷人视频 |