OpenEdv-开源电子网

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

DS18B20数据采集问题(急)

[复制链接]

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
发表于 2012-5-29 15:25:45 | 显示全部楼层 |阅读模式

 我写的这段18B20的程序中,怎么也采集不到温度数值,可能是卡在初始化的while里了,感觉时序也没什么问题了,实在不知道什么原因,求大侠帮忙。
部分代码如下,(显示部分为1602的LCD,调试无误,不贴出来了) 

u8 Data;
u16 temp;
u8 value;
float temperature;

void delay_nus(unsigned long n)    //经示波器验证,这个延时时间绝对精确
{
unsigned long j;
while (n--)
{j=8;
while (j--);
}
}

void delay_nms(unsigned long n)    //延时nms
{
 while(n--)
 delay_nus(1100);
}

void GPIO_Configuration(void)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  //PC0到PC7表示LCD的DB0--DB7
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);


  GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_0| GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}
 //18B20复位
void DS18b20_reset(void)  

   u8 DQ;
  GPIO_Configuration();

    GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
   delay_nus(10);
    GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ;
    delay_nus(500); //延时500us
    GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
 //给18B20发出复位信号
      delay_nus(45);//45us
 DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
 //检测18B20发出的存在脉冲"0",判断复位是否成功
  while(DQ!=0)
    {
       DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
    }
  delay_nus(150);   //延时150us
 GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
}

  //18B20写一字节
void write_byte(u8 val)     
{       int i;
        u8 Data;
  GPIO_Configuration(); 
    for (i=0; i<8; i++)
 {
  GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ;
  delay_nus(15); //延时15us
  Data = val & 0x01; //最低位保留
  GPIO_Write(GPIOB,Data); 
  delay_nus(45);  //45us延时
   val >>= 1; //右移一位
     GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
 }
 GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
}


//18B20读一字节

u8 read_byte(void)  

 {  int i;
  u8 value=0;
  u8 DQ;
   GPIO_Configuration();
    for (i=0; i<8; i++)
 {
     GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
  delay_nus(2); //延时 2us
  value >>= 1;
  GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET) ;
  delay_nus(3); //3us
     GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
  delay_nus(5); //5us
      DQ=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);
        if(DQ)  
       value|=0x80;    //若DQ为1则把数据1给value的最高位,然后value向右移 否则直接往右移
  delay_nus(60); //60us
 }    
   GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET) ;
   return(value);
}


//18B20启动温度转换 与 读取温度

u16 gettemperature(void)
{ u8 temp_data[2];
    u16 temp;
 DS18b20_reset();
 write_byte(0xCC); // 发Skip ROM命令
 write_byte(0x44); // 发温度转换命令
 delay_nms(2);//延时2ms
   write_byte(0xCC); // 发Skip ROM命令
   write_byte(0xBE); //读RAM中9字节内容
 temp_data[0]=read_byte();  //温度低8位
 temp_data[1]=read_byte();  //温度高8位
 temp=temp_data[1];//温度高字节
 temp=temp<<8;//移到高8位中
 temp=temp|temp_data[0];//16位温度值
 temp=temp&0x07ff;//temp取后11位
 temperature=temp*0.0625; //最终的温度数据
 return temperature;
}

 

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-29 22:27:41 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
 楼主| 发表于 2012-5-29 23:37:50 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我想自己尝试着写而已,你的代码是直接操作寄存器的,现在一时看起来有点吃力,我想到暑假的时候系统的学一下,现在做这个是完成一个任务。
回复 支持 反对

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2012-5-17
在线时间
0 小时
 楼主| 发表于 2012-5-29 23:47:38 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有你们那个DS18B20的程序,跟我之前一个板子的一模一样,怀疑你的程序被借用了。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-29 23:54:47 | 显示全部楼层
回复【3楼】pope_hxj:
---------------------------------
其实我们的操作寄存器,也就是IO配置的时候需要修改.另外我们有寄存器版本的代码啊.可以参考.
回复【4楼】pope_hxj:
---------------------------------
我们代码不知道被多少地方借用呢,见怪不怪了.
本来就开源嘛,呵呵.只要借用者标明出处,就不错了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 02:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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