程式會讀取多個 DS18B20 在一條總線上,主機會用搜尋算法 (Search Algorithm) 二叉樹 (Binary Tree) 方式,直至將所有 DS18B20 ROM 的序列號讀出,方式可參考 DIY - PIC:18F4550 多個 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">8>
{
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 (一百四十九)
※ 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%
天氣:大致多雲
沒有留言:
張貼留言