2012年12月11日 星期二

DIY - PIC:18F4550 多個 DS18B20 ROM 的序列號讀取程式 (一百五十四)

DIY - PIC18F4550 多個  DS18B20 ROM 的序列號讀取程式 (一百五十四)

程式會讀取多個 DS18B20 在一條總線上,主機會用搜尋算法 (Search Algorithm) 二叉樹 (Binary Tree) 方式,直至將所有 DS18B20 ROM 的序列號讀出,方式可參考 DIY - PIC18F4550 多個  DS18B20 ROM 的序列號讀取方式 (一百五十三)

PIC18F4550 多個  DS18B20 電路圖
PIC18F4550 多個  DS18B20測試
主程式:
void main(void)
{             
    char LCD_name[] ="BWS DS18B20 v1.3";
    char LCD_name2[]="                ";

    unsigned int i=0;
    unsigned char tmpChar,Found,WarningFlag;
    signed char chTemp=0;
    signed char id=0;

TRISA = 0b00000001;                 // Setup RA1=Input=AD RA4=Output=LED
TRISB = 0b00100001;                 // Setup RB5=Input    RB1=Input=DS1820
        TRISC = 0b10111111;                 //RC7(RX) input mode   RC6(TX): output mode

        // Initialise LCD
       OpenXLCD(FOUR_BIT&LINES_5X7);       // Init the LCD Display
        while(BusyXLCD());
        WriteCmdXLCD(BLINK_OFF & CURSOR_OFF ); 
        while(BusyXLCD());
        stdout = _H_USER;              // Redirect I/O to LCD
        //Delay10KTCYx(24);          // 10,000x24x1/12us = 20ms
        LcdSetLine1();                      // Put cursor on start of line 1
        putsXLCD(LCD_name);      // Display text

        i = DS_Reset();
        LcdSetLine2();                          // Put cursor on start of line 2
        if (i == 0)
        { 
         putrsXLCD("Reset = 0");
        } else
        { 
         putrsXLCD("Reset = 1");
        } // End If

        // Find devices on the bus
        roms_count=0;
        roms_count = FindDevices();  

        if(roms_count > 0)
        {
         sprintf(sLCD_Line,"Found Sensor=%3u",roms_count);
         LcdSetLine1();                             // Put cursor on start of line 1
         putsXLCD(sLCD_Line);     // Display text

        for (id=0; id
        {
            for (i=0; i<8 i="i" span="span">
        {
            bin2Hex2ASC(ROM_ID[id][i]);
            LCD_name2[i*2]=glb_Buf2[0];
            LCD_name2[i*2+1]=glb_Buf2[1];
        }
        } // End of For


        LcdClear();
        while(1)   
        {

          LATAbits.LATA4 = 1;             // RA4=1 LED=ON Scope=1

          for (id=0; id            
        {
           chTemp=Read_Temperature(id);
           Temp_calc(id);

           if (rs232_tx == 1){
               rs232SendString(RS232_Buf);          
               sprintf(RS232_Buf,"\r\n");
               rs232SendString(RS232_Buf);
           } // End If 

        } // For Loop

        LATAbits.LATA4 = 0;                     // RA4=0 LED=OFF Scope=50ms
        Delay10KTCYx(240);                  // 10,000 x 1 x (4 x 0.05us) = 2ms
                                                                  // Scope = 2ms      
        } // End While
}
else
{     // Not Sensor Found
      sprintf(sLCD_Line,"Not Sensor = %1u",roms_count);
      LcdSetLine2();                                             // Put cursor on start of line 1
      putsXLCD(sLCD_Line);                                      // Display text

while(1);

DS_Search_ROM 副程式:
unsigned char DS_Search_ROM()
{
  unsigned char id_bit_number;   
  unsigned char last_zero;       
  unsigned char rom_byte_number; 
  unsigned char search_result;   
  unsigned char id_bit;         
  unsigned char cmp_id_bit;     
  unsigned char rom_byte_mask;   
  unsigned char TX_bit;         

  id_bit_number = 1;
  last_zero = 0;                 
  rom_byte_number = 0;
  rom_byte_mask = 1;
  search_result = 0;
  g_CRC8 = 0;

  if (!g_isAllFound) 
  {
    if (DS_Reset()==1)
        {
                g_Last00 = 0;
                g_isAllFound = 0;
                return 0;
        }

   
    DS_Write_Byte(SERACH_ROM);

    do
    {
     id_bit = DS_Read_Bit();
     cmp_id_bit = DS_Read_Bit();
     if ((id_bit == 1) && (cmp_id_bit == 1))    
     {  break;  }                               
     else
     {
        if (id_bit != cmp_id_bit)               
        { 
           TX_bit = id_bit;                     
        }
        else
        {

           if (id_bit_number < g_Last00)
           {
              TX_bit = ((sROMID[rom_byte_number] & rom_byte_mask) > 0);
           }
           else 
           {
              TX_bit = (id_bit_number == g_Last00);
           }
           if (TX_bit == 0)
           {
             last_zero = id_bit_number;
           }
        }

       if (TX_bit == 1)
         sROMID[rom_byte_number] |= rom_byte_mask;      
       else
         sROMID[rom_byte_number] &= ~rom_byte_mask; 

       DS_Write_Bit(TX_bit);
       id_bit_number++;               
       rom_byte_mask <<= 1;          

       if (rom_byte_mask == 0)
       {
         Do_CRC8(sROMID[rom_byte_number]);      
         rom_byte_number++;                     
         rom_byte_mask = 1;                     
       }
     }
    }while(rom_byte_number < 8);                

    if (!((id_bit_number < 65) || (g_CRC8 != 0)))
    {
     
      g_Last00 = last_zero;
     
      if (g_Last00 == 0)
        g_isAllFound = 1;   
      search_result = 1;   
    }
  }

  if (!search_result || !sROMID[0])
  {
    g_Last00 = 0;
    g_isAllFound = 0;
    search_result = 0;
  }

  return search_result;
}

找到第1 DS18B20 溫度感測器
找到共 4 DS18B20 溫度感測器
相關網址:
※ DIY - PIC:18F4550 DS18B20 ROM 的序列號介紹 (一百五十)
※ DIY - PIC:18F4550 單個 DS18B20 ROM 的序列號讀取程式 (一百五十一)
※ DIY - PIC:18F4550 + DS18B20 溫度感測器線 + 4mm 插頭 (一百五十二)
※ DIY - PIC:18F4550 多個 DS18B20 ROM 的序列號讀取方式 (一百五十三)
※ DIY - PIC:18F4550 多個 DS18B20 ROM 的序列號讀取程式 (一百五十四)
※ DIY - PIC:18F4550 多個 DS18B20 Data Logger 資料記錄儀 + PS/2 鍵盤 (一百五十五)
※ DIY - PIC:18F4550 多個 DS18B20 Data Logger 資料記錄儀 + RS232 (一百五十六)
※ DIY - PIC:18F4550 多個 DS18B20 Data Logger 資料記錄儀 (一百五十七)

相關網址:
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 機殼設計 (一百三十八)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 機殼加工 (一百三十九)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 面背板組裝 (一百四十)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 系統底板 (一百四十一)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 底板組裝 (一百四十二)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 系統組裝 (一百四十三)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 附件加工 (一百四十四)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 充電池 (一百四十五)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 鋰離子電池 (一百四十六)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 充電板 (一百四十七)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 充電板組裝 (一百四十八)
※ DIY - PIC:18F4550 Data Logger 資料記錄儀 – 藍屏 LCD 1602 (一百四十九)

2012年 12月 11日 天氣報告
氣溫:17.8@ 21.40
相對濕度:百分之 72%
天氣:大致多雲

沒有留言:

張貼留言