⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ow_comm.lst

📁 硬件平台:C8051F314 包括键盘扫描程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 259   1         {
 260   2            // 1-Wire reset
 261   2            if (!ow_reset())
 262   2            {
 263   3               // reset the search
 264   3               LastDiscrepancy = 0;
 265   3               LastDeviceFlag = FALSE;
 266   3               LastFamilyDiscrepancy = 0;
 267   3               return FALSE;
 268   3            }
 269   2      
 270   2            // issue the search command 
 271   2            ow_byte_wr(0xF0);  
 272   2      
 273   2            // loop to do the search
 274   2            do
 275   2            {
 276   3               // read a UCHAR and its complement
 277   3               id_bit = ow_bit_rd();
 278   3               cmp_id_bit = ow_bit_rd();
 279   3      
 280   3               // check for no devices on 1-wire
 281   3               if ((id_bit == 1) && (cmp_id_bit == 1))
 282   3                  break;
 283   3               else
 284   3               {
 285   4                  // all devices coupled have 0 or 1
 286   4                  if (id_bit != cmp_id_bit)
 287   4                     search_direction = id_bit;  // UCHAR write value for search
 288   4                  else
 289   4                  {
 290   5                     // if this discrepancy if before the Last Discrepancy
 291   5                     // on a previous next then pick the same as last time
 292   5                     if (id_bit_number < LastDiscrepancy)
 293   5                        search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
 294   5                     else
 295   5                        // if equal to last pick 1, if not then pick 0
 296   5                        search_direction = (id_bit_number == LastDiscrepancy);
 297   5      
 298   5                     // if 0 was picked then record its position in LastZero
 299   5                     if (search_direction == 0)
 300   5                     {
 301   6                        last_zero = id_bit_number;
 302   6      
 303   6                        // check for Last discrepancy in family
C51 COMPILER V8.02   OW_COMM                                                               09/17/2008 10:45:02 PAGE 6   

 304   6                        if (last_zero < 9)
 305   6                           LastFamilyDiscrepancy = last_zero;
 306   6                     }
 307   5                  }
 308   4      
 309   4                  // set or clear the UCHAR in the ROM byte rom_byte_number
 310   4                  // with mask rom_byte_mask
 311   4                  if (search_direction == 1)
 312   4                    ROM_NO[rom_byte_number] |= rom_byte_mask;
 313   4                  else
 314   4                    ROM_NO[rom_byte_number] &= ~rom_byte_mask;
 315   4      
 316   4                  // serial number search direction write UCHAR
 317   4                  ow_bit_wr(search_direction);
 318   4      
 319   4                  // increment the byte counter id_bit_number
 320   4                  // and shift the mask rom_byte_mask
 321   4                  id_bit_number++;
 322   4                  rom_byte_mask <<= 1;
 323   4      
 324   4                  // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
 325   4                  if (rom_byte_mask == 0)
 326   4                  {
 327   5                      docrc8(ROM_NO[rom_byte_number]);  // accumulate the CRC
 328   5                      rom_byte_number++;
 329   5                      rom_byte_mask = 1;
 330   5                  }
 331   4               }
 332   3            }
 333   2            while(rom_byte_number < 8);  // loop until through all ROM bytes 0-7
 334   2      
 335   2            // if the search was successful then
 336   2            if (!((id_bit_number < 65) || (crc8 != 0)))
 337   2            {
 338   3               // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
 339   3               LastDiscrepancy = last_zero;
 340   3      
 341   3               // check for last device
 342   3               if (LastDiscrepancy == 0)
 343   3                  LastDeviceFlag = TRUE;
 344   3               
 345   3               search_result = TRUE;
 346   3            }
 347   2         }
 348   1      
 349   1         // if no device found then reset counters so next 'search' will be like a first
 350   1         if (!search_result || !ROM_NO[0])
 351   1         {
 352   2            LastDiscrepancy = 0;
 353   2            LastDeviceFlag = FALSE;
 354   2            LastFamilyDiscrepancy = 0;
 355   2            search_result = FALSE;
 356   2         }
 357   1      
 358   1         return search_result;
 359   1      }
 360          
 361          
 362          
 363          //--------------------------------------------------------------------------
 364          // Calculate the CRC8 of the byte value provided with the current 
 365          // global 'crc8' value. 
