2012年12月4日 星期二

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

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

程式的測試是為了實現下一步讀取多個 DS18B20 溫度感測器而做,總線接上一個 DS18B20,祇需要向 DS18B20 發出 Read ROM (33h) 指令,接收從 DS18B20 發出至總線的數據,簡單讀取 DS1820 溫度感測器內 ROM 中的編碼(即 64位元位址),然後將數據轉換成 ASCII Code,顯示在 LCD 1602 屏上。 

18F4550 + DS18B20 電路圖
單個 DS18B20 ROM 的序列號讀取程式
主程式:
void main(void)
{             
    char LCD_name[] ="BWS DS18B20 v1.1";
    char LCD_name2[]="                ";
    char temp,x;


        TRISA = 0b00000001;                 // Setup RA0=Input RA1=Output
        TRISB = 0b00100000;                 // Setup RB5=Input

        // 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
        LcdSetLine1();                         // Put cursor on start of line 1
        putsXLCD(LCD_name);                     // Display text

        read_romcode_18B20();

        for (x=0; x<8 span="span" x="x">
             bin2Hex(glb_Buf[x]);
             LCD_name2[x*2]=glb_Buf2[0];
             LCD_name2[x*2+1]=glb_Buf2[1];
             }

        LcdSetLine2();                          // Put cursor on start of line 2
        putsXLCD(LCD_name2);                    // Display Code

        while(1)   
}

Read ROM 副程式:
void read_romcode_18B20(void) {
    int n;
    reset_ow();
    write_byte_ow(0x33);             //Read ROM Code
    for (n=0;n<8 glb_buf="glb_buf" n="n" read_byte_ow="read_byte_ow" span="span">
}

Binary Convert to Hexdecimal 副程式:
void bin2Hex(unsigned char Temp)
{
     unsigned char x,y,z;
     unsigned char hex_value;
     unsigned char hex_base;

     z=128;
     hex_value = 0;
     hex_base = 8;

     for (x=0; x<4 span="span" x="x">
         if ((z & Temp) > 0){
             hex_value = hex_value+hex_base;
         }
         z = z >> 1;
         hex_base  = hex_base/2;
     }

     if (hex_value < 10) hex_value=hex_value+48;
        else hex_value = hex_value+55;
        glb_Buf2[0]= hex_value;

        hex_value = 0;
        hex_base = 8;
     for (x=0; x<4 span="span" x="x">
         if ((z & Temp) > 0){
             hex_value = hex_value+hex_base;
         }
         z = z >> 1;
         hex_base  = hex_base/2;
     }

     if (hex_value < 10) hex_value=hex_value+48;
     else hex_value = hex_value+55;
     glb_Buf2[1]= hex_value;

     return;
}


測試中的單個DS18B20試驗板
筆者的 DS18B20 編號及序列號:
編號
序列號 (Silicon Series Number)
31
28 5A 51 3A 04 00 00 6A
32
28 5E BE 38 04 00 00 04
33
28 A2 73 3A 04 00 00 C2
34
28 BA 5B 3A 04 00 00 FE
35
28 10 5F 2E 04 00 00 44
40
28 EA 35 88 03 00 00 8F
41
28 DE B3 88 03 00 00 E9

相關網址:
※ 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月 4日 天氣報告
氣溫:17.5@ 22.10
相對濕度:百分之 97%
天氣:微雨

沒有留言:

張貼留言