You are on page 1of 6

THỰC HÀNH KỸ THUẬT VI ĐIỀU KHIỂN

BUỔI : GIAO TIẾP VỚI MÁY TÍNH

PHẦN 1: LÝ THUYẾT VÀ PHẦN CỨNG


1. Lý thuyết về giao tiếp UART trên PIC 16F877A
 Xem sơ đồ chân của PIC16F877A ở trang 33 Giáo trình Kỹ thuật Vi điều khiển PIC của TS. Đặng
Phước Vinh.
 Lý thuyết về phần giao tiếp nối tiếp với cổng COM ở phần 7.1.3. Giao tiếp cổng nối tiếp UART –
RS232 trang 220 Giáo trình Kỹ thuật Vi điều khiển PIC của TS. Đặng Phước Vinh.
 Chú ý vào chân số 25: RC6/TX/CK và số 26: RC7/RX/DT, đây là hai chân truyền và nhận dữ liệu
cho giao tiếp nối tiếp.
 Khi cắm dây phần cứng cho giao tiếp nối tiếp thì ta cắm chân TX của vi điều khiển vào chân TX
trên module cổng COM và cắm chân RX của vi điều khiển vào chân RX của module cổng COM.
 Khai báo sử dụng giao tiếp nối tiếp ở phần chỉ thị tiền xử lý:
#use RS232 (baud=9600, xmit = pin_c6, rcv = pin_c7, Errors, bits=8, parity = N)
hoặc
#use RS232 (baud=9600, UART1, Errors, bits=8, parity = N)
Khi sử dụng cách 2 thì tham số UART1 tương đương xmit = pin_c6, rcv = pin_c7.
 Giải thích tham số của khai báo #use rs232

Tham số Giải thích


baud = 9600 Tốc độ baud (baud rate) là 9600
xmit = pin_C6 Chân C6 làm chân truyền dữ liệu (xmit là viết tắt của từ transmit)
rcv = pin_C7 Chân C7 làm chân nhận dữ liệu (rcv là viết tắt của từ receive)
Errors Kiểm tra có lỗi khi nhận/truyền dữ liệu hay không, có thể không
cần tham số này nếu đường truyền dữ liệu ổn định
bits = 8 Gửi/nhận dữ liệu 8-bit
parity = N Có kiểm tra bit chẵn/lẻ hay không, N là không kiểm tra

 Để nhận dữ liệu từ vi điều khiển gửi lên máy tính, có thể dùng MATLAB hoặc RealTerm.
 Nối dây COM to USB: đầu COM đực nối với cổng COM cái trên board Easy PIC và đầu USB nối
với máy vi tính.
2. Cách sử dụng MATLAB để nhận và truyền dữ liệu qua cổng COM
Trong MATLAB, sử dụng các lệnh sau để tiến hành giao tiếp đơn giản với máy tính

Lệnh Tác dụng


s = serial(‘COMX’) Gán biến s cho cổng COM có số thứ tự X, xem số thứ tự của cổng
COM trong trình quản lý thiết bị Device Manager của Windows.
get(s) Đọc các thông số của cổng COM (như Baud Rate, Data bit…) để kiểm
tra đã cấu hình đúng chưa
fopen(s) Mở cổng COM được gán cho biến s, cổng COM bây giờ mới truyền và
nhận dữ liệu được.
fclose(s) Đóng cổng COM được gán cho biến s, cổng COM bây giờ không thể
truyền và nhận dữ liệu được
fgets(s) Đọc dữ liệu gửi đến cổng COM
fwrite(s,‘Nội dung’) Truyền dữ liệu dạng ký tự đến vi điều khiển. Ví dụ muốn truyền ký
tự ‘a’ đến vi điều khiển thì viết fwrite(s,‘a’).

1
Thứ tự thực hiện nhận/truyền dữ liệu trong MATLAB (nhớ truyền tham số vào hàm):
1. luôn luôn gán biến cổng COM trước,
2. kiểm tra các thông số của cổng đã đúng chưa bằng lệnh get(),
3. mở cổng với lệnh fopen() và cuối cùng
4. nhận/truyền dữ liệu bằng lệnh fgets() hoặc fwrite().

2
PHẦN 2: CHƯƠNG TRÌNH MẪU
1. Cấu hình phần cứng chung cho cả hai chương trình.
 Nối chân RX của cổng COM với chân RX của PIC và nối chân TX của cổng COM với chân TX
của PIC;
 Nối dây của nút nhấn tuỳ ý với chân A0;
 Nối Port B của PIC16F877A với phần LED đơn trên board EASY PIC.
2. Chương trình mẫu
Chương trình 1: Gửi dữ liệu lên máy tính
Chương trình thực hiện công việc sau: Nếu nhấn nút nhấn nối với chân A0 thì gửi một tín hiệu ở dạng
ký tự có nội dung Hello lên máy tính.

