搜索
bottom↓
回复: 15

DS18B20测温始终为0度,还有就是DS18B20采集的温度怎么传给RT...

[复制链接]

出0入0汤圆

发表于 2016-8-17 15:53:42 | 显示全部楼层 |阅读模式
本帖最后由 靳涛5128121 于 2016-8-18 11:06 编辑

#include "ds18b20.h"
//#include "delay.h"       
#include "bsp.h"
#include "stm32f4xx.h"
#include "max6675.h"
#include <rtthread.h>
#include "rtdef.h"
//////////////////////////////////////////////////////////////////////////////////         
static struct rt_device DS18B20;
//复位DS18B20
void DS18B20_Rst(void)          
{        
       
        DS18B20_IO_OUT(); //SET PG11 OUTPUT
  DS18B20_DQ_OUT=0; //拉低DQ

//        delay_us(750);    //拉低750us

        DelayXus(250);   //750=3*250
        DelayXus(250);
        DelayXus(250);
  DS18B20_DQ_OUT=1; //DQ=1
//        delay_us(15);     //15US

        DelayXus(15);

}
//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
int DS18B20_Check(void)           
{   
        u8 retry=0;
        DS18B20_IO_IN();//SET PB4 INPUT         
    while (DS18B20_DQ_IN&&retry<200)
        {
                retry++;
//                delay_us(1);

                DelayXus(1);
        };         
        if(retry>=200)return 1;
        else retry=0;
    while (!DS18B20_DQ_IN&&retry<240)
        {
                retry++;
        //        delay_us(1);
                DelayXus(1);
        };
        if(retry>=240)return 1;            
        return 0;
}
//从DS18B20读取一个位
//返回值:1/0
rt_uint8_t DS18B20_Read_Bit(void)                          // read one bit
{
  u8 data;
        DS18B20_IO_OUT();//SET PB4 OUTPUT
  DS18B20_DQ_OUT=0;
//        delay_us(2);

        DelayXus(2);
  DS18B20_DQ_OUT=1;
        DS18B20_IO_IN();//SET PB4 INPUT
//        delay_us(12);

        DelayXus(12);
        if(DS18B20_DQ_IN)data=1;
  else data=0;         
// delay_us(50);
        DelayXus(50);

  return data;
}
//从DS18B20读取一个字节
//返回值:读到的数据
rt_uint8_t DS18B20_Read_Byte(void)    // read one byte
{        
    u8 i,j,dat;
    dat=0;
        for (i=1;i<=8;i++)
        {
        j=DS18B20_Read_Bit();
        dat=(j<<7)|(dat>>1);
    }                                                    
    return dat;
}
//写一个字节到DS18B20
//dat:要写入的字节
rt_uint8_t DS18B20_Write_Byte(u8 dat)
{            
    u8 j;
    u8 testb;
          DS18B20_IO_OUT();//SET PB4 OUTPUT;
    for (j=1;j<=8;j++)
        {
        testb=(dat)&0x01;
        dat=dat>>1;
        if (testb)
        {
            DS18B20_DQ_OUT=0;// Write 1
            //delay_us(2);

                                        DelayXus(2);
            DS18B20_DQ_OUT=1;
           // delay_us(60);
                                          DelayXus(60);                                                                
        }
        else
        {
            DS18B20_DQ_OUT=0;// Write 0
         //   delay_us(60);
                                        DelayXus(60);                
                       
            DS18B20_DQ_OUT=1;
         //   delay_us(2);  
                                        DelayXus(2);
        }
    }
}
//开始温度转换
void DS18B20_Start(void)// ds1820 start convert
{                                                                 
    DS18B20_Rst();          
          DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0x44);// convert
}
//初始化DS18B20的IO口 DQ 同时检测DS的存在
//返回1:不存在
//返回0:存在   
int DS18B20_Init()
{
        //rt_spi_device_init(&DS18B20,&cs,"DS18B20",spi_bus);
        GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOG时钟

  //GPIOB4
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

        DS18B20_Rst();
        return DS18B20_Check();     //检测18B20的应答信号,为1说明没有检测到18B20,返回0则说明检测到18B20的信号
}  
//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250)
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
          short tem;
    DS18B20_Start ();                    // ds1820 start convert
    DS18B20_Rst();
          DS18B20_Rst();
    DS18B20_Check();         
    DS18B20_Write_Byte(0xcc);// skip rom
    DS18B20_Write_Byte(0xbe);// convert            
    TL=DS18B20_Read_Byte(); // LSB   
    TH=DS18B20_Read_Byte(); // MSB   
    if(TH>7)
    {
        TH=~TH;
        TL=~TL;
        temp=0;//温度为负  
    }else temp=1;//温度为正                    
    tem=TH; //获得高八位
    tem<<=8;   
    tem+=TL;//获得底八位
    tem=(double)tem*0.625;//转换     
        if(temp)return tem; //返回温度值
        else return -tem;   
}



