【求助】LPC2124仿真DS18B20


我在用单片机仿真DS18B20的时候,一切都很正常,但现在转到ARM仿真的时候,问题就来了,一直得不到正确的温度值,且点击器件温度值变化时,在LED上的值没有发生变化,很郁闷!按说初始化、读和写的时序我都烂熟于胸了,可不管怎么弄总也不出结果,望高手指点!如有人之前弄过的,求例子!

我也来说两句 查看全部回复

最新回复

  • leshen750 (2008-8-11 12:08:59)

    我用的是LPC2124,采集到温度值后经由MAX7219驱动四位LED数码管输出显示数值。显示方面没有问题,我仔细核实过。但发现读取的数据值是不对的,高位值和低位值均为255。由此怀疑是初始化和写指令这两部分出了问题,但仔细检查了步骤和时序,也都没有发现问题。真是头大了!
  • leshen750 (2008-8-11 14:56:44)

    没人回答吗?????????????????
  • leotron (2008-8-11 22:27:12)

    才开始弄ARM,不了解。盼高手。。。。。。。。。。。。。。。
  • leshen750 (2008-8-13 08:26:02)

    莫非proteus论坛上没有人弄过这个吗??????
  • liuyimao4858 (2008-9-17 17:32:51)

    我也遇到同样的问题,不知如何解决!
  • carrick (2008-9-30 20:51:53)

    同上!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • machunshui (2008-10-04 20:36:25)

    很容易,关键是时序时间要准确,可以用proteus的程序运行时间测量特性来确定延时时间.
  • machunshui (2008-10-04 20:38:25)

    本人写的基于crossworks的lpc配合DS18B20的测温程序

    http://www.proteus.com.cn/bbs/vi ... 2792&highlight=
  • qzc001617 (2008-10-11 16:13:49)

    以下是本人写的LPC2148驱动 DS18B20的子程序.前三个为准备,调用最后个程序就行了

    #define  DS18B20 0x01 << 24                        //P1.24
    /**************************************************************
    ** 函数名称:void DS18B20_delay_us(Uint32 time)
    ** 输 入:   time延进数量
    ** 输 出:
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城  QQ:15716780
    ** 日 期: 2008_08_21
    ** 功能描述:延时1US 晶振: 12M
    ****************************************************************/
    void DS18B20_delay_us(Uint32 time)
    {     
    Uint32 i,j;
    for(i=0;i<8;i++)
    {
      for(j=1;j<time;j++)
      {
                  ;  
             }
    }
    }
    /*******************************************************************
    ** 函数名称:void Dis_Lcd_Start(void)
    ** 输 入:  无
    ** 输 出:   x 为0表示复位成功。1表示没有检测到DS18B20
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城
    ** 日 期: 2008_08_21
    ** 功能描述: 初始化函数
    ******************************************************************/
    Uchar8 DS18B20_Reset(void)
    {
    Uint32 Temp_DS18B20;    //设置LCD控制引脚为输出
    Uchar8 x=0;
    Temp_DS18B20 = DS18B20;
      
    IO1DIR |= DS18B20;   //设置引脚为输出
    IO1SET |= DS18B20;   //Temperature_RW 拉高总线
    DS18B20_delay_us(2);
        IO1CLR |= DS18B20;   //将Temperature_RW拉低
    DS18B20_delay_us(650);     //精确延时 大于 480us
    IO1SET |= DS18B20;   //Temperature_RW 拉高总线
    DS18B20_delay_us(60);
    IO1DIR &= (~Temp_DS18B20);   //转为输入
    x=(IO1PIN & DS18B20) >> 24; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
    DS18B20_delay_us(480);     //精确延时 大于 480us
    return(x);
    }
    /***************************************************************************
    ** 函数名称:void Dis_Lcd_Start(void)
    ** 输 入:
    ** 输 出:
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城  QQ:15716780
    ** 日 期: 2008_08_21
    ** 功能描述: 读一个字节
    ****************************************************************************/
    unsigned char DS18B20_ReadOneChar(void)
    {
    unsigned char i,dat;
    Uint32 Temp_DS18B20;    //设置LCD控制引脚为输出
       dat = 0;
    Temp_DS18B20 = DS18B20;
    IO1DIR |= DS18B20;   //设置引脚为输出
       for (i=1;i<=8;i++)
       {
      dat>>=1;
      IO1DIR |= DS18B20;   //设置引脚为输出
      IO1SET |= DS18B20; // 给脉冲信号
        DS18B20_delay_us(2);
      IO1CLR |= DS18B20;   //将Temperature_RW拉低
        DS18B20_delay_us(10);
      IO1SET |= DS18B20; // 给脉冲信号
        DS18B20_delay_us(15);
      IO1DIR &= (~Temp_DS18B20);   //转为输入
      if(IO1PIN & DS18B20)     //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
      dat |= 0x80;  //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        DS18B20_delay_us(60);                        //延时60us左右
       }
    IO1DIR |= DS18B20;   //设置引脚为输出
    IO1SET |= DS18B20; // 给脉冲信号
       return (dat);
    }
    /******************************************************************************
    ** 函数名称:void DS18B20_WriteOneChar(unsigned char dat)
    ** 输 入:   无
    ** 输 出:
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城 QQ:15716780
    ** 日 期: 2008_08_21
    ** 功能描述: 写一个字节
    **********************************************************************************/
    void DS18B20_WriteOneChar(unsigned char dat)
    {
       unsigned char j, testb;
    IO1DIR |= DS18B20;   //设置引脚为输出
    for (j=1;j<=8;j++)
    {  
      testb = dat & 0x01;
      if (testb)
      {
       IO1CLR |= DS18B20; // 给脉冲信号
       DS18B20_delay_us(10);          // 延时10us
       IO1SET |= DS18B20; // 给脉冲信号   
       DS18B20_delay_us(75);         //延时75us
      }
      else
      {
       IO1CLR |= DS18B20; // 给脉冲信号;   
       DS18B20_delay_us(75);          // 延时75us
       IO1SET |= DS18B20; // 给脉冲信号   
       DS18B20_delay_us(10);         //延时10us
      }
      dat = dat >> 1;
    }
    }
    /*********************************************************************************
    ** 函数名称:Ushort16 DS18B20_ReadTemperature(void)
    ** 输 入:
    ** 输 出:   sdata 温度值
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城 QQ:15716780
    ** 日 期:
    ** 功能描述:  读取温度
    *******************************************************************************/
    Ushort16 DS18B20_ReadTemperature(void)
    {
    Uchar8 DS18B20_flag[2];
    Uchar8 tempL = 0;
    Uchar8 tempH = 0;
    Ushort16 sdata;        //测量到的温度的整数部分
    Uchar8 TEMP_Flag, xiaoshu;       //小数第一位
    fp32 xiaoshu1;  
    DS18B20_flag[0] = DS18B20_Reset(); //初始化
    DS18B20_WriteOneChar(0xcc); //跳过读序列号的操作
    DS18B20_WriteOneChar(0x44); //启动温度转换
    DS18B20_delay_us(1000); //转换需要一点时间,延时
    DS18B20_flag[1] = DS18B20_Reset(); //初始化
    DS18B20_WriteOneChar(0xcc); //跳过读序列号的操作
    DS18B20_WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
    tempL = DS18B20_ReadOneChar(); //读出温度的低位LSB
    tempH = DS18B20_ReadOneChar(); //读出温度的高位MSB

    if((DS18B20_flag[1] == 0) && (DS18B20_flag[1] == 0))  //没有检测到温度传感器
    {
      if(tempH>0x7f)      //最高位为1时温度是负
      {
       tempL=~tempL;         //补码转换,取反加一
       tempH=~tempH+1;
       TEMP_Flag =1;                       //为负数时,将TEMP_Flag =1      
      }
      else
      {
       TEMP_Flag =0;                       //为正数时,将TEMP_Flag =0
      }
      sdata = (tempL /16) | ((tempH & 0x07) *16);      //整数部分
      xiaoshu1 = ((tempL&0x0f) * 0.0625) * 10; //小数第一位
      xiaoshu = (Uchar8)xiaoshu1;
      sdata = sdata * 10 + xiaoshu;   //一位小数点,所以要放大10 倍
      if(TEMP_Flag)       //最高位表示下负号
      {
       if(sdata > 9999)
       {
        sdata = 9999;
       }
       sdata = sdata | 0x8000;
      }
    }
    else  sdata = 0xffff;
    return(sdata);  
    }
  • qzc001617 (2008-10-11 16:24:39)

    修下一下:
    /***************************************************************************
    ** 函数名称:void Dis_Lcd_Start(void)
    ** 输 入:
    ** 输 出:
    ** 全局变量: 无
    ** 调用模块: 无
    ** 作 者: 邱志城  QQ:15716780
    ** 日 期: 2008_08_21
    ** 功能描述: 读一个字节
    ****************************************************************************/
    unsigned char DS18B20_ReadOneChar(void)
    {
            unsigned char i,dat;
            Uint32 Temp_DS18B20;                  //设置LCD控制引脚为输出
              dat = 0;
            Temp_DS18B20 = DS18B20;
            IO1DIR |= DS18B20;                        //设置引脚为输出
              for (i=1;i<=8;i++)
              {
                    dat>>=1;
                    IO1DIR |= DS18B20;                        //设置引脚为输出
                    IO1SET |= DS18B20; // 给脉冲信号
                      DS18B20_delay_us(2);
                    IO1CLR |= DS18B20;                        //将Temperature_RW拉低
                      DS18B20_delay_us(10);
                    IO1SET |= DS18B20; // 给脉冲信号
                      DS18B20_delay_us(10);                         //此时间不能太大,大了就会不稳定
                    IO1DIR &= (~Temp_DS18B20);                 //转为输入
                    if(IO1PIN & DS18B20)                          //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
                    dat |= 0x80;  //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
                      DS18B20_delay_us(60);                        //延时60us左右
              }
            IO1DIR |= DS18B20;                        //设置引脚为输出
            IO1SET |= DS18B20; // 给脉冲信号
              return (dat);
    }