项目智能测温系统的实现
智能测温系统
电子温度计任务演示
任务分析
电子温度计程序包括温度的采集、温度数据的处理以及温度值在数码管的显示等
DS18B20的引脚功能
测温范围为-55℃~125℃,输出12位数字温度值
1-GND,地
3-Vdd,外供电时为电源接入端,总线供电时接地2-DQ,数据输入/输出。数据传输端,“单总线”
DS18B20的内部结构
存储器
64位ROM
64bit的ROM编码是器件的身份标识
非易失性存储器E2PROM
非易失性存储器E2PROM共3字节,包括高温触发器TH、低温触发器TL和配置寄存器
配置寄存器
R1R0
分辨率
转换时间
00
9
93ms
01
10
187ms
10
11
375ms
11
12
750ms
TM是测试位,用户不改动
R1R0设置分辨率
高速RAM
序号
高速存储器RAM
0
温度值低位
1
温度值高位
2
高温报警寄存器
3
低温报警寄存器
4
配置寄存器
5
保留
6
保留
7
保留
8
CRC校验字节
输出温度值时先低8位,再高8位
温度值存放格式
S为符号位,正温度S=0,负温度S=1
温度值以补码形式存放,当测得的温度是负数时,应作补码到原码的转换
20~26为7位整数部分
2-1~2-4为4位小数部分
复位时序和流程
复位操作首先在t0时刻发出最短为480μs的低电平,在t1时刻释放总线进入接收状态,DS18B20检测到总线变高后,等15~60μs,在t2时刻发出低电平信号表示响应
复位函数
bitreset(void) //复位DS18B20
{
biterr;
DQ=0; //在数据线上产生600us的低电平
delay1us(600);
DQ=1; //数据线拉高
delay1us(60); //延时60us
err=DQ; //读取数据线状态,err=0:复位成功
delay1us(540); //err=1:复位失败
return(err);
}
写时序和流程
总线拉至低电平的t0时刻开始的15μs之内将要写的数据位送到总线上,在t0后的15~60μs内若为低电平写入的是0;若为高电平写入的为1。连续写2位之间的间隙应大于1μs
写函数
DQ=0; //产生15us的低电平
delay1us(15);
DQ=dat0; //将需要写的数据0或1送DQ线
delay1us(15);//延时15us
DQ=1;//数据线拉高,为写入下一位做准备
写一个字节函数
voidwrbyte(uchard)
{uchari;
dat=d;
for(i=8;i0;i--)//循环写8位(先低位,后高位)
{
DQ=0; delay1us(15);
DQ=dat0; dat=dat1;//将下一位要写入的数据移到最低位
delay1us(15); //延时15us
DQ=1;//数据线拉高,为写入下一位做准备
}
}
读时序和流程
单片机在t0时刻将总线从高拉至低电平,几个μs后的t1时刻释放总线。DS18B20通过保持总线为高表示发送“1”,将总线拉低表示发送“0”,并在t2时刻释放总线。单片机必须在t2之前读取总线状态。读时序至少需要60μs,且两次读时序之间至少需要1μs的恢复时间
读函数
DQ=0;//产生负脉冲
delay1us(3);
DQ=1; //数据总线拉高
delay1us(3);//延时3us
dat7=DQ; //读取数据
delay1us(60);//延时,为读下一位做准备
读一个字节函数
ucharrdbyte(void) //从DS18B20读取一个字节
{
uchari;
dat=0; //读出数据初值为0
for(i=8;i0;i--) //循环读8位(先低位,后高位)
{dat=dat1; //读出数据先右移一位
DQ=0;delay1us(3);
DQ=1; delay1us(3);//延时3us
dat7=DQ; //读取数据
delay1us(60);}
return(dat);
}
DS18B20的基本操作指令
名称
代码
功能
跳过ROM
0XCC
单片机可用这一命令同时访问总线上的所有设备而不需送出ROM序列号信息
读ROM
0X33
单片机发该命令,要求从ROM读出8个字节序列号
匹配ROM
0X55
执行该命令后,单片机必须接着向D