当前位置:首页 > 单片机 > 单片机
[导读]最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总

最近都在学习和写单片机的程序, 今天有空又模仿DS18B20温度测量显示实验写了一个与DS18B20基于单总线通信的程序.

DS18B20 数字温度传感器(参考:智能温度传感器DS18B20的原理与应用)是DALLAS 公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点:
(1)、只要求一个I/O 口即可实现通信。
(2)、在DS18B20 中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55 到+125℃之间; 在-10 ~ +85℃范围内误差为±5℃;
(5)、数字温度计的分辨率用户可以从9 位到12 位选择。将12位的温度值转换为数字量所需时间不超过750ms;
(6)、内部有温度上、下限告警设置。

DS18B20引脚分布图

DS18B20 详细引脚功能描述:
1、GND 地信号;
2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5kΩ的上拉电阻.
3、VDD可选择的VDD 引脚。电压范围:3~5.5V; 当工作于寄生电源时,此引脚必须接地。

DS18B20存储器结构图

暂存储器的头两个字节为测得温度信息的低位和高位字节;
第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;
第5字节是配置寄存器的易失性拷贝, 同样在电复位时被刷新;
第9字节是前面8个字节的CRC检验值.

配置寄存器的命令内容如下:

0R1R011111

MSB LSB
R0和R1是温度值分辨率位, 按下表进行配置.默认出厂设置是R1R0 = 11, 即12位.

温度值分辨率配置表

R1R0分辨率最大转换时间(ms)009bit93.75(tconv/8)0110bit183.50(tconv/4)1011bit375(tconv/2)1112bit750 (tconv)

4种分辨率对应的温度分辨率为0.5℃, 0.25℃, 0.125℃, 0.0625℃(即最低一位代表的温度值)

12位分辨率时的两个温度字节的具体格式如下:
低字节:

2^32^22^12^02^-12^-22^-32^-4


高字节:

SSSSS2^62^52^4


其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为:

2^32^22^12^02^-12^-200


, 高字节不变....

一些温度与转换后输出的数字参照如下:

温度数字输出换成16进制+125℃00000111 1101000007D0H+85℃00000101 010100000550H+25.0625℃00000001 100100010191H+10.125℃00000000 1010001000A2H+0.5℃00000000 000010000008H0℃00000000 000000000000H-0.5℃11111111 11111000FFF8H-10.125℃11111111 01011110FFE5H-25.0625℃11111110 01101111FF6FH-55℃11111100 10010000FC90H

由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).

DS18B20 的使用方法:
由于DS18B20 采用的是1-Wire 总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。
DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。
该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte())、写时序(writeByte())。
所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

DS18B20与单片机连接电路图:


利用软件模拟DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序
1. 初始化
单线总线上的所有操作都是从初始化开始的. 过程如下:
1)请求: 主机通过拉低单线480us以上, 产生复位脉冲, 然后释放该线, 进入Rx接收模式. 主机释放总线时, 会产生一个上升沿脉冲.
DQ : 1 -> 0(480us+) -> 1
2)响应: DS18B20检测到该上升沿后,延时15~60us, 通过拉低总线60~240us来产生应答脉冲.
DQ: 1(15~60us) -> 0(60~240us)
3)接收响应: 主机接收到从机的应答脉冲后, 说明有单线器件在线. 至此, 初始化完成.
DQ: 0

2. ROM操作命令
当主机检测到应答脉冲, 便可发起ROM操作命令. 共有5类ROM操作命令, 如下表

命令类型命令字节功能Read Rom 读ROM33H读取激光ROM中的64位,只能用于总线上单个DS18B20器件情况, 多挂时会发生数据冲突Match Rom匹配ROM55H此命令后跟64位ROM序列号,寻址多挂总线上的对应DS18B20.只有序列号完全匹配的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲.可用于单挂或多挂两种情况.Skip Rom 跳过ROMCCH可无须提供64位ROM序列号即可运行内存操作命令, 只能用于单挂.Search Rom搜索ROMF0H通过一个排除法过程, 识别出总线上所有器件的ROM序列号Alarm Search告警搜索ECH命令流程与Search Rom相同, 但DS18B20只有最近的一次温度测量时满足了告警触发条件的, 才会响应此命令.


3. 内存操作命令
在成功执行ROM操作命令后, 才可使用内存操作命令. 共有6种内存操作命令:

命令类型命令字节功能

Write Scratchpad
写暂存器

4EH写暂存器中地址2~地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3个字节都必须要写.

Read Scratchpad
读暂存器

BEH读取暂存器内容,从字节0~一直到字节8, 共9个字节,主机可随时发起复位脉冲,停止此操作,通常我们只需读前5个字节.

Copy Scratchpad
复制暂存器

48H将暂存器中的内容复制进EERAM, 以便将温度告警触发字节存入非易失内存. 如果此命令后主机产生读时隙, 那么只要器件还在进行复制都会输出0, 复制完成后输出1.

Convert T
温度转换

44H开始温度转换操作. 若在此命令后主机产生时隙, 那么只要器件还在进行温度转换就会输出0, 转换完成后输出1.

Recall E2
重调E2暂存器

B8H将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20加电时自动产生.

Read Power Supply
读供电方式

B4H主机发起此命令后每个读数时隙内,DS18B20会发信号通知它的供电方式:0寄生电源, 1外部供电.