#include <16f877a.h>
#fuses HS, PUT, NOWDT, NOPROTECT, BROWNOUT, NOLVP
#use delay(clock=8M)
#use RS232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, bits=8, parity=N, Errors)
void main()
{
set_tris_a(0xff);
delay_ms(1000);
while (TRUE){
if(input(PIN_A0)==0)
{
delay_ms(250);
puts("Hello\n");
}
while (input(PIN_A0)==0)
{}
}

Thứ tự thực hiện:


1. Nạp chương trình cho PIC 16F877A;
2. Nhấn nút nhấn trên board EASY PIC để gửi tín hiệu lên máy vi tính;
3. Trên MATLAB, mở cổng COM theo hướng dẫn ở trên và nhận dữ liệu bằng lệnh fgets().
Một vài lưu ý:
 Ký tự \n là ký tự xuống dòng.
 Đoạn chương trình
while (input(PIN_A0)==0)
{}
là đoạn chương trình nhấn giữ của nút nhấn (nút nhấn chỉ gửi một tín hiệu một lần).
 Hàm puts() là hàm gửi tín hiệu từ vi điều khiển đi:
o nếu chỉ gửi một ký tự thì để ký tự trong cặp nháy đơn hoặc nháy kép đều được. Ví dụ
puts(‘a’) hoặc puts(“a”) đều thoả mãn cú pháp.
o Nếu gửi một chuỗi ký tự thì bắt buộc phải để trong cặp nháy kép. Ví dụ
puts(“Hello”).

3
Chương trình 2: Đọc dữ liệu gửi từ máy tính đến PIC 16F877A và thực hiện một công việc nào đó
Chương trình thực hiện công việc sau: nếu vi điều khiển nhận được một tín hiệu ở dạng ký tự có nội
dung là:
 ‘0’ thì tắt toàn bộ LED;
 ‘1’ thì bật các LED sáng xen kẽ nhau.
Hàm getch() có nhiệm vụ đọc tín hiệu gửi đến chân RX của PIC 16F877A.
#include <16f877a.h>
#fuses HS, PUT, NOWDT, NOPROTECT, BROWNOUT, NOLVP
#use delay(clock=8M)
#use rs232(baud=9600, UART1, bits=8, parity=N, Errors)

void main()
{
set_tris_b(0x00);
output_b(0xff);
char c;
while(true)
{
c = getch();
if (c=='0')
{
output_b(0xff);
}
if (c=='1')
{
output_b(0b10101010);
}
}
}

Thứ tự thực hiện:


1. Nạp chương trình cho PIC 16F877A,
2. Trên MATLAB, mở cổng COM theo hướng dẫn ở trên và truyền dữ liệu bằng lệnh fwrite().

4
PHẦN 3: BÀI TẬP ÁP DỤNG
1. Viết chương trình thực hiện công việc sau: cứ mỗi một giây thì gửi một tín hiệu có nội dung
“Ho va ten sinh vien” từ vi điều khiển lên máy vi tính (sử dụng RealTerm để đọc nội dung).
2. Viết chương trình thực hiện các công việc sau:
a. Nếu nhấn một nút nhấn trên Board Easy PIC thì gửi một tín hiệu có nội dung “TH VDK”
lên máy tính. Sử dụng MATLAB để đọc nội dung đã gửi có đúng không.
b. Nếu gửi một tín hiệu có nội dung “A” về PIC 16F877A thì LCD hiển thị nội dung là “Ho
va ten sinh vien” ở cột 1, dòng 1 (nếu họ và tên sinh viên nhiều hơn 16 ký tự thì viết
tên và từ đệm); nếu gửi một tín hiệu có nội dung “B” về PIC 16F877A thì xoá toàn bộ
nội dung trên LCD.

5
PHẦN 4: PHỤ LỤC - GPIO, STANDARD I/O VÀ FAST I/O TRONG
PIC 16F877A
GPIO là viết tắt của General Purpose Input/Output (có nhiều cách dịch khác nhau cho thuật ngữ này:
cổng vào/ra vạn năng, cổng vào/ra cơ bản, cổng vào/ra mục đích chung). Hiểu một cách chung nhất
thì GPIO là các chân vào/ra của vi điều khiển có thể sử dụng cho nhiều mục đích khác nhau tuỳ thuộc
vào yêu cầu thực tế. GPIO trong PIC16F877A ngoài các chức năng cơ bản là input và output còn có
một số chức năng đặc biệt khác như:
 chân giao tiếp UART;
 ngõ vào timer;
 bus địa chỉ;
 ngõ vào ngắt ngoài…
Trong CCS có hai chế độ lập trình chính cho các chân GPIO là chế độ Standard I/O và chế độ Fast I/O:
 Trong chế độ Standard I/O thì khi xuất hay nhập chân I/O ta không cần quan tâm đến hướng
của nó mà chỉ đơn giản là dùng luôn hàm input, output tương ứng của nó. Nếu chú ý kỹ thì
nhiều chương trình cũ chúng ta viết hoàn toàn không có hàm set_tris_x() nhưng chương
trình vẫn chạy bình thường vì chân I/O đang ở chế độ Standard. Tuy nhiên khi sử dụng chế độ
này thì mỗi lệnh mất khoảng 3-4 chu kỳ lệnh.
 Trong chế độ Fast I/O thì mỗi lệnh Input, output sẽ chỉ mất một chu kỳ lệnh, nhưng ta phải chỉ
rõ hướng hiện tại của nó là cổng vào hay cổng ra (tức là cần hàm set_tris_x()). Với những
chương trình cần tốc độ đọc/ghi cao như quét LED, đọc ADC thì chúng ta có thể sử dụng chế
độ Fast I/O để giảm độ trễ của chương trình.

You might also like