资源描述
dht11的c语言程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit TRH = P1^0;//温湿度传感器DHT11数据接入
uchar str[]={0,0,0,0,0,0,0,0};
uint TH,TL,RH,RL,CK;
uint THc,TLc,RHc,RLc,CKc;
uint xh,sum;
// void delay(uchar s) //延时10us
// {
// uchar v;
// for(;s>0;s--)
// for(v=25;v>0;v--);
// }
void delay(uchar b) //误差 0us
{
unsigned char a;
for(;b>0;b--)
for(a=2;a>0;a--);
}
//void delay1( )// 延时20ms
//{
//uchar x,y,z;
//for(x=15;x>0;x--)
//for(y=4;y>0;y--)
//for(z=248;z>0;z--);
//}
void delay1(uchar c) //误差 0us
{
unsigned char a,b;
for(;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay2()//数码管显示用的延时
{
uchar l,j,k;
for(l=2;l>0;l--)
for(j=4;j>0;j--)
for(k=100;k>0;k--);
}
void start()
{ TRH=1;
delay(2);
TRH=0; //主机拉低18ms
delay1(20);
TRH=1; //DATA总线由上拉电阻拉高主机延时20
delay(3);
}
uchar receive()
{ uchar i,temp;
xh=0;
while(TRH);
for(i=0;i<8;i++)
{ while(!TRH);
delay(3);
if(TRH)
{ temp=1;while(TRH);}
else
temp=0;
xh<<=1;
xh|=temp;
}
return (xh);
}
void display()
{
uchar a[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};vNP1MMb。
uchar m,n,s,i;
m= str[3];//数码管显示部分
n= str[4];
s= str[5];
while(1)
{
for(i=0;i<10;i++)
{ if(m==i)
m=a[i];
}
P0=m;
P2=0x10;
delay2();
for(i=0;i<10;i++)
{ if(n==i)
n=a[i];
}
P0=n-0X80;
P2=0x20;
delay2();
for(i=0;i<10;i++)
{ if(s==i)
s=a[i];
}
P0=s;
P2=0x40;
delay2();
P0=0X9C;
P2=0x80;
delay2();
}
}
void main()
{
while(1)
{
start();
TRH=1; // 读取数据并写入指令
if(!TRH)
{
while(!TRH); //判断DHT11发出 80us 的低电平响应信号是否结束
while(TRH);
delay(8);
RHc = receive(); //数据接收状态
RLc = receive();
THc = receive();
TLc = receive();
CKc = receive();
}
TRH=1;
sum=(RHc+RLc+THc+TLc);//数据校验
if(sum==CKc)
{ RH = RHc;
RL = RLc;
TH= THc;
TL = TLc;
CK = CKc;
str[0] =RH/10; //湿度整数部分
str[1] =RH%10;
str[2] = RL/10 ;
str[3] = TH/10; //温度整数部分
str[4] = TH%10;
str[5] = TL/10;
}
display();
}
}
展开阅读全文