4. 数据处理
DS18B20要求有严格的时序来保证数据的完整性. 在单线DQ上, 有复位脉冲, 应答脉冲, 写0, 写1, 读0, 读1这6种信号类型. 除了应答脉冲外, 其它都由主机产生. 数据位的读和写是通过读、写时隙实现的.
1) 写时隙: 当主机将数据线从高电平拉至低电平时, 产生写时隙.所有写时隙都必须在60us以上, 各写时隙间必须保证1us的恢复时间.
写"1" : 主机将数据线DQ先拉低, 然后释放15us后, 将数据线DQ拉高;
写"0" : 主机将DQ拉低并至少保持60us以上.
2)读时隙: 当主机将数据线DQ从高电平拉至低电平时, 产生读时隙. 所有读时隙最短必须持续60us, 各读时隙间必须保证1us的恢复时间.
读: 主机将DQ拉低至少1us,. 此时主机马上将DQ拉高, 然后就可以延时15us后, 读取DQ即可.


源代码: (测量范围: 0 ~ 99度)


DS18B20
1#include
2//通过DS18B20测试当前环境温度,并通过数码管显示当前温度值
3sbitwela=P2^7;//数码管位选
4sbitdula=P2^6;//数码管段选
5sbitds=P2^2;
6//0-F数码管的编码(共阴极)
7unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
80x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
9//0-9数码管的编码(共阴极),带小数点
10unsignedcharcodetableWidthDot[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
110x87,0xff,0xef};
12
13//延时函数,例i=10,则大概延时10ms.
14voiddelay(unsignedchari)
15{
16unsignedcharj,k;
17for(j=i;j>0;j--)
18{
19for(k=125;k>0;k--);
20}
21}
22
23//初始化DS18B20
24//让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动
25voiddsInit()
26{
27//一定要使用unsignedint型,一个i++指令的时间,作为与DS18B20通信的小时间间隔
28//以下都是一样使用unsignedint型
29unsignedinti;
30ds=0;
31i=103;
32while(i>0)i--;
33ds=1;
34i=4;
35while(i>0)i--;
36}
37
38//向DS18B20读取一位数据
39//读一位,让DS18B20一小周期低电平,然后两小周期高电平,
40//之后DS18B20则会输出持续一段时间的一位数据
41bitreadBit()
42{
43unsignedinti;
44bitb;
45ds=0;
46i++;
47ds=1;
48i++;i++;
49b=ds;
50i=8;
51while(i>0)i--;
52returnb;
53}
54
55//读取一字节数据,通过调用readBit()来实现
56unsignedcharreadByte()
57{
58unsignedinti;
59unsignedcharj,dat;
60dat=0;
61for(i=0;i<8;i++)
62{
63j=readBit();
64//最先读出的是最低位数据
65dat=(j<<7)"(dat>>1);
66}
67returndat;
68}
69
70//向DS18B20写入一字节数据
71voidwriteByte(unsignedchardat)
72{
73unsignedinti;
74unsignedcharj;
75bitb;
76for(j=0;j<8;j++)
77{
78b=dat&0x01;
79dat>>=1;
80//写"1",让低电平持续2个小延时,高电平持续8个小延时
81if(b)
82{
83ds=0;
84i++;i++;
85ds=1;
86i=8;while(i>0)i--;
87}
88else//写"0",让低电平持续8个小延时,高电平持续2个小延时
89{
90ds=0;
91i=8;while(i>0)i--;
92ds=1;
93i++;i++;
94}
95}
96}
97
98//向DS18B20发送温度转换命令
99voidsendChangeCmd()
100{
101dsInit();//初始化DS18B20
102delay(1);//延时1ms
103writeByte(0xcc);//写入跳过序列号命令字
104writeByte(0x44);//写入温度转换命令字
105}
106
107//向DS18B20发送读取数据命令
108voidsendReadCmd()
109{
110dsInit();
111delay(1);
112writeByte(0xcc);//写入跳过序列号命令字
113writeByte(0xbe);//写入读取数据令字
114}
115
116//获取当前温度值
117unsignedintgetTmpValue()
118{
119unsignedintvalue;//存放温度数值
120floatt;
121unsignedcharlow,high;
122sendReadCmd();
123//连续读取两个字节数据
124low=readByte();
125high=readByte();
126//将高低两个字节合成一个整形变量
127value=high;
128value<<=8;
129value"=low;
130//DS18B20的精确度为0.0625度,即读回数据的最低位代表0.0625度
131t=value*0.0625;
132//将它放大10倍,使显示时可显示小数点后一位,并对小数点后第二2进行4舍5入
133//如t=11.0625,进行计数后,得到value=111,即11.1度
134value=t*10+0.5;
135returnvalue;
136}
137
138//显示当前温度值,精确到小数点后一位
139voiddisplay(unsignedintv)
140{
141unsignedcharcount;
142unsignedchardatas[]={0,0,0};
143datas[0]=v/100;
144datas[1]=v%100/10;
145datas[2]=v%10;
146for(count=0;count<3;count++)
147{
148//片选
149wela=0;
150P0=((0xfe<>(8-count)));//选择第(count+1)个数码管
151wela=1;//打开锁存,给它一个下降沿量
152wela=0;
153//段选
154dula=0;
155if(count!=1)
156{
157P0=table[datas[count]];//显示数字
158}
159else
160{
161P0=tableWidthDot[datas[count]];//显示带小数点数字
162}
163dula=1;//打开锁存,给它一个下降沿量
164dula=0;
165delay(5);//延时5ms,即亮5ms
166
167//清除段先,让数码管灭,去除对下一位的影响,去掉高位对低位重影
168//若想知道影响效果如何,可自行去掉此段代码
169//因为数码管是共阴极的,所有灭的代码为:00H
170dula=0;
171P0=0x00;//显示数字
172dula=1;//打开锁存,给它一个下降沿量
173dula=0;
174}
175}
176
177voidmain()
178{
179unsignedchari;
180unsignedintvalue;
181while(1)
182{
183//启动温度转换
184sendChangeCmd();
185value=getTmpValue();
186//显示3次
187for(i=0;i<3;i++)
188{
189display(value);
190}
191}
192}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