用过DS18B20的请进

[复制链接]
3334|16
 楼主| 万山21 发表于 2011-7-17 08:45 | 显示全部楼层 |阅读模式
一段关于DS18B20的程序:
while(1)
{
  Reset();
  write_byte(jump_ROM);
  write_byte(0x4e);               //写暂存器命令
  write_byte(0x02);
  write_byte(0x01);
  write_byte(peizhi);      //写分辨率的配置字节
  Reset();
  write_byte(jump_ROM);
  write_byte(convert);
  write_byte(read_EEROM);
  TMPL = read_byte();
  TMPH = read_byte();
}
不管配置字节改为几分辨率,到最后通过数码管读TMPH和TMPL总是显示05和80,大家帮忙分析分析。为什么啊?
maychang 发表于 2011-7-17 08:48 | 显示全部楼层
DS18B20对时序要求相当严格,时序不符就会发生错误。
hotpower 发表于 2011-7-17 08:58 | 显示全部楼层
采用uart做的“单总线控制器”就没什么时序的要求了~~~

基于 LOOK 系统的助学板 DS18B20 示例
 楼主| 万山21 发表于 2011-7-17 08:59 | 显示全部楼层
上面的程序没有错吗?
 楼主| 万山21 发表于 2011-7-17 08:59 | 显示全部楼层
上面的程序没有错吗?
mcu5i51 发表于 2011-7-17 13:47 | 显示全部楼层
转换后没有延时呀
m97m97 发表于 2011-7-17 14:30 | 显示全部楼层
:victory:
JX小自 发表于 2011-7-17 18:45 | 显示全部楼层
我们课设有做过类似的题目。自己写程序时读写时序都是严格按照datasheet里的要求写的。发现程序无法按照预定的功能实现。最后发现原来复位程序在检测响应后没做240US的延时。加上后,一切都好了
 楼主| 万山21 发表于 2011-7-17 20:36 | 显示全部楼层
6# mcu5i51
加了延时还是不对呀!
ewq123 发表于 2011-7-17 21:41 | 显示全部楼层
最好用汇编控制18B20,因为它对时序的要求比较严,且应该注意延时。
hotpower 发表于 2011-7-17 21:57 | 显示全部楼层
上面的程序没有错吗?
万山21 发表于 2011-7-17 08:59


请搜索“单总线控制器 HotPower”

http://www.baigoogledu.com/s.php?q=%B5%A5%D7%DC%CF%DF%BF%D8%D6%C6%C6%F7+HotPower&num=10
hotpower 发表于 2011-7-17 22:02 | 显示全部楼层
xuyaqi 发表于 2011-7-18 06:45 | 显示全部楼层
18B20除了程序要对,还和用那种cpu及它的晶振频率有关,因这些都会影响“时序”。
wangjun403 发表于 2011-7-18 08:07 | 显示全部楼层
有问题的片子相当多
DS18B20的64位光刻号最低两位是28

可我们用过一批次的是10
mcu5i51 发表于 2011-7-18 08:50 | 显示全部楼层
某项目的部分函数,根据情况改写吧
int readTempDS18B20(bit T)
{
        unsigned char tempL,tempH;
        unsigned int x;
        P3_3 = 1;
        P3_4 = 1;
        DS_Rest();
        OWWriteByte(0xcc);                 //跳过ROM
        OWWriteByte(0x44);                //启动温度转换
        SetDatOut();   IO转换 忽略
        wait(SYSTIM); 1秒

        SetDatIn();      IO转换 忽略

        DS_Rest();
        OWWriteByte(0xcc);                //跳过ROM
        OWWriteByte(0xbe);                //读数据
        tempL=OWReadbyte();
        tempH=OWReadbyte();
        P3_3 = 0;
        P3_4 = 0;


        x=((unsigned int)tempH<<8)|tempL;
        if(T) return((int)x*10/16);
        return((int)x);
}
 楼主| 万山21 发表于 2011-8-15 11:08 | 显示全部楼层

谢过大家了!
sarang202 发表于 2011-8-15 15:51 | 显示全部楼层
https://bbs.21ic.com/icview-227465-1-1.html
前面我发过的帖子你看一下,或许对你有帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

267

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部