硬件信息
所用开发板为zybo z720
ds18b20测温元件介绍
报警装置由蜂鸣器构成,选用最简单的蜂鸣器,输入高电平蜂鸣器报警,低电平无响应
硬件连接
ds18b20温控模块连接图
蜂鸣器连接图
模块详解
温度传感器模块
clk为系统时钟输入引脚,输入为125mhz时钟,模块内部写有分频器;
rst引脚为复位引脚;
one_wire为数据总线,从温度传感器接收温度数据,
Led和buzzer为自己定义的管脚,如果温度高于某个值,则点亮led并且启动buzzer(蜂鸣器)。
Temp_control为自己添加的使能开关,开关闭合时,温度传感器不工作,可删去。
蜂鸣器模块
蜂鸣器模块,接收一个寄存器的值,如果为高电平,则输出1个高电平,使蜂鸣器发出警报声。
代码实现
蜂鸣器模块
module DS18B20(
input clk, // 50MHz时钟
// input rst_n, // 异步复位
inout one_wire, // One-Wire总线
output [15:0] temperature // 输出温度值
);
reg rst_n;
reg [19:0]count;
always@(posedge clk)
begin
if(count<20'h80000)
begin
rst_n<=1;
count<=count+1;
end
else if(count<20'h8ffff)
begin
rst_n<=0;
count<=count+1;
end
else
rst_n<=1;
end
//++++++++++++++++++++++++++++++++++++++
// 分频器125MHz->1MHz 开始
//++++++++++++++++++++++++++++++++++++++
reg [7:0] cnt; // 计数器
always @ (posedge clk, negedge rst_n)
if (!rst_n)
cnt <= 0;
else
if (cnt == 125)
cnt <= 0;
else
cnt <= cnt + 1'b1;
reg clk_1us; // 1MHz 时钟
always @ (posedge clk, negedge rst_n)
if (!rst_n)
clk_1us <= 0;
else
if (cnt <= 62) // 24 = 50/2 - 1
clk_1us <= 0;
else
clk_1us <= 1;
//--------------------------------------
// 分频器50MHz->1MHz 结束
//--------------------------------------
//延时模块的使用
//++++++++++++++++++++++++++++++++++++++
// 延时模块 开始
//++++++++++++++++++++++++++++++++++++++
reg [19:0] cnt_1us; // 1us延时计数器
reg cnt_1us_clear; // 请1us延时计数器
always @ (posedge clk_1us)
if (cnt_1us_clear)
cnt_1us <= 0;
else
cnt_1us <= cnt_1us + 1'b1;
//--------------------------------------
// 延时模块 结束
//--------------------------------------
//++++++++++++++++++++++++++++++++++++++
// DS18B20状态机 开始
//++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++
// 格雷码
parameter S00 = 5'h00;
parameter S0 = 5'h01;
parameter S1 = 5'h03;
parameter S2 = 5'h02;
parameter S3 = 5'h06;
parameter S4 = 5'h07;
parameter S5 = 5'h05;
parameter S6 = 5'h04;
parameter S7 = 5'h0C;
parameter WRITE0 = 5'h0D;
parameter WRITE1 = 5'h0F;
parameter WRITE00 = 5'h0E;
parameter WRITE01 = 5'h0A;
parameter READ0 = 5'h0B;
parameter READ1 = 5'h09;
parameter READ2 = 5'h08;
parameter READ3 = 5'h18;
reg [4:0] state; // 状态寄存器
//-------------------------------------
reg one_wire_buf; // One-Wire总线 缓存寄存器
reg [15:0] temperature_buf; // 采集到的温度值缓存器(未处理)
reg [5:0] step; // 子状态寄存器 0~50
reg [3:0] bit_valid; // 有效位
always @(posedge clk_1us, negedge rst_n)
begin
if (!rst_n)
begin
one_wire_buf <= 1'bZ;
step <= 0;
state <= S00;
end
else
begin
case (state)
S00 : begin
temperature_buf <= 16'h001F;
state <= S0;
end
S0 : begin // 初始化
cnt_1us_clear <= 1;
one_wire_buf <= 0;
state <= S1;
end
S1 : begin
cnt_1us_clear <= 0;
if (cnt_1us == 500) // 延时500us
begin
cnt_1us_clear <= 1;
one_wire_buf