protues仿真DHT11显示温湿度
仿真原理图如下
DHT11单片机源程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6; //定义数据线
uchar rec_dat[9]; //用于显示的接收数据数组
sbit lcdrs=P3^0;
sbit lcdrw=P3^1;
sbit lcden=P3^2;
void delay(uint n)
{ uint x,y;
for(x=n;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0; //rs=0时输入指令
P2=com;
delay(5);
lcden=1; //en=1时读取信息
delay(5);
lcden=0; //1 -> 0 执行指令
}
void write_dat(uchar dat)
{
lcdrs=1; //rs=1时输入数据
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x38); //8位数据,双列,5*7字形
write_com(0x0c); //开启显示屏,关光标,光标不闪烁
write_com(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
write_com(0x01);
}
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); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
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';
}
}
/*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/
void main()
{
uchar i;
init_lcd(); //lcd1602初始化
while(1)
{
DHT11_delay_ms(100); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
DHT11_receive();
write_com(0x80); //从lcd1602第一行第一个位置开始显示
for(i=0;i<9;i++)
write_dat(rec_dat[i]); //显示数据
write_com(0x80+0x40);
write_dat(0x2d);
write_dat(0x42);
write_dat(0x3a);
……………………
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』