標題:
菜鳥級的DHT11讀取 單片機程序
[打印本頁]
作者:
lhxr
時間:
2019-8-21 00:30
標題:
菜鳥級的DHT11讀取 單片機程序
菜鳥初學C51單片機,不容易啊,僅與一步一步走來的菜鳥分享,大師們忽視!
今天剛收到某寶快遞來的DHT11,馬上焊接,早上就一直再看規(guī)格書,網上看別人的例程,以為很順利,結果從下午4點開始,
一直弄到12點多,就是讀不出數(shù)據,網上看了很多例程,就是不行。都快崩潰得想放棄了,最后還是有顯示了
不敢獨享,分享給很多像我一樣的菜鳥
(參照:
http://www.torrancerestoration.com/bbs/dpj-154092-1.html
,fumily 發(fā)表于 2019-3-23 18:57)感謝作者
fumily
/*****************************************************************************
*MCU 型號:STC15W404AS
*開發(fā)環(huán)境:Keil uVision5
*晶震頻率:11.0592MHZ
*完成日期:2019-08-20
*程序功能:DHT11讀取
/********************定義數(shù)據*************************/
#include <STC15F2K60S2.H>
#include <intrins.h>
#define uchar unsigned char //無符號字符型類型數(shù)據
#define uint unsigned int //無符號整型數(shù)據
uchar dat_r[4]; //用于存放從DHT11讀取到的數(shù)值
sbit DATA=P3^3; //定義數(shù)據線,DHT11的2腳,2腳要上拉5.1K電阻
/*-------30US延時---11.0592MHz(Copy自STC-ISP(v6.86).exe)----------------------------*/
void Delay30us()
{
unsigned char i;
_nop_();
_nop_();
i = 80;
while (--i);
}
/*-------20MS延時----11.0592MHz(Copy自STC-ISP(v6.86).exe)---------------------------*/
void Delay20ms()
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*-------1S延時-----11.0592MHz(Copy自STC-ISP(v6.86).exe)--------------------------*/
void Delay1s()
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*********************************************************************************************
函數(shù)名:DHT11啟動函數(shù)
調 用:無
參 數(shù):無
返回值:無
結 果:DHT11開始工作
備 注:
**********************************************************************************************/
void DHT11_start() // 主機控制DHT11開始工作
{
DATA=1; // 主線空閑狀態(tài)
_nop_();
_nop_();
DATA=0; // 主機發(fā)送開始工作信號
Delay20ms(); //延時18ms以上
DATA=1; // 拉高并延時等待DHT11響應
Delay30us();
}
/*********************************************************************************************
函數(shù)名:DHT11讀數(shù)據函數(shù)
調 用:? = DHT11_rec_byte();
參 數(shù):無
返回值:
結 果:讀DHT11數(shù)據并保存到dat
備 注:
**********************************************************************************************/
uchar DHT11_rec_byte() //接收一個字節(jié)
{
uchar i,dat=0;
for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據
{
while(!DATA); //等待50us低電平過去
Delay30us();
Delay30us(); //延時60us,如果還為高則數(shù)據為1,否則為0
dat<<=1; //左移位使正確接收8位數(shù)據,數(shù)據為0時直接移位
if(DATA==1) //數(shù)據為1時,使dat加1來接收數(shù)據1
dat+=1;
while(DATA); //等待數(shù)據線拉低
}
return dat;
}
/*********************************************************************************************
函數(shù)名:接收DHT11的40位的數(shù)據并校驗
調 用:? = DHT11_receive();
參 數(shù):無
返回值:無
結 果:結果保存到dat_r[i]中
備 注:
**********************************************************************************************/
void DHT11_receive() //接收40位的數(shù)據
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start(); // 主機控制DHT11開始工作
if(DATA==0)
{
while(DATA==0); //等待拉高
Delay30us();
Delay30us();
Delay30us(); //拉高后延時80us
R_H=DHT11_rec_byte(); //接收濕度高八位
R_L=DHT11_rec_byte(); //接收濕度低八位
T_H=DHT11_rec_byte(); //接收溫度高八位
T_L=DHT11_rec_byte(); //接收溫度低八位
revise=DHT11_rec_byte(); //接收校正位[/i][/color][/font][/u][i]
[u][font=宋體][color=#336699] Delay30us(); //結束[/color][/font][/u]
[u][font=宋體][color=#336699] if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*數(shù)據處理,方便顯示*/
dat_r[0]='0'+(RH/10);
dat_r[1]='0'+(RH%10);
dat_r[2]='0'+(TH/10);
dat_r[3]='0'+(TH%10);
}
}
/*========串口初始化函數(shù)=================================================*/
void UartInit() [url=]//9600bps@11.0592MHz[/url]
{
SCON = 0x50; //8位數(shù)據,可變波特率
AUXR |= 0x04;
//AUXR |= 0x01; //串口1選擇定時器2為波特率發(fā)生器
T2L =0xE0; // 65536-(11059200/4/9600); //設定定時初值
T2H =0xFE; // (65536-(11059200/4/9600))>>8; //設定定時初值
AUXR |= 0x10;
}
/*===========串口發(fā)送函數(shù)(字節(jié))=======================================*/
void Uartsend_1(unsigned char send)
{
SBUF=send; //發(fā)送數(shù)據
while(!TI); //等待前一幀數(shù)據發(fā)送完畢
TI=0; //復位標志位
}
//----------串口發(fā)送函數(shù)(字符串)-----------------------------------------
void PrintString(unsigned char code *puts) //發(fā)送一串字符串
{
for (; *puts != 0;
puts++) Uartsend_1(*puts); //遇到停止符0結束
}
/*********************************************************************************************
函數(shù)名:主函數(shù)
調 用:無
參 數(shù):無
返回值:無
結 果:讀DHT11數(shù)據并送到1602顯示
備 注:
**********************************************************************************************/
void main (void)
{
UartInit();
Delay20ms();
while(1)
{
Delay1s(); //經測試,兩次連讀要至少延時80ms
DHT11_receive();//接受數(shù)據
//RH:XX%
PrintString("RH:");
Uartsend_1(dat_r[0]);
Uartsend_1(dat_r[1]);
PrintString("%; ");
//TMP:XXC
PrintString("Tempreture:");
Uartsend_1(dat_r[2]);
Uartsend_1(dat_r[3]);
Uartsend_1(0xdf);
PrintString("C ");
Delay1s();
}
}
復制代碼
作者:
ping264888
時間:
2019-8-21 09:42
51有你更精彩
作者:
huaohui
時間:
2019-8-21 10:25
多動腦勤動手,下個大師就是你,加油!
作者:
LOGLOG6
時間:
2019-11-2 19:21
非常棒,多謝多謝
作者:
lsg0280
時間:
2022-2-12 19:44
非常好,實踐出真知。
作者:
bhjyqjs
時間:
2022-6-2 08:55
持之以恒,終將成老怪。
作者:
小萌新51
時間:
2022-6-7 21:30
多思考
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1