首先说明一下,程序没有调出来,这里分享一下失败的过程和可能的原因。
既然是移植程序,就表明之前程序能够正常运行。移植的源程序之前是用在STM32平台上的,能够读出温湿度数据,但当时用的温湿度传感器DHT11和现在用的不是同一批的。
DHT11是串行单总线数字温湿度传感器,与MCU通信时序如下:
读回的数据为:
一次完整的数据传输为 40bit, 高位先出。
数据格式 :8bit 湿度整数数据 +8bit 湿度小数数据+8bi 温度整数数据 +8bit 温度小数数据+8bit 校验和
数据传送正确时校验和数据等于 “ 8bit 湿度整数数据 +8bit 湿度小数数据+8bi 温度整数数据 +8bit 温度小数数据 ” 所得结果的末 8 位。
读回的温湿度小数数据均默认为0(在8051上验证的)。
移植过程很简单,改写IO口操作函数就可以,调试过程就比较纠结。R7F0C809读回的数据第2、4byte为0,但前四byte之和不等于第5byte,不满足校验和关系。开始以为DHT11有问题,于是拿了块stm32的板子又试了一下,读回的数据同样出错;又用8051单片机试了一下(程序为现用DHT11出厂测试程序),能正确读回数据,读回的数据第2、4byte为0,温湿度整数数据无误。
初步推测有2方面原因:
1.2批DHT11读取数据略有差异,需要移植现用DHT11出厂测试程序
2.DHT11程序中需要用到us级延时函数,且时序中对us延时的精度要求较高。但R7F0C809中实现的定时器中断延时函数delay_us()误差较大,可达2倍(详见:
https://bbs.eeworld.com.cn/thread-477149-1-1.html),使得程序无法按照正确时序读回数据。这一点由于手上没有示波器,无法进一步验证。
贴一份程序,有兴趣可帮忙看下。