Thứ Sáu, 18 tháng 9, 2015

Lap trinh vi dieu khien - Đo lường đa điểm với DS18b20 dùng AVR

Lap trinh vi dieu khien - Đo lường đa điểm với DS18b20 dùng AVR
XIN CHÀO CÁC BẠN...!
Sau khi test thử nghiệm thành công, hôm nay lap trinh vi dieu khien 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 EnableMultiple Devices để lấy thư viện sử dụng nhiều DS18b20 trên 1 Bus.​
Code Test V1.0.0 (lap trinh c):
HTML:
#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 tu hoc lap trinh thành công!!!

0 nhận xét:

Đăng nhận xét