4.1单总线通信软件设计
4.1.1温湿度模块软件设计
单总线是美国DALLAS公司推出的外围串行扩展总线技术。与SPI、I²C串行数据通信方式不同,它采用单根信号线传输。这种传输方式信号线上既传输时钟又传输数据,而且数据传输是双向的,具有节省I/O口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。
单总线通信是主从结构,也就是只有主机呼叫从机从机才能应答,所以主机访问模块时必须按照严格的访问时序,不然模块不予回应,不同的模块单总线通信的时序会有不同,本系统使用的单总线模块为DHT11,所以就以DHT11模块为例介绍。
步骤一:初始化,主机去唤醒DHT11模块。具体操作为单片机的I/O设置为输出,设置单片机的I/O设置为输出步骤如图4.1所示。同时输出低电平,且低电平保持时间不能小于18ms,如图4.2所示。然后单片机的I/O设置为输入状态,等待DHT11模块回应。
图4.1 设置单片机的I/O为输出
图4.2 唤醒DHT11模块
步骤二:DHT11模块回应。DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出 80微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据,STM32F103C8T6对应代码如图4.3所示。
图4.3 等待DHT11回应
步骤三:单片机接收DHT11模块发回来的信息。单片机的 I/O 此时处于输入状态,检测到 I/O 有低电平(DHT11回应信号)后,等待80微秒的高电平后进行数据接收。同时位数据“0”的格式为50 微秒的低电平和 26-28 微秒的高电平。位数据“1”的格式为50 微秒的低电平加70微秒的高电平。这里STM32F103C8T6对应代码的代码分三个层次,第一层为判断每一位数据是1还是0的读一位的函数,如图4.4(a)所示。第二层为在第一层的基础上的读一个字节的函数,如图4.4(b)所示。最后一层为接收5个字节即40位数据,并且计算出温湿度数据,如图4.5所示。
图4.4(a) 从DHT11读取一个位的函数
图4.4(b) 从DHT11读取一个字节的函数
图4.5 从DHT11读取一次数据的函数
步骤四:单片机处理数据。DHT11模块会返回40bit的数据,其中分别为8bit湿度整数数据,8bit湿度小数数据,8bi温度整数数据,8bit温度小数数据,8bit校验和。如果8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据之和等于8bit校验和就说明数据传输正确。