一、項目背景
本項目基于STC89C52單片機和DHT20溫濕度傳感器,實現了一款環境溫濕度檢測儀。通過傳感器采集環境的溫度和濕度數據,利用IIC接口的OLED顯示屏顯示出來,便于用戶實時監測環境溫濕度狀態。
在現代社會,人們對環境溫濕度的要求越來越高。無論是工作場所還是居住環境,都需要維持一個舒適的溫濕度狀態,以保證身體的健康和工作效率的提高。隨著科技的不斷進步和物聯網技術的廣泛應用,環境溫濕度檢測儀被廣泛運用于各種領域,如制造業、醫療、農業等等,成為了一種重要的環境檢測設備。
而本項目所涉及的STC89C52單片機和DHT20溫濕度傳感器作為傳統的嵌入式開發技術,在實現物聯網設備方面有著廣泛的應用前景。通過本項目的學習和實踐,可以深入了解傳感器技術的原理和應用,并掌握基于單片機的嵌入式開發技術,為實現更多物聯網設備的開發和應用打下基礎。
二、設計思路
本項目的設計思路主要包括硬件和軟件兩個方面。
【1】硬件設計思路
本項目的硬件設計主要涉及到STC89C52單片機、DHT20溫濕度傳感器和OLED顯示屏三個模塊。其中,STC89C52單片機負責控制整個系統的運行,DHT20溫濕度傳感器用于采集環境的溫濕度數據,OLED顯示屏則負責將溫濕度數據實時展示出來。
具體的硬件設計流程如下:
(1)選擇合適的STC89C52單片機開發板,并根據需要添加外部電源、復位電路、晶振等元件。
(2)選擇合適的DHT20溫濕度傳感器,并根據其引腳定義將其連接到單片機的I/O口。
(3)選擇合適的OLED顯示屏,并根據其接口定義將其連接到單片機的IIC總線上。
(4)在單片機開發環境中編寫程序,實現對DHT20傳感器的溫濕度數據讀取和對OLED顯示屏的控制。
【2】軟件設計思路
本項目的軟件設計主要涉及到單片機程序的編寫和調試。根據硬件設計的思路,將實現對DHT20傳感器的溫濕度數據讀取和對OLED顯示屏的控制。
具體的軟件設計流程如下:
(1)在單片機開發環境中編寫程序,實現DHT20傳感器的初始化、溫濕度數據的讀取和對OLED顯示屏的控制。
(2)通過串口調試助手,將DHT20傳感器采集到的溫濕度數據打印出來,檢查程序是否正常運行。
(3)連接OLED顯示屏,并調試程序,實現溫濕度數據的實時顯示。
三、設計代碼
【1】DHT20溫濕度讀取
DHT20是一款數字式溫濕度傳感器,其采用了廣受歡迎的I2C總線進行數據通信,可以方便地與各種微控制器和單片機進行連接和使用。該傳感器具有高精度、低功耗、穩定性好等特點,被廣泛應用于氣象站、冷庫、溫室、恒溫箱、智能家居等領域。
DHT20的工作電壓范圍為2.1V至5.5V,并且其在測量過程中的功耗非常低,最大電流為1.3mA,平時僅需要幾微安的待機電流,從而節省了能源并延長了電池壽命。該傳感器采用了獨特的校準技術,能夠實現高精度的測量,溫度測量精度為±0.2℃,濕度測量精度為±2%RH。
DHT20是一款數字式溫濕度傳感器,其通過內部的ADC將模擬信號轉換成數字信號,并使用CRC校驗保證數據傳輸的可靠性。此外,該傳感器還具有單次測量和連續測量兩種模式,可以滿足不同場景下的需求。
DHT20傳感器采用單線數字信號傳輸,讀取數據過程中需要按照協議進行時序控制。
下面是基于STC89C52單片機的DHT20溫濕度數據讀取代碼示例,通過串口調試助手將讀取到的數據打印出來:
#include
#include
?
sbit DHT20 = P1^0; //定義DHT20連接的IO口
?
void delay_us(unsigned int us) //us級延時函數
{
while(us--)
{
_nop_();
}
}
?
void DHT20_start(void) //開始信號
{
DHT20 = 1; //先將數據線置高
delay_us(30); //延時30us
DHT20 = 0; //拉低數據線
delay_us(25); //持續拉低25us
DHT20 = 1; //釋放數據線
delay_us(5); //延時5us
}
?
unsigned char DHT20_read(void) //讀取一個字節的數據
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
while(!DHT20); //等待數據線變高
delay_us(4); //延時4us
dat <<= 1; //左移一位
if(DHT20) //如果數據線為高
{
dat |= 1; //在最低位寫入1
while(DHT20); //等待數據線變低
}
}
return dat;
}
?
void main()
{
unsigned char humi_H, humi_L, temp_H, temp_L, check_sum;
while(1)
{
DHT20_start(); //發送開始信號
if(!DHT20) //等待DHT20響應
{
delay_us(80);
if(DHT20)
{
delay_us(80);
humi_H = DHT20_read(); //讀取濕度高8位
humi_L = DHT20_read(); //讀取濕度低8位
temp_H = DHT20_read(); //讀取溫度高8位
temp_L = DHT20_read(); //讀取溫度低8位
check_sum = DHT20_read(); //讀取校驗和
if((humi_H + humi_L + temp_H + temp_L) == check_sum) //校驗和正確
{
printf("濕度:%d.%d %%\\r\\n", humi_H, humi_L);
printf("溫度:%d.%d ℃\\r\\n", temp_H, temp_L);
}
}
}
delay_ms(5000); //延時5s再讀取
}
}
【2】IIC接口的OLED顯示屏的驅動代碼
0.96寸OLED(SSD1306驅動芯片)顯示屏是一款常見的小型顯示器件,具有高對比度、低功耗、快速響應等特點。其主要由OLED芯片和玻璃基板組成,可通過IIC或SPI接口控制,實現圖形、文字、數字等內容的顯示。
SSD1306驅動芯片是最常用的OLED顯示器驅動芯片之一,具有低功耗、高對比度、高分辨率等優點。它支持點陣圖像顯示、字符顯示、圖形顯示等多種顯示模式,可通過IIC/SPI接口進行通信控制,支持控制字體大小、顯示位置、亮度等參數,且內置顯存,方便多屏幕拼接顯示。
0.96寸OLED(SSD1306驅動芯片)顯示屏通常采用128x64或者128x32的分辨率,顯示效果清晰,可顯示4行16列的字體信息。其內置控制器,占用極少的CPU資源和存儲空間,適合于嵌入式系統、智能家居、手持設備等場景中使用。
下面是基于STC89C52單片機控制IIC接口的0.96寸OLED(SSD1306驅動芯片)顯示屏顯示一個數字的詳細代碼:
#include
#include
?
#define uchar unsigned char
#define uint unsigned int
?
/* 定義IIC總線的SDA和SCL引腳 */
sbit SDA = P1^0;
sbit SCL = P1^1;
?
/* 定義OLED顯示屏的地址,一般為0x78 */
#define OLED_ADDRESS 0x78
?
/* OLED顯示屏的初始化命令 */
uchar init_cmd[] = {
0xAE, /* 關閉OLED顯示 */
0x00, /* 設置列地址低位 */
0x10, /* 設置列地址高位 */
0x40, /* 設置起始行 */
0xB0, /* 設置頁地址 */
0x81, /* 設置對比度 */
0xFF, /* 對比度值 */
0xA1, /* 水平翻轉 */
0xA6, /* 正常顯示 */
0xA8, /* 設置多路復用率 */
0x3F, /* 值越大,顯示點越多,亮度越高 */
0xC8, /* 垂直翻轉 */
0xD3, /* 設置顯示偏移 */
0x00, /* 偏移量為0 */
0xD5, /* 設置時鐘分頻 */
0x80, /* 分頻值為80 */
0xD9, /* 設置預充電周期 */
0xF1, /* 默認值 */
0xDA, /* 設置COM硬件配置 */
0x12, /* 默認值 */
0xDB, /* 設置VCOMH電壓 */
0x40, /* 默認值 */
0x20, /* 設置內存地址模式 */
0x00, /* 水平地址模式 */
0xAF /* 打開OLED顯示 */
};
?
/* IIC總線的延時函數 */
void Delay5ms()
{
uint i, j;
?
for (i = 0; i < 5; i++) {
for (j = 0; j < 110; j++);
}
}
?
/* IIC總線的啟動信號,SDA從高到低,SCL為高電平 */
void I2C_Start()
{
SDA = 1;
SCL = 1;
Delay5ms();
SDA = 0;
Delay5ms();
SCL = 0;
}
?
/* IIC總線的停止信號,SDA從低到高,SCL為高電平 */
void I2C_Stop()
{
SDA = 0;
SCL = 1;
Delay5ms();
SDA = 1;
Delay5ms();
}
?
/* IIC總線的寫數據函數 */
void I2C_Write(uchar dat)
{
uchar i;
?
for (i = 0; i < 8; i++) {
SDA = dat & 0x80;
SCL = 1;
Delay5ms();
SCL = 0;
dat <<= 1;
}
}
?
/* OLED顯示屏的初始化函數 */
void OLED_Init()
{
uchar i;
?
I2C_Start();
I2C_Write(OLED_ADDRESS);
for (i = 0; i < sizeof(init_cmd); i++) {
I2C_Write(init_cmd[i]);
}
I2C_Stop();
}
?
/* OLED顯示屏的寫數據函數 */
void OLED_Write_Data(uchar dat)
{
I2C_Start();
I2C_Write(OLED_ADDRESS);
I2C_Write(0x40); /* 寫數據標志 */
I2C_Write(dat);
I2C_Stop();
}
?
/* OLED顯示屏顯示數字的函數 */
void OLED_Show_Number(uchar num)
{
uchar i;
uint j;
?
/* 在第1頁、第5列顯示數字 */
OLED_Write_Data(0xB0);
OLED_Write_Data(0x00);
OLED_Write_Data(0x10);
for (i = 0; i < 8; i++) {
OLED_Write_Data(0x00);
}
for (i = 0; i < 3; i++) {
OLED_Write_Data(0xFF);
}
for (i = 0; i < 5; i++) {
OLED_Write_Data(0x00);
}
for (i = 0; i < 3; i++) {
OLED_Write_Data(0xFF);
}
for (j = 0; j < 5000; j++); /* 延時一段時間,讓數字停留在屏幕上 */
}
?
/* 主函數 */
void main()
{
/* 初始化OLED顯示屏 */
OLED_Init();
?
/* 顯示數字 */
OLED_Show_Number(5);
}
代碼首先定義了IIC總線的SDA和SCL引腳,以及OLED顯示屏的地址。然后定義了OLED顯示屏的初始化命令和顯示數字的函數。在主函數中調用初始化函數,并在OLED顯示屏上顯示數字5。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2561文章
52200瀏覽量
761900 -
單片機
+關注
關注
6058文章
44821瀏覽量
644899 -
物聯網
+關注
關注
2922文章
45675瀏覽量
385534 -
檢測儀
+關注
關注
5文章
4182瀏覽量
43379 -
IIC總線
+關注
關注
1文章
67瀏覽量
20682
發布評論請先 登錄
相關推薦
DIY 溫濕度檢測儀
求一份萬年歷程序+電路圖(STC89c52+ds1302+溫濕度DHT11+12864
環境溫濕度采集系統
基于AT89S52單片機的全數字溫濕度儀設計與實現
怎樣去設計一種基于51單片機溫濕度檢測儀
如何利用STC89C52和DHT11實現溫濕度檢測儀的設計
通過使用AT89C52和DHT11設計的溫濕度控制系統資料分享
20-基于51單片機溫濕度檢測儀設計

20-基于51單片機的溫濕度檢測儀設計

STC89C52RC 單片機讀取DHT22溫濕度傳感器串口顯示程序調試經驗總結

評論