打印

请教:MC9S08AC16单片机读取DS18B20

[复制链接]
1688|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ygyh|  楼主 | 2013-12-10 14:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ygyh|  楼主 | 2013-12-10 14:21 | 只看该作者
我的代码如下.........帮忙看看....错在那儿了..........

/*****************************************************/
/*  ----------------读DS18B20函数------------------- */
/*****************************************************/
void Read_DS18B20()           // get the temperature
{
//        EA=0;
        Init_DS18B20();              // 初始化DS18B20子函数
        if(Ack_sign)
        {
                WriteOneChar(0xcc);        // 跳过ROM命令
                WriteOneChar(0x44);        // 发出温度转换命令
                Delay(5);
                //DS18b20_1dir=0;            // 输入状态
                Init_DS18B20();            // 初始化DS18B20子函数
                if(Ack_sign)
                {
                        WriteOneChar(0xcc);      // 跳过ROM命令
                        WriteOneChar(0xbe);      // 发出温度转换命令
                        dat_L=ReadOneChar();     // 连续读两个字节数据
                        dat_H=ReadOneChar();
                        dat_HL=dat_H;                                                                                                         
                        dat_HL=dat_HL<<8;
                        dat_HL=dat_HL+dat_L;
                        DS18B20_3=1;
                       
                        if(d<5)
                        {
                                d++;                                 // 读DS18B20启始"随机数"控制辅助变量
                        }
                }
        }
//        EA=1;
}

/************************************************/
/*------------ 初始化DS18B20子函数------------  */
/************************************************/
void Init_DS18B20()
{
   DS18b20_3dir=1;            // 输出状态
         DS18B20_3 = 1;             // DS1820复位
   Delay(3);                 // 稍做延时 6us //48us
   DS18B20_3 = 0;             // 单片机将DS1820拉低
   Delay(80);                // 精确延时 大于 600us// 480us
   DS18B20_3 = 1;             // 拉高总线
   Delay(7);                              // 精确延时 大于 60us
   DS18B20_3 = 0;
   DS18b20_3dir=0;            // 改为输入状态
   Delay(3);
   responsion();                    // 调用应答检查程序
   Delay(50);                            // 精确延时 大于 120us
         //DS18B20_3 = 1;
         //Delay(20);       

}

/**********************************************/
/*-----------应答检查子函数------------------ */
/**********************************************/
void responsion()
{
      
    assistant=DS18B20_3;

    if(assistant)
    {
      Ack_sign=0;
    }
    if(!assistant)
    {
      Ack_sign=1;
    }
}

/**********************************************/
/*---------------读字节子函数-----------------*/
/**********************************************/
byte ReadOneChar(void)
{
  uchar i = 0;
  for (i=8; i>0; i--)
  {
    DS18b20_3dir=1;            // 输出状态
    DS18B20_3 = 0;             // 给脉冲信号
    dat >>= 1;
    Delay(2);                                           // 时间隙
    DS18B20_3 = 1;             // 给脉冲信号
    //Delay(1);                                           // 时间隙
    DS18b20_3dir=0;            // 改为输入状态
    Delay(3);                                           // 时间隙
    if(DS18B20_3)
    dat |= 0x80;
    Delay(5);
  }
  return (dat);
}

/*************************************************/
/*---------------写字节子函数--------------------*/
/*************************************************/
void WriteOneChar(uchar wdat)
{
    uchar i = 0;
        for (i=8; i>0; i--)
        {
                DS18b20_3dir=1;            // 输出状态
                DS18B20_3 = 0;
                Delay(2);
                DS18B20_3 = wdat&0x01;     // 写入一位数据
                //Rd1820 = wdat&0x01;
                Delay(6);                       // 延时 大于 30us
                DS18B20_3 = 1;
                wdat>>=1;                  // 右移一位数据
                Delay(2);
        }       
}

使用特权

评论回复
板凳
motodefy| | 2013-12-10 14:30 | 只看该作者
目测是延时的关系····之前用1768调也是这样···后来干脆换了传感器

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2013-12-10 14:40 | 只看该作者
楼主要是可以的话,可以测一下和传感器通信的信号,是不是满足传感器数据手册的要求哦!

使用特权

评论回复
5
ygyh|  楼主 | 2013-12-10 14:42 | 只看该作者
延时函数如下:

/**************************************************/
/*  ----------------延时函数-------------------         */
/**************************************************/
void Delay(uint num)         
   {
     while(num--);
   }

根据DS18B20的资料....我用示波器测量了各段的延时量......大致都可以.......但是运行时.....示波器在数据端口上监测到的却是一条高电平直线
伤心呀

使用特权

评论回复
6
FSL_TICS_ZJJ| | 2013-12-10 14:51 | 只看该作者
ygyh 发表于 2013-12-10 14:42
延时函数如下:

/**************************************************/

时间放大些看,也没有吗? 也就是MCU口没有输出咯?

使用特权

评论回复
7
ygyh|  楼主 | 2013-12-10 15:01 | 只看该作者
FSL_TICS_ZJJ 发表于 2013-12-10 14:51
时间放大些看,也没有吗? 也就是MCU口没有输出咯?

您是指....把一些延时量...加大一点是吧.........我都加过了还0xffff:'(

使用特权

评论回复
8
ygyh|  楼主 | 2013-12-10 15:04 | 只看该作者
ygyh 发表于 2013-12-10 15:01
您是指....把一些延时量...加大一点是吧.........我都加过了还0xffff

这些代码.......以前我已在51系列的单片机上用过........很不错的....可是这欠用飞思卡尔的单片机....却怎么也不成了...........:'(

使用特权

评论回复
9
ygyh|  楼主 | 2013-12-10 16:05 | 只看该作者
现在。。。。数据能读出来 了。。。。。。。但读出来的数据很乱,。。。。。好象每次都不一样的。。。。。怎么回事呀?????

请诸位指点指点呀


使用特权

评论回复
10
FSL_TICS_ZJJ| | 2013-12-10 16:14 | 只看该作者
ygyh 发表于 2013-12-10 16:05
现在。。。。数据能读出来 了。。。。。。。但读出来的数据很乱,。。。。。好象每次都不一样的。。。。。 ...

能读啦,那再查查通信波形,慢慢调,离成功不远了。

使用特权

评论回复
11
lilian1003| | 2014-6-10 15:40 | 只看该作者
大家好!我司专注飞思卡尔单片机的,主要分销国内外的现货库存,有什么疑问大家可以咨询我,谢谢!希望能帮到大家

使用特权

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

本版积分规则

53

主题

154

帖子

0

粉丝