当前位置:首页 > 基于FPGA的温度监控系统 - 图文
山东科技大学学士学位论文 附录
附录
附录A系统总体电路图
附录B 系统总程序
DS18B20驱动: module ds18b20( input clk, //50M input rst, //复位 output [7:0] seg, //数码管 output [1:0] en, //数码管使能 inout dq //ds18b20 数据线 );
37
山东科技大学学士学位论文 附录
wire clk_1k; //数码管扫描时钟 wire clk_1m; //1us 时钟,用于控制传感器读写时序 reg[15:0] temp; //16位温度数据 wire[15:0] disp_dat; reg[8:0] state; reg[19:0] cnt; reg[2:0] cnt_bit; reg[7:0] data_w; //写到传感器的数据 reg[7:0] data_r; //从传感器读入的数据 reg link; reg dq_out; wire dq_in; wire[11:0] bcd;
assign dq = (link)? dq_out : 1'bz; assign dq_in = dq;
parameter RESET1 = 9'b0_0000_0001, // 复位1 RESET2 = 9'b0_0000_0010, // 复位2
WRITE_CC1 = 9'b0_0000_0100, // 第一次写入跳过rom命令 WRITE_44 = 9'b0_0000_1000, // 写入温度转换命令WRITE_CC2 = 9'b0_0001_0000, // 第二次写入跳过rom命令 WRITE_BE = 9'b0_0010_0000, // 写入读命令 READ1 = 9'b0_0100_0000, // 读入第一个字节 READ2 = 9'b0_1000_0000, // 读入第二个字节 WAIT_800MS = 9'b1_0000_0000; // 等待800ms
clk_gen uu0( .rst(rst), .clk(clk), //产生1k 和 1m时钟 .clk_1k(clk_1k), .clk_1m(clk_1m) );
bin2bcd uu1( .data(disp_dat), //二进制转bcd码,从传感器读入的数据是二进制的,转换为bcd后才能显示 .bcd_out(bcd)
38
山东科技大学学士学位论文 附录
); disp uu2( .rst(rst), //数码管显示 .clk(clk_1k), .data(bcd), .seg(seg), .en(en) );
assign disp_dat =(temp[15])? (~temp+1) : temp; 度为负,取反加1
always @(posedge clk_1m or negedge rst) begin if(~rst) begin cnt <= 0; state <= RESET1; end else case(state) RESET1: begin cnt <= cnt + 1; if(cnt < 'd500) begin link <= 1; dq_out <= 0; end else if(cnt < 'd1000) begin link <= 0; end else begin cnt <= 0; state <= WRITE_CC1; data_w <= 8'hcc;
39
//若最高位为1,则温 //第一次复位 山东科技大学学士学位论文 附录
cnt_bit <= 0; end end
WRITE_CC1: begin //写入跳过rom命令 cnt <= cnt + 1; if(cnt < 'd5) begin link <= 1; dq_out <= 0; end else if(cnt < 'd60) begin dq_out <= data_w[cnt_bit]; end else if(cnt < 'd65) begin link <= 0; end else begin cnt <= 0; cnt_bit <= cnt_bit + 1; if(cnt_bit == 'd7) begin state <= WRITE_44; cnt_bit <= 0; data_w <= 8'h44; end end end
WRITE_44: begin cnt <= cnt + 1; if(cnt < 'd5) begin link <= 1; dq_out <= 0; end else if(cnt < 'd60)
begin
40
//写入温度转换命令
共分享92篇相关文档