OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6125|回复: 1

ds18b20程序有问题 求解

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-8-18
在线时间
0 小时
发表于 2013-8-27 22:53:27 | 显示全部楼层 |阅读模式

//=========================DS18b20.c================================//

#include "stm32f10x_lib.h"

#include "18b20.h"

#include "delay.h"

/******************************************

函数名称:GPIO_DQ_Out_Mode

    能:设置DQ引脚为开漏输出模式

    数:无

返回值  :无

*******************************************/

void GPIO_DQ_Out_Mode(void)

{

    GPIO_InitTypeDef GPIO_InitStructure ;

    GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //开漏输出

    GPIO_Init(DQ_GPIO ,&GPIO_InitStructure) ;

}

/******************************************

函数名称:GPIO_DQ_Input_Mode

    能:设置DQ引脚为浮空输入模式

    数:无

返回值  :无

*******************************************/

void GPIO_DQ_Input_Mode(void)

{

    GPIO_InitTypeDef GPIO_InitStructure ;

   

    GPIO_InitStructure.GPIO_Pin = DQ_GPIO_Pin ;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ; //浮空输入

    GPIO_Init(DQ_GPIO ,&GPIO_InitStructure) ;

}

/******************************************

函数名称:Tx_ResetPulse

    能:发送复位脉冲

    数:无

返回值  :无

*******************************************/

void Tx_ResetPulse(void)

{

    GPIO_DQ_Out_Mode() ;

    DQ_Write_0() ;  //复位脉冲

    Delay_Nus(500) ; //至少保持480us

    DQ_Write_1() ;  //加速上升沿速度

    Delay_Nus(1) ;

}

/******************************************

函数名称:Write_OneByte_ToDS18b20

    能:写一个字节到DS18b20

    数:无

返回值  :无

*******************************************/

void Write_OneByte_ToDS18b20(unsigned char data)

{

    unsigned char i ;

    GPIO_DQ_Out_Mode() ;

    for(i=0 ;i<8 ;i++)

    {

        if(data&0x01)    //低位在前

        {

            //1

            DQ_Write_0() ; //写时间空隙总是从总线的低电平开始

            Delay_Nus(8) ;  //15us内拉高

            DQ_Write_1() ;

            Delay_Nus(80) ; //整个写1时隙不低于60us

        }

        else

        {

            //0

            DQ_Write_0() ;

            Delay_Nus(110) ; //保持在60us120us之间

            DQ_Write_1() ;

            Delay_Nus(5) ;

        }

        data >>= 1 ;

    }

}

/******************************************

函数名称:Read_OneByte_FromDS18b20

    能:从DS18b20读一个字节

    数:无

返回值  :读出的数据

*******************************************/

unsigned char Read_OneByte_FromDS18b20(void)

{

    unsigned char i ,data = 0 ;

   

    for(i=0 ;i<8 ;i++)

    {

        GPIO_DQ_Out_Mode() ;

        data >>= 1 ;

        DQ_Write_0() ;

        Delay_Nus(2) ;

        GPIO_DQ_Input_Mode() ;

        Delay_Nus(1) ;

        if(DQ_ReadBit())

        {

            data |= 0x80 ;

        }

        Delay_Nus(70) ;   //等待这一位数据完成传输

    }

    GPIO_DQ_Out_Mode() ;

    return data ;

}

/******************************************

函数名称:Read_Temperature

    能:读取温度信息

    数:*sign - 保存符号(零上或零下)

          *integer - 保存整数部分

          *decimal - 保存小数部分

返回值  :无

*******************************************/

unsigned int Read_Temperature(void)

{

    unsigned int a=0;

    unsigned int b=0;

                   unsigned int t;

    //volatile unsigned char c=0;

    //volatile unsigned char d=0;

    //volatile unsigned char e=0;

   

  //  unsigned int tmp ;

   

    DS18B20_Init();

    Write_OneByte_ToDS18b20(ROM_Read_Cmd);

 

    DS18B20_Init();

    Write_OneByte_ToDS18b20(ROM_Skip_Cmd);//跳过读序列号操作

    Write_OneByte_ToDS18b20(Convert_T); //启动温度转换

    Delay_Nms(780);//等待DS18b20转换完成

   

    DS18B20_Init();

    Write_OneByte_ToDS18b20(ROM_Skip_Cmd);

    Write_OneByte_ToDS18b20(Read_Scratchpad); //读取寄存器内容(可以从寄存器0读到寄存器8

   

    a= Read_OneByte_FromDS18b20();     //温度低8

    b= Read_OneByte_FromDS18b20();     //温度高8

          a=a>>4;                             //低位右移4位,舍弃小数部分

   b=b<<4;                             //高位左移5位,舍弃符号位

   t=a|b;    

   return(t);                          //返回角度的値

        

}

 

/******************************************

函数名称:DS18B20_Init

    能:初始化DS18b20

    数:无

返回值  :无

*******************************************/

void DS18B20_Init(void)

{

    Tx_ResetPulse();

  }
输出是用数码管输出,输出没问题,就是18b20没有工作,无法得到问题,不知道程序有什么问题

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-27 23:15:48 | 显示全部楼层
检查时序吧,ds18b20对时序要求严格。

可以参考下我们的例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 05:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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