#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit Data=P2^0; uchar rec_dat[4]; void DHT11_delay_us(uchar n) { while(--n); } void DHT11_delay_ms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void DHT11_start() { Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(30); Data=1; DHT11_delay_us(30); } uchar DHT11_rec_byte() { uchar i,dat=0; for(i=0;i<8;i++) { while(!Data); DHT11_delay_us(8); dat<<=1; if(Data==1) dat+=1; while(Data); } return dat; } void DHT11_receive() { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start(); if(Data==0) { while(Data==0); DHT11_delay_us(40); 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[0]=RH; rec_dat[1]=RL; rec_dat[2]=TH; rec_dat[3]=TL; } }
时间: 2024-04-12 19:33:40 浏览: 177
51与DS1302程序
5星 · 资源好评率100%
这段代码是用来读取DHT11温湿度传感器的数据。它使用了8051系列单片机的寄存器和延时函数。代码中定义了一些宏,包括uchar和uint,用于定义无符号字符和无符号整数的数据类型。
在代码中,通过定义一个Data变量来控制DHT11传感器的数据引脚。通过设置Data引脚的电平状态,可以与DHT11传感器进行通信。
代码中还定义了一些延时函数,用于实现微秒级和毫秒级的延时操作。
函数DHT11_start()用于发送开始信号给DHT11传感器。具体的操作包括将Data引脚置高、延时一段时间后将其置低、再延时一段时间后将其置高。
函数DHT11_rec_byte()用于接收一个字节的数据。具体的操作是等待Data引脚变为高电平,然后延时一段时间后读取Data引脚的电平状态,将其保存到dat变量中。
函数DHT11_receive()用于接收DHT11传感器的温湿度数据。具体的操作包括发送开始信号、等待Data引脚变为低电平、接收4个字节的数据(分别是湿度的整数部分、湿度的小数部分、温度的整数部分和温度的小数部分)、校验数据的正确性,并将接收到的数据保存到rec_dat数组中。
需要注意的是,这段代码只是读取DHT11传感器的数据,还需要结合其他代码来对数据进行处理和显示。
阅读全文