|
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; //用哪個(gè)I/O口自選,注意不要用P3口
uchar dht_num=0; //用于while循環(huán)中計(jì)數(shù),超時(shí)則跳出循環(huán)
uchar dht_d1=0,dht_d2=0 ; //依次為濕度整數(shù)部分和濕度小數(shù)部
uchar dht_t1=0,dht_t2=0 ; //依次為溫度整數(shù)部分和溫度小數(shù)部分
uchar dht_j=0; //和校驗(yàn),可選擇是否使用,具體參照數(shù)據(jù)手
uchar i,t11,t12,d11,d12;
uchar t21,t22,d21,d22;
/*****************ms延時(shí)函數(shù)*********************************/
void delay(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/*****************us延時(shí)函數(shù)*****************************/
void delay_10us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void dht_init()
{
delay(1000); //DHT11上電前準(zhǔn)備時(shí)間,大概1s
dht_dat=1; // //總線準(zhǔn)備
}
uchar read_date() //接收一個(gè)8位數(shù)據(jù),先高位后低位
{
uchar i,dat;
for(i=0;i<8;i++) //也就是說程序是循環(huán)八次,把判斷有“1”輸出到dat中,然后輸出一個(gè)八位的數(shù)據(jù)。
{
dht_num=2;
while((dht_dat==0)&&(dht_num++)); //dht_dat 數(shù)據(jù)線由DH11拉低準(zhǔn)備發(fā)送數(shù)據(jù)
delay_10us();
delay_10us();
delay_10us();
delay_10us();
dat=dat<<1;
if(dht_dat==1)
{
dht_num=2;
dat=dat|0x01; //如果來自DQ的數(shù)據(jù)是高電平1,則把1放到dat的最低位
while((dht_dat==1)&&(dht_num++));
}
}
return dat;
}
void get_temp() //給DHT11一個(gè)開始信號(hào),然后讀取一次數(shù)據(jù),共五個(gè)8位字節(jié)
{
dht_dat=0;
delay(25);
dht_dat=1; //單片機(jī)給起始脈沖信號(hào)
delay_10us();
delay_10us();
delay_10us();
delay_10us();
dht_dat=1; //稍作延時(shí),等待DHT11返回響應(yīng)(響應(yīng)為低電 平)
if(dht_dat==0) //有響應(yīng)才接收數(shù)據(jù),否則不作處理
{
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(); //一次讀出五個(gè)數(shù)據(jù)
}
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);
}
}
\
|
|