amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 791|回复: 8

STC15W408AS + DS18B20的DQ 脚需要用手指拿着才有数据输出?

[复制链接]
发表于 2015-12-25 08:21:18 | 显示全部楼层 |阅读模式
现在有个设计,采用的是STC15W408AS,电源电压 3.3V,P1.3脚接DS18B20的DQ,移植原来正常工作的程序,没有数据输出,但是用手指接触DQ脚,能够输出数据,用示波器的探头接DQ ,也有数据,接512上拉电阻,故障依旧,很是疑惑,和大家请教下。
下面是测试程序:
void main()
{   
        unsigned int Temperature;       
    Init_Mcu();
    DS18B20_Reset();             //设备复位   
    delayms(400);
    delayms(400);                                                 
        flag_uart=0;                 //清空标志位
        while(1)
    {            
                flag_uart=0;         //清空标志位
                //采集温度数据
                Temperature = GET_TEMP();
                DATA[0]='@';
                DATA[1]= Temperature%100000/10000 + 0x30;
                DATA[2]= Temperature%10000/1000 + 0x30;
                DATA[3]= Temperature%1000/100 + 0x30;
                DATA[4]= Temperature%100/10 + 0x30;
                DATA[5]= Temperature%10 + 0x30;
                num_txd=0;
                num_txd_max=6;
                EN_485=1;
                delayms(1);                                                                                                                 
                SBUF=DATA[0];
                delayms(500);
                delayms(1000);
        }
}
 楼主| 发表于 2015-12-25 08:22:49 | 显示全部楼层

/**************************************
延时X微秒(STC15L@5.5296M)
不同的工作环境,需要调整此函数
**************************************/
void DelayXus(unsigned char n)
{
    while (n--)
    {
        _nop_();
    }
}

/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}
/**************************************
从DS18B20读1字节数据
**************************************/
unsigned char DS18B20_ReadByte()
{
    unsigned char i;
    unsigned char dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(unsigned char dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        DelayXus(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        DelayXus(1);                //恢复延时
    }
}


//************************************
unsigned int GET_TEMP()
{       
        unsigned int temp;
        unsigned char TPL,TPH;
        EA = 0;
        DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成
        //第一次转换前,在此加入延时毫秒
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节
    TPH = DS18B20_ReadByte();       //读温度高字节
        EA =1;
    temp=(TPH<<8)|TPL;
    temp=(temp*10)>>4;                        //精确到小数点后1位
        return temp;
}


sbit DQ = P1^3;   //定义单片机接ds18b20的数据端
发表于 2015-12-25 08:34:12 | 显示全部楼层
上拉电阻,频率。。。。
发表于 2015-12-25 09:05:25 | 显示全部楼层
最好看下,延时函数,坛友好多提出是,延时除了问题,楼主可以借鉴下,修改下延时,看可以吗  DS18B20好像是4.7k上拉
发表于 2015-12-25 09:24:56 来自手机 | 显示全部楼层
512上拉电阻,这么狠?
 楼主| 发表于 2015-12-25 09:50:17 | 显示全部楼层
延时修改了。现在改成6--12个_nop_();都不行。
void DelayXus(unsigned char n)
{
    while (n--)
    {
        _nop_();
    }
}
发表于 2015-12-25 10:18:40 | 显示全部楼层
买块 猪肉 挂上去试试  




你重新找一个驱动函数试试啊
 楼主| 发表于 2015-12-25 12:04:22 | 显示全部楼层
ayumi8 发表于 2015-12-25 10:18
买块 猪肉 挂上去试试  

有这想法,
这个函数在别的地方用过,是验证过的。
现在怀疑是MCU的原因。
 楼主| 发表于 2015-12-25 15:39:10 | 显示全部楼层
找到原因了。
oid DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;


去掉while (CY)

结贴吧。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-22 12:39

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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