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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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 0110 1110
FF5EH
-25.0625
1111 1110 0110 1111
FF6FH
-55 执行序列与介绍 3.1 执行序列
跳过 ROM//用于总线只有一个 1820 搜索 ROM//用于一次读取多个 1820 的 64 位编码 报警搜索 ROM//从多个 1820 中搜索哪个在报警
(3)DS18B20 功能指令(暂存器指令集)
A.温度转换
[44H] 启动 DS18B20 进行温度转换
B.读暂存器
[BEH] 读暂存器 9 个字节内容
0x20,0x40,0x80,0x00}; uchar code numd[]={0x3f,0x06,0x5b,0x4f,0x66,//数码管段选显示(0—9)
0x6d,0x7d,0x07,0x7f,0x6f}; uchar code numdg[]={0xbf,0x86,0xdb,0xcf,0xe6,//数码管“个”位段选显示因为保留一位小数,
1111 1100 1001 0000
FC90H
(1)初始化
(2)ROM 指令集
A.READ_ROM [33H]
B.MATCH_ROM [55H]
C.SKIP_ROM
[CCH]
D.SEARCH_ROM [F0H]
E.ALARM_SEARCH [ECH]
读 ROM //可读出 64 位编码 匹配 ROM//以此指令对某一个 1820 操作
0xed,0xfd,0x87,0xff,0xef};//所以各位后要显示小数点,所以需要重新编码(0—9) uchar code numfh[]={0x40,0x00}; //温度 + — 符号位 /******************1ms 延时函数****************/ void delay0(uint z) {
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];
表 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
//此项目需要保留一位小数,所以 x10,小数点后移一位 //所以可得要保留几位小数点就扩大 10 的几次方 else temp=(~((templ+temph*256)-1))*(-0.625); return temp;
} /******************显示函数****************/ void display(int num) {
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() {
C.写暂存器
[4EH] 将数据写入暂存器的 TH、TL 字节
D.复制暂存器
[48H] 把暂存器的 TH、TL 字节写到 E2RAM 中
E.重新调 E2RAM [B8H] 把 E2RAM 中的 TH、TL 字节写到暂存器 TH、TL 字节 F.读电源供电方式 [B4H] 启动 DS18B20 发送电源供电方式的信号给主 CPU
DS18B20 温度传感器(详细案列+程序)
硬件介绍 1.1 主要特征 (1) 独特的单线接口方式,只需一个接口引脚即可通信; (2) 每一个 DS18B20 都有一个唯一的 64 位 ROM 序列码; (3) 在使用中不需要任何外围元件; (4) 可用数据线供电,电压范围:+3.0V-+5.5 V; (5) 测温范围:-55℃ -+125℃,在-10℃-+85℃范围内精度为+0.5℃,分辨率为 0.0625℃; (6) 通过编程可实现 9-12 位的数字读数方式。温度转换成 12 位数字信号所需时间最长为 750ms,而在 9 位 分辩模式工作时仅需 93.75ms; (7) 用户可自设定非易失性的报警上下限值; (8) 告警搜索命令可识别和定位那些超过报警限值的 DS18B20; (9) 多个 DS18B20 可以并联在惟一的三线上,实现多点测温; (10)电源极性接反时,DS18B20 不会因发热而烧毁,但不能正常工作;
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 变为高电平
break; case 2: if(zf==0&&shi!=0)
1.2 外形与接线
引脚图
接线图
DS18B20 引脚定义: DQ 为数字信号输入/输出端; GND 为电源地; VDD 为外接供电电源输入端(在寄生电源接线方式时接地)。
内部结构与介绍 2.1 内部结构
存储器和控制器
64位
温度灵敏元件
ROM



单线

接口

高速 缓存 存储器
低温触发器TL 高温触发器TH
//因为存在脉冲检测结束后自动拉高*/ //return stat; } /******************写一个字节函数****************/ void write_byte(uchar dat) { uchar i; DQ=1; //先拉高电平,为写作准备 for(i=0;i<8;i++) {
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);//***************************
以 12 位转化为例说明温度高低字节存放形式(温度的存储形式如表 3.1)及计算:12 位转化后得到的 12
位数据,存储在 18B20 的两个高低 8 位的 RAM 中,二进制中的前面 5 位是符号位。如果测得的温度大于 0,
这 5 位为 0,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 位为 1,测到的数值
出其中内容进行验证。如果正确,当主机发送复制暂存器命令,暂存器的第二、三字节将被复制到 TH、TL
中,这样处理有利于确保该数据在单总线上传输的完整性[7]。
(暂存 RAM)
EERAM 结构(电可擦写 RAM)
暂存存储器作用是在单线通信时确保数据的完整性,它由 8 字节组成,头两个字节表示测得的温度读数。
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 为整形,小数部分读不到
需要取反加 1,再乘于 0.0625 才能得到实际温度[8]。
表 3.1 温度的存储形式
高8位 S
S
S
S
S
26
25
24
低8位
23
22
21
20
2-1
2-2
2-3
2-4
S=1 时表示温度为负,S=0 时表示温度为正,其余低位以二进制补码形式表示,最低位为 1 时表示 0.0625℃ 。
温度/数字对应关系如表 3.2 所示。
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;//消影
运行流程 4.1 多个读取步骤
4.2 单个读取步骤 4.3 读取到的字节
时序介绍
5.1 初始化
Vpu 单总线
GFra Baidu bibliotekD
主控器发送脉冲 至少480us
DS18B20 等待15~60us
主控器接收
DS18B20发送 至少480us
存在脉冲 60~240us
5.2 写时间隙
5.3 读时间隙
6.开发板原理图
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 中的值时,数据首先被写进暂存器的第二、三字节中,主机可再读
7.源程序 #include<reg52.h> //晶振为 11.0592MHz #define uint unsigned int #define uchar unsigned char sbit DQ=P2^5;//接温度传感器 sbit duan=P2^6;//数码管段选 sbit wei=P2^7; //数码管位选 uchar code numw[]={0x01,0x02,0x04,0x08,0x10,//数码管位选
路 图 路 电 电 振 理 源 晶 电 路 原 电 器 板 电 继 路 发 电 收 开 接 外 红 作 小 块 模 祥 信 通 必 口 路 串 电 器 全 鸣 蜂 路 电 位 复 块 模 机 电 块 进 模 步 盘 键 阵 ) 矩 流 端 限 地 接 加 接 处 ( 节接 源 处 此 极极 调处 接 电 此 据 正负 度此 处 为 ) 数 灯灯 比) 此 脚 接 光光 对 引 背背 为(( 路 块 电 模 块 灯 管 模 码 晶 数 液
相关文档
最新文档