欧美**视频一级毛片_国产午夜精品久久久久九九_www.毛片在线观看_免费观看的毛片大全


 

基于51單片機+SHT30設計的環境溫度與濕度檢測設備(IIC模擬時序)
發布時間:2023-06-19 09:20:28 文章來源:DS小龍哥-嵌入式技術
在本項目中,使用了51單片機作為主控芯片,SHT30傳感器作為溫濕度傳感
一、項目介紹

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


(資料圖)

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

二、硬件設計2.1 硬件構成

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

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

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

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

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

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

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

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

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

端口功能說明
P1.0-P1.7DB0-DB7數據線
P0.0RS指令/數據選擇線
P0.1RW讀/寫選擇線
P0.2E使能線
P0.3CS片選線
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);    //顯示溫濕度值     } } ?

審核編輯:湯梓紅

標簽:

資訊播報

樂活HOT

娛樂LOVE

精彩推送

欧美**视频一级毛片_国产午夜精品久久久久九九_www.毛片在线观看_免费观看的毛片大全

                国产精品美女久久久久久2018| 在线看国产日韩| 成人免费在线播放视频| 亚洲欧美怡红院| 亚洲综合图片区| 天天综合天天做天天综合| 欧美中文字幕一区| 日韩午夜av电影| 欧美羞羞免费网站| 中文字幕精品—区二区四季| 国产精品国产三级国产aⅴ无密码| 亚洲日本在线天堂| 亚洲国产精品欧美一二99 | 91香蕉视频黄| 欧美国产日韩在线观看| 亚洲精品日韩专区silk| 色菇凉天天综合网| 日韩欧美一级在线播放| 亚洲一区二区在线视频| 久久国产精品免费| 国产成人激情av| av一二三不卡影片| 国产精品久久久久久久久久久免费看| 欧美日韩你懂的| 久久久久国产免费免费| 亚洲欧美精品午睡沙发| 国产xxx精品视频大全| 亚洲一区二区在线免费观看视频| 久久久久久久久一| 樱桃国产成人精品视频| 久久成人精品无人区| 国产精品夫妻自拍| 日韩美女一区二区三区四区| 天堂在线亚洲视频| 国产精品亚洲а∨天堂免在线| 国产亚洲美州欧州综合国| 亚洲视频在线观看三级| 精品国产伦一区二区三区免费| 亚洲欧洲另类国产综合| 蜜桃视频一区二区| 99精品一区二区三区| 亚洲女爱视频在线| 欧美剧情电影在线观看完整版免费励志电影| 精品欧美乱码久久久久久 | 亚洲国产精品传媒在线观看| 在线综合亚洲欧美在线视频| 成人欧美一区二区三区视频网页| 美女视频黄免费的久久| 中文字幕在线不卡国产视频| 欧美精品一区二区三区蜜桃 | 在线欧美日韩精品| 精品久久久久久久一区二区蜜臀| 国产精品萝li| 欧美videofree性高清杂交| 日韩中文字幕av电影| 国产精品对白交换视频| 久久久久久久国产精品影院| 国产一区二区三区在线看麻豆| 国产精品一区在线观看乱码| 国产精品欧美久久久久无广告 | 日韩精品中文字幕在线不卡尤物| 日本麻豆一区二区三区视频| 久久久久久夜精品精品免费| 亚洲一区欧美一区| 亚洲日本va午夜在线影院| 久久奇米777| 精品国产区一区| 国产精品18久久久久久久久| 在线一区二区观看| 日韩激情视频网站| 国产欧美一区二区三区在线看蜜臀 | 18成人在线观看| 久久久精品人体av艺术| 精品入口麻豆88视频| 26uuu另类欧美| 国产精品69毛片高清亚洲| 欧美伊人精品成人久久综合97 | 亚洲综合无码一区二区| 亚洲女人小视频在线观看| 国产三级一区二区| 久久久久久一二三区| 不卡一区中文字幕| 日韩一区二区精品在线观看| 精品一区二区三区视频在线观看| 日本精品视频一区二区| 日本最新不卡在线| 婷婷综合久久一区二区三区| 亚洲午夜一区二区| 一区二区三区加勒比av| 日韩久久久久久| 国产高清久久久久| 7777女厕盗摄久久久| 国产在线精品视频| 欧美高清视频www夜色资源网| 激情五月婷婷综合网| 亚洲一区二区三区四区在线观看| 亚洲黄色片在线观看| 1024成人网| 亚洲资源中文字幕| 一区二区三区在线看| 亚洲国产综合人成综合网站| 亚洲自拍偷拍麻豆| 午夜久久电影网| 国产精品久久三| 亚洲免费观看在线视频| 91视频在线观看| 国产女人水真多18毛片18精品视频| 国产精品香蕉一区二区三区| 欧美一区日本一区韩国一区| 蜜乳av一区二区| 欧美日韩亚洲综合一区| 国产激情一区二区三区桃花岛亚洲| 欧美女孩性生活视频| 国产福利不卡视频| 精品久久久三级丝袜| 久久色中文字幕| 国产精品伦一区二区三级视频| 国产精品嫩草久久久久| 亚洲精品乱码久久久久| 亚洲va欧美va人人爽午夜| 一区二区三区中文在线观看| 一卡二卡欧美日韩| 美腿丝袜在线亚洲一区| 制服丝袜av成人在线看| 99国产精品久久久| 国产精品毛片久久久久久| 亚洲精品中文字幕在线观看| 天天做天天摸天天爽国产一区| 欧美在线999| 波多野结衣91| 中文字幕一区二区在线播放| 亚洲精品高清在线| 男人的j进女人的j一区| 欧美一区二区精美| 国产午夜精品一区二区三区视频 | 亚洲精品中文在线影院| 色婷婷久久综合| 国产成人av网站| 国产女主播视频一区二区| 亚洲精品成人在线| 久久99精品久久久久婷婷| 欧美mv日韩mv国产网站app| 欧美极品美女视频| 亚洲成人av电影| 亚洲在线成人精品| 国内精品久久久久影院薰衣草| 精品美女被调教视频大全网站| 中文字幕一区二区三区四区| 日韩va亚洲va欧美va久久| 91麻豆精品久久久久蜜臀| 久久精品亚洲精品国产欧美 | 亚洲福利一二三区| 欧美精品第一页| 国产欧美视频一区二区| 亚洲国产aⅴ成人精品无吗| 6080国产精品一区二区| 国产欧美一区二区在线观看| 爽好久久久欧美精品| 欧美成人综合网站| 亚洲色图一区二区三区| 久草这里只有精品视频| 久久久国产一区二区三区四区小说| 一区二区三区丝袜| 成人黄色大片在线观看| 国产午夜精品在线观看| 国产目拍亚洲精品99久久精品| 午夜精品aaa| 久久尤物电影视频在线观看| 一区二区三区在线视频观看58| 国产乱码精品1区2区3区| 国产精品国产a| 欧美亚洲禁片免费| 国产精品无码永久免费888| 蜜桃久久久久久| 中文子幕无线码一区tr| 在线观看网站黄不卡| 国产香蕉久久精品综合网| 美女国产一区二区| 国产精品乱码一区二区三区软件| 欧美午夜寂寞影院| 中文字幕亚洲在| 国产精品资源网站| 夜夜嗨av一区二区三区四季av| 欧美一区二区三区影视| 亚洲激情在线激情| www.av精品| 日本一区中文字幕| 欧美极品aⅴ影院| 欧美日韩在线免费视频| 99久久精品免费看国产免费软件| 午夜精品久久久久久久久久久| 欧美精品一区二区三区蜜桃 | 国产肉丝袜一区二区| 色婷婷一区二区| 国产精品麻豆久久久| 国产成人午夜高潮毛片| 亚洲成av人片一区二区梦乃| 国产亚洲一区二区三区| 欧美三级一区二区| 亚洲美女屁股眼交3|