按照時序圖改了很多次,但是總是輸出為0,有沒有大神能夠幫忙解答一下
dht11.c
- #include "STC8A.h"
- #include "time111.h"
- #include <string.h>
- #include "stdio.h"
- #include "dht111.h"
- sbit dht11=P0^3;
- sbit led=P2^0;
- sbit led1=P2^1;
- unsigned char s[5]=0;
- unsigned char rec[5]=0;
- void start()
- {
-
- dht11=1;
- Delay1us();
- Delay1us();
- dht11=0;
- Delay18ms();
- dht11=1;
- Delay30us();
- //dht11=1;
- while(!dht11)
- {
- led=0;
- }
- }
- unsigned char readbyte()
- {
- unsigned char i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數據
- {
- while(!dht11); //等待50us低電平過去
- Delay50us(); //延時60us,如果還為高則數據為1,否則為0
- dat<<=1; //移位使正確接收8位數據,數據為0時直接移位
- if(dht11==1) //數據為1時,使dat加1來接收數據1
- dat+=1;
- while(dht11); //等待數據線拉低
- }
- return dat;
- }
- void readall(unsigned char *rec)
- {
- unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- start();
- if(start==1)led1=0;
- if(dht11==0)
- {
- while(dht11==0);//等待拉高
- Delay80us(); //拉高后延時80us
- R_H=readbyte(); //接收濕度高八位
- R_L=readbyte(); //接收濕度低八位
- T_H=readbyte(); //接收溫度高八位
- T_L=readbyte(); //接收溫度低八位
- revise=readbyte(); //接收校正位
- Delay25us(); //結束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
-
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- //led1=0;
- }
- rec[0]=(RH)/10;
- rec[1]=(RH)%10;
- rec[2]=(TH)/10;
- rec[3]=(TH)%10;
-
- }
-
- }
復制代碼 main.c
- #include "STC8A.h"
- #include <intrins.h>
- #include <string.h>
- #include "stdio.h"
- #include "Uart.h"
- #include "time111.h"
- #include "dht111.h"
- extern unsigned char s[5];
- sbit led1=P2^0;
- void main()
- {
-
- Uart1Init();
- EA=1;//開啟總中斷
-
- while(1)
- {
- char send[2]={'O','k'};
- char dht11_data[4]=0;
- start();
-
- send_string(send);
-
- readall(dht11_data);
- sprintf(s,"%d",dht11_data);
- send_string(s);
- Delay2000ms();
- }
- }
復制代碼 dht11時序圖
20191222204323263.png (48.79 KB, 下載次數: 50)
下載附件
dht11時序圖
2022-5-26 13:30 上傳
|