DHT11温湿度传感器,用51单片机驱动,并用1602液晶显示屏显示。请大家多多指教!
单片机源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P2^0;
- uchar rec_dat[9]="12369566";
- extern void InitLcd1602();
- extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
- 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(20);
- 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); //延时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[0]='0'+(RH/10);
- rec_dat[1]='0'+(RH%10);
- rec_dat[2]='R';
- rec_dat[3]='H';
- rec_dat[4]=' ';
- rec_dat[5]=' ';
- rec_dat[6]='0'+(TH/10);
- rec_dat[7]='0'+(TH%10);
- rec_dat[8]='C';
- }
- }
- void main()
- {
- InitLcd1602(); //1602初始化
- while(1)
- {
- DHT11_delay_ms(1500); //DHT11初始1S延时
- DHT11_receive();
- LcdShowStr(0,0,rec_dat); //显示温湿度
- }
- }
复制代码
所有资料51hei提供下载:
51温湿度传感器1602显示.zip
(27.84 KB, 下载次数: 113)
Sheet2.pdf
(61.89 KB, 下载次数: 54)
|