打印

用过DS18B20的请进

[复制链接]
2369|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 | 只看该作者
上面的程序没有错吗?

使用特权

评论回复
5
万山21|  楼主 | 2011-7-17 08:59 | 只看该作者
上面的程序没有错吗?

使用特权

评论回复
6
mcu5i51| | 2011-7-17 13:47 | 只看该作者
转换后没有延时呀

使用特权

评论回复
7
m97m97| | 2011-7-17 14:30 | 只看该作者
:victory:

使用特权

评论回复
8
JX小自| | 2011-7-17 18:45 | 只看该作者
我们课设有做过类似的题目。自己写程序时读写时序都是严格按照datasheet里的要求写的。发现程序无法按照预定的功能实现。最后发现原来复位程序在检测响应后没做240US的延时。加上后,一切都好了

使用特权

评论回复
9
万山21|  楼主 | 2011-7-17 20:36 | 只看该作者
6# mcu5i51
加了延时还是不对呀!

使用特权

评论回复
10
ewq123| | 2011-7-17 21:41 | 只看该作者
最好用汇编控制18B20,因为它对时序的要求比较严,且应该注意延时。

使用特权

评论回复
11
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

使用特权

评论回复
12
hotpower| | 2011-7-17 22:02 | 只看该作者
13
xuyaqi| | 2011-7-18 06:45 | 只看该作者
18B20除了程序要对,还和用那种cpu及它的晶振频率有关,因这些都会影响“时序”。

使用特权

评论回复
14
wangjun403| | 2011-7-18 08:07 | 只看该作者
有问题的片子相当多
DS18B20的64位光刻号最低两位是28

可我们用过一批次的是10

使用特权

评论回复
15
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);
}

使用特权

评论回复
16
万山21|  楼主 | 2011-8-15 11:08 | 只看该作者

谢过大家了!

使用特权

评论回复
17
sarang202| | 2011-8-15 15:51 | 只看该作者
https://bbs.21ic.com/icview-227465-1-1.html
前面我发过的帖子你看一下,或许对你有帮助

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

267

帖子

1

粉丝