基于51單片機的DHT11溫濕度傳感器- #include<reg52.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit dht=P1^1;
- sbit dula=P2^6;
- sbit wela=P2^7;
- uchars8h,s8h_temp,s8l,s8l_temp,w8h,w8h_temp,w8l,w8l_temp,check8,check8_temp,flag=0;
- float sd,wd;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
- 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
- void delayms(uint z)
- {
- uintx,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void Delay_10us() //進入函數3us
- {
- uchar i; //每條語句1us
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void display(uchar th,uchar tl)
- {
- ucharih=0,il=0,jh=0,jl=0,kh=0,kl=0;
- ih=th/100;
- jh=th%100/10;
- kh=th%10;
- il=tl/100;
- jl=tl%100/10;
- kl=tl%10;
-
- P0=0xfe;
- wela=1;
- wela=0;
- P0=table[ih];
- dula=1;
- dula=0;
- delayms(1);
-
- P0=0xfd;
- wela=1;
- wela=0;
- P0=table[jh];
- dula=1;
- dula=0;
- delayms(1);
-
- P0=0xfb;
- wela=1;
- wela=0;
- P0=table[kh+10];
- dula=1;
- dula=0;
- delayms(1);
- P0=0xf7;
- wela=1;
- wela=0;
- P0=table[il];
- dula=1;
- dula=0;
- delayms(1);
-
- P0=0xef;
- wela=1;
- wela=0;
- P0=table[jl];
- dula=1;
- dula=0;
- delayms(1);
-
- P0=0xdf;
- wela=1;
- wela=0;
- P0=table[kl];
- dula=1;
- dula=0;
- delayms(1);
- }
- char com()
- {
- uchari,j,temp,cdata=0;
- for(i=0;i<8;i++)
- {
- flag=2;
- while((!dht)&&(flag++));//等待拉高
- // Delay_10us();
- // Delay_10us();
- // Delay_10us();
- j=3;while(j--); //延時30us
- temp=0;
- if(dht==1)temp=1;
- flag=2;
- while(dht&&(flag++));//等待拉低
- // if(flag==1)break;
- cdata<<=1;
- cdata=cdata|temp;
- }
- returncdata;
- }
- void getdth()
- {
- uchari;
- dht=0;
- delayms(18); //18ms
- dht=1;
- // Delay_10us();
- // Delay_10us();
- // Delay_10us();
- // Delay_10us();
- i=4;while(i--); //延時40us
- dht=1;
- if(dht!=1) //dth11響應
- {
- flag=2;while((!dht)&&(flag++));//等待拉高
- flag=2;while(dht&&(flag++));//等待讀入數據
- s8h_temp=com();
- s8l_temp=com();
- w8h_temp=com();
- w8l_temp=com();
- check8_temp=com();
- dht=1;
- if((s8h_temp+s8l_temp+w8h_temp+w8l_temp)==check8_temp)//校驗
- {
- s8h=s8h_temp;
- s8l=s8l_temp;
- w8h=w8h_temp;
- w8l=w8l_temp;
- check8=check8_temp;
- }
- }
- sd=s8h+(float)s8l/256;
- wd=w8h+(float)w8l/256;
- }
- void main()
- {
- while(1)
- {
- getdth();
- display(s8h,w8h);
- }
- }
復制代碼
|