OpenEdv-开源电子网

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

这是我18b20的程序,不知道为什么读出来一直是高电平,65536

[复制链接]

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
发表于 2014-3-26 13:50:33 | 显示全部楼层 |阅读模式
我的DS18B20外接了1米长的导线,我原以为是线太长的原因所以接收不到,所以我只连接了18b20到板子上,可读数还是65535
#define  DATAIN  1
#define  DATAOUT  0
#define DS18B20_Write_1()     GPIO_SetBits(GPIOE ,GPIO_Pin_5)  //?1 
#define DS18B20_Write_0()     GPIO_ResetBits(GPIOE ,GPIO_Pin_5)//?0  
#define DS18B20_ReadBit()     GPIO_ReadInputDataBit(GPIOE ,GPIO_Pin_5) 
static void DS18B20_GPIO_Config(u8 data)
{
    GPIO_InitTypeDef GPIO_InitStruct;
        switch(data)
        {
                case DATAIN :
GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE , &GPIO_InitStruct);
                                break;
                case DATAOUT :
GPIO_InitStruct.GPIO_Pin    = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed  = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode   = GPIO_Mode_Out_OD;
GPIO_Init(GPIOE , &GPIO_InitStruct);
                                break;
                default:
                                break;
        }
    
}
static void DS18B20Init(void)
{
    
        DS18B20_GPIO_Config(DATAOUT);
        DS18B20_Write_1();
        delay_us(10);
        DS18B20_Write_0();
        delay_us(550);
        DS18B20_Write_1();
        delay_us(40);

        DS18B20_GPIO_Config(DATAIN);
        while(DS18B20_ReadBit());
       
        DS18B20_GPIO_Config(DATAOUT);
       
        delay_us(480);
        DS18B20_Write_1();
       
}
static u8 DS18B20ReadByte(void)
{
        u8 data = 0 , i = 0;
        for(i=0; i<8; i++)
        {
     data >>= 1;
                DS18B20_GPIO_Config(DATAOUT);
     
     DS18B20_Write_1();
                delay_us(2);
               
                DS18B20_Write_0();
                delay_us(10);
                DS18B20_Write_1();
                delay_us(60);
                DS18B20_GPIO_Config(DATAIN);

                if(DS18B20_ReadBit())
{
                     data |= 0x80;
}
else  
{
data &= 0x7f; 
}
                
delay_us(60);
                
        }
DS18B20_GPIO_Config(DATAOUT);
DS18B20_Write_1();
      delay_us(4);
return (data);
}
static void DS18B20WriteByte(u8 data)
{
        u8 i = 0;
        DS18B20_GPIO_Config(DATAOUT);
    
        for(i=0; i<8; i++)
        {                                  
                DS18B20_Write_0();
                delay_us(10);
                if(data & 0x01)
{
                   DS18B20_Write_1();
}
                 else
{
                    DS18B20_Write_0();
}  
                data >>= 1;
                delay_us(60);
                DS18B20_Write_1();
                delay_us(5);
        }
DS18B20_Write_1();
}
static u16 DS18B20TmpGet(void)
{
        u8  data1,data2;
        u16 data;
        float temp;
        data1 = DS18B20ReadByte();
        data2 = DS18B20ReadByte();
        data = data2;
     data = data<<8;
     data = data | data1;
     //temp = data * 0.0625;
     //temp = temp*10 + 0.5;
     //data = temp;
        return (data);
}

u16 TEMP_Convert(void)
{
   
   
          DS18B20Init();
       
          delay_us(5);
        DS18B20WriteByte(0xcc);
        DS18B20WriteByte(0x44);
          delay_us(1000);

         DS18B20Init();
        
         
        DS18B20WriteByte(0xcc);
        DS18B20WriteByte(0xbe);
        return (DS18B20TmpGet());
}



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

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-3-26 13:51:04 | 显示全部楼层
我看了好几遍,实在没看哪不对来啊
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-26 14:29:13 | 显示全部楼层
设置成推挽输出和上拉输入试下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-3-26 14:32:21 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
外部有有上拉电阻5.1k的,后来我换成1.5k的,推挽输出我也试过,没变化
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-26 14:34:53 | 显示全部楼层
我的就是设置成这两种模式的,难道你的代码问题?移植原子的例程看下行不行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-3-26 21:24:00 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
我不清楚,我有可能是延时程序的问题,我不是用的Systick延时。是大约的延时。
//粗延时函数,微秒
void delay_nus(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=10;  //自己定义
      while(i--) ;    
   }
}
//毫秒级的延时
void delay_nms(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=12000;  //自己定义
      while(i--) ;    
   }
}
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-3-27 10:53:13 | 显示全部楼层
回复【6楼】巫妖:
---------------------------------
1820这个家伙对延时比较敏感的,还是用准确的延时吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

39

主题

160

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2014-1-9
在线时间
8 小时
 楼主| 发表于 2014-3-27 15:10:23 | 显示全部楼层
回复【7楼】Badu_Space:

回复【6楼】巫妖:
---------------------------------
1820这个家伙对延时比较敏感的,还是用准确的延时吧

---------------------------------
谢谢,是我延时的不准确,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 16:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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