|

楼主 |
发表于 2020-5-1 13:06:34
|
显示全部楼层
可能真的是万份之一的机会碰到了,因为同一个程序,在另一块板子上是正确显示,所以程序应该是没有问题的。这块板子的GPIO口测试也是正常的,就不知为什么程序写进去后运行就会出现数据错误,因为单单运行DHT22的温湿度程序,也不能出现确的数据。
程序,这个只是用于验证,没有做超时检测跟负温度时的调整,也没有做小数部份处理,全部显示整数。
#define PIN PA0
uint8_t data[5];
uint16_t shidu,tem;
void Star(void) //启动DHT22
{
pinMode(PIN,OUTPUT);
digitalWrite(PIN,LOW);
delay(2);
digitalWrite(PIN,HIGH);
delayMicroseconds(20);
digitalWrite(PIN,LOW);
pinMode(PIN,INPUT);
while(!digitalRead(PIN));
while(digitalRead(PIN));
}
uint8_t readbit(void) // 读1BIT 的数据
{
uint8_t shi=0;
uint8_t ci,temp;
for(ci=0;ci<8;ci++)
{
while(!digitalRead(PIN));
delayMicroseconds(40);
shi=shi<<1;
if(digitalRead(PIN)==1)
{
shi=shi|1;
while(digitalRead(PIN));
}
}
return shi;
}
void readdata(void)
{
uint8_t a;
for(a=0;a<5;a++)
{
data[a]=readbit();
}
shidu=((data[0]<<8)+data[1]);
tem=((data[2]<<8)+data[3]);
}
void setup()
{
Serial.begin(9600);
delay(2000); //上电先延时2秒,等DHT22完成初始化
}
void loop()
{
Star();
readdata();
Serial.print("温度:");
Serial.print(tem);
Serial.print(" 相对湿度:");
Serial.print(shidu);
Serial.println("%");
delay(2000);
} |
|