OpenEdv-开源电子网

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

18B20初始化不成功

[复制链接]

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2014-8-7
在线时间
4 小时
发表于 2015-7-13 18:33:41 | 显示全部楼层 |阅读模式
5金钱
#include <stm32f10x.h>
#include "ds18b20.h"
#include "SysTick.h"

u8 DS18B20_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DS18B20_Rst();
return DS18B20_Check();
}
void DS18B20_Rst(void)
{
DS18B20_IO_OUT();//PA1?è????????????
GPIO_ResetBits (GPIOA,GPIO_Pin_1);//????DQ
Delay_us(750);
GPIO_SetBits (GPIOA,GPIO_Pin_1);//????DQ
Delay_us(15);
}
u8 DS18B20_Check(void) 
{
u8 retry=0;
    DS18B20_IO_IN();
    while ((GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_1))&&retry<200)
    {
retry++;
Delay_us(1);
    };  
    if(retry>=200)return 1;
    else retry=0;
    while (!(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_1))&&retry<240)
    {
      retry++;
      Delay_us(1);
    };
    if(retry>=240)return 1;
    return 0;
}
u8 DS18B20_Read_Bit(void) 
{
    u8 data;
DS18B20_IO_OUT();
    GPIO_ResetBits (GPIOA,GPIO_Pin_1);
Delay_us(2);
    GPIO_SetBits (GPIOA,GPIO_Pin_1); 
DS18B20_IO_IN();
Delay_us(12);
if(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_1))data=1;
    else data=0;  
    Delay_us(50);           
    return data;
}
u8 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;
}
void DS18B20_Write_Byte(u8 dat)     
 {             
    u8 j;
    u8 testb;
DS18B20_IO_OUT();//SET PG11 OUTPUT;
    for (j=1;j<=8;j++) 
{
        testb=dat&0x01;
        dat=dat>>1;
        if (testb) 
        {
            GPIO_ResetBits (GPIOA,GPIO_Pin_1);
            Delay_us(2);                            
            GPIO_SetBits (GPIOA,GPIO_Pin_1);
            Delay_us(60);             
        }
        else 
        {
            GPIO_ResetBits (GPIOA,GPIO_Pin_1);// Write 0
            Delay_us(60);             
            GPIO_SetBits (GPIOA,GPIO_Pin_1);
            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
}
short DS18B20_Get_Temp(void)
{
    u8 temp;
    u8 TL,TH;
short 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;    
}
这个程序在18b20check一直失败,不知道什么原因,大神来看看吧

ds18b20.zip

5.71 MB, 下载次数: 2399

最佳答案

查看完整内容[请看2#楼]

代码太长,不好看。 一般来说都是延时造成的,你想确定你的延时函数准确性,再按18B20的时序来写,肯定没啥问题。18B20为单线模式,对延时时间要求较高。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

28

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
313
金钱
313
注册时间
2013-10-11
在线时间
38 小时
发表于 2015-7-13 18:33:42 | 显示全部楼层
代码太长,不好看。
一般来说都是延时造成的,你想确定你的延时函数准确性,再按18B20的时序来写,肯定没啥问题。18B20为单线模式,对延时时间要求较高。
回复

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2014-8-7
在线时间
4 小时
 楼主| 发表于 2015-7-14 09:12:07 | 显示全部楼层
回复【2楼】netmouse:
---------------------------------
把check去掉之后就好了,数据也是正确的,估计就是check里的延时有问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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