智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 11348|回复: 6
打印 上一主题 下一主题

有人会K60的DS18B20温度传感器采集吗

[复制链接]

11

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1071
威望
527
贡献
308
兑换币
331
注册时间
2015-10-20
在线时间
118 小时
毕业学校
跳转到指定楼层
1#
发表于 2017-11-26 22:15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我对照时序图和51的代码写的18B20程序,不知道哪里出问题了,一直不能用unsigned int TT;  //1820温度变量   

unsigned char table_temp[5];  
unsigned char temp_comp;  
//初始化
void DS18B20_reset()  
{  
    unsigned char x = 0;
    gpio_init(PTC10,GPO,0);  //输出
    gpio_set (PTC10,1);   
    DELAY_US(16); //稍做延时
    gpio_set (PTC10,0);//将DQ拉低      
    DELAY_US(500);//延时400us~960us
    gpio_set (PTC10,1);   //拉高总线  
    DELAY_US(18);//延时15us~60us
   // gpio_init(PTC10,GPI,0);  //输入
   // x = gpio_get(PTC10); //如果=0则初始化成功 =1则初始化失败

   // gpio_init(PTC10,GPO,0);  //输出
    DELAY_US(100);//延时60us~240us

  /**/
}  

//写一个字节                                                                                                                  
void DS18B20_write(unsigned char dat)  
{  
     unsigned char i;  
     gpio_init(PTC10,GPO,0);  //输出
     for(i = 8; i > 0; i--)  
     {  
         gpio_set (PTC10,0);
         gpio_set (PTC10,dat & 0x01);
         DELAY_US(10);
         gpio_set (PTC10,1);
         dat >>= 1;  
     }  
}
/*******************************************************************/  
/*                                                                 */  
/* 读一个字节                                                      */  
/*                                                                 */  
/*******************************************************************/  
unsigned char DS18B20_data()  
{  
    unsigned char i,dat;
    gpio_init(PTC10,GPI,0);  //输入

    for (i = 8; i > 0; i--)  
    {
      gpio_init(PTC10,GPI,0);

      GPIO_PDOR_REG(GPIOX_BASE(PTC10)) &= ~(1 << PTn(PTC10));
       dat >>= 1;
       gpio_init(PTC10,GPI,1);
       GPIO_PDOR_REG(GPIOX_BASE(PTC10))  |= (1 << PTn(PTC10));
      if(gpio_get(PTC10))
        dat |= 0x80;  
      DELAY_US(8);  
    }
    return dat;  
}  

// 读取温度                                                                                                                          
unsigned int read_temperature()  
{  
    unsigned char a,b;  
    unsigned int t = 0;  
    float tt = 0;  

    DS18B20_reset();//DS18B20复位  
    DS18B20_write(0xcc); //跳过读序号列号的操作  
    DS18B20_write(0x44); //启动温度转换     

    DS18B20_reset();//DS18B20复位  
    DS18B20_write(0xcc); //跳过读序号列号的操作  
    DS18B20_write(0xbe); //读取温度寄存器  
    a = DS18B20_data(); //读低8位  
    b = DS18B20_data();  //读高8位  
    t=b;  
    t<<=8;  
    t=t|a;  
    tt=t*0.0625;  
    t= tt*10+0.5; //放大10倍输出并四舍五入

    return(t);  
}  


回复

使用道具 举报

1

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2989
威望
1396
贡献
933
兑换币
818
注册时间
2016-9-24
在线时间
330 小时
毕业学校
皮皮小学
2#
发表于 2017-11-26 22:51:21 | 只看该作者
如果在51上能用的话可能是delay的时间没有对应上的缘故,如果你的delay_us里是很多for循环之类的话就得改改
回复 支持 反对

使用道具 举报

11

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1071
威望
527
贡献
308
兑换币
331
注册时间
2015-10-20
在线时间
118 小时
毕业学校
3#
 楼主| 发表于 2017-11-27 14:06:23 | 只看该作者
k1060382101 发表于 2017-11-26 22:51
如果在51上能用的话可能是delay的时间没有对应上的缘故,如果你的delay_us里是很多for循环之类的话就得改改

delay_us是用定时器来延时的,时间比for循环还要准确才对。
回复 支持 反对

使用道具 举报

1

主题

57

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2989
威望
1396
贡献
933
兑换币
818
注册时间
2016-9-24
在线时间
330 小时
毕业学校
皮皮小学
4#
发表于 2017-11-27 14:25:23 | 只看该作者
M_Edge 发表于 2017-11-27 14:06
delay_us是用定时器来延时的,时间比for循环还要准确才对。

用定时器延时的话时间间隔上应该没啥问题,或者单独搞一个定时器延时1s间隔LED闪烁的程序,看延时时间对不对,然后就是多对比对比51上的程序,显示部分用的串口或者显示屏的话就注释掉18b20单独检查检查显示部分有没有问题。别的我就不知道了- -
回复 支持 反对

使用道具 举报

11

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1071
威望
527
贡献
308
兑换币
331
注册时间
2015-10-20
在线时间
118 小时
毕业学校
5#
 楼主| 发表于 2017-11-28 15:05:06 | 只看该作者
k1060382101 发表于 2017-11-27 14:25
用定时器延时的话时间间隔上应该没啥问题,或者单独搞一个定时器延时1s间隔LED闪烁的程序,看延时时间对 ...

定时器用很久了,可以确定是准确的,显示部分我用的是OLED12864,这个我也用过很久了。就是不知道为什么移植DS18B20会有问题
回复 支持 反对

使用道具 举报

3

主题

24

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2232
QQ
威望
1054
贡献
652
兑换币
641
注册时间
2011-12-9
在线时间
263 小时
6#
发表于 2017-12-25 15:54:32 | 只看该作者
18b20比较奇葩,启动转换温度后要延时500ms-1000ms左右(跟转换精度有关)才能读温度,否则是读不出来的,建议遇到问题多看规格书
回复 支持 反对

使用道具 举报

11

主题

28

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1071
威望
527
贡献
308
兑换币
331
注册时间
2015-10-20
在线时间
118 小时
毕业学校
7#
 楼主| 发表于 2018-1-29 15:50:25 | 只看该作者
WAITXHURT 发表于 2017-12-25 15:54
18b20比较奇葩,启动转换温度后要延时500ms-1000ms左右(跟转换精度有关)才能读温度,否则是读不出来的, ...

尝试了好久了,没有用。手册看来蛮久了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 19:55 , Processed in 0.048316 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表