基于DS18B20的温度值的十进制转换

2020-02-02 11:30发布

本帖最后由 BigTree2017 于 2017-10-9 13:48 编辑

1. 概述本设计基于CPLD设计一款数字温度计,温度传感器使用DS18B20,CPLD采用EPM240T100C5。DS18B20 具有体积小,硬件开销低(只需要一根信号线),抗干扰能力强等优点。EPM240T00C5具有延时低、功耗小、稳定性高等优点。2. 硬件简介硬件平台采用额ETree的CPLD开发板,有如下硬件资源:
  • CPLD EPM240T100C5;
  • USB 转串口(省去 USB 转串口线);
  • LED;
  • 有源蜂鸣器;
  • DS18B20 温度传感器;
  • 四位共阳极数码管;
  • 按键;
  • GPIO 拓展接口(18 个通用 IO)。
    有需要的朋友可以在   shop397545458.taobao.com    购买。
3. 进制转换(Hex2Dec)由于 DS18B20 输出的是十六进制数据, 所以需要做进制转换为 10 进制输出。这里由于CPLD 资源问题,故只设计温度显示范围为: 0~47 度,最小分辨率为 1 度。wire [7:0] data_in;
assign data_in = {1'b0,temperature_buf[10:4]};

reg [7:0] buf0;
reg [7:0] buf1;
reg [7:0] buf2;
reg [7:0] data_out;

always @(*)
        case(data_in[7:4])
        0:
        begin
                buf0[3:0] = (data_in[3:0]>=10)?(data_in[3:0]-10):data_in[3:0];
                buf0[7:4] = (data_in[3:0]>=10)?(data_in[7:4]+1):data_in[7:4];
                data_out  = buf0;
        end
        1:
        begin
                buf0[3:0] = (data_in[3:0]>=10)?(data_in[3:0]-10 + 6):(data_in[3:0]+6);
                buf0[7:4] = (data_in[3:0]>=10)?(data_in[7:4]+1):data_in[7:4];
                buf1[3:0] = (buf0[3:0]>=10)?(buf0[3:0]-10):buf0[3:0];
                buf1[7:4] = (buf0[3:0]>=10)?(buf0[7:4]+1):buf0[7:4];
                data_out  = buf1;
        end
        2:
        begin
                buf0[3:0] = (data_in[3:0]>=10)?(data_in[3:0]-10 + 6):(data_in[3:0]+6);
                buf0[7:4] = (data_in[3:0]>=10)?(data_in[7:4]+1):data_in[7:4];
                buf1[3:0] = (buf0[3:0]>=10)?(buf0[3:0]-10 + 6):(buf0[3:0]+6);
                buf1[7:4] = (buf0[3:0]>=10)?(buf0[7:4]+1):buf0[7:4];
                buf2[3:0] = (buf1[3:0]>=10)?(buf1[3:0]-10):(buf1[3:0]);
                buf2[7:4] = (buf1[3:0]>=10)?(buf1[7:4]+1):buf1[7:4];        
                data_out  = buf2;
        end
        default:
        begin
                data_out  = data_in;
        end
        endcase

assign temperature = data_out[7:0];


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。