12
HOÀNG KHÁNH THÂN ĐẠI HC SƯ PHM K  THU T TP-HCM Page 1 GIAO TIP VỚ I DS18B20 DÙNG PIC16F887 Xin chào tt c các bn, hôm nay tôi s chia s vớ i các bn cách thc đo nhi t độ dùng cm bi ến nhi t độ DS18B20 hi n th lên LCD16x02. C m bi ến này tr  v giá tr  nhit độ theo d ng s, có ngh  ĩ a là chúng ta không c n phi chuyn đổi ADC như con cm bi ến LM35 mà ch cn đọc giá tr  mà DS18B20 tr  v r i xu t ra LCD là xong. Để đọc đượ c giá tr  nhit độ mà c m  bi ến tr  v, chúng ta dùng vi đi u khin (vđk) để giao ti ế  p vớ i cm bi ến theo chun 1-dây (one- wire). Đề tài này không còn gì là m ớ i m c. Trước đây, khi tôi mớ i bt đầu giao ti ế  p vớ i con DS18B20 này cũng gp không ít khó khăn, code trên mng khá nhi u nhưng đều viết bng CCS nên thc ra tôi đọc cũng không hiu lm. Bí quá tôi đành đọc datasheet, vì vn tiếng anh h n h p nên v a đọc va tra t thành ra hơi vt vã. I. Đầu tiên, tôi xin nói v cm biến DS18B20. 1.1. Vài l ờ i v DS18B20 Theo như ngun tin chính xác nh t là datasheet ca nhà sn xut thì trên mi con DS18B20 có mt mã định danh duy nht 64 bit cha trong b nhớ  ROM trên chip (on chip), giá tr  nh  phân đượ c khc bng tia laze. Vì thế các b n có th dùng nhi u con cm bi ến để đo nhit độ nhi u nơ i và ch cn mt con vđk để đọc nhi t độ tng con là đượ c. đối vớ i bài này tôi ch dùng 1 con c m bi ến nên cũng không c n quan tâ m đến mã địa ch làm gì. Thêm mt s thông tin t  datasheet để các bn tham kh o: • S d ng giao di n mt dây nên ch cn có mt chân ra để truy n thông. • Có th đo nhit độ trong khong -55 ÷ +125 o C.Vớ i khong nhi t độ là -10°C ÷ +85°C thì độ chính xác ±0.5°C.Có ch c năng cnh báo nhi t độ vượ c qua giá tr  cho trướ c. Đin áp s  d ng : 3 ÷ 5.5 V,có th cu hình mã hóa nhi u độ t 9 ÷ 12 bit s bit càng lớ n thì độ chính xác cao hơn.Thờ i gian chuyn đổi nhit độ ti đa là 750ms cho m ã hóa 12 bit • Dòng tiêu th ti chế độ ngh cc nh. • Nếu cu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ng là : 0.5°C , 0.25°C ,0.125°C, 0.0625°C.Theo m c đị nh ca nhà sn xut nếu chúng ta không c u hình chế độ chuyn đổi thì nó s t  cu hình là 12 bit. Cm bi ến DS18b20 thường đượ c s d ng gm có 3 chân: VCC, GND, DATA như h ình d ướ i:

[Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

  • Upload
    gosuhp

  • View
    106

  • Download
    0

Embed Size (px)

Citation preview

Page 1: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 1

GIAO TIẾP VỚ I DS18B20 DÙNG PIC16F887

Xin chào tất cả các bạn, hôm nay tôi sẽ chia sẽ vớ i các bạn cách thức đo nhiệt độ dùng

cảm biến nhiệt độ DS18B20 hiễn thị lên LCD16x02. Cảm biến này tr ả về giá tr ị nhiệt độ theo

d ạng số, có ngh ĩ a là chúng ta không cần phải chuyển đổi ADC như con cảm biến LM35 mà chỉ cần đọc giá tr ị mà DS18B20 tr ả về r ồi xuất ra LCD là xong. Để đọc đượ c giá tr ị nhiệt độ mà cảm

 biến tr ả về, chúng ta dùng vi điều khiển (vđk) để giao tiế p vớ i cảm biến theo chuẩn 1-dây (one-

wire).

Đề tài này không còn gì là mớ i mẽ cả. Trước đây, khi tôi mớ i bắt đầu giao tiế p vớ i con

DS18B20 này cũng gặp không ít khó khăn, code trên mạng khá nhiều nhưng đều viết bằng CCS

nên thực ra tôi đọc cũng không hiểu lắm. Bí quá tôi đành đọc datasheet, vì vốn tiếng anh hạn hẹ pnên vừa đọc vừa tra từ thành ra hơi vất vã.

I.  Đầu tiên, tôi xin nói về cảm biến DS18B20.

1.1.  Vài lờ i về DS18B20

Theo như nguồn tin chính xác nhất là datasheet của nhà sản xuất thì trên mỗi con

DS18B20 có một mã định danh duy nhất 64 bit chứa trong bộ nhớ  ROM trên chip (on chip), giá

tr ị nhị  phân đượ c khắc bằng tia laze. Vì thế các bạn có thể dùng nhiều con cảm biến để đo nhiệtđộ nhiều nơ i và chỉ cần một con vđk để đọc nhiệt độ từng con là đượ c. đối vớ i bài này tôi chỉ dùng 1 con cảm biến nên cũng không cần quan tâm đến mã địa chỉ làm gì. Thêm một số thông

tin từ datasheet để các bạn tham khảo:

• Sử d ụng giao diện một dây nên chỉ cần có một chân ra để truyền thông.

• Có thể đo nhiệt độ trong khoảng -55 ÷ +125 oC.Vớ i khoảng nhiệt độ là -10°C ÷ +85°C thì độ 

chính xác ±0.5°C.Có chức năng cảnh báo nhiệt độ vượ c qua giá tr ị cho trướ c.

• Điện áp sử d ụng : 3 ÷ 5.5 V,có thể cấu hình mã hóa nhiệu độ từ 9 ÷ 12 bit số bit càng lớ n thì độ 

chính xác cao hơn.Thờ i gian chuyển đổi nhiệt độ tối đa là 750ms cho mã hóa 12 bit

• Dòng tiêu thụ tại chế độ nghỉ cực nhỏ.

• Nếu cấu hình cho DS18B20 theo 9,10,11,12 bit thì ta có độ chính xác tương ứng là : 0.5°C ,

0.25°C ,0.125°C, 0.0625°C.Theo mặc định của nhà sản xuất nếu chúng ta không cấu hình chế độ 

chuyển đổi thì nó sẽ tự cấu hình là 12 bit.

Cảm biến DS18b20 thường đượ c sử d ụng gồm có 3 chân: VCC, GND, DATA như hình d ướ i:

Page 2: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 2

Trong đó: 

  Vdd là chân cấ p nguồn từ 3 ÷ 5.5 VDC, thông thườ ng là 5 VDC cùng nguồn với vđk. 

  GND là chân nối mass 0 VDC

  DQ là chân tín hiệu, chân này nối với vđk để giao tiế p.

   N.C là chân not connect có ngh ĩa là không k ết nối, để tr ống.

1.2.  Cách kết nối DS18B20 với vđk  

Page 3: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 3

Để cho cảm biến có thể làm việc thì chúng ta cần k ết nối như sau, theo nhà sản xuất thì

có 3 cách k ết nối, các bạn xem hình:

Cách 1: cách này ít dùng

Cách 2: cách này hay dùng nhất.

Cách 3: cách này cũng ít dùng

1.3.  Các tập lệnh của DS18B20

Page 4: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 4

- READ ROM (33h)Cho phép đọc ra 8 byte mã đã khắc bằng laser tr ên ROM, bao gồm: 8 bit mã định tên linh kiện(10h), 48 bit số xuất xưởng, 8 bit kiểm tra CRC. Lệnh này chỉ dùng khi trên bus có 1 cảm biếnDS1820, nếu không sẽ xảy ra xung đột tr ên bus do tất cả các thiết bị tớ cùng đáp ứng. 

- MATCH ROM (55h)Lệnh này được gửi đi cùng với 64 bit ROM tiếp theo, cho phép bộ điều khiển bus chọn ra chỉmột cảm biến DS1820 cụ thể khi tr ên bus có nhiều cảm biến DS1820 cùng nối vào. Chỉ cóDS1820 nào có 64 bit trên ROM trung khớp với chuỗi 64 bit vừa được gửi tới mới đáp ứng lạicác lệnh về bộ nhớ tiếp theo. Còn các cảm biến DS1820 có 64 bit ROM không tr ùng khớp sẽ tiếptục chờ một xung reset. Lệnh này được sử dụng cả trong trường hợp có một cảm biến một dây,cả trong trường hợp có nhiều cảm biến một dây. 

- SKIP ROM (CCh)Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của DS1820 màkhông cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian chờ đợi nhưng chỉmang hiệu quả khi tr ên bus chỉ có một cảm biến. 

- SEARCH ROM (F0h)Lệnh này cho phép bộ điều khiển bus có thể dò tìm được số lượng thành viên tớ đang được đấuvào bus và các giá tr ị cụ thể trong 64 bit ROM của chúng bằng một chu tr ình dò tìm.

- ALARM SEARCH (ECh)Tiến tr ình của lệnh này giống hệt như lệnh Search ROM, nhưng cảm biến DS1820 chỉ đáp ứnglệnh này khi xuất hiện điều kiện cảnh báo trong phép đo nhiệt độ cuối cùng. Điều kiện cảnh báoở đây được định nghĩa là giá tr ị nhiệt độ đo được lớn hơn giá trị TH và nhỏ hơn giá trị TL là haigiá tr ị nhiệt độ cao nhất và nhiệt độ thấp nhất đã được đặt tr ên thanh ghi trong bộ nhớ của cảm biến. 

Sau khi thiết bị chủ (thường là một vi điều khiển) sử dụng các lệnh ROM để định địa chỉ cho cáccảm biến một dây đang được đấu vào bus, thiết bị chủ sẽ đưa ra các lệnh chức năng DS1820.Bằng các lệnh chức năng thiết bị chủ có thể đọc ra và ghi vào bộ nhớ nháp (scratchpath) của cảm biến DS1820. khởi tạo quá tr ình chuyển đổi giá trị nhiệt độ đo được và xác định chế độ cung cấpđiện á p nguồn. Các lệnh chức năng có thể được mô tả ngắn gọn như sau: 

- WRITE SCRATCHPAD (4Eh)Lệnh này cho phép ghi 2 byte d ữ liệu vào bộ nhớ nháp của DS1820. Byte đầu tiên được ghi vàothanh ghi TH (byte 2 của bộ nhớ nháp) còn byte thứ hai được ghi vào thanh ghi TL (byte 3 của bộ nhớ nháp). Dữ liệu truyền theo tr ình tự đầu tiên là bit có ý ngh ĩa nhất và k ế tiếp là những bitcó ý ngh ĩa giảm dần. Cả hai byte này phải được ghi trước khi thiết bị chủ xuất ra một xung resethoặc khi có dữ liệu khác xuất hiện. 

- READ SCRATCHPAD (BEh) Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá tr ình đọc bắt đầu từ bit có ýngh ĩa nhấy của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ có thể xuất ra

Page 5: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 5

một xung reset để làm d ừng quá tr ình đọc bất kỳ lúc nào nếu như chỉ có một phần của dữ liệutrên bộ nhớ nháp cần được đọc. 

- COPYSCRATCHPAD (48h)Lệnh này copy nội dung của hai thanh ghi TH và TL (byte 2 và byte 3) vào bộ nhớ EEPROM. Nếu cảm biến được sử dụng trong chế dộ cấp nguồn l bắt đầu việc đo. 

- CONVERT T (44h)Lệnh này khởi động một quá tr ình đo và chuyển đổi giá trị nhiệt độ thành số (nhị phân). Sau khichuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ tr ên thanh ghi nhiệt độ 2 byte trong bộ nhớnháp Thời gian chuyển đổi không quá 200 ms, trong thời gian đang chuyển đổi nếu thực hiệnlệnh đọc thì các giá tr ị đọc ra đều bằng 0. 

- READ POWER SUPPLY (B4h)Một lệnh đọc tiếp sau lệnh này sẽ cho biết DS1820 đang sử dụng chế độ cấp nguồn như thế nào,giá tr ị đọc được bằng 0 nếu cấp nguồn bằng chính đường dẫn dữ liệu và bằng 1 nếu cấp nguồnqua một đường dẫn riêng.

Đối với bài này, chúng ta chỉ cần quan tâm đến hai lệnh đó là: read và write.

II.  Bây giờ là Vi Điều Khiển 

Đối với vđk, các bạn có thể dùng hãng nào, con nào cũng được. Ở đây tôi dùng con PIC16f887của MICROCHIP. Phần mềm viết code là MPLAB-IDE và trình biên d ịch là Hi-Tech C.

 Như vậy là phần cứng đã xong, bây giờ chỉ cần viết code là được. 

III. Cuối cùng là phần viết code 

Code để giao tiếp với DS18B20 cũng không khó lắm, các bạn chịu khó theo giỏi. 

3.1.  Khởi tạo DS18B20 

Đây là sơ đồ mà nhà sản xuất chỉ cho chúng ta biết cách reset và khởi tạo DS18B20, nó có đầyđủ trong datasheet. 

Page 6: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 6

Theo đó, để reset và khởi tạo DS18B20 chúng ta cần: khởi tạo chân DQ (là một chân I/O bất kỳcủa vđk, chân này được nối với chân DQ của DS18B20. Ví dụ ở đây tôi dùng chân RA4) là ngõra, sau đó set chân này ở mức “0” ít nhất là 480µs, sau đó khởi tạo chân DQ là ngõ vào r ồi delaymột khoảng ít nhất là 480µs.

Page 7: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 7

Các bạn xem code: 

void onewire_reset()

{

TDQ=0; // khở i tạo chân DQ là ngõ ra

DQ = 0; //set DQ là mức “0”

 __delay_us(500); //chờ  ít nhất là 480µs

TDQ=1;DQ=1; // khở i tạo chân DQ là ngõ vào

 __delay_us(500); //chờ  ít nhất là 480µs

}

Page 8: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 8

3.2.  Viết lệnh xuống DS18B20

Để gửi lệnh xuống DS18B20 ta xem sơ đồ sau:

 Như vậy, để ghi mức “0” thì chỉ cần cho chân DQ của vđk xuống mức “0” ít nhất là 60µs và lớ nnhất là 120µs. Còn để ghi mức “1” thì 1µs < TREC < ∞. TREC là thờ i gian ghi. Vậy thờ i gian ghi là

vô cùng nên chúng ta lấy chung thờ i gian cho hai mức logic là 60 ÷ 120µs.

Đây là code: 

void write_byte(unsigned char data)

{

unsigned char i=0; //khai báo biến i cho vòng lặ p for

for (i=8; i>0; i--) //dùng vòng lặp for để viết 8bit xuống DS18B20

{

TDQ=0; //DQ là ngõ ra

DQ = 0; //set DQ là mức “0”

DQ = (data&0x01); //so sánh d ữ liệu để viết “0” hoặc “1” xuống DS18B20

Page 9: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 9

 __delay_us(60); //chờ  một khoảng thời gian để DS18B20 ghi mức logic

DQ = 1; // set DQ là mức “1”

data>>=1; //chuyển qua bit k ế tiế p

} //lặ p 8 lần thì chúng ta đã ghi đượ c 8bit

}

3.3.  Đọc giá trị nhiệt độ từ  DS18B20

Đọc giá tr ị cũng giống như ghi, các bạn xem hình:

Các bạn xem code luôn

int read_byte()

{

unsigned char i=0;

unsigned char data = 0;

for (i=8;i>0;i--)

{

Page 10: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 10

TDQ=0;

DQ = 0;

data>>=1;

DQ = 1;

TDQ=1;DQ=1; //DQ là ngõ vào

if(DQ)

data|=0x80;

 __delay_us(120);

}

return(data); //tr ả về giá tr ị data

}

 Như vậy là đã xong những hàm cơ bản để giao tiế p vớ i DS18B20. Bây giờ  chúng ta hãy tậ p hợ  pchúng lại để tạo thành một hàm vừa khở i tạo, ghi, đọc và tình k ết quả luôn. Các bạn xem code:

float ds18b20_read()

{

unsigned char busy=0, temp1, temp2;

int temp3;

float result;

onewire_reset();

write_byte(0xCC); //Skip ROM, address all devices

write_byte(0x44); //Start temperature conversion

 __delay_us(200);

onewire_reset();

write_byte(0xCC); //Skip ROM, address all devices

Page 11: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 11

write_byte(0xBE); //Read scratchpad

temp1 = read_byte();

temp2 = read_byte();

temp3 = (temp2*256+temp1);

result = (float) temp3 / 16.0; //Calculation for DS18B20 with 0.1 deg C resolution

 __delay_ms(200); // ??????

return(result);

}

 Những câu lệnh như: 

Write_byte(0xCC); các bạn quay ngượ c lên trên, mục “1.3. Các tập lệnh của DS18B20” để xem

0xCC là lệnh gì nha.

 Như vậy là xong, chỉ cần viết thêm hàm main để cho vđk làm việc. Đây là hàm main:

void main()

{

lcd_init();

// lcd_gotoxy(0,0);

 printf("\fHOANG KHANH THAN");

 __delay_ms(1000);

lcd_gotoxy(0,1);

 printf(" DH-SPKT");

 __delay_ms(2500);

// lcd_gotoxy(0,0);

 printf("\f");

float temperature;

Page 12: [Codientu.org]_giao Tiếp Với Ds18b20 Dùng Pic16f887

 

HOÀNG KHÁNH THÂN

ĐẠI HỌC SƯ PHẠM K Ỹ THUẬT TP-HCM Page 12

while(1)

{

temperature=ds18b20_read();

lcd_gotoxy(0,0);

 printf("NHIET DO: %3.2f",temperature);

}

}

Về phần hiển thị lên LCD các bạn tự tham khảo hoặc tải source code tại:http://www.mediafire.com/?bjjiq3886bybqr0 

 Như vậy là k ết thúc phiên giao d ịch vớ i DS18B20 một cách thành công tốt đẹ p. Chúc các bạn

thành công.

Mọi ý kiến đóng góp hay thắc mắc các bạn hãy gửi vào email: [email protected] 

thân ái!