OpenEdv-开源电子网

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

DS18B20 函数库版

[复制链接]

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
发表于 2014-1-23 22:28:15 | 显示全部楼层 |阅读模式
利用原子哥的寄存器版本的DS18B20的程序修改了函数库版本的程序,可是发现程序死在DS18B20_Check函数中,请各位大神指点一下,谢谢;
#include "ds18b20.h"
#include "SysTick.h"


static GPIO_DS18B20_Input() 
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure) ;
}
static GPIO_DS18B20_Output() 
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//通用推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure) ;
}
//复位DS18B20
void DS18B20_Rst(void)   
{                 
GPIO_DS18B20_Output(); //设置PA0为输出模式
    GPIO_ResetBits(GPIOA,GPIO_Pin_0); //拉低DQ
    Delay_us(750);    //拉低750us
    GPIO_SetBits(GPIOA,GPIO_Pin_0); //DQ=1 
Delay_us(15);     //15US
}

//等待DS18B20的回应
//返回1:未检测到DS18B20的存在
//返回0:存在
uint8_t DS18B20_Check(void)   
{   
u8 retry=0;
GPIO_DS18B20_Input();//设置PA0为输入模式  
    while (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)&&retry<220)
{
retry++;
Delay_us(1);
};  
if(retry>=220)return 1;
else retry=0;
    while (!GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)&&retry<240)
{
retry++;
Delay_us(1);
};
if(retry>=240)return 1;    
return 0;
}

//从DS18B20读取一个位
//返回值:1/0
uint8_t DS18B20_Read_Bit(void) // read one bit
{
    u8 data;
GPIO_DS18B20_Output(); //设置PA0为输出模式
    GPIO_ResetBits(GPIOA,GPIO_Pin_0); 
Delay_us(2);
    GPIO_SetBits(GPIOA,GPIO_Pin_0); 
GPIO_DS18B20_Input();//设置PA0为输入模式
Delay_us(12);
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0))data=1;
    else data=0;  
    Delay_us(50);           
    return data;
}

//从DS18B20读取一个字节
//返回值:读到的数据
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:要写入的字节
void DS18B20_Write_Byte(uint8_t dat)     
 {             
    u8 j;
    u8 testb;
GPIO_DS18B20_Output(); //设置PA0为输出模式
    for (j=1;j<=8;j++) 
{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            GPIO_ResetBits(GPIOA,GPIO_Pin_0);// Write 1
            Delay_us(2);                            
            GPIO_SetBits(GPIOA,GPIO_Pin_0);
            Delay_us(60);             
        }
        else 
        {
            GPIO_ResetBits(GPIOA,GPIO_Pin_0);// Write 0
            Delay_us(60);             
            GPIO_SetBits(GPIOA,GPIO_Pin_0);
            Delay_us(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:存在      
uint8_t DS18B20_Init(void)
{
GPIO_DS18B20_Output(); //设置PA0为输出模式
GPIO_SetBits(GPIOA,GPIO_Pin_0);
DS18B20_Rst();
return DS18B20_Check();
}

//从ds18b20得到温度值
//精度:0.1C
//返回值:温度值 (-550~1250) 
uint16_t DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
uint16_t tem;
    DS18B20_Start ();                    // ds1820 start convert
    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=(float)tem*0.625;//转换     
if(temp)return tem; //返回温度值
else return -tem;    
}
之前用寄存器版本的在STM32 mini板子上跑没有问题~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-1-24 09:16:27 | 显示全部楼层
检查你的Delay_us函数,是不是准确?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
 楼主| 发表于 2014-1-24 10:52:31 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
延时函数使用SysTick做的,没有问题,我之前单用这个延时做的1s闪烁LED,没有问题。
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2014-1-24 11:41:19 | 显示全部楼层
原子哥不是有库函数的吗,你用那个试试,我改的那个没问题的。
态度决定一切
回复 支持 反对

使用道具 举报

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
 楼主| 发表于 2014-1-26 19:27:52 | 显示全部楼层
回复【4楼】冰封嗜魔:
---------------------------------
能不能麻烦上传一个呢  谢谢
回复 支持 反对

使用道具 举报

54

主题

1008

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2384
金钱
2384
注册时间
2012-11-22
在线时间
403 小时
发表于 2014-1-26 19:31:30 | 显示全部楼层
http://pan.baidu.com/share/link?shareid=450752&uk=3993209745#dir/path=%2FALIENTEK%20STM32%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99%E9%9B%86%2FALIENTEK%20%E6%88%98%E8%88%B0STM32%E5%BC%80%E5%8F%91%E6%9D%BF%E6%9C%80%E6%96%B0%E4%BE%8B%E7%A8%8B
态度决定一切
回复 支持 反对

使用道具 举报

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
 楼主| 发表于 2014-1-26 21:30:37 | 显示全部楼层
回复【6楼】冰封嗜魔:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-20
在线时间
1 小时
发表于 2014-4-21 12:52:21 | 显示全部楼层
你的这个(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0))错的,改成:GPIO_ReadIutputDataBit(GPIOA,GPIO_Pin_0)
我要变大神!!!
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2014-4-20
在线时间
1 小时
发表于 2014-4-21 13:15:03 | 显示全部楼层
回复【8楼】探路者:
---------------------------------
把所有的GPIO_ReadOutputDataBit改成GPIO_ReadInputDataBit。我移植成功了!
我要变大神!!!
回复 支持 反对

使用道具 举报

15

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2012-4-3
在线时间
13 小时
 楼主| 发表于 2014-4-25 18:25:58 | 显示全部楼层
回复【9楼】探路者:
---------------------------------
我试试  谢谢啊 先
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-10 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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