在线观看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);    //顯示溫濕度值
     }
 }
 ?

審核編輯:湯梓紅

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

    關注

    6043

    文章

    44621

    瀏覽量

    638587
  • 51單片機
    +關注

    關注

    274

    文章

    5705

    瀏覽量

    124304
  • IIC
    IIC
    +關注

    關注

    11

    文章

    302

    瀏覽量

    38506
  • 檢測設備
    +關注

    關注

    0

    文章

    639

    瀏覽量

    16896
收藏 人收藏

    評論

    相關推薦

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

    當前介紹基于STM32F103ZCT6芯片設計的環境溫度濕度檢測系統設計過程。當前系統通過SHT30濕度傳感器采集
    的頭像 發表于 06-20 09:16 ?2127次閱讀
    基于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.7w次閱讀
    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.7w次閱讀
    使用<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 ?36次下載
    STM32之<b class='flag-5'>IIC</b>通訊-<b class='flag-5'>SHT30</b>溫<b class='flag-5'>濕度</b>采集
    主站蜘蛛池模板: 中文字幕天堂网 | 欧美视频综合 | 欧美天天搞 | 男女一进一出抽搐免费视频 | chinesevideo普通话对白 | 欧美夜夜夜 | 一区二区三区在线播放 | 免费看h网站 | 国产一区美女视频 | 淫欲网 | 国产黄色片在线观看 | 手机看高清特黄a大片 | 亚洲综合久久久久久888 | 男人你懂的网站 | 亚洲视频在线一区 | www.亚洲.com| 中文字幕二区 | 哪里可以看免费毛片 | 黄视频免费 | 久久久精品免费国产四虎 | 午夜伦理片在线观看 | 黄色毛片儿 | 天天干天天操天天玩 | 色在线免费观看 | 韩彩英三级无删版甜性涩爱 | 国内一国产农村妇女一级毛片 | 五月天婷婷亚洲 | 亚洲天天更新 | 一区二区三区视频观看 | 国产免费一级高清淫日本片 | 久久精品午夜 | 日韩免费视频一区二区 | 天堂网视频| 午夜逼逼| 中国一级特黄真人毛片 | 中文字幕一区二区三区四区五区人 | 黄色w站| 国内精品91久久久久 | 欧美成人鲁丝片在线观看 | 中文字幕佐山爱一区二区免费 | 婷婷中文网|