打印

DS18B20初始化失败,用MSP430F149

[复制链接]
4459|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilysea_xin|  楼主 | 2011-6-17 09:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚开始学习MSP430单片机,参考网上修改的程序, DS18B20总是初始化失败,端口读入的值总是FFFF。
延时用示波器测的,满足500,改为600US也不好用,请教各位达人,可能是什么原因,谢谢。

/***************DS18B20 Reset&Init*********************/
void Reset_18B20(void)
{
    P4DIR|=0x01 ;
   OUT_0;//Set output 0  主机首先发出一个480-960微秒的低电平脉冲
   DelayNus(50);  //500us
   OUT_1; //释放数据线(将数据线拉高)
   DelayNus(10);  //90us
   P4DIR&=~BIT0;   //BIT0=0X01  P4.0=input
   if((P4IN&BIT0)==BIT0)  
   {   Err_Flag=1;     }  //失败,一直都是高电平说明总线上无器件应答
   else  
   {
     Err_Flag=0; // 有低电平出现说明总线上有器件已做出应答
     OUT_1;
   }
   P4DIR|=BIT0 ;  //BIT0=0X01  P4.0=output
   
}

相关帖子

沙发
加班加点| | 2011-6-21 21:30 | 只看该作者
太强大了,不懂!

使用特权

评论回复
板凳
archer911| | 2011-6-22 09:01 | 只看该作者

宝贝儿,这个应该够你用了,好好看看1820的userguide

*--------------------------------------------------
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void write2ds(unsigned char command)
{
unsigned char i;
   DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
   DQ=0;
   Delay15us();
   DQ=command&0x1;//低位在先
   Delay15us();
   Delay15us();
   Delay15us();
   DQ=1;
   command=command>>1;
   Delay1us(1);
}
}
//ds18b20读命令
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char temp;
temp=0;
  
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
   DQ=0;
   Delay10us();
   DQ=1;
   Delay1us(2);
   temp=temp>>1;
   if(DQ==1)
   {
    temp=temp+0x80;//先读到最高位,再依次右移
   }
   Delay15us();
   Delay15us();
   Delay15us();
}
    return(temp);
}
/*---------------------------------------------------------
无论是读还是写操作,开始前一定要复位一下ds18b20.
-----------------------------------------------------------*/
//跳过读序号列号的操作
void SkipRomCode(void)
{
resetpulse();     //复位
write2ds(0xCC);// 跳过读序号列号的操作
}
//启动转换
void StartADC(void)
{
resetpulse();     //复位
write2ds(0xCC);//广播
write2ds(0x44);//启动温度转换,12位,需时700ms
}
//获得温度值
int GetTempValue(void)
{

  union{
               unsigned char c[2];
               int x;
             }temp;
SkipRomCode();
write2ds(0xBE);//读取温度值的命令
temp.c[1]=readdatafromds18b20(); //温度低八位
temp.c[0]=readdatafromds18b20(); //温度高八位
StartADC();     
       if (temp.x<=TEMPTYPE)
         temp.x=23*TEMPTYPE; //add by cw 080614 tempdefault value 23 du
     return temp.x;
     
}

使用特权

评论回复
地板
ilysea_xin|  楼主 | 2011-7-5 16:03 | 只看该作者
3# archer911
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就是那宝贝,吓我一跳

使用特权

评论回复
5
wwde| | 2011-7-6 21:12 | 只看该作者
学习下

使用特权

评论回复
6
wwde| | 2011-7-6 21:12 | 只看该作者
:)

使用特权

评论回复
7
xiandni| | 2013-6-8 23:58 | 只看该作者
楼主这问题解决了没,我也遇到了啊,求帮助。。。。

使用特权

评论回复
8
在路上的旁观者| | 2013-6-10 00:17 | 只看该作者
看看

使用特权

评论回复
9
pmp| | 2013-6-11 13:04 | 只看该作者
你把时序安排好了!

使用特权

评论回复
10
pmp| | 2013-6-11 13:05 | 只看该作者
这个时间要求还是要求还是非常精确的,你的时钟不一样,所以延时函数得修改的。

使用特权

评论回复
11
lzbf| | 2013-6-11 19:00 | 只看该作者
你安装时钟数 修改一下,不是自己试出来的。

使用特权

评论回复
12
smilingangel| | 2013-6-14 00:22 | 只看该作者
这个我觉得一还是先检查下硬件的

使用特权

评论回复
13
smilingangel| | 2013-6-14 00:23 | 只看该作者
第二就是单片机的时钟的以及跟18B20的通讯时序的

使用特权

评论回复
14
hawksabre| | 2013-6-14 19:21 | 只看该作者
问题解决了  就好   顶一个   需要好好看看先   顶一个

使用特权

评论回复
15
ss么么| | 2016-11-6 18:10 | 只看该作者
ilysea_xin 发表于 2011-7-5 16:03
3# archer911  
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就 ...

想问楼主怎么解决的  求方法啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名: 耐得住寂寞才能守得了繁华

5

主题

13

帖子

0

粉丝