原理
在写代码前还是要仔细学习以下要使用的传感器的工作原理的,这样可以利于在调试过程中快速解决问题。
1.网上找来的DHT11读取数据的通信时序图
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必
须大于18毫秒,保证DHT11能检测到起始信号。
DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.
主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高
总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉
高80us,
准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1.格式见下面图示.如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
2.数据0,1表示方法:
0:
1:
————————————————
上述转载自:博主「不想成为大佬的IC小菜鸟」的原创文章
原文链接:https://blog.csdn.net/weixin_46628093/article/details/115055623
代码
1.顶层文件
module top(
input clk,
input rst,
inout in_out,
output [3:0] dig,
output [7:0] dict
);
/*===================================================
触发和数据读取
===================================================*/
wire [31:0]information;
dht11_drive dht
(
.sys_clk (clk ),//input clk,
.rst_n (rst ),//input btn_in,
.dht11 (in_out ),//inout in_out,
.data_valid (information) //output reg [31:0]information
);
/*===================================================
数据形式转换
===================================================*/
wire [3:0]humidity_one;//湿度
wire [3:0]humidity_ten;
wire [3:0]humidity_decimal;
wire [3:0]temp_one;//温度
wire [3:0]temp_ten;
wire [3:0]temp_decimal;
//assign information = 32'h3300_3300;
change change
(
.clk (clk ),//input clk,
.information (information ),//读取的40位数据中的高32位//input [31:0] information,//读取的40位数据中的高32位
.humidity_one (humidity_one ),//output reg [3:0]humidity_one=0,//湿度
.humidity_ten (humidity_ten ),//output reg [3:0]humidity_ten=0,
.humidity_decimal(humidity_decimal),//output reg [3:0]humidity_decimal,
.temp_one (temp_one ), //output reg [3:0]temp_one=0,//温度
.temp_ten (temp_ten )<