Chú ý : Source code bài viết dưới đây được biên dịch bằng phần mềm CodeVisionAVR để biên dịch code không lỗi xin vui lòng Download bản CodeVisionAVR Tại Đây
I. Sơ đồ kết nối đa điểm
Sau khi test thử nghiệm thành công, mình xin giới thiệu với các bạn CODE sử dụng DS18b20 trong đo lường đa điểm (Version 1.0.0 ^^) cùng vi điều khiển Atmega 8. Cụ thể là mình sẽ đo nhiệt độ tại nhiều nơi sử dụng nhiều cảm biến DS18b20. Các cảm biến này cùng được kết nối trên 1 dây DATA (theo chuẩn 1 Wire):
Trong code của mình các bạn có thể cấu hình lại số lượng DS18b20 tối đa ở trên Bus (mình đang cho là 8 con). Ở mạch thực tế, mình chỉ mới sử dụng 5 cảm biến DS18b20, giá trị nhiệt độ tại 5 điểm sẽ liên tục được cập nhật và hiển thị lên LCD1602.
Mình dùng trình biên dịch CodeVisionAVR, các bạn vào CodeWizardAVR –> 1 Wire, sau đó chọn chân DATA và tích vào Enable, Multiple Devices để lấy thư viện sử dụng nhiều DS18b20 trên 1 Bus.
II.Code Test V1.0.0:
#include <main.h> #include <var.h> void main(void) { unsigned char i,j; float Temp; char Lcd_Buffer[33]; // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0xff; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0xff; DDRD=0x00; // KHOI TAO CHUAN 1 WIRE // 1 Wire Data port: PORTC // 1 Wire Data bit: 5 // Note: 1 Wire port settings must be specified in the // Project|Configure|C Compiler|Libraries|1 Wire IDE menu. w1_init(); lcd_init(16); lcd_clear(); lcd_gotoxy(0,0); lcd_puts(" MINHHAGROUP"); lcd_gotoxy(0,1); lcd_puts("1 WIRE BUS DEMO"); delay_ms(2000); lcd_clear(); // Xac dinh so IC DS18b20 co tren Bus ds18b20_devices = w1_search(0xf0,ds18b20_rom_codes); sprintf(Lcd_Buffer,"SO THIET BI\nDS18B20: %u",ds18b20_devices); lcd_puts(Lcd_Buffer); delay_ms(3000); /* //Hien thi ROM CODE cua tung IC tren Bus if (ds18b20_devices) { for (i=0;i<ds18b20_devices;i++) { sprintf(Lcd_Buffer," IC DS18b20 #%u\nROM CODE:",i+1); lcd_clear(); lcd_puts(Lcd_Buffer); delay_ms(2000); lcd_clear(); for (j=0;j<8;j++) { sprintf(Lcd_Buffer,"%02X ",ds18b20_rom_codes[i][j]); lcd_puts(Lcd_Buffer); if(j==3) lcd_gotoxy(0,1); }; delay_ms(2000); }; } else while (1); // Khong co IC tren Bus */ // Cau hinh do phan giai 12 Bit cho cac IC DS18b20 tren Bus for (i=0;i<ds18b20_devices;) if (!ds18b20_init(&ds18b20_rom_codes[i++][0],20,30,DS18B20_12BIT_RES)) { sprintf(Lcd_Buffer,"Init error for\ndevice #%u",i); lcd_clear(); lcd_puts(Lcd_Buffer); while (1); // Qua trinh khoi tao co loi }; /* lcd_clear(); lcd_gotoxy(0,0); lcd_puts("NHIET DO TAI:"); */ while (1) { j=1; // Cap nhat nhiet do tai cac diem va hien thi len LCD1602 for (i=0;i<ds18b20_devices;i++) { Temp = ds18b20_temperature(&ds18b20_rom_codes[i][0]); sprintf(Lcd_Buffer,"t%u=%2.2f\xdfC",j++,Temp); lcd_clear(); lcd_puts(Lcd_Buffer); delay_ms(1500); } } } // ------------------END OF FILE-------------------- // -------------------------------------------------
Mình sẽ tối ưu hóa code hơn trong các Version sau… Chúc các bạn thành công!
Các bạn có thể tham khảo thêm Code mẫu TẠI ĐÂY :