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

20-基于51單片機(jī)的溫濕度檢測儀設(shè)計

STC89C52RC 單片機(jī)讀取DHT22溫濕度傳感器串口顯示程序調(diào)試經(jīng)驗總結(jié)

評論