89C52RC 单片机实现串口查询 DHT11 数据
<p><strong>串口以 HEX 方式发送 10 或 11 查询温湿度</strong></p><h1>硬件连接</h1>
<p><img src="data/attachment/forum/202412/28/121149ruju4qyo6r3g69u4.jpg" alt="IMG_20241228_121029.jpg" title="IMG_20241228_121029.jpg" /></p>
<h1>代码</h1>
<pre><code>
#include <reg52.h>
#include <stdio.h>
sbit DHT_data=P2^0;
unsigned int rec_dat;
unsigned char DHT11_rec_byte();
unsigned char comdata;
#define Temp_COMMAND 0x10
#define Humidity_COMMAND 0x11
//定义
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int k);
void DHT11_start();
void DHT11_receive();
void InitUART(void);
void uart_send(unsigned char dat);
void uart_send_string(unsigned char *str);
void receive_data(void);
void test_do_data(void);
//主函数
void main()
{
InitUART();
while(1)
{
}
}
//DHT11起始信号
void DHT11_start()
{
DHT_data=1;
DHT11_delay_us(2);
DHT_data=0;
DHT11_delay_ms(20);
DHT_data=1;
DHT11_delay_us(13);
}
//接收一个字节
unsigned char DHT11_rec_byte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
while(!DHT_data);
DHT11_delay_us(8);
dat<<=1;
if(DHT_data==1)
{
dat+=1;
}
while(DHT_data);
}
return dat;
}
//接收温湿度数据
void DHT11_receive()
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,revise;
DHT11_start();
DHT_data=1;
if(DHT_data==0)
{
while(DHT_data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时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(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,方便显示*/
rec_dat=RH;
rec_dat=RL;
rec_dat=TH;
rec_dat=TL;
}
}
//延时us --2*n+5us
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
//延时ms
void DHT11_delay_ms(unsigned int k)
{
unsigned int i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void InitUART(void)//使用定时器1作为串口波特率发生器
{
SCON=0x40; //串口通信工作方式1
REN=1; //允许接收
TMOD=0x20; //定时器1的工作方式2
TH1=0xFD; // 波特率 9600 bps
TL1=0xFD; // 波特率 9600 bps
TI=1;
TR1=1;
ES = 1; //
EA = 1; //
}
void uart_send(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void uart_send_string(unsigned char *str)
{
while(*str)
{
uart_send(*str++);
}
}
void uart_isr(void) interrupt 4
{
if(RI)
{
RI = 0;
comdata = SBUF;
switch(comdata)
{
case Temp_COMMAND:
DHT11_delay_ms(150);
DHT11_receive();
DHT11_delay_ms(100);
uart_send_string("Temp: ");
uart_send(rec_dat/10 + '0');//shi
uart_send(rec_dat%10 + '0');//ge
uart_send('.');
uart_send(rec_dat + '0');
uart_send('C');
uart_send_string("\r\n");
break;
case Humidity_COMMAND:
DHT11_delay_ms(150);
DHT11_receive();
DHT11_delay_ms(100);
uart_send_string("Humidity: ");
uart_send(rec_dat/10 + '0');//shi
uart_send(rec_dat%10 + '0');//ge
uart_send('.');
uart_send(rec_dat + '0');
uart_send('%');
uart_send_string("\r\n");
break;
}
}
}
</code></pre>
<h1>效果</h1>
<p><img src="data/attachment/forum/202412/28/120949vd7fu4qzh7hhgrsu.gif" alt="UART_DHT11.gif" title="UART_DHT11.gif" /></p>
页:
[1]