|
5黑币
#include<reg51.h>
#include<intrins.h>
# include <stdio.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
/*端口定义*/
sbit dht_dat=P1^2; //用哪个I/O口自选,注意不要用P3口
uchar dht_num=0; //用于while循环中计数,超时则跳出循环
uchar dht_d1=0,dht_d2=0 ; //依次为湿度整数部分和湿度小数部
uchar dht_t1=0,dht_t2=0 ; //依次为温度整数部分和温度小数部分
uchar dht_j=0; //和校验,可选择是否使用,具体参照数据手
uchar i,t11,t12,d11,d12;
uchar t21,t22,d21,d22;
/*****************ms延时函数*********************************/
void delay(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/*****************us延时函数*****************************/
void delay_10us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void dht_init()
{
delay(1000); //DHT11上电前准备时间,大概1s
dht_dat=1; // //总线准备
}
uchar read_date() //接收一个8位数据,先高位后低位
{
uchar i,dat;
for(i=0;i<8;i++) //也就是说程序是循环八次,把判断有“1”输出到dat中,然后输出一个八位的数据。
{
dht_num=2;
while((dht_dat==0)&&(dht_num++)); //dht_dat 数据线由DH11拉低准备发送数据
delay_10us();
delay_10us();
delay_10us();
delay_10us();
dat=dat<<1;
if(dht_dat==1)
{
dht_num=2;
dat=dat|0x01; //如果来自DQ的数据是高电平1,则把1放到dat的最低位
while((dht_dat==1)&&(dht_num++));
}
}
return dat;
}
void get_temp() //给DHT11一个开始信号,然后读取一次数据,共五个8位字节
{
dht_dat=0;
delay(25);
dht_dat=1; //单片机给起始脉冲信号
delay_10us();
delay_10us();
delay_10us();
delay_10us();
dht_dat=1; //稍作延时,等待DHT11返回响应(响应为低电 平)
if(dht_dat==0) //有响应才接收数据,否则不作处理
{
dht_num=2;
while((dht_dat==0)&&(dht_num++));
dht_num=2;
while((dht_dat==1)&&(dht_num++));
dht_d1=read_date();
dht_d2=read_date();
dht_t1=read_date();
dht_t2=read_date();
dht_j=read_date(); //一次读出五个数据
}
dht_dat=1; //释放总线
delay(5);
}
void main()
{
TMOD=0x21;
SCON=0x50;
TH1=0xFD;
TL1=0xFD;
TR1=1;
ES = 1;
TI=1;
EA = 1; //开总中断
dht_init();
while(1)
{
// dht_init();
get_temp();
d11=dht_d1/10+0x30;
d12=dht_d1%10+0x30;
t11=dht_t1/10+0x30;
t12=dht_t1%10+0x30;
d21=dht_d2/10+0x30;
d22=dht_d2%10+0x30;
t21=dht_t2/10+0x30;
t22=dht_t2%10+0x30;
printf("T:2%d",dht_t1);
printf(".");
printf("2%d",dht_t2);
printf("C\n");
delay(100);
printf("D:2%d",dht_d1);
printf(".");
printf("2%d",dht_d2);
printf("RH\n");
delay(250);
}
}
\
|
|