534|8

5

帖子

0

资源

一粒金砂(初级)

求助:写了个用DS18B20程序但是不知道为什么只显示85摄氏度求各位帮我看看该怎么办

#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
sbit DQ=P1^3;
unsigned char a[6]={0x40,0x40,0x40,0x40,0x40,0x40};
unsigned char b[ ]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
unsigned char code c[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay (unsigned char i)
{
    while(i--);
}
void reset1820 ()
{
    DQ=1;_nop_();
    DQ=0;
    delay(100);
    DQ=1;
    delay(12);
}
unsigned char rd1820()
{
    unsigned char i,d=0;
    for (i=0;i<8;i++)
        {
            DQ=0;
            d>>=1;
            DQ=1;_nop_();
            if (DQ)d|=0x80;
            delay(12);
        }
    return d;
}
void wr1820 (unsigned char d)
{
    unsigned char i;
    for(i=0;i<8;i++)
        {   
            DQ=0;_nop_();
            DQ=d&0x01;
            delay(12);
            DQ=1;
            d>>=1;
        }
}
void chag (unsigned char x[],unsigned char y[])
{
    y[5]=0x39;
    y[0]=0;
    if((x[1]&0xf8)==0xf8)
        {
            x[1]=~x[1];
            x[0]=~x[0]+1;
            if(x[0]==0) x[1]=x[1]+1;
            y[0]=0x40;
        }
    y[4]=b[x[0]&0x0f];
    y[4]=c[y[4]];
    x[1]=(x[1]&0x0f)<<4;
    x[0]=(x[0]&0xf0)>>4;
    x[0]=x[0]|x[1];
    y[1]=x[0]/100;
    y[2]=(x[0]%100)/10;
    y[3]=c[x[0]%10]|0x80;
    if(y[1]!=0) y[1]=c[y[1]];
    if((y[1]!=0)|(y[2]!=0))
    y[2]=c[y[2]];
    
}
void disp (unsigned char n)
{
    unsigned char i,j;
    for(j=0;j<n;i++)
        {
            for(i=0;i<6;i++)
            {
                P1=(P1&0XF8)+i;
                XBYTE[0X7FFF]=a[i];
                delay(300);
            }
        }
}
void main ()
{
    unsigned char t[2];
    while(1)
        {
            reset1820();
            if(DQ==0)
                {
                delay (15000);
                wr1820 (0xcc);
                wr1820 (0x44);
                reset1820();
                delay (15000);
                wr1820 (0xcc);
                wr1820 (0xbe);         
                t[0]=rd1820 ();
                t[1]=rd1820 ();
                delay(15000);                            
                chag (t,a);
                }
            disp(100);
            }
}

此帖出自51单片机论坛

回复

1万

帖子

13

资源

版主

85代表读取的数据是全1,或者时序不对,或者器件损坏。前者的可能性更大。


回复

787

帖子

0

资源

一粒金砂(高级)

实物的话  示波器看看时序是否正确

个人签名我从不担心我努力了不优秀,只担心优秀的人都比我更努力。如果你无法忍受孤独,就不要追逐梦想。每一个优秀的人,都有一段沉默的时光。在那一段时光,你付出了很多努力,忍受孤独和寂寞,不抱怨不诉苦,最后渡过了这

回复

5

帖子

0

资源

一粒金砂(初级)

swustlx86 发表于 2020-6-16 17:25 实物的话  示波器看看时序是否正确

我是用proteus仿真我是初学者不清楚要怎么弄

 


回复

5

帖子

0

资源

一粒金砂(初级)

本帖最后由 paslaps 于 2020-6-16 18:48 编辑
dcexpert 发表于 2020-6-16 16:01 85代表读取的数据是全1,或者时序不对,或者器件损坏。前者的可能性更大。

那我的编程应该没问题吧,时序我是按照他书上的先下拉480~960微秒,然后释放15~60微秒,不好意思因为我是初学者这些都不是很懂,能详细的指出我的错误吗

 

点评

可以用示波器观察波形,看看时序有没有问题。如果是proteus,可以很容易用虚拟示波器查看  详情 回复 发表于 2020-6-16 21:47

回复

1万

帖子

13

资源

版主

paslaps 发表于 2020-6-16 18:45 dcexpert 发表于 2020-6-16 16:01 85代表读取的数据是全1,或者时序不对,或者器件损坏。前者的可能性更 ...

可以用示波器观察波形,看看时序有没有问题。如果是proteus,可以很容易用虚拟示波器查看


回复

5

帖子

0

资源

一粒金砂(初级)

dcexpert 发表于 2020-6-16 21:47 可以用示波器观察波形,看看时序有没有问题。如果是proteus,可以很容易用虚拟示波器查看

嗯嗯 我去试试


回复

3708

帖子

0

资源

版主

我印象里18b20没有正确响应的情况读取数据全1,最后计算结果就是85度


回复

2256

帖子

0

资源

纯净的硅(高级)

+85°是ds18b20在上电复位后在温度寄存器内的对应的数字量,能读出来说明时序没问题,既然是仿真,很大概率是延时不够,要是实际中,直接换个18B20试下


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

热门资料推荐 更多>>
    关闭
    站长推荐上一条 1/3 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表