DS18B20应用笔记.docx

上传人:scccc 文档编号:12437649 上传时间:2021-12-03 格式:DOCX 页数:6 大小:78.12KB
返回 下载 相关 举报
DS18B20应用笔记.docx_第1页
第1页 / 共6页
DS18B20应用笔记.docx_第2页
第2页 / 共6页
DS18B20应用笔记.docx_第3页
第3页 / 共6页
DS18B20应用笔记.docx_第4页
第4页 / 共6页
DS18B20应用笔记.docx_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《DS18B20应用笔记.docx》由会员分享,可在线阅读,更多相关《DS18B20应用笔记.docx(6页珍藏版)》请在三一文库上搜索。

1、DS18B20应用笔记DS18B20应用笔记2010-03-04 13:03:54高),此时置端口为输入,读取DS18B20的数据,由于其数据有效时间仅为下 降沿后15us以内,也就是说在读时隙时,主机必须在15us内完成读数,而不 是很多中文datasheet所谓的“延时15us后再开始读数。同时每一个读时隙需 持续至少60us,所以读完数据后要做足够的延时才可进行下一个读时隙;2)、 写时序中,最根本的是写1和写。的时序不一样,所以要分别写子函数,同样 结合datasheet完成写时序的精确化。又严格地修改了读写时序后,上电测试, LCD显示变成了 43 而且手触DS18B20,温度也能增

2、加,说明DS18B20再 正常工作,着实让人很振奋。现在的问题就是说,显示的温度不正确,但是我 很自信地意识到离胜利已经不远了。因不能在线Debug,所以我只好单步用心算执行,再看到读数据子函数时, 潜意识告诉我这个循环有点问题,于是我在草稿纸上按循环一步步来,当写完 第二个循环后,找到问题了,因一个移位操作放在循环的最后,也就是说循环 外return语句所返回的结果相对实际测量的结果右移了一位!当我把该移位操 作放在循环开始的地方时,LCD众望所归地显示了 24.9,手触DS18B20,它 直线上升到34.8,考虑到环境因素的影响,这个值已经让我很满意了。大功告 成,此时看看时间,己经是凌晨

3、1点58分了,不过庆幸地是这个夜熬得值!ds18b20应用笔记2007-12-18 20:35:091分类;C51及其他|标签;|字号大中小订阅最近做了个东东,需要用到ds18b20, ds18b20的应用早就不是什么新东西了,网上的例程比比皆是, 想着很容易就会搞定,结果还是花了我几个小时的时间,想来有些郁闷。我也是从网上下的例程开始的:这个例程是这样的, 功能:实现对DS18B20的读取原理:单总线协议注意:单总线协议对延时要求比较严格,此程序中采用的是11.0592M的晶振,如果使用其他的晶振请跟据DS18B20的资料修改延时参数版本:1.4b最后修改时间:2004年11月8号开发人,鞠

4、春阳版权:哈尔滨众邦龙开发有限公司 单片机坐标网:www,mcuzbcom*/#includeMreg51.h" sbit DQ =P1A4; 定义通信端口延时函数void delay(unsigned int i)(while(i-);)7初始化函数lnit_DSl8B20(void) (unsigned char x=0;DQ = 1; /DQ 友位delay(8); 稍做延时DQ = 0; 单片机将DQ拉低delay(80); 精确延时大于480usDQ = 1; 拉高总线delay(14);x=DQ; 稍做延时后如果x=0则初始化成功x=1则初始化失败 delay(20);)

5、读一个字节ReadOneChar(void) (unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i-)(DQ = 0;/给脉冲信号dat»=1;DQ = 1;/给脉冲信号 if(DQ) dat|=0x80;delay(4);)return(dat);写一个字节WriteOneChar(unsigned char dat) ( unsigned char i=0;for (i=8; i>0; i-)DQ = 0;DQ = dat&OxO1;delay ;DQ = 1;dat»=1;)/delay(4

6、);)读取温度ReadTemperature(void) (unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=O;lnit_DSl8B20();WriteOneChar(OxCC);/跳过读序号列号的操作WriteOneChar(Ox44); / 启动温度转换 lnit_DSl8B20();WriteOneChar(OxCC); 跳过读序号列号的操作WriteOneChar(OxBE); 读取温度寄存器等(共可读9个寄存器)前两个就是温度 a=ReadOneChar();b=ReadOneChar(); t=b;t

7、71;=8;t=t|a;tW0.0625;/t= tt*10+0.5; 放大10倍输出并四舍五入一此行没用 return ;)main() ( unsigned char i=0;while(1)(i=ReadTemperature();读说实话,这个程序写的是相当好的,也很容易实现,只是对于不同的振涉频率来说,延时过程还是需要调 弗.我从网上下载了个DS18B20的资料,是中文的,我也没太仔细看前面的,对照着把时序给检查了一下没 有什么问题,然后按照我的晶体的频率,把时延进行了调整,接到机器上,数值很快就读出来了。问题就出在读出来的数上了.按程序上的,结果是要乘于0.0625的,我以为是作者

8、另有意图呢,毕竟每个人的使用都有自己的特点,因为接照我下的资料,结果是不能乘于0.0625的,而是去掉最后一位直接 变成数值就可以。这个我可犯了难了,首先想到的就是程序的时序不对,查,再查,没有问题;时延也不 准,变,再变,再改,还是一样的值,看来应该不是这些的问题吧,换一个DS18B20,还是一样。那能 是什么呢? ?再资料好好看看吧。这一看,找出问题来了,我下的中文资料,名字是DS18B20,开头的几页说的也是 DS18B20,而到后面说着说着就变成了 DS1820,难道1820和18B20不同? ? ? ?重新上网,下了英文原版的资,一查,果然。两者的一线协议是想同的,读数的方法也是相同的,只是读 出的结果对应温度的方式是不同的,而DS18B20,的确是要乘以0.0625的,这时距我改好上面的程序已经有近2个小时过去了,郁闷不由而生教训:对资料的使用一定要看原版的,至少要中英文对照,国内的有些人,或所谓的公司(我下的资料就 是某个公司的)翻译的资料太水了,他们自己都不是太明白的东东都拿出来给人用,最终是谁用就害了谁。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1