7777|6

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

DS18B20初始化失败 [复制链接]

麻烦大家帮我看下,  我的DS18B20初始化失败。   我用protues仿真,用一盏小灯做指示, 程序读不出数据,逐步检测发现程序卡在DS18B20初始化的初始化部分。

可是我去查看了datasheet也没能查出原因来··。   麻烦大家要是可以就抽点空帮我看看是哪里出了差错··。   先拜谢了··。

代码附下
#include
__CONFIG(0X3B31);
#define uint unsigned int
#define uchar unsigned char
#define DQ RD5
#define DQ_DIR TRISD5
#define DQ_HIGH() DQ_DIR=1
#define DQ_LOW() DQ=0;DQ_DIR=0
uchar Num[]={0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,0x7F,0x6F};//不带小数点
uchar Num0[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uint StopWatch_Num,ge,shi,shifen,baifen;

void display();

void delayus(char x,char y) //慧净提供的us级的延时
{
char z;     //定义Z
do {     //先执行一次do
  z=y;    //把Y的值给Z
  do{;}while(--z); //do空语句,等待--z,直到z=0结束,do--while语句,延时在这产生
  }     
while (--x);   //同理x在--,再产生延时
}

void  delay(uint x)
{
        uint a,b;
        for(a=x;a>0;a--)
         {
                for(b=110;b>0;b--);
         }
}


void Io_Init()
{
        TRISC=0;
        TRISD=0;
}

void dsinit()
{
        char sta=1;
     while(sta)
        {
                DQ_LOW();
                delayus(2,81);       
                DQ_HIGH();
                delayus(2,8);
                if(DQ==1)  
                {
                        sta=1;
                        RD6=1;
                        delay(10);
                        RD6=0;
                }
                else sta=0;
                delayus(2,81);       
        }
}

uchar read_byte()
{
        uchar i,val=0;
        for(i=0;i<8;i++)
                {
                        val=val>>1;
                        DQ_LOW();
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                        DQ_HIGH();
                        NOP();
                        NOP();
                        NOP();
                        NOP();
                        val=val|0x80;
                        delayus(1,6);               
                }
                        return(val);
}

void write_byte(uchar val)
{
        uchar i,temp;
        for(i=0;i<8;i++)
        {
                temp=val&0x01;
                DQ_LOW();
                delayus(1,1);
                if(temp==1) DQ_HIGH();
                delayus(3,3);
                DQ_HIGH();
                NOP();
                NOP();
                val=val>>1;                       
        }
}

void get_temp()
{
        uchar TLV,HLV,num;
        float tem_valf;
        int tem_vali;
        dsinit();
        write_byte(0xcc);
        write_byte(0x44);
        TLV=read_byte();
        HLV=read_byte();       
        DQ_HIGH();
        tem_valf=((HLV*256)+TLV)*0.0625;
        tem_vali=tem_valf*1000;
        shi=tem_vali/1000;
        ge=tem_vali%1000/100;
        shifen=tem_vali%100/10;
        baifen=tem_vali%10;
}

void display()
{
                PORTD=0XFE;
                PORTC=Num[shi];//Num[StopWatch_Num%10];
                delay(1);
                PORTD=0XFD;
                PORTC=Num0[ge];//Num[StopWatch_Num/10];
                delay(1);       
                PORTD=0XFB;
                PORTC=Num[shifen];//Num[StopWatch_Num/10];
                delay(1);
                PORTD=0XF7;
                PORTC=Num[baifen];//Num[StopWatch_Num/10];
                delay(1);               
}

void main()
{
        Io_Init();
        while(1)
        {
                get_temp();
                display();
        }
}

最新回复

YANSHI,RUANJIANYANSHIGOUMA? 延时够吗?   详情 回复 发表于 2023-9-8 20:34
点赞 关注
 

回复
举报

6366

帖子

4912

TA的资源

版主

沙发
 
一般问题都在延时时间上,看一下你的延时时间是否符合协议要求的

点评

感谢你的回复 。 延迟我用的是网上找的慧净提供的delay函数, 我用一盏LED做指示,进行调试。发现初始化的时候得不到DS18B20的响应。 程序一直在进行循环检测等待DS18B20的响应。 排查的真纠结就是解决不  详情 回复 发表于 2012-12-4 20:00
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 tiankai001 的帖子

感谢你的回复 。   

延迟我用的是网上找的慧净提供的delay函数,  我用一盏LED做指示,进行调试。发现初始化的时候得不到DS18B20的响应。 程序一直在进行循环检测等待DS18B20的响应。     排查的真纠结就是解决不了。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 
要注意的一是端口方向的设置,设置方向与写入数据需要有短暂的延时,US级即可。二是延时,你初始化没成功很可能是你的写入函数或者读出函数失败,建议你用protues软模一下,里面有工具可以监视1-wire的状态,能帮你看是哪里的问题。另外你的#define DQ_HIGH() DQ_DIR=1
是不是却了DQ=1啊,加上看好使不,不好使就把设置端口方向与写入端口数值分开写,别用同一个预定义。
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

5
 
DS18B20对时序的要求是很高的,有问题基本上都是时序的问题。当然软模的话可以排除硬件损坏的问题。另外注意连线的问题,才3个脚不容易错的。

时序的问题,关键的是延时的问题。

既然你是在proteus的环境下模拟的话,你怎么不加个模拟示波器来看波形呢,这个过程不难做啊。你在示波器下来调,把延时函数调准了。别人提供的延时不一定对你总是使用的,靠别人不如靠自己。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

6
 

用模拟示波器,如何得到波形的时长?

工具可以监视1-wire的状态,如何调出?

 
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

7
 

YANSHI,RUANJIANYANSHIGOUMA? 延时够吗?

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表