1. 概述
本规划根据CPLD规划一款数字温度计,温度传感器运用DS18B20,CPLD选用EPM240T100C5。DS18B20 具有体积小,硬件开支低(只需求一根信号线),抗干扰能力强等长处。EPM240T00C5具有延时低、功耗小、稳定性高级长处。
2. 硬件简介
硬件渠道选用BigTree的CPLD开发板,有如下硬件资源:
CPLD EPM240T100C5;
USB 转串口(省去 USB 转串口线);
LED;
有源蜂鸣器;
DS18B20 温度传感器;
四位共阳极数码管;
按键;
GPIO 拓宽接口(18 个通用 IO)。
有需求的朋友能够在 shop397545458.taobao.com购买。
3. 体系框图

温度收集模块:担任初始化、读写DS18B20温度传感器;
十六进制转十进制模块:将DS18B20的温度输出数据转化成十进制数据;
数码管显现模块:将转化好的十进制数据动态显现在数码管上。
4. DS18B20 作业原理
DS18B20 引脚功用
GND: 地信号
DQ: 数据信号线
VDD: 电源
存储资源
ROM: 只读存储器,用于寄存 DS18B20 编码,总共 64 位,第一个 8 位是 1-wire 宗族号(28h),第二个 48 位是仅有的序列号。最终一个 8 位是前 56 位的 CRC 校验码。
RAM: 数据暂存器,共 9 个字节,第 1、 2 字节是温度转后的数据值。
EEPROM: 用于寄存长时刻需求坚持的数据,如上下限温度报警值等。
设备操作
1.初始化
-> 数据线拉高 1;
-> 短延时;
-> 数据线拉底 0;
-> 延时 750ms;
-> 数据线拉高 1;
-> 延时等候(假如初始化成功则在 15~60 毫秒内发生一个由 DS18B20 回来的低电平);
->若读到数据线上的低电平,再做延时(第五步算起,最少 480ms);
-> 数据线拉高,完毕。
2.发送 ROM 指令
ROM 指令共 5 条,每一个作业周期只能发一条,分别为:读 ROM、匹配 ROM、跳动ROM、查找 ROM 和报警查找。一般只要单个 18B20 芯片,可运用越过 ROM 指令[CCH]。
3.发送存储器操作指令
在 ROM 指令后,紧接着发送存储器操作指令,分别为:
? 温度转化 44H:
发动 DS18B20 进行温度转化,将温度值放入 RAM 的第 1、 2 个地址。
? 读暂存器 BEH
从 RAM 中读数据,读地址从 0 开端到 9,可只读前两个字节。
? 写暂存器 4EH
将数据写入暂存器的 TH、 TL 字节。
? 仿制暂存器 48H
把暂存器的 TH、 TL 字节写到 E2RAM 中。
? 从头调 E2RAM B8H
把 E2RAM 中的 TH、 TL 字节写到暂存器 TH、 TL 字节 。
? 读电源供电方法 B4H
发动 DS18B20 发送电源供电方法的信号给主控。
4.读当时温度数据
需求履行两次作业周期,第一个周期为复位,越过 ROM 指令,履行温度转化存储器指令等候 500us 温度转化时刻。紧接着履行第二个周期为复位,越过 ROM 指令,履行读 RAM 的存
储器,读数据。
5.写操作

写时隙分为写“0”和写“1”, 时序如图,在写数据时刻空隙的前 15us 总线需求是被主控拉低,然后则将是芯片对总线数据的采样时刻,采样时刻在 15-60us,采样时刻内,假如主控将 总线拉高则表明写 1,假如主控将总线拉低则表明写 0。每一位的发送都应该有一个至少15us 的低电平开端位随后的数据 0 或 1 应该在 45us 内完结。整个位的发送时刻应该坚持 在60-120us,不然不能确保通讯的正常。
6.读操作

读时隙时也是有必要先由主控发生至少 1us 的低电平,表明读时刻的开端。随后在总线被开释后的 15us 中 DS18B20 会发送内部数据位。留意有必要要在读空隙开端的 15us 内读数据为才 能够坚持通讯的正确。通讯时,字节的读或写是从高位开端的,即 A7 到 A0。控制器开释总线,也相当于将总线置 1。
更多关于DS18B20的材料能够检查其使用手册。
5. 进制转化(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];