问题描述:
最近在做某个小项目时,需要使用DHT11温湿度传感器。传感器使用单总线传输协议需要遵守一定的时序才能正常使用,但是最后却遇到了一个很奇怪的问题——无论怎么调试,结果都DHT11传输回来的信号都只有高电平,根本没有低电平。
问题原因:
在排除了硬件芯片烧毁、电路连接错误的问题之后,发现主要原因由两个:
一.时序错误
DHT11使用手册上写着“当总线空闲的时候,总线总是高电平。”以及“开启时序错误,传感器将不会响应”。既然传感器的总线无论怎样都只有高电平没有低电平,会不会是传感器的开启信号根本就是错的?
经过调试,答案的确是“是"。程序的时序有问题,问题的关键在这两个个delay_us()和delay_ms()上。
我原本使用的的两个delay函数是从当初初学时使用的正点原子的代码那边直接copy过来的。查看这两个函数可以发现,都是调用了系统的Ticky时钟来进行计时延迟的。那是使用的stm32芯片型号是STM32F103ZE,然而此刻我所使用的芯片型号是STM32F103C8,型号不同导致系统时钟不同,导致了同样的一个delay_ms(),延迟的时间不一样!!
使用kile5的debug查看延迟1s实际上使用了多少时间。可以看到实际上运行了7.2s!!由此可以得出结论——整个工程的时间延迟都是错的,直接导致启动信号不对,而启动信号的时序都已经错了,难怪之后传感器根本没有响应。