当前位置:文档之家› DS18B20温度传感器详解带c程序

DS18B20温度传感器详解带c程序


C.写暂存器
[4EH] 将数据写入暂存器的 TH、TL 字节
D.复制暂存器
[48H] 把暂存器的 TH、TL 字节写到 E2RAM 中
E.重新调 E2RAM [B8H] 把 E2RAM 中的 TH、TL 字节写到暂存器 TH、TL 字节 F.读电源供电方式 [B4H] 启动 DS18B20 发送电源供电方式的信号给主 CPU
DQ=0; DQ=dat&0x01; delay(4);//DS18B20 采样单片机写给 DQ 线上的数据(45us)*************** DQ=1; dat>>=1; } delay(4); } /******************读一个字节函数****************/ uchar read_byte() { uchar vaul,i; DQ=1; //先拉高电平,为读作准备 for(i=0;i<8;i++) { DQ=0; vaul>>=1; DQ=1; if(DQ) vaul|=0x80; delay(4); } return vaul; } /******************读取温度值函数****************/ int read_temper() { uchar templ,temph, flag; int temp; reset_ds18b20();//复位操作 write_byte(0xcc);//跳过 ROM write_byte(0x44);//温度转换 delay(300);//***************************
0xed,0xfd,0x87,0xff,0xef};//所以各位后要显示小数点,所以需要重新编码(0—9) uchar code numfh[]={0x40,0x00}; //温度 + — 符号位 /******************1ms 延时函数****************/ void delay0(uint z) {
运行流程 4.1 多个读取步骤
4.2 单个读取步骤 4.3 读取到的字节
时序介绍
5.1 初始化
Vpu 单总线
GND
主控器发送脉冲 至少480us
DS18B20 等待15~60us
主控器接收
DS18B20发送 至少480us
存在脉冲 60~240us
5.2 写时间隙
5.3 读时间隙
6.开发板原理图
uchar i,zf,bai,shi,ge,fen; if(num<0) {
zf=0;//温度 — 符号位 num=num*(-1); } else zf=1;//温度 + 符号位 bai=num/1000; shi=num%1000/100; ge=num%100/10; fen=num%10; for(i=0;i<6;i++) { wei=1; P1=numw[i]; wei=0; P1=0x00;//消影
break; case 2: if(zf==0&&shi!=0)
//因为存在脉冲检测结束后自动拉高*/ //return stat; } /******************写一个字节函数****************/ void write_byte(uchar dat) { uchar i; DQ=1; //先拉高电平,为写作准备 for(i=0;i<8;i++) {
00A2H
+0.5
0000 0000 0000 1000
0008H
0
0000 0000 0000 0000
0000H
-0.5
1111 1111 1111 1000
FFF8H
-10.125
1111 1111 01111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
uchar x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--); } /******************15us 延时函数****************/ void delay(uint z) {
while(z--); } /******************初始化 DS18B20 函数****************/ void reset_ds18b20() {
reset_ds18b20();//复位操作 write_byte(0xcc);//跳过 ROM write_byte(0xbe);//读内部 RAM 内容 templ=read_byte(); temph=read_byte(); flag=(temph&0x80)>>7;//判断高字节符号位是 1 还是 0(1 为负温度,0 为正温度) if(flag==0) //temp=(temph<<=4)+((templ&=0xf0)>>4); temp=(templ+temph*256)*0.625;//将精度 0.0625 扩大 10 倍,因为 temp 为整形,小数部分读不到
路 图 路 电 电 振 理 源 晶 电 路 原 电 器 板 电 继 路 发 电 收 开 接 外 红 作 小 块 模 祥 信 通 必 口 路 串 电 器 全 鸣 蜂 路 电 位 复 块 模 机 电 块 进 模 步 盘 键 阵 ) 矩 流 端 限 地 接 加 接 处 ( 节接 源 处 此 极极 调处 接 电 此 据 正负 度此 处 为 ) 数 灯灯 比) 此 脚 接 光光 对 引 背背 为(( 路 块 电 模 块 灯 管 模 码 晶 数 液
跳过 ROM//用于总线只有一个 1820 搜索 ROM//用于一次读取多个 1820 的 64 位编码 报警搜索 ROM//从多个 1820 中搜索哪个在报警
(3)DS18B20 功能指令(暂存器指令集)
A.温度转换
[44H] 启动 DS18B20 进行温度转换
B.读暂存器
[BEH] 读暂存器 9 个字节内容
1.2 外形与接线
引脚图
接线图
DS18B20 引脚定义: DQ 为数字信号输入/输出端; GND 为电源地; VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。
内部结构与介绍 2.1 内部结构
存储器和控制器
64位
温度灵敏元件
ROM



单线

接口

高速 缓存 存储器
低温触发器TL 高温触发器TH
else if(zf==0&&shi==0) P1=numdg[ge]; else if(zf!=0&&bai!=0) P1=numd[shi]; else if(zf!=0&&bai==0&&shi!=0) P1=numdg[ge]; else
if(zf!=0&&bai==0&&shi==0) P1=numd[fen];
duan=1; switch(i) {
case 0: if(zf==0) P1=numfh[zf];
else if(bai!=0) P1=numd[bai]; else if(shi!=0) P1=numd[shi]; else P1=numdg[ge]; break;
case 1: if(zf==0&&shi!=0) P1=numd[shi];
配置寄存器
8位CRC生成器
内部结构图
2. 2 DS18B20 内部存储器及温度数据格式
对于 DS18B20 内部存储器结构(见下图),它包括一个暂存 RAM 和一个非易失性电可擦除 EERAM,后者存
放报警上下限 TH、TL。当改变 TH、T L 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
uchar stat=0; DQ=1; delay(8); DQ=0; delay(80); //600us/12mhz DQ=1; delay(8); stat=DQ; //高电平为存在,低电平为不存在(stat 应该为 0) delay(4); // while(!DQ);/*等待 DQ 变为高电平
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
表 3.2 DS18B20 温度/数字对应关系表
温度(℃)
输出的二进制码
对应的十六进制码
+125
0000 0111 1101 0000
07D0H
+85
0000 0101 0101 0000
0550H
+25.0625
0000 0001 1001 0001
0191H
+10.125
0000 0000 1010 0010
出其中内容进行验证。如果正确,当主机发送复制暂存器命令,暂存器的第二、三字节将被复制到 TH、TL
中,这样处理有利于确保该数据在单总线上传输的完整性[7]。
(暂存 RAM)
EERAM 结构(电可擦写 RAM)
暂存存储器作用是在单线通信时确保数据的完整性,它由 8 字节组成,头两个字节表示测得的温度读数。
需要取反加 1,再乘于 0.0625 才能得到实际温度[8]。
表 3.1 温度的存储形式
高8位 S
S
S
S
S
26
25
24
低8位
相关主题