GIAO TiẾP ONEWIRE
GiỚI THIỆU
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
ĐỊNH DẠNG DỮ LiỆU
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
ĐỊNH DẠNG DỮ LiỆU
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
XÂY DỰNG CÁC LỆNH CƠ BẢN
//báo chân giao tiep I2C
#defne DQ P0_3
//hàm reset
unsigned char
Init_DS18B20(void)
{
DQ = 0;
Delay(60); //480us
DQ = 1;
Delay(8); 64us,
presence = DQ;
Delay(50); // 400us,
DQ = 1;
return (presence);
}
void
WriteOneChar(unsigne
d char dat)
{
unsigned char i = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay(1); //<15us
dat >>= 1; //CY
DQ = CY;
Delay(6); //> 45us
DQ = 1;
}
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
unsigned char
ReadOneChar(void)
{unsigned char i = 0;
unsigned char dat = 0;
DQ = 1;
for (i = 0; i < 8; i++)
{DQ = 0;
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if (DQ == 1)
dat |= 0x80;
Delay(6); //> 45us
DQ = 1;
}return (dat);
}
ỨNG DỤNG: ĐO NHIỆT ĐỘ DÙNG DS18B20
- Sử dụng 1 chân DQ để truyền thông
- Độ phân giải từ 9 đến 12 bit
- Dãi nhiệt độ -55 đến 125
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
CÁC LỆNH
CÁC LỆNH ROM:
-SEACH ROM (F0H): Tìm số lượng ds18b20 nối vào mạch
-READ ROM (33H): Đọc 8 byte liên quan đến mã xuất xưởng (để xử lý
bus có nhiều cảm biến), chỉ dùng lệnh này khi trên mạch có 1 cảm biến
-MATCH ROM (55H): cùng với 64bit để chọn ra 1 cảm biến cụ thể
-SKIP ROM (CCH): Truy cập thẳng đến bộ nhớ mà ko cần chuỗi mã 64bit
-ALARM SEACH (ECH): giống SEACH ROM, nhưng cảm biến chỉ phản
hồi khi nhiệt độ vượt quá ngưỡng quy định
•Sau khi sử dụng các lệnh ROM để xác định 1 cảm biến cụ thể thì sử
dụng đến nhóm lệnh chức năng
CÁC LỆNH CHỨC NĂNG:
-CONVERT (44H):Bắt đầu đo và chuyển đổi, thời gian chuyển đổi <200us
-READ SCRATCHPAD (BEH): cho phép đọc nội dung bộ nhớ nháp
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
ĐỊNH DẠNG KẾT QuẢ
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
LẬP TRÌNH
if (Init_DS18B20() == 0)
{
WriteOneChar(0xCC); // SKIP ROM
WriteOneChar(0x44); // CONVERT
}
if (Init_DS18B20() == 0)
{
WriteOneChar(0xCC); // SKIP ROM
WriteOneChar(0xBE); // READ SCRATCHPAD
temp_data[0] = ReadOneChar();
temp_data[1] = ReadOneChar();
Temperature_conver();
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng
LẬP TRÌNH
void Temperature_conver()
{
unsigned char minus = 0;
if (temp_data[1] > 127) //Nhiệt độ âm (dạng bù 2)
{
temp_data[0] = (~temp_data[0]) + 1;//chuyển lại dạng số dương (bù 1 +1)
if ((~temp_data[0]) >= 0xff)
temp_data[1] = (~temp_data[1]) + 1;
else
temp_data[1] = ~temp_data[1];
minus = 1;
}
}
Cao Nguyễn Khoa Nam - Khoa Điện - Trường Cao đẳng Công nghệ Đà Nẵng