首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >One Wire问题

One Wire问题
EN

Stack Overflow用户
提问于 2009-12-15 18:07:19
回答 2查看 543关注 0票数 4

我需要你合格的帮助!我正在用C++编程,使用PIC18F87J50,并试图在我的H0端口连接DS18B20!

我认为我的底层编程是正确的,所以...我遇到的问题(我想我有)是,当执行ROM命令时,我搜索64位ROM代码。

第一个字节应该告诉我组件属于哪个家族(28h)。接下来的48位应该只为该组件提供了一个uniq序列。最后一个用于CRC。

当我这样做的时候,我的想法正确吗:

代码语言:javascript
复制
void Device_ID( uint8_t command ){
    uint8_t ROM_CODE[8]; // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code
    uint8_t loop;
    static char container[8];

    OW_reset_pulse();
    OW_write_byte( command );

    for(loop = 0; loop < 8; loop++)     // 1 byte in per time = 64-bits
    {
        ROM_CODE[loop] = OW_read_byte(); 
    }

    HexToStrWithZeros(ROM_CODE[0], container);
    Display_Cls();
    Display_StringAt ("Family Code: ",5,6);
    Display_Buffer (container);
}

如果我问ROM_CODE1-6中的代码,我应该得到uniq编号??我不应该吗??

致以亲切的问候!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-15 19:25:13

访问序列号的最好方法可能是使用strncpy将其复制到单独的缓冲区中。

代码语言:javascript
复制
#include <string.h>

...

char family;
char serial[7]; // Extra byte for null terminator
char checksum;

...

family = ROM_CODE[0];

strncpy(serial, &ROM_CODE[1], 6);
serial[6] = '\0';

checksum = ROM_CODE[7];

...

&ROM_CODE[1]是用来获取ROM_CODE中第二个元素的地址的。ROM_CODE+1也可以工作,但是我的C有点生疏了。

由于C使用null-terminated strings,因此在末尾添加了null ('\0')。这将确保它与C库例程和常用的C语言习惯用法兼容。

您也可以直接从数组中访问它。但这将很难使用,而且不太可能值得,除非你真的需要6字节的内存。

根据您的应用程序的复杂程度,您可能希望将其包装在一个类中。将8个字符的缓冲区传递给构造函数,然后使用getFamily() / getSerial()等方法检索所需的信息。

然而,对于一个非常简单的应用程序来说,这是一大堆额外的代码来简化已经非常容易管理的东西。

票数 2
EN

Stack Overflow用户

发布于 2009-12-27 02:59:28

这是一些允许你读取设备ID的代码。我认为你的代码运行得太快了。这是我用来与DS18B20接口的一些代码。

代码语言:javascript
复制
/****************************************************************************
* temperature.h
****************************************************************************/

#ifndef TEMP_H
#define TEMP_H

extern double read_temp ( void );
extern   void start_temp( void );
extern   void Device_ID ( void );

#endif

/****************************************************************************
* temperature.c
****************************************************************************/

void     reset_ow(void);
void     write_ow(uint8_t  b);
uint8_t  read_ow (void);

#define OW_TEMP_SIG LATHbits.LATH0
#define OW_TEMP_TRIS TRISHbits.TRISH0
#define OW_TEMP_SIG_IN PORTHbits.RH0
#define DIR_OUT 0
#define DIR_IN 1


void Device_ID( void )
{
    uint8_t loop; 
   uint8_t family; 
   uint8_t checksum; 
   uint8_t ROM_CODE[8];         // 1 byte CRC, 6 bytes SERIAL, 1 byte Family code

   reset_ow();
   write_ow(0x33); // READ ROM COMMAND DS18B20

    for(loop = 0; loop < 8; loop++) // 1 byte in per time = 64-bits
    {
        ROM_CODE[loop] = read_ow();
    }

    family = ROM_CODE[0];
    checksum = ROM_CODE[7];

  // add extra code to handle code
}

void start_temp(void) 
{
   uint8_t i;

   OW_TEMP_SIG=1;
   OW_TEMP_TRIS=DIR_OUT;
   for ( i=0;i<100;i++)
   {
       Delay_us(100);
   }
   reset_ow();
   write_ow(0xcc); // skip rom
   write_ow(0x44); // start t conv
}

double read_temp(void) 
{
   double temp=0;
   S16 itemp;

   reset_ow();
   write_ow(0xcc); // skip rom
   write_ow(0xbe); // read scratch pad
   itemp=read_ow();
   itemp|=(S16)read_ow()<<8;

   temp = itemp*(0.0625);
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   return temp; 
}


void reset_ow(void)
{
   OW_TEMP_TRIS=DIR_OUT;
   OW_TEMP_SIG=0;
   Delay_us(250);
   Delay_us(250);
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   Delay_us(250);
   Delay_us(250);
}

void write_ow(uint8_t b)
{
   uint8_t i;

   OW_TEMP_SIG=1;
   OW_TEMP_TRIS=DIR_OUT;
   for ( i=0;i<8;i++)
   {
      OW_TEMP_SIG=0;
      if ( b & 0x01 )
      {
         Delay_us(10);
         OW_TEMP_SIG=1;
      }
      Delay_us(70);
      OW_TEMP_SIG=1;
      Delay_us(10);
      b >>= 1;
   }
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
}

uint8_t read_ow(void)
{
   uint8_t b=0;
   uint8_t m;
   uint8_t i;

   m=1;
   for ( i=0;i<8;i++)
   {
      OW_TEMP_SIG=1;
      OW_TEMP_TRIS=DIR_OUT;
      OW_TEMP_SIG=0;        
      Delay_us(8);
      OW_TEMP_TRIS=DIR_IN;
      OW_TEMP_SIG=1;
      Delay_us(15);

      if ( 1 == OW_TEMP_SIG_IN )
      {
         b |= m;
      }
      m <<=1;
      Delay_us(60);
   }
   OW_TEMP_TRIS=DIR_IN;
   OW_TEMP_SIG=1;
   return b;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1906383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档