版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、最近都在学习和写单片机的程序, 今天有空又模仿写了一个与DS18B20基于单总线通信的程序.DS18B20 数字温度传感器(参考:是DALLAS 公司生产的1Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20 产品的特点:(1)、只要求一个I/O 口即可实现通信。(2)、在DS18B20 中的每个器件上都有独一无二的序列号。(3)、实际应用中不需要外部任何元器件即可实现测温。(4)、测量温度范围在55 到125之间; 在-10 +85范围内误差为5;(5)、数字温度计的分辨率用户可以从9 位到1
2、2 位选择。将12位的温度值转换为数字量所需时间不超过750ms;(6)、内部有温度上、下限告警设置。DS18B20引脚分布图DS18B20 详细引脚功能描述:1、GND 地信号;2、DQ数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源;漏极开路, 常太下高电平. 通常要求外接一个约5k的上拉电阻.3、VDD可选择的VDD 引脚。电压范围:35.5V; 当工作于寄生电源时,此引脚必须接地。DS18B20存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节; 第3, 4字节是TH和TL的易失性拷贝, 在每次电复位时都会被刷新;第5字节是配置寄存器的易失性
3、拷贝, 同样在电复位时被刷新;第9字节是前面8个字节的CRC检验值.配置寄存器的命令内容如下:0R1R011111MSB LSBR0和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位分辨率时的两个温度字节的具体格式如下:低字节: 2322212
4、02-12-22-32-4高字节: SSSSS262524其中高字节前5位都是符号位S, 若分辨率低于12位时, 相应地使最低为0, 如: 当分辨率为10位时, 低字节为: 232221202-12-200, 高字节不变.一些温度与转换后输出的数字参照如下:温度数字输出换成16进制+12500000111 1101000007D0H+8500000101 010100000550H+25.062500000001 100100010191H+10.12500000000 1010001000A2H+0.500000000 000010000008H000000000 000000000000H
5、-0.511111111 11111000FFF8H-10.12511111111 01011110FFE5H-25.062511111110 01101111FF6FH-5511111100 10010000FC90H由上表可看出, 当输出是负温度时, 使用补码表示, 方便计算机运算(若是用C语言, 直接将结果赋值给一个int变量即可).DS18B20 的使用方法:由于DS18B20 采用的是方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有
6、着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序(dsInit()实现)、读时序(readByte()、写时序(writeByte()。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。DS18B20与单片机连接电路图:利用软件模拟DS18B20的单线协议和命令:主机操作DS18B20必须遵循下面的顺序1. 初始化单线总线上的所有操作都是从初始化开始的. 过程如下
7、: 1)请求: 主机通过拉低单线480us以上, 产生复位脉冲, 然后释放该线, 进入Rx接收模式. 主机释放总线时, 会产生一个上升沿脉冲.DQ : 1 - 0(480us+) - 1 2)响应: DS18B20检测到该上升沿后, 延时1560us, 通过拉低总线60240us来产生应答脉冲. DQ: 1(1560us) - 0(60240us)3)接收响应: 主机接收到从机的应答脉冲后, 说明有单线器件在线. 至此, 初始化完成.DQ: 02. ROM操作命令当主机检测到应答脉冲, 便可发起ROM操作命令. 共有5类ROM操作命令, 如下表命令类型命令字节功能Read Rom 读ROM 3
8、3H读取激光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只有最
9、近的一次温度测量时满足了告警触发条件的, 才会响应此命令.3. 内存操作命令在成功执行ROM操作命令后, 才可使用内存操作命令. 共有6种内存操作命令:命令类型命令字节功能Write Scratchpad写暂存器4EH写暂存器中地址2地址4的3个字节(TH,TL和配置寄存器)在发起复位脉冲之前,3个字节都必须要写.Read Scratchpad读暂存器BEH读取暂存器内容,从字节0一直到字节8, 共9个字节,主机可随时发起复位脉冲,停止此操作,通常我们只需读前5个字节.Copy Scratchpad复制暂存器48H将暂存器中的内容复制进EERAM, 以便将温度告警触发字节存入非易失内存. 如果
10、此命令后主机产生读时隙, 那么只要器件还在进行复制都会输出0, 复制完成后输出1.Convert T温度转换44H开始温度转换操作. 若在此命令后主机产生时隙, 那么只要器件还在进行温度转换就会输出0, 转换完成后输出1.Recall E2 重调E2暂存器B8H将存储在EERAM中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在DS18B20加电时自动产生.Read Power Supply读供电方式B4H主机发起此命令后每个读数时隙内,DS18B20会发信号通知它的供电方式:0寄生电源, 1外部供电.4. 数据处理DS18B20要求有严格的时序来保证数据的完整性. 在单线DQ上,
11、有复位脉冲, 应答脉冲, 写0, 写1, 读0, 读1这6种信号类型. 除了应答脉冲外, 其它都由主机产生. 数据位的读和写是通过读、写时隙实现的.1) 写时隙: 当主机将数据线从高电平拉至低电平时, 产生写时隙.所有写时隙都必须在60us以上, 各写时隙间必须保证1us的恢复时间.写1 : 主机将数据线DQ先拉低, 然后释放15us后, 将数据线DQ拉高;写0 : 主机将DQ拉低并至少保持60us以上.2)读时隙: 当主机将数据线DQ从高电平拉至低电平时, 产生读时隙. 所有读时隙最短必须持续60us, 各读时隙间必须保证1us的恢复时间.读: 主机将DQ拉低至少1us,. 此时主机马上将D
12、Q拉高, 然后就可以延时15us后, 读取DQ即可.源代码: (测量范围: 0 99度)DS18B201#include2/通过DS18B20测试当前环境温度,并通过数码管显示当前温度值3sbitwela=P27;/数码管位选4sbitdula=P26;/数码管段选5sbitds=P22;6/0-F数码管的编码(共阴极)7unsignedcharcodetable=0x3f,0x06,0x5b,0x4f,0x66,80x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;9/0-9数码管的编码(共阴极),带小数点10unsignedchar
13、codetableWidthDot=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,110x87,0xff,0xef;1213/延时函数,例i=10,则大概延时10ms.14voiddelay(unsignedchari)1516unsignedcharj,k;17for(j=i;j0;j-)1819for(k=125;k0;k-);20212223/初始化DS18B2024/让DS18B20一段相对长时间低电平,然后一段相对非常短时间高电平,即可启动25voiddsInit()2627/一定要使用unsignedint型,一个i+指令的时间,作为与DS18B20通信的小
14、时间间隔28/以下都是一样使用unsignedint型29unsignedinti;30ds=0;31i=103;32while(i0)i-;33ds=1;34i=4;35while(i0)i-;363738/向DS18B20读取一位数据39/读一位,让DS18B20一小周期低电平,然后两小周期高电平,40/之后DS18B20则会输出持续一段时间的一位数据41bitreadBit()4243unsignedinti;44bitb;45ds=0;46i+;47ds=1;48i+;i+;49b=ds;50i=8;51while(i0)i-;52returnb;535455/读取一字节数据,通过调用
15、readBit()来实现56unsignedcharreadByte()5758unsignedinti;59unsignedcharj,dat;60dat=0;61for(i=0;i8;i+)6263j=readBit();64/最先读出的是最低位数据65dat=(j1);6667returndat;686970/向DS18B20写入一字节数据71voidwriteByte(unsignedchardat)7273unsignedinti;74unsignedcharj;75bitb;76for(j=0;j=1;80/写1,让低电平持续2个小延时,高电平持续8个小延时81if(b)8283d
16、s=0;84i+;i+;85ds=1;86i=8;while(i0)i-;8788else/写0,让低电平持续8个小延时,高电平持续2个小延时8990ds=0;91i=8;while(i0)i-;92ds=1;93i+;i+;9495969798/向DS18B20发送温度转换命令99voidsendChangeCmd()100101dsInit();/初始化DS18B20102delay(1);/延时1ms103writeByte(0xcc);/写入跳过序列号命令字104writeByte(0x44);/写入温度转换命令字105106107/向DS18B20发送读取数据命令108voidsen
17、dReadCmd()109110dsInit();111delay(1);112writeByte(0xcc);/写入跳过序列号命令字113writeByte(0xbe);/写入读取数据令字114115116/获取当前温度值117unsignedintgetTmpValue()118119unsignedintvalue;/存放温度数值120floatt;121unsignedcharlow,high;122sendReadCmd();123/连续读取两个字节数据124low=readByte();125high=readByte();126/将高低两个字节合成一个整形变量127value=h
18、igh;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;136137138/显示当前温度值,精确到小数点后一位139voiddisplay(unsignedintv)140141unsignedcharcount;142unsignedchardata
19、s=0,0,0;143datas0=v/100;144datas1=v%100/10;145datas2=v%10;146for(count=0;count3;count+)147148/片选149wela=0;150P0=(0xfe(8-count);/选择第(count+1)个数码管151wela=1;/打开锁存,给它一个下降沿量152wela=0;153/段选154dula=0;155if(count!=1)156157P0=tabledatascount;/显示数字158159else160161P0=tableWidthDotdatascount;/显示带小数点数字162163dul
20、a=1;/打开锁存,给它一个下降沿量164dula=0;165delay(5);/延时5ms,即亮5ms166167/清除段先,让数码管灭,去除对下一位的影响,去掉高位对低位重影168/若想知道影响效果如何,可自行去掉此段代码169/因为数码管是共阴极的,所有灭的代码为:00H170dula=0;171P0=0x00;/显示数字172dula=1;/打开锁存,给它一个下降沿量173dula=0;174175176177voidmain()178179unsignedchari;180unsignedintvalue;181while(1)182183/启动温度转换184sendChangeCm
21、d();185value=getTmpValue();186/显示3次187for(i=0;i3;i+)188189display(value);190191192显示效果:流程图:改进代码: 扩大测量范围, 使可测量范围为: -55度 +125度, 严格按照上面的流程进行软件设计3.15 1:34 修正display()函数中的下一位显示对上一位的影响改进代码1#include2#include3#include/要用到取绝对值函数abs()4/通过DS18B20测试当前环境温度,并通过数码管显示当前温度值,目前显示范围:-55+125度5sbitwela=P27;/数码管位选6sbitdu
22、la=P26;/数码管段选7sbitds=P22;8inttempValue;910/0-F数码管的编码(共阴极)11unsignedcharcodetable=0x3f,0x06,0x5b,0x4f,0x66,120x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;13/0-9数码管的编码(共阴极),带小数点14unsignedcharcodetableWidthDot=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,150x87,0xff,0xef;1617/延时函数,对于11.0592MHz时钟,例i=10,
23、则大概延时10ms.18voiddelay(unsignedinti)1920unsignedintj;21while(i-)2223for(j=0;j0)i-;36ds=1;/产生一个上升沿,进入等待应答状态37i=4;38while(i0)i-;394041voiddsWait()4243unsignedinti;44while(ds);45while(ds);/检测到应答脉冲46i=4;47while(i0)i-;484950/向DS18B20读取一位数据51/读一位,让DS18B20一小周期低电平,然后两小周期高电平,52/之后DS18B20则会输出持续一段时间的一位数据53bitre
24、adBit()5455unsignedinti;56bitb;57ds=0;58i+;/延时约8us,符合协议要求至少保持1us59ds=1;60i+;i+;/延时约16us,符合协议要求的至少延时15us以上61b=ds;62i=8;63while(i0)i-;/延时约64us,符合读时隙不低于60us要求64returnb;656667/读取一字节数据,通过调用readBit()来实现68unsignedcharreadByte()6970unsignedinti;71unsignedcharj,dat;72dat=0;73for(i=0;i8;i+)7475j=readBit();76/
25、最先读出的是最低位数据77dat=(j1);7879returndat;808182/向DS18B20写入一字节数据83voidwriteByte(unsignedchardat)8485unsignedinti;86unsignedcharj;87bitb;88for(j=0;j=1;92/写1,将DQ拉低15us后,在15us60us内将DQ拉高,即完成写193if(b)9495ds=0;96i+;i+;/拉低约16us,符号要求1560us内97ds=1;98i=8;while(i0)i-;/延时约64us,符合写时隙不低于60us要求99100else/写0,将DQ拉低60us120u
26、s101102ds=0;103i=8;while(i0)i-;/拉低约64us,符号要求104ds=1;105i+;i+;/整个写0时隙过程已经超过60us,这里就不用像写1那样,再延时64us了106107108109110/向DS18B20发送温度转换命令111voidsendChangeCmd()112113dsInit();/初始化DS18B20,无论什么命令,首先都要发起初始化114dsWait();/等待DS18B20应答115delay(1);/延时1ms,因为DS18B20会拉低DQ60240us作为应答信号116writeByte(0xcc);/写入跳过序列号命令字SkipR
27、om117writeByte(0x44);/写入温度转换命令字ConvertT118119120/向DS18B20发送读取数据命令121voidsendReadCmd()122123dsInit();124dsWait();125delay(1);126writeByte(0xcc);/写入跳过序列号命令字SkipRom127writeByte(0xbe);/写入读取数据令字ReadScratchpad128129130/获取当前温度值131intgetTmpValue()132133unsignedinttmpvalue;134intvalue;/存放温度数值135floatt;136uns
28、ignedcharlow,high;137sendReadCmd();138/连续读取两个字节数据139low=readByte();140high=readByte();141/将高低两个字节合成一个整形变量142/计算机中对于负数是利用补码来表示的143/若是负值,读取出来的数值是用补码表示的,可直接赋值给int型的value144tmpvalue=high;145tmpvalue0?0.5:-0.5);/大于0加0.5,小于0减0.5155returnvalue;156157158unsignedcharconsttimeCount=3;/动态扫描的时间间隔159/显示当前温度值,精确到小数点后一位160/若先位选再段选,由于IO口默认输出高电平,所以当先位选会使数码管出现乱码161voiddisplay(intv)162163unsignedcharcount;164unsignedchardatas=0,0,0,0,0;165unsignedinttmp=abs(v);166datas0=tmp/10000;167datas1=t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二年级语文教案前
- 《红托竹荪鲜品贮运技术规程》征求意见稿
- 上海市县(2024年-2025年小学五年级语文)人教版期末考试(下学期)试卷及答案
- 一年级数学计算题专项练习1000题集锦
- 三年级语文上册教案
- 江苏省泰州市泰兴市2024-2025学年九年级上学期期中英语试卷(含答案解析)
- 【初中物理】《运动的描述》教学课件-2024-2025学年人教版(2024)八年级物理上册
- 护目镜市场需求与消费特点分析
- 拉力器市场发展预测和趋势分析
- 制药加工工业机器产品供应链分析
- 第9课《这些是大家的》(课件)-部编版道德与法治二年级上册
- 2024年四川省南充市从“五方面人员”中选拔乡镇领导班子成员201人历年高频500题难、易错点模拟试题附带答案详解
- 2024年水电暖安装合同模板
- 2024年母婴护理考试竞赛试题
- 人工智能算力中心项目可行性研究报告写作模板-申批备案
- 2024-2030年中国机器翻译行业市场发展趋势与前景展望战略分析报告
- 三年级语文《那次玩得真高兴:记一次游戏的感受》说课课件
- 高速公路综合监控太阳能供电系统技术方案设计
- 2024年秋新华师大版七年级上册数学 2.4.3去括号和添括号 教学课件
- 2023-2024学年广东省深圳市龙岗区沪教牛津版(深圳用)六年级上册期中英语试卷(无答案)
- 2024年初级银行从业资格《个人理财》考试试题
评论
0/150
提交评论