您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > ds18b2详解及程序(活动za)
最近都在学习和写单片机的程序,今天有空又模仿温度测量显示实验写了一个与基于单总线通信的程序.数字温度传感器(参考:智能温度传感器的原理与应用)是公司生产的-,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。产品的特点:()、只要求一个口即可实现通信。()、在中的每个器件上都有独一无二的序列号。()、实际应用中不需要外部任何元器件即可实现测温。()、测量温度范围在-到+℃之间;在℃范围内误差为±℃;()、数字温度计的分辨率用户可以从位到位选择。将位的温度值转换为数字量所需进度不超过;()、内部有温度上、下限告警设置。引脚分布图详细引脚功能描述:、地信号。、数据输入出引脚。开漏单总线接口引脚。当被用在寄生电源下,此引脚可以向器件提供电源。漏极开路,常太下高电平.通常要求外接一个约Ω的上拉电阻.、可选择的引脚。电压范围;当工作于寄生电源时,此引脚必须接地。存储器结构图暂存储器的头两个字节为测得温度信息的低位和高位字节;第,字节是和的易失性拷贝,在每次电复位时都会被刷新;第字节是配置寄存器的易失性拷贝,同样在电复位时被刷新;第字节是前面个字节的检验值.配置寄存器的命令内容如下:和是温度值分辨率位,按下表进行配置.默认出厂设置是,即位.温度值分辨率配置表分辨率最大转换进度()()()()()种分辨率对应的温度分辨率为℃,℃,℃,℃(即最低一位代表的温度值)位分辨率时的两个温度字节的具体格式如下:低字节:^^^^^^^^高字节:^^^其中高字节前位都是符号位,若分辨率低于位时,相应地使最低为,如:当分辨率为位时,低字节为:^^^^^^,高字节不变....一些温度与转换后输出的数字参照如下:温度数字输出换成进制℃℃℃℃℃℃℃℃℃℃由上表可看出,当输出是负温度时,使用补码表示,方便计算机运算(若是用语言,直接将结果赋值给一个变量即可).的使用方法:由于采用的是-总线协议方式,即在一根数据线实现数据的双向传输,而对单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对芯片的访问。由于是在一根线上读写数据,因此,对读写的数据位有着严格的时序要求。有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序(()实现)、读时序(())、写时序(())。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。与单片机连接电路图:利用软件模拟的单线协议和命令:主机操作必须遵循下面的顺序.初始化单线总线上的所有操作都是从初始化开始的.过程如下:)请求:主机通过拉低单线以上,产生复位脉冲,然后释放该线,进入接收模式.主机释放总线时,会产生一个上升沿脉冲.:())响应:检测到该上升沿后,延时,通过拉低总线来产生应答脉冲.:()())接收响应:主机接收到从机的应答脉冲后,说明有单线器件在线.至此,初始化完成.:.操作命令当主机检测到应答脉冲,便可发起操作命令.共有类操作命令,如下表命令类型命令字节功能读读取激光中的位,只能用于总线上单个器件情况,多挂时会发生数据冲突匹配此命令后跟位序列号,寻址多挂总线上的对应.只有序列号完全匹配的才能响应后面的内存操作命令,其他不匹配的将等待复位脉冲.可用于单挂或多挂两种情况.跳过可无须提供位序列号即可运行内存操作命令,只能用于单挂.搜索通过一个排除法过程,识别出总线上所有器件的序列号告警搜索命令进程安排与相同,但只有最近的一次温度测量时满足了告警触发条件的,才会响应此命令..内存操作命令在成功执行操作命令后,才可使用内存操作命令.共有种内存操作命令:命令类型命令字节功能写暂存器写暂存器中地址地址的个字节(和配置寄存器)在发起复位脉冲之前个字节都必须要写.读暂存器读取暂存器内容,从字节一直到字节,共个字节,主机可随时发起复位脉冲,停止此操作,通常我们只需读前个字节.复制暂存器将暂存器中的内容复制进,以便将温度告警触发字节存入非易失内存.如果此命令后主机产生读时隙,那么只要器件还在进行复制都会输出,复制完成后输出.温度转换开始温度转换操作.若在此命令后主机产生时隙,那么只要器件还在进行温度转换就会输出,转换完成后输出.重调暂存器将存储在中的温度告警触发值和配置寄存器值重新拷贝到暂存器中,此操作在加电时自动产生.读供电方式主机发起此命令后每个读数时隙内会发信号通知它的供电方式寄生电源,外部供电..数据处理要求有严格的时序来保证数据的完整性.在单线上,有复位脉冲,应答脉冲,写,写,读,读这种信号类型.除了应答脉冲外,其它都由主机产生.数据位的读和写是通过读、写时隙实现的.)写时隙:当主机将数据线从高电平拉至低电平时,产生写时隙.所有写时隙都必须在以上,各写时隙间必须保证的恢复进度.写:主机将数据线先拉低,然后释放后,将数据线拉高;写:主机将拉低并至少保持以上.)读时隙:当主机将数据线从高电平拉至低电平时,产生读时隙.所有读时隙最短必须持续,各读时隙间必须保证的恢复进度.读:主机将拉低至少,.此时主机马上将拉高,然后就可以延时后,读取即可.源代码:(测量范围:度)通过测试当前环境温度,并通过数码管显示当前温度值^;数码管位选^;数码管段选^;数码管的编码(共阴极)[]{,};数码管的编码(共阴极),带小数点[]{,,,,,,,,,};延时函数,例,则大概延时.(){,;(;;){(;;);}}初始化让一段相对长进度低电平,然后一段相对非常短进度高电平,即可启动(){一定要使用型,一个指令的进度,作为与通信的小进度间隔以下都是一样使用型;;;();;;();}向读取一位数据读一位,让一小周期低电平,然后两小周期高电平,之后则会输出持续一段进度的一位数据(){;;;;;;;;;();;}读取一字节数据,通过调用()来实现(){;,;;(;;){();最先读出的是最低位数据()();};}向写入一字节数据(){;;;(;;){;;写,让低电平持续个小延时,高电平持续个小延时(){;;;;;();}写,让低电平持续个小延时,高电平持续个小延时{;;();;;;}}}向发送温度转换命令(){();初始化();延时();写入跳过序列号命令字();写入温度转换命令字}向发送读取数据命令(){();();();写入跳过序列号命令字();写入读取数据令字}获取当前温度值(){;存放温度数值;,;();连续读取两个字节数据();();将高低两个字节合成一个整形变量;;;的精确度为度,即读回数据的最低位代表度*;将它放大倍,使显示时可显示小数点后一位,并对小数点后第二进行舍入如,进行计数后,得到,即度*;;}显示当前温度值,精确到小数点后一位(){;[]{,,};[];[];[];(;;){片选;(()(()));选择第()个数码管;打开锁存,给它一个下降沿量;段选;(){[[]];显示数字}{[[]];显示带小数点数字};打开锁存,给它一个下降沿量;();延时,即亮清除段先,让数码管灭,去除对下一位的影响,去掉高位对低位重影若想知道影响效果如何,可自行去掉此段代码因为数码管是共阴极的,所有灭的代码为:;;显示数字;打开锁存,给它一个下降沿量;}}(){;;(){启动温度转换();();显示次(;;){();}}}显示效果:进程安排图:改进代码:扩大测量范围,使可测量范围为:度度,严格按照上面的进程安排进行软件设计修正()函数中的下一位显示对上一位的影响改进代码要用到取绝对值函数()通过测试当前环境温度,并通过数码管显示当前温度值,目前显示范围:度^;数码管位选^;数码管段选^;;数码管的编码(共阴极)[]{,};数码管的编码(共阴极),带小数点[]{,,,,,,,,,};延时函数,对于时钟,例,则大概延时.(){;(){(;;);}}初始化让一段相对长进度低电平,然后一段相对非常短进度高电平,即可启动(){对于时钟,型的,作一个操作的进度大于为;;;拉低约,符合协议要求的以上();;产生一个上升沿,进入等待应答状态;();}(){;();();检测到应答脉冲;();}向读取一位数据读一位,让一小周期低电平,然后两小周期高电平,之后则会输出持续一段进度的一位数据(){;;;;延时约,符合协议要求至少保持;;;延时约,符合协议要求的至少延时以上;;();延时约,符合读时隙不低于要求;}读取一字节数据,通过调用()来实现(){;,;;(;;){();最先读出的是最低位数据()();};}向写入一字节数据(){;;;(;;){;;写,将拉低后,在内将拉高,即完成写(){;;;拉低约,符号要求内;;();延时约,符合写时隙不低于要求}写,将拉低{;;();拉低约,符号要求;;;整个写时隙过程已经超过,这里就不用像写那样,再延时了}}}向发送温度转换命令(){();初始化,无论什么命令,首先都要发起初始化();等待应答();延时,因为会拉低作为应答信号();写入跳过序列号命令字();写入温度转换命令字}向发送读取数据命令(){();();();();写入跳过序列号命令字();写入读取数据令字}获取当前温度值(){;;存放温度数值;,;();连续读取两个字节数据();();将高低两个字节合成一个整形变量计算机中对于负数是利用补码来表示的若是负值,读取出来的数值是用补码表示的,可直接赋值给型的;;;;使用的默认分辨率位,精确度为度,即读回数据的最低位代表度*;将它放大倍,使显示时可显示小数点后两位,并对小数点后第三进行舍入如,进行计数后,得到,即度如,进行计数后,得到,即度*(?:);大于加,小于减;};动态扫描的进度间隔显示当前温度值,精确到小数点后一位若先位选再段选,由于口默认输出高电平,所以当先位选会使数码管出现乱码(){;[]{,,,,};();[];[];[];[];[];(){关位选,去除对上一位的影响;;打开锁存,给它一个下降沿量;段选;显示号;打开锁存,给它一个下降沿量;位选;;打开锁存,给它一个下降沿量;();}(;;){关位选,去除对上一位的影响;;打开锁存,给它一个下降沿量;段选(){*(([])(([])([]))){;当最高位为时,不作显示}*[[]];显示数字}{[[]];显示带小数点数字};打开锁存,给它一个下降沿量;位选(,);选择第()个数码管;打开锁存,给它一个下降沿量;();}}(){;(){启动温度转换();显示次(;;){();}();}}改进后的效果图:只有一位小数两位小数,并消除下一位对上一位的影响
本文标题:ds18b2详解及程序(活动za)
链接地址:https://www.777doc.com/doc-5584690 .html