PDA

View Full Version : Đo nhiệt độ (PIC16F877A - DS18b20-quét led-Giao tiếp máy tính dùng VB2008 )


tat
16-04-2013, 10:12 AM
Đo nhiệt độ (PIC16F877A - DS18b20-quét led-Giao tiếp máy tính dùng VB2008 ) Bên dưới là chỉ là một ví dụ về thiết kế giao diện mà mình đả làm,các bạn có thể thiết kế tùy ý.
http://sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs1215.snc4/156742_182769975073638_100000219111090_691157_3799 226_n.jpg

http://sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs712.snc4/63239_182773025073333_100000219111090_691168_51056 91_n.jpg


Sử dụng mạch này để chuyển USB to COM nhé.Giá là 80k
http://sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs712.snc4/63272_182773055073330_100000219111090_691169_67740 67_n.jpg



I Đặc điểm:

Các đặc điểm kỹ thuật của cảm biến DS18B20 có thể kể ra một cách tóm tắt như sau:
• 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 to +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ỏ.
• Mỗi cảm biến 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.
• 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.
Khi bắt đầu chuyển đổi nhiệt độ thì chân DQ sẽ được kéo xuống mức thấp và khi chuyển đổi xong thì ở mức cao.Như vậy ta sẽ căn cứ vào hiện tượng này để xác định khi nào chuyển đổi xong nhiệt độ.


II.Lệnh ROM


- 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ến DS1820, 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ại cá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ếp tụ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 bú 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 đấu và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 ứng lệ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à hai giá 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ác cả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ào thanh 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 bit có ý 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 reset hoặ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 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ệu trê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 khi chuyể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ện lệ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ồn qua một đường dẫn riêng.

III.Code dùng trong PIC




#include <16f877a.h> #use delay(clock=20000000) #fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, NOPUT #use rs232(baud=9600,parity=n,xmit=pin_c6,rcv=pin_c7) #define DS PIN_A3 int8 led1,led2; int8 const seg7[10] ={0xC0,0x8F9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x 90}; int8 const char9[10] ={'a','b','c','d','e','f','g','h','j','k'}; void reset() { output_low(DS); delay_us( 500 ); output_float(DS); delay_us( 500 ); output_float(DS); } void write(int data) { int count; for (count=0; count<8; ++count) { output_low(DS); delay_us( 2 ); output_bit(DS, shift_right(&data,1,0)); delay_us( 60 ); output_float(DS); delay_us( 2 ); } } unsigned read() { int count, data; for (count=0; count<8; ++count) { output_low(DS); delay_us( 2 ); output_float(DS); delay_us( 8 ); shift_right(&data,1,input(DS)); delay_us( 120 ); } return( data ); } unsigned int CHUYEN(float data) { data = data* 0.625; return(data); } void DS18B20() { int8 byte2,led1,led2,byte1,dec,decimal,led3,i,j,busy=0; int16 data; unsigned char nhiet_do,so_le; reset(); write(0xCC); write(0x44); while (busy == 0) busy = read(); reset(); write(0xCC); write(0xBE); byte1 = read(); byte2 = read(); data=make16(byte2,byte1); data=data>>4; data=data&0x0ff; led2=data/10; led1=data; decimal=byte1&0x0f; dec=CHUYEN(decimal); putc(char9[led2]); putc(char9[led1]); putc(char9[dec]); for(i=0;i<20;i++) { for(J=0;J<50;J++) { output_low(pin_a0); output_b(seg7[led2]); delay_ms(1); output_high(pin_a0); output_low(pin_a1); output_b(seg7[led1]); output_low(pin_b7); delay_ms(1); output_high(pin_a1); output_low(pin_a2); output_b(seg7[dec]); delay_ms(1); output_high(pin_a2); } } } void main() { SET_TRIS_A(0b00001000); SET_TRIS_B(0); OUTPUT_A(0XFF); OUTPUT_LOW(PIN_A0); while (1) { DS18B20(); } }







IV.Sơ đồ nguyên lý :

Các bạn thay 2sc1815 thành A1015 nhé

http://i1082.photobucket.com/albums/j361/diendandien/69699_184867221530580_1000002191110.jpg

psmvn
16-04-2013, 10:12 AM
V.Code phần mềm hiển thị

1.Khai báo và mở cổng COM:

http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs759.ash1/165055_184870188196950_100000219111090_707980_9186 38_n.jpg

2.Xử lý data

http://sphotos.ak.fbcdn.net/hphotos-ak-snc6/hs033.snc6/166369_184870201530282_100000219111090_707981_1141 119_n.jpg



Code phần mềm hiển thị

1.Khai báo và mở cổng COM:

http://sphotos.ak.fbcdn.net/hphotos-ak-ash1/hs759.ash1/165055_184870188196950_100000219111090_707980_9186 38_n.jpg

Đến đây có thể dùng được cổng COM rồi , các thông số cần khai báo thì rất rỏ ràng rồi đúng không,Tiếp theo là đọc data nhận được bắng hàm serialport1.readExisting. Lưu ý là ở vi điều khiển gửi lên 3 byte tương ứng với phần chục,lẻ,đơn vị của nhiệt độ.Sau đó dùng hàm MID lấy từng phần ra và chuyển sang số .

2.Xử lý data

http://sphotos.ak.fbcdn.net/hphotos-ak-snc6/hs033.snc6/166369_184870201530282_100000219111090_707981_1141 119_n.jpg