chenho 发表于 2021-12-8 21:00

测温程序读不出数据

每次读出来的数据总是0xFF
#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 = Read_DS18B20();      //
tem = 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&0xF0)
{
    Neg_flag = 1;                     //负数标志
    temper = tem+tem*256;
    temper = (~temper) +1;               //取反加一
}
else
{
    temper = tem+tem*256;
}
return temper;
}

langgq 发表于 2021-12-8 21:02

根据你的时钟来调整延时的。

午夜粪车 发表于 2021-12-8 21:03

定时器没设置好,子系统时钟源没有8分频啊

zhenykun 发表于 2021-12-8 21:05

DS18B20是单线通信,时序比较重要,所以系统时钟一定配置好了

chenjunt 发表于 2021-12-8 21:10

单片机的工作频率也不一样 还有时序

songqian17 发表于 2021-12-8 21:12

延时需要调节下,保证延时要比较准。

dingy 发表于 2021-12-8 21:14


你也可以参考下火哥和原子的。

dengdc 发表于 2021-12-8 21:15

相应寄存器的值是多少,看看有变化没有

jiahy 发表于 2021-12-8 21:18

我这用的是C8051F020,18b20实验死活就是调不通

morrisk 发表于 2021-12-8 21:19

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

zwll 发表于 2021-12-8 21:22

同意,STM32下的也是不少的,要注意引脚方向的切换和延时的准确性。

dingy 发表于 2021-12-8 21:24

说明时序有问题它并没有响应你

dengdc 发表于 2021-12-8 21:26

时许有问题 用示波器看看波形吧

renyaq 发表于 2021-12-8 21:30

说明没有理睬你

zhanghqi 发表于 2021-12-8 21:33

微调一下延时时间

llljh 发表于 2021-12-8 21:35

18b20对时序的要求挺高的

dengdc 发表于 2021-12-8 21:36


有可能18b20损坏了

wyjie 发表于 2021-12-8 21:38

我第一次写程序就是写的这个程序 调试了好久 最后还是发现是时许有问题

chenho 发表于 2021-12-8 21:40


好的,我明天去单位试一下,多谢各位大侠了哈        
页: [1]
查看完整版本: 测温程序读不出数据