版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最近都在学习和写单片机的程序,今天有空又模仿DS18B20 温度测量显示实验写了一个 与DS18B20 基于单总线通信的程序.DS18B20数字温度传感器(参考:智能温度传感器 DS18B20 的原理与应用)是DALLAS公司生产的1 -Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一 个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点:(1 )、只要求一个I/O 口即可实现通信。(2 )、在DS18B20中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4 )、测量温度范围在 55到+ 1
2、25 C之间;在-10 +85C范围内误差为 ±5 C;(5 )、数字温度计的分辨率用户可以从9位到12位选择。将12位的温度值转换为数字量所需时间不超过 750ms;(6)、内部有温度上、下限告警设置。EImmElNCNCmDQDS18B20 引脚分布图NCNCNDDS18B20 详细引脚功能描述:1、GND地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件 提供电源;漏极开路,常太下高电平通常要求外接一个约 5k Q的上拉电阻.3、 VDD可选择的VDD引脚。电压范围:35.5V;当工作于寄生电源时,此引脚必须接 地。DS18B20 存储器结
3、构图中间蜡果和存RAM龍世值岛世字节th rfri:r?-疔 iTL/用户SfflT T门伐常M节暂存储器的头两个字节为测得温度信息的低位和高位字节第3, 4字节是TH和TL的易失性拷贝,在每次电复位时都会被刷新 第5字节是配置寄存器的易失性拷贝,同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下0R1R011111MSBLSBR0和R1是温度值分辨率位,按下表进行配置默认出厂设置是 R1R0 = 11, 即12位.温度值分辨率配置表R1R0分辨率最大转换时间(ms)009bit93.75(tco nv/8)0110bit183.50(tco nv/4)101
4、1bit375(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高字节不变一些温度与转换后输出的数字参照如下温度数字输出换成16进 制+ 125 C00000111110
5、1000007D0H+85 C00000101010100000550H+25.0625C00000001100100010191H+10.125C000000001010001000A2H+0.5 C00000000000010000008H0 C00000000000000000000H-0.5 C1111111111111000FFF8H-10.125C1111111101011110FFE5H-25.0625C1111111001101111FF6FH-55 C1111110010010000FC90H由上表可看出,当输出是负温度时,使用补码表示,方便计算机运算(若是用C语言,直接 将
6、结果赋值给一个int变量即可).DS18B20的使用方法:由于DS18B20 采用的是1 -Wire 总线协议方式,即在一根数据线实现数据的双向传输, 而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20 是在一根I/O线上读写数据,因此,对读写的数据位 有着严格的时序要求。 DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序(dslnit()实现)、读时序(readByte() 、写时序(writeByte() 。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和
7、数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20 与单片机连接电路图-9S52DBUJpnggDB+QDB;严RST9piorrPOOpn/rPOiP12P02PBP03P14P0+P15P05P16P06P17P07IHT1P30INTOPSIP32T1P茁TOP2+P时EA/VPP26P27KIK2RESETRXDTSDRD-ALEWRPSEHINTCSJ18E20DS13B20£381 上00>8§0P3J0P3.1 ALE'I20Ilk利用软件
8、模拟 DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序1. 初始化单线总线上的所有操作都是从初始化开始的过程如下:1) 请求:主机通过拉低单线480us 以上,产生复位脉冲,然后释放该线,进入Rx接收模 式.主机释放总线时,会产生一个上升沿脉冲DQ : 1 -> 0(480us+) -> 12) 响应:DS18B20检测到该上升沿后,延时1560us,通过拉低总线60240us 来产生应答脉冲DQ: 1(1560us) -> 0(60240us)3) 接收响应:主机接收到从机的应答脉冲后,说明有单线器件在线至此,初始化完成DQ: 02. ROM操作命令
9、当主机检测到应答脉冲,便可发起ROM操作命令.共有5类ROM操作命令,如下表命令类型命令功能字节Read Rom读ROM33H读取激光ROM中的64位,只能用于总线上单个 DS18B20 器件情况,多挂时会发生 据冲突Match Rom 匹 配ROM55H此命令后跟64位ROM序列号,寻址多挂总线上的对应 DS18B20.只有序列号完全匹的DS18B20才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲.可用于单扌 或多挂两种情况Skip Rom跳过ROMCCH可无须提供64位ROM序列号即可运行内存操作命令,只能用于单挂Search Rom 搜 索ROMF0H通过一个排除法过程,识别出总
10、线上所有器件的 ROM序列号Alarm Search告警搜索ECH命令流程与Search Rom 相冋,但DS18B20只有最近的一次温度测量时满足了告警发条件的,才会响应此命令3.内存操作命令在成功执行ROM操作命令后,才可使用内存操作命令.共有6种内存操作命令命令类型命令字节功能WriteScratchpad写暂存器4EH写暂存器中地址2地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3 字节都必须要写ReadScratchpad读暂存器BEH读取暂存器内容,从字节0 直到字节8,共9个字节,主机可随时发起复位脉冲,停 此操作,通常我们只需读前 5个字节CopyScratch
11、pad 复制暂存器48H将暂存器中的内容复制进 EERAM,以便将温度告警触发字节存入非易失内存 如果此 命令后主机产生读时隙,那么只要器件还在进行复制都会输出 0,复制完成后输出1Convert T温度转换44H开始温度转换操作若在此命令后主机产生时隙,那么只要器件还在进行温度转换就输出0,转换完成后输出1.Recall E2重调E2暂存器B8H将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20 加电时自动产生Read PowerSupply读供电方式B4H主机发起此命令后每个读数时隙内QS18B20 会发信号通知它的供电方式:0寄生电源1外部供电4
12、. 数据处理DS18B20 要求有严格的时序来保证数据的完整性.在单线DQ上,有复位脉冲,应答脉冲,写0,写1,读0,读1这6种信号类型.除了应答脉冲外,其它都由主机产生数据位的读和写是通过读、写时隙实现的1)写时隙:当主机将数据线从高电平拉至低电平时,产生写时隙所有写时隙都必须在60us以上,各写时隙间必须保证 1us的恢复时间写"1":主机将数据线 DQ先拉低,然后释放15us后,将数据线DQ拉高;写"0": 主机将DQ拉低并至少保持 60us以上2)读时隙:当主机将数据线 DQ从高电平拉至低电平时,产生读时隙所有读时隙最短必须持续60us,各读时隙
13、间必须保证1us的恢复时间读:主机将DQ拉低至少1us,.此时主机马上将 DQ拉高,然后就可以延时15us后,读取 DQ即可源代码:(测量范围:0 99度)DS18B20#in clude <reg51.H> / 通过 DS18B20 sbit wela = P2A7;sbit dula =卩2人6;测试当前环境温度,并通过数码管显示当前温度值/数码管位选/数码管段选sbit ds = P2A2;0-F 数码管的编码unsignedchar code table=0x3f,0x06,0x5b,0x4f,0x66,L 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7
14、c,0x39,0x5e,0x79,0x71;0-9 数码管的编码(共阴极),带小数点(共阴极)10unsignedchar code tableWidthDot=0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,L 0x87, 0xff, 0xef;11121314151617/延时函数,例i=10,则大概延时10ms.void delay(unsignedchar i)0unsignedchar j, k;I for (j = i; j > 0; j-)181920212223/24/初始化DS18B20让DS18B20 一段相对长时间低电平,然后一段相
15、对非常短时间高电平,即可启动252627间间隔=void nFi l /dsl nit()定要使用unsigned int 型,一个i+指令的时间,作为与DS18B20 通信的小时28/以下都是一样使用un sig ned int 型I IT-丄丄 0 1 2 3 4 5 63 3 3 3 3 33738/向DS18B20 读取一位数据39/读一位,让DS18B20 一小周期低电平,然后两小周期高电平40/之后DS18B20 则会输岀持续一段时间的一位数据41 bit readBit()42 口 D43 Iunsigned44 bit b;45 ds = 0;46 i+;47 ds = 1;4
16、8 Ii+; i+;inti;4950515253 Lb = ds;i = 8;while (i>0) return b;i-;5455/读取一字节数据通过调用readBit()来实现56575859606162636465666768_unsignedchar readByte()0un sig nedint i;I 趟 TIi T 丄unsigned char j, dat;dat = 0;for (i=0; i<8; i+)j = readBit();/最先读岀的是最低位数据dat = (j << 7) | (dat >> 1);return dat;
17、unsigned int i;ds = 0;i = 103;while (i>0) i-;ds = 1;i = 4;while (i>0) i-;707172/向DS18B20写入一字节数据void writeByte(unsigned char dat) n073 Iun sig nedint i;11 |一卵 一 IT 一軸 T 一4567890123477777788888unsignedchar j;bit b;for (j = 0; j < 8; j+)b = dat & 0x01;dat >>= 1;/写"1",让低电平持续
18、2个小延时,高电平持续8个小延时if (b)ds = 0;i+; i+;卜!X卜卜567890123456 f888889999999 “ds = 1;i = 8; while (i>0) i-;else /写"0",让低电平持续8个小延时,高电平持续2个小延时ds = 0;i = 8; while (i>0) i-;ds = 1;i+; i+;98/向 DS18B20发送温度转换命令99void sendChangeCmd()100101102103104 0dsln it(); delay(1);writeByte(0xcc);writeByte(0x44)
19、;/初始化DS18B20延时1ms/写入跳过序列号命令字/写入温度转换命令字/105 106107/向DS18B20 发送读取数据命令108109110111112113void sendReadCmd()口日dsln it(); delay(1); writeByte(Oxcc); writeByte(Oxbe);/写入跳过序列号命令字/写入读取数据令字114115116 /获取当前温度值117118119un sig nedI | unsignedintgetTmpValue()int value; /存放温度数值120121122123float t; un sig ned sen dR
20、eadCmd();/连续读取两个字节数据char low, high;124125126low = readByte();high = readByte();/将高低两个字节合成一个整形变量127128129130value = high;value <<= 8;value |= low;/DS18B20 的精确度为0.0625 度,即读回数据的最低位代表0.0625 度131132133134135t = value * 0.0625;/将它放大10倍,使显示时可显示小数点后一位/如t=11.0625,进行计数后,得到value = 111,value = t * 10 + 0.
21、5;return value;,并对小数点后第二2进行4舍即11.1 度136137138139140141显示当前温度值,精确到小数点后一位void display(unsignedint v)I I unsignedchar count;/2 3 44 4 T T T5 6 74 4 T T Tunsignedchar datas = 0, 0, 0;datasO = v / 100;datas1 = v % 100 / 10;datas2 = v % 10;for (count = 0; count < 3; count+)/片选wela = 0;P0 = (0xfe <&l
22、t; cou nt) | (0xfe >> (8 - cou nt);/ 选择第(count + 1)码5 昵3 4 5 65 5 5I T- T- T- T-157158159wela = 1;/打开锁存,给它一个下降沿量wela = 0;/段选dula = 0;if (count != 1)P0 = tabledatascount;/ 显示数字else160161P0 = tableWidthDotdatascou nt;/显示带小数点数字162163164165dula = 1;dula = 0;delay(5);/打开锁存,给它一个下降沿量/延时5ms,即亮5ms16616
23、7168169170171172/清除段先,让数码管灭,去除对下一位的影响,去掉高位对低位重影/若想知道影响效果如何,可自行去掉此段代码/因为数码管是共阴极的,所有灭的代码为:00Hdula = 0;P0 = 0x00;/显示数字dula = 1;/打开锁存,给它一个下降沿量dula = 0;176177 l_void main()178 口日179un sig ned180unsignedint value;char i; 12 3 4 8 8 8 。 T T T I5 6 7 8 9 o 1 z 8888899T T T T T T T 一丄-丄一上一上ILwhile (1)/启动温度转换
24、sen dCha ngeCmd(); value = getTmpValue();/显示3次for (i = 0; i < 3; i+)display(value);显示效果:流程图:改进代码:扩大测量范围,使可测量范围为:-55度 +125 度,严格按照上面的流程进 行软件设计3.15 1:34 修正display。函数中的下一位显示对上一位的影响I I改进代码1 #i nclude <reg51.H>2 #in clude< intrin s.h>3 #include <math.H>/要用到取绝对值函数abs()4 /通过DS18B20 测试当前
25、环境温度,并通过数码管显示当前温度值,目前显示范 围:-55 +125 度5 sbit wela = P2A7;/数码管位选6 sbit dula =卩2人6;/数码管段选7 sbit ds = P2A2;8 int tempValue;99 /0-F 数码管的编码(共阴极)10 unsignedchar code table=0x3f,0x06,0x5b,0x4f,0x66,11 L 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;12 /0-9 数码管的编码(共阴极),带小数点13 JUunsignedchar code tab
26、leWidthDot=Oxbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,14 L 0x87, 0xff, 0xef;1617 | /延时函数,对于11.0592MHz 时钟,例i=10,则大概延时 10ms.181920212223void delay(unsigned int i)ULJunsignedint j;while (i-) M Ifor (j = 0; j < 125; j+);24252627/28/初始化 DS18B20让DS18B20 一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动29303132333435363738v
27、oid dslnit()ULIJJLL1II1T/对于11.0592MHz时钟,unsigned int 型的i,作一个i+操作的时间大于为 8usunsignedint i;ds = 0;i = 100;whileds = 1;/拉低约800us,符合协议要求的480us以上(i>0) i-;/产生一个上升沿,进入等待应答状态i = 4;while(i>0) i-;39404142434445dsWait()unsignedint i;while (ds);while (ds);/检测到应答脉冲4849505152535455565758596061626364656667686
28、970717273747576777879808182838485868788899091/向DS18B20读取一位数据/读一位,让DS18B20 一小周期低电平,然后两小周期高电平/之后DS18B20 则会输岀持续一段时间的一位数据bit readBit()ULII unsigned int i;bit b;ds = 0;i+;/延时约8us,符合协议要求至少保持1usI ds = 1;i+; i+;/延时约16us,符合协议要求的至少延时15us以上b = ds;i = 8;while (i>0) i-;/延时约64us,符合读时隙不低于60us要求return b;读取一字节数据,
29、通过调用readBit() 来实现un sig nedLB1charreadByte()/un sig ned un sig ned dat = 0;int i;char j, dat;for (i=0; i<8; i+)j = readBit();/最先读岀的是最低位数据dat = (j << 7) | (dat >> 1);return dat;向DS18B20 写入一字节数据void writeByte(unsignedchar dat)unsignedint i;unsignedchar j;bit b;for (j = 0; j < 8; j+)
30、M b = dat & 0x01;dat >>= 1;9293 I94雨9596979899100 I101 1 巾/写"1",将DQ拉低15us后,在15us60us 内将DQ拉咼,即完成写1if (b)ds = 0;i+; i+;/拉低约16us, 符号要求1560us 内ds = 1;i = 8; while (i>0) i-;/延时约64us,符合写时隙不低于60us要求else / 写"0", 将 DQ 拉低 60us120us I 3 4 5 o o o T T Tds = 0;i = 8;ds = 1; i+; i
31、+;while (i>0) i-;/ 拉低约 64us,/整个写0时隙过程已经超过符号要求60us,这里就不用像写1那样,再延109110/ 向 DS18B20发送温度转换命令111 void112 口 吐sen dCha ngeCmd()113 dsInit();/初始化DS18B20, 无论什么命令,首先都要发起初始化114 dsWait();/ 等待 DS18B20 应答115 I delay(1);/延时1ms,因为DS18B20 会拉低DQ 60240us作为应答信号116117118writeByte(0xcc);writeByte(0x44);/写入跳过序列号命令字Skip
32、 Rom/写入温度转换命令字Con vert T119120/向DS18B20 发送读取数据命令1211221231241251260T.1sen dReadCmd()dsl nit(); dsWait(); delay(1); writeByte(Oxcc);/写入跳过序列号命令字Skip Rom127128writeByte(0xbe);/写入读取数据令字Read Scratchpad129130/获取当前温度值131 int getTmpValue()132 口百133 unsignedint tmpvalue;134 I int value; /存放温度数值135 丨 float t;
33、136 unsignedchar low, high;137 se ndReadCmd();138 /连续读取两个字节数据139 I low = readByte();140 high = readByte();141 /将高低两个字节合成一个整形变量142 /计算机中对于负数是利用补码来表示的143 /若是负值,读取岀来的数值是用补码表示的,可直接赋值给int型的value144 Itmpvalue = high;145 Itmpvalue <<= 8;146 Itmpvalue |= low;147 Ivalue = tmpvalue;148148 I /使用DS18B20的默
34、认分辨率12位,精确度为0.0625 度,即读回数据的最低位代表0.0625 度149 t = value * 0.0625;150 /将它放大100倍,使显示时可显示小数点后两位,并对小数点后第三进行4舍5入151 / 如 t=11.0625,进行计数后,得到 value = 1106, 即 11.06 度152 / 如 t=-11.0625,进行计数后,得到 value = -1106, 即-11.06 度153 value = t * 100 + (value > 0 ? 0.5 : -0.5);/ 大于 0 力廿 0.5,小于 0 减 0.5154 丨return value;1
35、55 L157156 un sig nedchar con st timeCou nt = 3;/ 动态扫描的时间间隔159160/显示当前温度值L若先位选再段选,精确到小数点后一位,由于IO 口默认输岀高电平所以当先位选会使数码管出现乱码161162163void display( EIun sig nedint v)char count;1645678901966666777T T T T T T T dun sig ned un sig nedchar datas = 0, 0, 0, 0, 0; int tmp = abs(v);datas0 = tmp / 10000;datas1 = tmp % 10000 / 1000;datas2 = tmp % 1000 /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论