


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最近都在学习和写单片机的程序,今天有空又模仿DS18B20 温度测量显示实验写了一个 与DS18B20 基于单总线通信的程序.DS18B20数字温度传感器(参考:智能温度传感器 DS18B20 的原理与应用)是DALLAS公司生产的1 -Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一 个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点:(1 )、只要求一个I/O 口即可实现通信。(2 )、在DS18B20 中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4 )、测量温度范围在 55到+
2、125 C之间;在-10 +85C范围内误差为 ±5 C;(5 )、数字温度计的分辨率用户可以从9位到12位选择。将12位的温度值转换为数字量所需时间不超过 750ms;(6)、内部有温度上、下限告警设置。DS18B20 引脚分布图NC Tnn nc斗匚TO NCVT>D CDrn ncrn gnuDS18B20 详细引脚功能描述:1、GND地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件 提供电源;漏极开路,常太下高电平通常要求外接一个约 5k Q的上拉电阻.3、 VDD可选择的VDD引脚。电压范围:35.5V;当工作于寄生电源时,此引
3、脚必须接 地。DS18B20 存储器结构图叩何结黑臂存RAM至节0非晶罠性电nJ攥液RAM1TH?国户僱国字节1jTH口戸忡用/书|3IH.?J户性用宁廿7配苕节斗思誉字节56佞对辛节rCRD书X暂存储器的头两个字节为测得温度信息的低位和高位字节第3, 4字节是TH和TL的易失性拷贝,在每次电复位时都会被刷新 第5字节是配置寄存器的易失性拷贝,同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下0R1R011111MSBLSBR0和R1是温度值分辨率位,按下表进行配置默认出厂设置是 R1R0 = 11, 即12位.温度值分辨率配置表R1R0分辨率最大转换时间(m
4、s)009bit93.75(tco nv/8)0110bit183.50(tco nv/4)1011bit375(tc on v/2)1112bit750 (tco nv)4种分辨率对应的温度分辨率为0.5 C , 0.25 C , 0.125 C , 0.0625 C (即最低一位代表的温度值)12位分辨率时的两个温度字节的具体格式如下 低字节:2A32A22A12A02A-12A-22A-32A-4高字节:SSSSS2A62A52A4其中高字节前5位都是符号位S,若分辨率低于12位时,相应地使最低为0,如:当分辨 率为10位时,低字节为:2A32A22A12A02A-12A-200高字节不
5、变一些温度与转换后输出的数字参照如下温度数字输出换成16进 制+ 125 C000001111101000007D0H+85 C00000101010100000550H+25.0625C00000001100100010191H+10.125C000000001010001000A2H+0.5 C00000000000010000008H0 C00000000000000000000H-0.5 C1111111111111000FFF8H-10.125C1111111101011110FFE5H-25.0625C1111111001101111FF6FH-55 C11111100100100
6、00FC90H由上表可看出,当输出是负温度时,使用补码表示,方便计算机运算(若是用C语言,直接 将结果赋值给一个int变量即可).DS18B20的使用方法:由于DS18B20 采用的是1 -Wire 总线协议方式,即在一根数据线实现数据的双向传输, 而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20 是在一根I/O线上读写数据,因此,对读写的数据位 有着严格的时序要求。 DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序(dslnit()实现)、读时序(readByte() 、写
7、时序(writeByte() 。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20 与单片机连接电路图vccHJQS52监T ?P10/TPOOP11JTP01P1JP02P13P03P14P04PBP05Pl<5P06P17POJINTIP20INTOP21Pi2T1P23TOP24EA/YPKIK2P2SP27RED TKPRDALE乔WRFSE1IXI P藍18碍 】佃如DB3OkDB+ +DB6?ZDE7QD
8、B8弘RS走 LCMALEDS18B20''I利用软件模拟 DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序1. 初始化单线总线上的所有操作都是从初始化开始的过程如下:1) 请求:主机通过拉低单线480us 以上,产生复位脉冲,然后释放该线,进入Rx接收模 式.主机释放总线时,会产生一个上升沿脉冲DQ : 1 -> 0(480us+) -> 12) 响应:DS18B20检测到该上升沿后,延时1560us,通过拉低总线60240us 来产生应答脉冲DQ: 1(1560us) -> 0(60240us)3) 接收响应:主机接收到从机的应答脉
9、冲后,说明有单线器件在线至此,初始化完成DQ: 02. ROM操作命令当主机检测到应答脉冲,便可发起ROM操作命令.共有5类ROM操作命令,如下表命令类型命令功能字节Read Rom读ROM33H读取激光ROM中的64位,只能用于总线上单个 DS18B20 器件情况,多挂时会发生 据冲突Match Rom 匹 配ROM55H此命令后跟64位ROM序列号,寻址多挂总线上的对应 DS18B20.只有序列号完全匹的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲.可用于单扌 或多挂两种情况Skip Rom跳过ROMCCH可无须提供64位ROM序列号即可运行内存操作命令,只能用于单
10、挂Search Rom 搜 索ROMF0H通过一个排除法过程,识别出总线上所有器件的 ROM序列号Alarm Search告警搜索ECH命令流程与Search Rom 相冋,但DS18B20只有最近的一次温度测量时满足了告警发条件的,才会响应此命令3.内存操作命令在成功执行ROM操作命令后,才可使用内存操作命令.共有6种内存操作命令命令类型命令字节功能WriteScratchpad写暂存器4EH写暂存器中地址2地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3 字节都必须要写ReadScratchpad读暂存器BEH读取暂存器内容,从字节0 直到字节8,共9个字节,主机可随时发起
11、复位脉冲,停 此操作,通常我们只需读前 5个字节CopyScratchpad复制暂存器48H将暂存器中的内容复制进 EERAM,以便将温度告警触发字节存入非易失内存 如果此 命令后主机产生读时隙,那么只要器件还在进行复制都会输出 0,复制完成后输出1Convert T温度转换44H开始温度转换操作若在此命令后主机产生时隙,那么只要器件还在进行温度转换就输出0,转换完成后输出1.Recall E2重调E2暂存器B8H将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20 加电时自动产生Read PowerSupply读供电方式B4H主机发起此命令后每个读数时
12、隙内QS18B20 会发信号通知它的供电方式:0寄生电源1外部供电4. 数据处理DS18B20 要求有严格的时序来保证数据的完整性.在单线DQ上,有复位脉冲,应答脉冲,写0,写1,读0,读1这6种信号类型.除了应答脉冲外,其它都由主机产生数据位的 读和写是通过读、写时隙实现的1)写时隙:当主机将数据线从高电平拉至低电平时,产生写时隙所有写时隙都必须在60us以上,各写时隙间必须保证 1us的恢复时间写"1":主机将数据线 DQ先拉低,然后释放15us后,将数据线DQ拉高;写"0": 主机将DQ拉低并至少保持 60us以上2)读时隙:当主机将数据线 DQ从
13、高电平拉至低电平时,产生读时隙所有读时隙最短必 须持续60us,各读时隙间必须保证 1us的恢复时间读:主机将DQ拉低至少1us,.此时主机马上将 DQ拉高,然后就可以延时15us后,读取 DQ即可源代码:(测量范围:0 99度)国日 DS18B201 #i nclude <reg51.H>2 /通过DS18B20 测试当前环境温度,并通过数码管显示当前温度值3sbit wela = P2A7;/数码管位选4sbit dula =卩2人6;/数码管段选5sbit ds = P2A2;60-F 数码管的编码(共阴极)7unsignedchar code table=0x3f,0x06
14、,0x5b,0x4f,0x66,80x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;90-9 数码管的编码(共阴极),带小数点10日田unsignedchar code tableWidthDot=0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,L11 0x87, Oxff, Oxef;1212 /延时函数,例i=10,则大概延时10ms.13 void delay(unsignedchar i)14 15 unsignedchar j, k;16 for (j = i; j > 0; j-)9
15、 0 112 217 申for (k = 125; k > 0; k_);2223 / 初始化 DS18B2024 /让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动25 void dsInit()26 27 I / 一定要使用 unsigned int 型,一个i+指令的时间,作为与DS18B20 通信的小时间间隔28 I /以下都是一样使用unsigned int 型29unsignedint i;30ds = 0;31i = 103;32while (i>0) i-;33ds = 1;34i = 4;35while (i>0) i-;3637
16、38/向DS18B20 读取一位数据39/读一位,让DS18B20 一小周期低电平,然后两小周期高电平,40/之后DS18B20 则会输岀持续一段时间的一位数据41bit readBit()42日田43unsignedint i;441 bit b;45ds = 0;46i+;47ds = 1;48i+; i+;49b = ds;501 i = 8;51while (i>0) i-;52return b;53 5455/读取一字节数据,通过调用readBit()来实现56unsignedchar readByte()57日田58unsignedint i;59unsignedchar j
17、, dat;60dat = 0;61for (i=0; i<8; i+)62艸63j = readBit();641/最先读岀的是最低位数据65dat = (j << 7) | (dat >> 1);66卜67return dat;68L6970/向DS18B20 写入一字节数据71void writeByte(unsignedchar dat)72日田73un sig nedint i;74un sig nedchar j;75bit b;76for (j = 0; j <8; j+)7778b = dat & 0x01;79dat >>
18、;= 1;80/ 写"1",让低电平持续2个小延时,高电平持续8个小延时81if (b)8283ds = 0;84i+; i+;85ds = 1;86i = 8;while (i>0) i-;8788else /写"0",让低电平持续8个小延时,高电平持续2个小延时89申申90ds = 0;91i = 8;while (i>0) i-;92ds = 1;93i+; i+;94 95 I 96 9797 /向DS18B20 发送温度转换命令99 void sendChangeCmd()100 101 ds In it();/ 初始化 DS18B
19、20102 delay(1);/ 延时 1ms103 writeByte(Oxcc);/写入跳过序列号命令字104 writeByte(0x44);/写入温度转换命令字L105 106107/向DS18B20 发送读取数据命令108 void sendReadCmd()110111112113109曰田/写入跳过序列号命令字/写入读取数据令字dsI nit(); delay(1); writeByte(0xcc); writeByte(Oxbe);114115116 /获取当前温度值117 unsigned int getTmpValue()118曰眄119unsignedint value;
20、 / 存放温度数值120float t;121unsignedchar low, high;122sen dReadCmd();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入13
21、3/如t=11.0625,进行计数后,得到value = 111,即11.1 度134value = t * 10 + 0.5;135return value;136137138/显示当前温度值,精确到小数点后一位139void display(unsignedint v)140曰叫141unsignedchar count;142unsignedchar datas = 0, 0, 0;143datas0 = v / 100;144datas1 = v % 100 / 10;145datas2 = v % 10;146for (count = 0; count < 3; count+)
22、147白申148/片选149wela = 0;150P0 = (0xfe << count) | (0xfe >> (8 - count);/ 选择第(count + 1)个数码管151wela = 1;/打开锁存,给它一个下降沿量152wela = 0;153/段选154dula = 0;155if (count != 1)156白由157P0 = tabledatascount;/ 显示数字158卜159else160 161 P0 = tableWidthDotdatascount;/ 显示带小数点数字162 卜163 dula = 1;/打开锁存,给它一个下降沿
23、量164 dula = 0;165 delay(5);/ 延时 5ms,即亮 5ms166166 / 清除段先,让数码管灭,去除对下一位的影响,去掉高位对低位重影167 /若想知道影响效果如何,可自行去掉此段代码168 /因为数码管是共阴极的,所有灭的代码为:00H169 dula = 0;170 P0 = 0x00;/显示数字171 dula = 1;/打开锁存,给它一个下降沿量172 dula = 0;173 174 176175 void main()176 177 unsignedchar i;178 unsignedint value;179 while (1)180 181 /启动
24、温度转换182 sen dCha ngeCmd();183 value= getTmpValue();184 /显示3次185 for (i = 0; i < 3;i+)186 187 display(value);188 189 I L190 显示效果:流程图:Mtfi7.DSlKB20Skip R.imu甜令rCo 1 wen 1 O ?一 1r延时1 H +1rRel!也h評hH 命 yqr-即为隘雯鈕骞改进代码:扩大测量范围,使可测量范围为:-55度 +125 度,严格按照上面的流程进 行软件设计3.15 1:34 修正display。函数中的下一位显示对上一位的影响国日改进代码
25、1 #i nclude <reg51.H>2 #in clude< intrin s.h>3 #include <math.H>/要用到取绝对值函数abs()4 /通过DS18B20 测试当前环境温度,并通过数码管显示当前温度值,目前显示范围:-55 +125 度5 sbit wela = P2A7;/数码管位选6 sbit dula =卩2人6;II数码管段选7 sbit ds = P2A2;8 int tempValue;99 II0-F 数码管的编码(共阴极)10 unsigned char code table=0x3f,0x06,0x5b,0x4f
26、,0x66,11 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;12 0-9 数码管的编码(共阴极),带小数点14日田unsignedchar code tableWidthDot=Oxbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,150x87, 0xff, 0xef;1617/延时函数,对于11.0592MHz 时钟,例i=10,则大概延时 10ms.18void delay(unsignedint i)19 日 H 20unsignedint j;21while (i-)22申申23for (j
27、 = 0; j < 125; j+);2425 2627/初始化 DS18B2028/让DS18B20 一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动29void dsInit()30日丘31/对于11.0592MHz时钟,unsigned int型的i,作一个i+操作的时间大于为 8us32unsignedint i;33ds = 0;34i = 100;/拉低约800us,符合协议要求的480us以上35while (i>0) i-;36ds = 1;/产生一个上升沿,进入等待应答状态37i = 4;38while (i>0) i-;39L4041void
28、dsWait()42 日 H 43unsignedint i;44while (ds);45while (ds);/检测到应答脉冲46i = 4;47while (i > 0) i-;48 4950/向DS18B20 读取一位数据51/读一位,让DS18B20 一小周期低电平,然后两小周期高电平,52/之后DS18B20 则会输岀持续一段时间的一位数据53bit readBit()54 日 R 55unsignedint i;56bit b;57ds = 0;58i+;/延时约8us,符合协议要求至少保持1us59ds = 1;60i+; i+;/延时约16us,符合协议要求的至少延时1
29、5us以上61b = ds;62i = 8;63while (i>0) i-;/延时约64us,符合读时隙不低于60us要求64return b;65 6667/读取一字节数据,通过调用readBit() 来实现68unsignedchar readByte()69 日H 70unsignedint i;71unsignedchar j, dat;72dat = 0;73for (i=0; i<8; i+)74 口申75j = readBit();761/最先读岀的是最低位数据77dat = (j << 7) | (dat >> 1);78卜79return
30、 dat;1L808182/向DS18B20 写入一字节数据83void writeByte(unsignedchar dat)84日匸85unsignedint i;86unsignedchar j;87bit b;88for (j = 0; j < 8; j+)89申申90b = dat & 0x01;91dat >>= 1;92/ 写"1",将 DQ 拉低 15us 后,在 15us60us内将DQ拉咼,即完成写193if (b)9495ds = 0;96i+; i+;/拉低约16us,符号要求1560us 内97ds = 1;98i = 8
31、;while (i>0) i-;/ 延时约 64us,符合写时隙不低于 60us要求99卜100else /写"0", 将 DQ 拉低 60us120us101 韓102ds = 0;103i = 8;while (i>0) i-;/ 拉低约 64us,符号要求104ds = 1;105i+; i+;/整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时 64us 了106卜107卜108 109110/ 向 DS18B20发送温度转换命令111void sendChangeCmd()112日国113dsln it();/初始化DS18B20,无论什么
32、命令,首先都要发起初始化114dsWait();/等待DS18B20 应答115delay(1);/延时1ms,因为DS18B20 会拉低DQ 60240us作为应答信号116writeByte(0xcc);/写入跳过序列号命令字Skip Rom117writeByte(0x44);/写入温度转换命令字Convert TL118119120/ 向 DS18B20发送读取数据命令121void sendReadCmd()123124125126dsI nit(); dsWait(); delay(1); writeByte(Oxcc);127writeByte(Oxbe);/写入跳过序列号命令字
33、Skip Rom/写入读取数据令字Read Scratchpad122日曰128 130/获取当前温度值 131 int getTmpValue()132日曰unsignedint tmpvalue;int value; /存放温度数值135float t;136unsignedchar low, high;137sen dReadCmd();138/连续读取两个字节数据139low = readByte();140high = readByte();141/将高低两个字节合成一个整形变量142/计算机中对于负数是利用补码来表示的143/若是负值,读取岀来的数值是用补码表示的,可直接赋值给in
34、t型的value144tmpvalue = high;145tmpvalue <<= 8;146tmpvalue |= low;147value = tmpvalue;148149/使用DS18B20的默认分辨率12位,精确度为0.0625 度,即读回数据的最低位代表0.0625 度150t = value * 0.0625;151/将它放大100倍,使显示时可显示小数点后两位,并对小数点后第三进行4舍5入152/如t=11.0625,进行计数后,得到value = 1106,即11.06 度153/ 如 t=-11.0625,进行计数后,得到 value = -1106,即-11
35、.06 度154value = t * 100 + (value > 0 ? 0.5 : -0.5);/ 大于 0 力廿 0.5,小于 0 减 0.5155retur nvalue;156157158 un sig ned char con st timeCou nt = 3;/ 动态扫描的时间间隔159/显示当前温度值,精确到小数点后一位160 /若先位选再段选,由于10 口默认输岀高电平,所以当先位选会使数码管岀现乱码161 void display( int v)162日国163unsignedchar count;164unsignedchar datas = 0, 0, 0, 0, 0;165unsignedint tmp = abs(v);166datas0 = tmp / 10000;167datas1 = tmp % 10000 / 1000;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中英语集体备课教材开发计划
- 2025年中国太阳伞塑料配件行业市场发展前景及发展趋势与投资战略研究报告
- 百叶窗拉线行业深度研究分析报告(2024-2030版)
- 2025年中国高压空气压缩机行业市场调研分析及投资战略咨询报告
- 以镇江中小学为例探索青少年体育俱乐部运作功能拓展路径
- 2025年中国工业继电器行业市场发展前景及发展趋势与投资战略研究报告
- 以趣为引叩响初中古诗文背诵之门:“真兴趣”培养体系的构建与实践
- 以读者剧场为翼助力小学三年级语文教学腾飞
- 以说启思以写筑梦:小学作文教学说写结合策略探索
- 以语为翼共话未来:高中语文教学中普通话推广策略探究
- (王瑞元版本)运动生理学-课件-3-第三章-血液
- 济南世创友联有机硅科技有限公司年产1000 吨特种硅弹性体项目环评资料环境影响
- 2025中考(传统文化)类满分作文10篇
- 标准检验指导书(SIP)-钣金
- 交易员心理培训课件
- 京东笔试题库及答案
- 城市公园绿化施工安全措施方案
- DB11 T 627-2009 好氧降解法治理生活垃圾非卫生填埋场监测技术规范
- 建筑工程赶工计划措施
- 第十三讲先锋队与中华民族独立解放(1919-1949)-中华民族共同体概论专家大讲堂课件
- ICU发热与体温管理课件
评论
0/150
提交评论