3384|9

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:写了个用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单片机论坛

最新回复

我的实验显示0度,调整温度,显示器不变换。   详情 回复 发表于 2023-8-13 19:14
点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 

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

此帖出自51单片机论坛
 
 
 

回复

785

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

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

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

回复

4

帖子

0

TA的资源

一粒金砂(初级)

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

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

 

此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

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

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

 

此帖出自51单片机论坛

点评

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

回复

1万

帖子

25

TA的资源

版主

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

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

此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

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

嗯嗯 我去试试

此帖出自51单片机论坛
 
 
 

回复

4008

帖子

0

TA的资源

版主

8
 

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

此帖出自51单片机论坛
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

9
 

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

此帖出自51单片机论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

10
 

我的实验显示0度,调整温度,显示器不变换。

此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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