Đề tài: “Thiết kế thiết bị đo khoảng cách sử dụng vi điều khiển PIC 16F877A ” bao gồm những phần chính sau:
- Sử dụng cảm biến siêu âm SRF05 để đo khoảng cách
- Hiển thị kết quả đo được là khoảng cách (cm) lên LCD
- Dùng led màu để báo: Khi đo khoảng cách ở chế độ mode 2 thì đèn đỏ sáng, khi khoảng cách đến vật cần đo lớn hơn 4m thì đèn vàng sáng, khi cĩ vật cản ở khoảng cách nhỏ hơn 4m thì đèn xanh sáng.
- Nguồn cung cấp sử dụng nguồn một chiều 5VDC
I. CÁC LINH KIỆN TRONG ĐỀ TÀI 1. Điện trở
Điện trở là đại lượng vật lý đặc trưng cho tính chất cản trở dịng điện của một vật dẫn điện. Nĩ được định nghĩa là tỉ số của hiệu điện thế giữa hai đầu vật thể với cường độ dịng điện đi qua nĩ.
Nĩ được xác định bởi cơng thức R=U/I Tong đĩ:
U: là hiệu điện thế giữa hai đầu vật dẫn điện, đo bằng Vơn (V) I: là cường độ dịng diện đi qua vật dẫn điện, đo bằng Ampe (A) R:là điện trở của vật dẫn điện, đo bằng Ohm (Ω)
Kí hiệu:
Điện trở là linh kiện thụ động cĩ tác dụng cản trở điện áp và dịng điện Điện trở được sử dụng rất nhiều trong mạch điện tử.
2. Biến trở
Biến trở là điện trở thay đổi được, cĩ tác dụng là thay đổi điện áp theo yêu cầu người sử dụng.
Kí hiệu
Hình 4.2: ký hiệu và hình dạng của biến trở
3. Tụ điện
Tụ điện là linh kiện thụ động, cấu tạo của tụ điện là hai bản cực bằng kim loại ghép cách nhau một khoảng d ở giữa hai bản tụ là dung dịch hay chất điện mơi cách điện cĩ điện dung. Đặc điểm của tụ là cho dịng xoay chiều đi qua, ngăn cản dịng điện một chiều. Kí hiệu:
4. Thạch anh
Là một linh kiện làm bằng tinh thể đá thạch anh được mài phẳng chính xác. Linh kiện thạch anh làm việc dựa trên hiệu ứng áp điện. Hiệu ứng này cĩ tính thuận nghịch. Khi áp một điện áp vào 2 mặt của thạch anh, nĩ sẽ bị biến dạng. Ngược lại, khi tạo sức ép vào 2 bề mặt đĩ, nĩ se phát ra điện áp.
Hình4.4:kí hiệu và hình dạng của thạch anh
5. LCD 1602
Ngày nay, thiết bị hiển thị LCD được sử dụng trong rất nhiều các ứng dụng của vi điều khiển. LCD cĩ rất nhiều ưu điểm so với các dạng hiển thị khác. Nĩ cĩ khả năng hiển thị kí tự đa dạng, trực quan (chữ số và kí tự đồ họa), dễ dàng đưa vào mạch ứng dụng theo nhiều giao thức giao tiếp khác nhau, tốn rất ít tài nguyên hệ thống và giá thành rẻ.
Hình dạng:
Sơ đồ chân:
Chân Kí hiệu Ý nghĩa
1 VSS Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển
2 Vdd Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với VCC=5V của mạch điều khiển
3
VEE Điều chỉnh độ tương phản của LCD
4 RS Chân chọn thanh ghi (Register select). Nối chân RS với logic “0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi.
+ Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
trong LCD.
5 RW Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc.
6 E Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus DB0- DB7, các lệnh chỉ được chấp nhận khi cĩ 1 xung cho phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh ghi bên trong nĩ khi phát hiện một xung (high-to-low
transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp.
7-14 D0-D7 Tám đường của bus dữ liệu dùng để trao đổi thơng tin với MPU. Cĩ 2 chế độ sử dụng 8 đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit MSB là DB7
CHÚ Ý:
Ở chế độ “đọc”, nghĩa là MPU sẽ đọc thơng tin từ LCD thơng qua các chân Dx.
Cịn khi ở chế độ “ghi”, nghĩa là MPU xuất thơng tin điều khiển cho LCD thơng qua các chân Dx.
Chân 15 và chân 16: ghi là A và K. Nĩ là anot và katot của một con led dùng để sang LCD trong bĩng tối, chúng ta cĩ thể khơng nối, nếu sử dụng nối chân 15 với trở 220 hoặc 330 Ω lên VCC, chân 16 nối đất.
Tập lệnh của LCD
a. Một số chú ý:
Trước khi tìm hiểu tập lệnh của LCD, sau đây là một vài chú ý khi giao tiếp với LCD: Tuy trong sơ đồ khối của LCD cĩ nhiều khối khác nhau, nhưng khi lập trình điều khiển LCD ta chỉ cĩ thể tác động trực tiếp được vào 2 thanh ghi DR và IR thơng qua các chân DBx, và ta phải thiết lập chân RS, R/W phù hợp để chuyển qua lại giữ hai thanh ghi này Với mỗi lệnh, LCD cần một khoảng thời gian để hồn tất, thời gian này cĩ thể khá lâu đối với tốc độ của MPU, nên ta cần kiểm tra cờ BF hoặc đợi (delay) cho LCD thực thi xong lệnh hiện hành mới cĩ thể ra lệnh tiếp theo.
Địa chỉ RAM (AC) sẽ tự động tăng giảm 1 đơn vị, mỗi khi cĩ lệnh ghi vào RAM (điều này giúp chương trình gọn hơn)
Các lệnh của LCD cĩ thể chia thành các nhĩm như sau:
+ Các lệnh về kiểu hiển thị. VD: Kiểu hiển thị (1 hàng / 2 hàng), chiều dài dữ liệu (8 bit / 4 bit).
+Chỉ định địa chỉ RAM nội.
+Nhĩm lệnh truyền dữ liệu trong RAM nội
b. Tập lệnh
Tập lệnh của LCD tương đối đơn giản. Khi lập trình cho mạch cĩ LCD ta chỉ cần gọi các hàm cĩ sẵn trong trình biên dịch mà khơng cần LCD phải đánh các lệnh phức tạp.
CHƯƠNG V: THIẾT KẾ PHẦN MỀM
Phần mềm sử dụng là phần mềm C Nội dung chương trình:
/**********************************************************************/ /* DO AN I */ /* PROJECT: DO KHOAN CACH SU DUNG SRF05 */ /**********************************************************************/
#include <main.h> #include <var.h> #include "lcd.c"
#define SRF05_TRIGGER PIN_B1 #define SRF05_ECHO PIN_B0 #define NO_OBJECT 0
#INT_EXT
{
// Ngat ngoai theo suon xuong disable_interrupts(GLOBAL); num_pulse+=get_timer1(); range_ok=1; enable_interrupts(GLOBAL); } void SRF05_StartRange() { while(!range_ok) {
output_high(SRF05_TRIGGER); // Tao 1 xung len vao cha TRIGGER co do lon it nhat 10ms
delay_ms(15); // Tao xung vao chan TRIGGER rong 15ms (>10ms) output_low(SRF05_TRIGGER); // Bat dau phep do.
while(!(input(SRF05_ECHO)));// Doi cho den khi chan ECHO duoc keo len cao set_timer1(0); // Reset lai gia tri Timer1
enable_interrupts(GLOBAL); // Cho phep ngat toan cuc
delay_ms(50); // SRF05 chi co the kich hoat lai nhanh nhat sau moi 50ms }
}
float32 SRF05_GetDistance() {
float32 time_us=0,distance=0; SRF05_StartRange();
disable_interrupts(GLOBAL);
if(num_pulse>37500) // So sanh neu thoi gian do ve >30ms { num_pulse=0; range_ok=0; return NO_OBJECT; } else { time_us=num_pulse/1.25;
distance=time_us/58; // Datasheet SRF05: dis(cm)=timer(us)/58 num_pulse=0; range_ok=0; return distance; } } void main() { unsigned char str[20]; unsigned char mode=1; int count=0;
float32 range;
output_float(SRF05_ECHO); output_drive(SRF05_TRIGGER);
set_tris_b(0b11000001); // Cau hinh I/O cua PORTB: 11000001 LCD_Init(); sprintf(str," DO AN I "); delay_ms(10); LCD_Puts(str); delay_ms(1000); LCD_Clear(); sprintf(str,"DO K/C SRF05: M1"); LCD_Gotoxy(0,0); LCD_Puts(str); output_low(PIN_B4); delay_ms(100);
port_b_pullups(TRUE); // PORTB su dung dien tro keo len (pullups) ext_int_edge(H_TO_L); // Su dung ngat ngoai theo suon xuong
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);// F_TIMER1=F_OSC/4/4=20MHz/4/4=1.25MHz (T=0.8us tuc cu 0.8us thi Timer1 tang 1 do vi)
disable_interrupts(GLOBAL); // Khong cho phep ngat while(TRUE)
{
// PIN_B7: Change Mode
// PIN_B6: Get Distance in Mode 2 // Begin with Mode1
// To Change Mode2: Hold PIN_B7 > 3s // To change Mode1: Press PIN_B6 < 0.5s if(!input(PIN_B7)) { output_low(PIN_B2); count++; delay_ms(15); if(count<10) {
mode=1; // Mode 1 do lien tuc LCD_Gotoxy(0,0);
sprintf(str,"DO K/C SRF05: M1"); LCD_Puts(str);
output_low(PIN_B4); // Alarm MODE1 }
if(count>30) {
mode=2; // Mode 2 do 1 lan LCD_Gotoxy(0,0);
sprintf(str,"DO K/C SRF05: M2"); LCD_Puts(str);
first=0;
output_high(PIN_B4); // Alarm MODE2 } } else count=0; if(mode==1) { range=SRF05_GetDistance(); if(range==NO_OBJECT) { LCD_Gotoxy(0,1);
sprintf(str,"Khong Co Vat Can"); LCD_Puts(str);
output_high(PIN_B2); // Alarm No object was detected output_low(PIN_B3); // Alarm Object was detected delay_ms(500);
} else
{
output_low(PIN_B2); // Alarm No object was detected output_high(PIN_B3); // Alarm Object was detected LCD_Gotoxy(0,1);
sprintf(str," DIS : %3.2f Cm ",range); LCD_Puts(str); } } if(mode==2) { if(input(PIN_B6)) { delay_ms(50); first=0; } if(first==0&&!input(PIN_B6)) { first=1; range=SRF05_GetDistance(); if(range==NO_OBJECT) { LCD_Gotoxy(0,1);
sprintf(str,"Khong Co Vat Can"); LCD_Puts(str);
output_high(PIN_B2); // Alarm No object was detected output_low(PIN_B3); // Alarm Object was detected delay_ms(500);
} else {
output_low(PIN_B2); // Alarm No object was detected output_high(PIN_B3); // Alarm Object was detected LCD_Gotoxy(0,1);
sprintf(str," DIS : %3.2f Cm ",range); LCD_Puts(str); } } } } } Sản phẩm thực tế
Hình 5.2: Đo khoảng các ở chế độ mode2-đo liên tục
KẾT LUẬN
Trong đề tài này chúng em tìm hiểu và nghiên cứu thiết kế mạch đo khoảng cách dùng vi điều khiển PIC 16F877A. Đây chỉ là ứng dụng nhỏ của PIC trong điều khiển để đo khoảng cách.
+ Hệ thống điều khiển tương đối ổn định đáp ứng được điều kiện đề tài.
+ Cảm biến đọc thơng số khoảng cách tương đối chính xác và hiển thị qua LCD. + Phần mềm code cũng đơn giản.
Qua đề tài này giúp chúng em thêm kiến thức bổ ích vào trong chuyên ngành học tập của mình, hiểu biết nhiều hơn về mơn vi xử lý, kết hợp lý thuyết với thực hành hồn thành tốt đề tài.
Em xin chân thành cảm ơn.
Hà Nội, ngày 7 tháng 01 năm 2015
Sinh viên thực hiện