打印
[STM32F1]

149的DS18B20测温程序读不出数据

[复制链接]
2839|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanglaojii|  楼主 | 2018-6-24 22:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <msp430x14x.h>
#include "DS18B20.h"
extern void Delay(unsigned int dly);
#define DQ_IN  (P1DIR&=~BIT6)
#define DQ_OUT (P1DIR|= BIT6)
#define DQ_val (P1IN & BIT6)
#define DQ_1   (P1OUT|=BIT6)
#define DQ_0   (P1OUT&=~BIT6)
unsigned char tem[]={0,0},Neg_flag;  //数组存储读取的温度数据,负数标志
/*******************************************************************************
* Function Name  : void Delayus(unsigned int dly)
* Description    : 延时 dly us
* Input          : dly
* Output         : None
* Return         : None
*******************************************************************************/
void Delayus(unsigned int dly)
{
  TACTL|= TASSEL_2+MC_1+TACLR;
  CCR0  = dly;
  while(!(TACTL&BIT0));         //等待时间到
  TACTL  = 0;                 //停止计数   ??????
  TACTL &= ~BIT0;                 //清中断标志
}
/*******************************************************************************
* Function Name  : unsigned char Init_DS18B20(void)
* Description    : IO 初始化
* Input          : void
* Output         : None
* Return         : None
*******************************************************************************/
unsigned char Init_DS18B20(void)
{
  unsigned char tp;
  DQ_OUT;
  DQ_0;                     //MCU 拉低最少480us 再释放等待DS拉高
  Delayus(600);             //480us~960us
  DQ_1;
  DQ_IN;                    //释放总线
  Delayus(55);              //等15~60us
  _NOP();
  if(DQ_val==BIT6) tp=1;    //初始失败
  else tp=0;                //初始成功
  return tp;
}
/*******************************************************************************
* Function Name  : void Write_DS18B20(unsigned char data)
* Description    : 向18B20写数据
* Input          : void
* Output         : None
* Return         : None
*******************************************************************************/
void Write_DS18B20(unsigned char data)
{
  unsigned char i;
  DQ_OUT;
  for(i=0;i<8;i++)
  {
    DQ_0;                   //下降沿
    Delayus(3);            //15~60us 等待18B20采样
    if(data&0x01)           //写从低到高位
    {
      DQ_1;
    }   
    else
    {
      DQ_0;
    }
    Delayus(65);
    data>>=1;
    DQ_1;
    Delayus(2);
  }
}
/*******************************************************************************
* Function Name  : unsigned char Read_DS18B20(void);
* Description    : 读18B20数据
* Input          : void
* Output         : None
* Return         : 18B20数据
*******************************************************************************/
unsigned char Read_DS18B20(void)
{
  unsigned int i, rdata;
  for(i=0;i<8;i++)
  {
    rdata>>=1;
    DQ_0;               
    Delayus(2);          //下降沿
    DQ_1;
    DQ_IN;               //释放总线
    Delayus(3);          //延时5 us
    if(DQ_val==BIT6)
    {
      rdata |= 0x80;     //读从高位开始
    }
    Delayus(45);
    DQ_OUT;
    DQ_1;
    Delayus(2);
  }
  return rdata;  
}
/*******************************************************************************
* Function Name  : unsigned char Convert_18B20(void);
* Description    : 18B20转换
* Input          : void
* Output         : None
* Return         : None
*******************************************************************************/
unsigned char *Convert_18B20(void)
{
  unsigned char n;
  do
    n = Init_DS18B20();           //复位
  while(n);
  Write_DS18B20(0xCC);            //跳过 ROm指令
  Write_DS18B20(0x44);            //温度转换 RAM指令
  Delay(750);                   //等待750us温度转换完成
  do  
    n = Init_DS18B20();           //复位
  while(n);
  Write_DS18B20(0xCC);            //跳过ROM
  Write_DS18B20(0xBE);;           //读存储器指令 读数据
  tem[0] = Read_DS18B20();        //
  tem[1] = Read_DS18B20();
  return tem;
}
/*******************************************************************************
* Function Name  : unsigned char Compute_18B20(unsigned char data);
* Description    : 计算18B20转换后的温度值
* Input          : 16进制的温度值
* Output         : None
* Return         : 十进制的温度值
*******************************************************************************/
float Compute_18B20()
{
  unsigned char temper=0;
  if(tem[0]&0xF0)
  {
    Neg_flag = 1;                       //负数标志
    temper = tem[1]+tem[0]*256;
    temper = (~temper) +1;               //取反加一
  }
  else
  {
    temper = tem[1]+tem[0]*256;
  }
  return temper;
}
沙发
feiqi1| | 2018-6-24 22:42 | 只看该作者
我有430launchpad测DS18B20的代码,可以成功读取温度,需要的话可以发给你

使用特权

评论回复
板凳
androidbus| | 2018-6-24 22:42 | 只看该作者
根据你的时钟来调整延时的。

使用特权

评论回复
地板
litengg| | 2018-6-24 22:45 | 只看该作者
这个主要靠把握时间的。

使用特权

评论回复
5
qiangweii| | 2018-6-24 22:46 | 只看该作者
定时器没设置好,子系统时钟源没有8分频

使用特权

评论回复
6
shashaa| | 2018-6-24 22:49 | 只看该作者
DS18B20是单线通信,时序比较重要,所以系统时钟一定配置好了。

使用特权

评论回复
7
xia00| | 2018-6-24 22:49 | 只看该作者
单片机的工作频率也不一样。。

使用特权

评论回复
8
sourceInsight| | 2018-6-24 22:52 | 只看该作者
相应寄存器的值是多少,看看有变化没有。。

使用特权

评论回复
9
boy1990| | 2018-6-24 22:53 | 只看该作者

18b20做的人多了,例程网上一堆,楼主下一个修改修改

使用特权

评论回复
10
CallReceiver| | 2018-6-24 22:55 | 只看该作者
这个对时间控制比较精确的。

使用特权

评论回复
11
zhouhuanの| | 2018-6-24 22:56 | 只看该作者
使用上拉电阻了吗?没有代码怎么查看是哪里的问题的。。

使用特权

评论回复
12
hfdy01| | 2018-6-24 22:58 | 只看该作者
延时有问题的,信号电平有问题吗?

使用特权

评论回复
13
handleMessage| | 2018-6-24 22:58 | 只看该作者
上拉电阻一般没有多大的问题的。。

使用特权

评论回复
14
bbapple| | 2018-6-24 23:00 | 只看该作者
(1)数据线先置低电平“0”。 (2) 延时确定的时间为15微秒。

使用特权

评论回复
15
Listate| | 2018-6-24 23:00 | 只看该作者
读取的数据都是0xff吗?

使用特权

评论回复
16
Lewisnx| | 2018-6-25 20:24 | 只看该作者
读不出数据   可能的问题很多,只有程序看不出来的

使用特权

评论回复
17
Mattheww| | 2018-6-25 22:01 | 只看该作者
根据系统时钟来调整延时的

使用特权

评论回复
18
Bjorn| | 2018-6-25 22:45 | 只看该作者
子系统时钟分频没有

使用特权

评论回复
19
Mattheww| | 2018-6-30 16:51 | 只看该作者
DS18B20是单线通信,注意时序问题

使用特权

评论回复
20
keaibukelian| | 2018-7-17 16:06 | 只看该作者
一般来说就是时序问题 你读出来的是错误码还是别的什么代码?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

1411

帖子

1

粉丝