【文件属性】:
文件名称:DHT11温湿度传感器C代码
文件大小:3KB
文件格式:C
更新时间:2017-01-31 15:08:43
DHT11 温度 湿度 传感器
基于温度湿度一体的传感器DHT11
以下是在51单片机上测试成功的代码
#include
#include//加上这句下面的 _nop_();就能用
bit xianshiqiehuan;
// sbit dht11_dat=P1^6; //开发板用
sbit dht11_dat=P2^0; //使用版用
unsigned char c,count, dht11temp,dht11dat;
unsigned char dht11value[5];
unsigned int x,y,z;
unsigned char code dat[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,};
delay()
{
unsigned char a;
for(a=200;a>0;a--);
}
display(unsigned char x) //使用版用
{
P0=dat[(x0)/10];//十位
P2_3=0;
delay();
P2_3=1;
P0=dat[(x0)];//个位
P2_2=0;
delay();
P2_2=1;
}
/*display(unsigned char x) //开发板用
{
P0=dat[(x0)/10];//十位
P1_2=0;
delay();
P1_2=1;
P0=dat[(x0)];//个位
P1_3=0;
delay();
P1_3=1;
} */
delay_1s()
{
unsigned int i=50000;
while(i--);
}
delay_10us() //10us
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
void delayms(unsigned char x) //1ms单位延时程序
{
unsigned char j;
while(x--)
{
for(j=0;j<123;j++){;}
}
}
read_dht11()
{ unsigned char i;
dht11_dat=1; _nop_(); //起始
dht11_dat=0;//拉低总线
delayms(18);//手册要求大于18ms
dht11_dat=1;//拉高总线等待dht11回应
while(dht11_dat); // 等待dht11回应 若有回应 dht11_dat=0;往下执行
while(!dht11_dat);//回应后dht11将总线拉低80us,过后又将总线拉高,进入下一步
while(dht11_dat); //拉高80us 又变低,往下执行 进入50us延时
for(i=0;i<24;i++)
{
while(!dht11_dat);//50us过后...... dht11_dat=1;往下执行
delay_10us();delay_10us();delay_10us();//延时30us,查看总线是高是低,
dht11temp=0; //先默认为0处理
if(dht11_dat) dht11temp=1; //1处理
dht11dat=dht11dat<<1; //必须先移动再或 若先或再移本次数据就移动了
dht11dat=dht11dat|dht11temp;
dht11value[i/8]=dht11dat;
while(dht11_dat);//如果处理的是1,30us过后总线还是1,那就在此等待总线变为0进入下一个50us低电平,不然会重复进行0处理
}
}
main()
{
delay_1s(); //要求上电等1秒,让dht11稳定
EA=1;//开放中断
TMOD=0x01;//设T0 为16位计数方式
ET0=1;//定时0中断允许
TR0=1;//开启TR0
while(1)
{
if(!xianshiqiehuan) //显示温度
display(dht11value[2]) ;
else
{display(dht11value[0]) ; //显示湿度
P0=0x92&0x7f; //千位显 S.代表湿度
P2_5=0;
delay();
P2_5=1;
}
}
}
dingshi() interrupt 1 //定时器0服务程序
{
TH0=0;
TL0=0;
count++;
if(count==55){count=0;read_dht11();xianshiqiehuan=~xianshiqiehuan; } //在切换显示时采集,以防中断采样带来的显示闪烁
}