static void DelayXus(unsigned char n)                //延时基准1us
{
        unsigned char i;
        while (n--)
        {
        i = 2;
        while (--i);
        }
}




//device


static rt_err_t _18B20init(rt_device_t dev)
{
    return RT_EOK;
}
static rt_err_t _18B20open(rt_device_t dev, rt_uint16_t oflag)
{
    return RT_EOK;
}
static rt_err_t _18B20close(rt_device_t dev)
{
    return RT_EOK;
}
static rt_err_t _18B20control(rt_device_t dev, rt_uint8_t cmd, void *args)
{
   return RT_EOK;
}
static rt_size_t  _18B20wrte(rt_device_t dev, rt_off_t pos, const void* buffer,rt_size_t size)
{
        rt_uint8_t *buf;
        buf=(rt_uint8_t *)buffer;
           while(size)
                 {
                 DS18B20_Write_Byte(*buf);   
                         buf++;
                 size--;
                 }
        return RT_EOK;
}


static rt_size_t _18B20read(rt_device_t dev, rt_off_t pos, const void* buffer,rt_size_t size)
{
        rt_uint8_t *buf;
        buf=(rt_uint8_t *)buffer;
           while(size)
                 {
                         *buf=DS18B20_Read_Byte();         
                                              buf++;
                           size--;
                 }
                return  RT_EOK;
}

int DS18B20_DeviceInit(void)   //device
{
        int t;

        DS18B20.init=_18B20init;
  DS18B20.open=_18B20open;
  DS18B20.close=_18B20close;
  DS18B20.control=_18B20control;
  DS18B20.read=_18B20read;
        DS18B20.write=_18B20wrte;
       
       
  t=DS18B20_Init();
  rt_device_register(&DS18B20, "DS18B20",
                       RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
        return t;
}
INIT_DEVICE_EXPORT(DS18B20_DeviceInit);



大神们,遇到问题DS18B20怎么和RTT连接,小弟初学,以上是我写的,请问有错么,还有就是有没有相关例程参考下,在线等

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2016-8-17 16:02:42 | 显示全部楼层
楼主,注意标题。哈。改下吧。
不知道的话,先看一下论坛通告。

出0入0汤圆

发表于 2016-8-17 16:04:28 | 显示全部楼层
先多看看资料 文档 这个资料论坛很多吧

出0入0汤圆

发表于 2016-8-17 16:07:07 | 显示全部楼层
楼主给个看得懂的标题吧
头像被屏蔽

出0入0汤圆

发表于 2016-8-17 16:12:48 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2016-8-17 17:26:56 | 显示全部楼层
我是来跟楼主说再见的

出0入0汤圆

发表于 2016-8-17 17:32:52 来自手机 | 显示全部楼层
楼主你好,楼主再见

出0入0汤圆

发表于 2016-8-17 17:58:02 | 显示全部楼层
LZ,赶紧改标题

出0入0汤圆

发表于 2016-8-17 21:30:38 | 显示全部楼层
大伙都看着楼主标题着急呢

出0入0汤圆

发表于 2016-8-17 21:42:11 | 显示全部楼层
楼主赶快改改标题

出0入0汤圆

发表于 2016-8-17 22:24:18 来自手机 | 显示全部楼层
楼主你好,楼主再见。

出0入0汤圆

发表于 2016-8-17 22:36:46 | 显示全部楼层
不知道为什么那么多发帖的人,都不会抬头看一下文字输入框上面那行红色字体

出0入0汤圆

发表于 2016-8-18 09:11:00 来自手机 | 显示全部楼层
楼主新人吧,快改标题
头像被屏蔽

出0入0汤圆

发表于 2016-8-18 09:16:48 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

出0入0汤圆

发表于 2016-8-19 17:31:28 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2016-8-22 20:29:41 | 显示全部楼层
单总线通讯对时序要求高,最好使用关中断等措施保证时序要求。温度不需要传给rtt的,如果要形成驱动框架可以到Linux里找找,然后模仿一下就可以。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 23:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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