C51 COMPILER V8.02   OW_COMM                                                               09/17/2008 10:45:02 PAGE 7   

 366          // Returns current global crc8 value
 367          //
 368          UCHAR docrc8(UCHAR value)
 369          {
 370   1         // See Application Note 27
 371   1         
 372   1         // TEST BUILD
 373   1         crc8 = dscrc_table[crc8 ^ value];
 374   1         return crc8;
 375   1      }
 376          
 377          /************************************************************
 378          -----1-wire总线主机获取总线上所有器件地址的程序-----
 379          说明: 根据搜索算法查找所有器件的64位地址并存储于指定位置
 380                 并根据器件地址的家族号判断,总线上为何种设备
 381          出口参数:
 382                       如果存在DS2762,HasDs2762 = 1
 383                       如果存在DS2415,HasDs2415 = 1
 384          //void find_ow_dev(void)
 385          *************************************************************/
 386          
 387          UCHAR find_ow_dev(void)
 388          {
 389   1         UCHAR rslt,j;//,cnt;
 390   1         SCHAR i;     // i一定要为有符号数,否则会出错
 391   1         for(j = 0; j < 2; j++)
 392   1         {
 393   2           if(j == 0) 
 394   2             rslt = ow_first();
 395   2           else
 396   2             rslt = ow_next();
 397   2           if(rslt == 1)          // 
 398   2           {
 399   3             for (i = 7; i >= 0; i--)
 400   3               g_romaddr[j].romaddr[i] = ROM_NO[i];    // 存储64bit地址
 401   3             if(ROM_NO[0] == DS2762_FC)                // 判断是何器件
 402   3               HasDs2762 = 1;
 403   3             else if(ROM_NO[0] == DS2415_FC)
 404   3               HasDs2415 = 1;
 405   3           }
 406   2           else
 407   2             break;
 408   2         }
 409   1         return j;   // 返回数量
 410   1      }
 411          
 412          /************************************************************
 413          -----1-wire总线主机查询DS2762寄存器的程序-----
 414          说明: 写读取命令69H,0CH,读取电池输出电压
 415                 写读取命令69H,0EH,读取电池电流
 416          //void read_ds2762(void)
 417          *************************************************************/
 418          
 419          void read_ds2762(void)
 420          {
 421   1        UCHAR i;
 422   1        ow_reset();                    // 一个完整的总线动作之前都要复位总线
 423   1        ow_byte_wr(0x55);              // 发送NET ADDRESS COMMAND(MATCHE NETWORK ADDRESS)
 424   1        for(i = 0; i < 8; i++)         // 发送前面搜索到的地址
 425   1        {
 426   2          if(g_romaddr[0].st_romaddr.familycode == DS2762_FC)
 427   2            ow_byte_wr(g_romaddr[0].romaddr[i]);
C51 COMPILER V8.02   OW_COMM                                                               09/17/2008 10:45:02 PAGE 8   

 428   2          else
 429   2            ow_byte_wr(g_romaddr[1].romaddr[i]);    
 430   2        }
 431   1        ow_byte_wr(0x69);
 432   1        ow_byte_wr(0x0c);
 433   1        for(i = 0; i < 2; i++)
 434   1        {
 435   2          BatVol[i] = ow_byte_rd();
 436   2        }
 437   1        for(i =0; i < 2; i++)
 438   1        {
 439   2          BatCur[i] = ow_byte_rd();
 440   2        }
 441   1        ow_reset();                    // 读完后要复位总线
 442   1      }
 443          
 444          /************************************************************
 445          -----1-wire总线主机查询DS2415寄存器的程序-----
 446          说明: 写读取命令66H,读取RTC CLOCK
 447                 写设置命令69H,0EH,读取电池电流
 448          //void read_ds2415(void)
 449          *************************************************************/
 450          
 451          void read_ds2415(void)
 452          {
 453   1        UCHAR i;
 454   1        ow_reset();                    // 一个完整的总线动作之前都要复位总线
 455   1        ow_byte_wr(0x55);              // 发送NET ADDRESS COMMAND(MATCHE NETWORK ADDRESS)
 456   1        for(i = 0; i <8; i++)          // 发送前面搜索到的地址
 457   1        {
 458   2          if(g_romaddr[0].st_romaddr.familycode == DS2415_FC)
 459   2            ow_byte_wr(g_romaddr[0].romaddr[i]);
 460   2          else
 461   2            ow_byte_wr(g_romaddr[1].romaddr[i]);    
 462   2        }
 463   1        ow_byte_wr(0x66);
 464   1        ow_byte_rd();                  // 
 465   1        for(i = 0; i < 4; i++)         // 接收4字节clock
 466   1        {
 467   2          RtcClk[i] = ow_byte_rd();
 468   2        }
 469   1        ow_reset();                    // 读完后一定要复位,否则会一直读
 470   1      }
 471          
 472          /************************************************************
 473          -----ONE WIRE 通信任务-----
 474          功能: 主程序调用该任务,与ow器件通信
 475          参数: 行列号(ex。0x31 表示第3行第1列) 
 476          //说明: 
 477          //void task_owcomm(void)
 478          *************************************************************/
 479          
 480          void task_owcomm(void)
 481          {
 482   1        if(gOwdevNum != 0)            // 如果存在OW设备则读取数值
 483   1        {
 484   2              if(HasDs2762 == 1)
 485   2              {
 486   3                read_ds2762();
 487   3              }
 488   2              if(HasDs2415 == 1)
 489   2              {
C51 COMPILER V8.02   OW_COMM                                                               09/17/2008 10:45:02 PAGE 9   

 490   3                read_ds2415();
 491   3              }
 492   2        }     
 493   1      }
 494          // debug function
 495          //#ifdef OW_DEBUG
 496          //void ow_test(void)
 497          //{
 498          //  UCHAR i;
 499          //  if(ow_reset())
 500          //  {
 501          //    ow_byte_wr(0x33);    // issue READ ROM command
 502          //    DQ = 1;
 503          //    delay_us(3);
 504          //    for(i = 0; i < 8; i++)
 505          //    {
 506          //      g_testaddr.romaddr[i] = ow_byte_rd();
 507          //    }
 508          //  }
 509          //}
 510          //#endif


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    897    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =     41    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      13
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -