You are on page 1of 56

UBND THÀNH PHỐ CẦN THƠ

TRƢỜNG ĐẠI HỌC KỸ THUẬT- CÔNG NGHỆ CẦN THƠ

-----  -----

TÀI LIỆU THỰC TẬP

VI ĐIỀU KHIỂN

Giảng viên: Đƣờng Khánh Sơn

Cần Thơ - 01/2016


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

MỤC LỤC
MỤC LỤC ..................................................................................................................... 1
THIẾT BỊ THỰC HÀNH ............................................................................................ 2
BÀI 1 : LED ĐƠN ......................................................................................................... 8
BÀI 2 : HIỂN THỊ KÝ TỰ TRÊN LCD ................................................................... 10
BÀI 3 : XỬ LÝ NGẮT................................................................................................ 21
BÀI 4 : XỬ LÝ ADC .................................................................................................. 25
BÀI 5 : TIMER ........................................................................................................... 30
BÀI 6: GIAO TIẾP I2C ............................................................................................. 34
BÀI 7: GIAO TIẾP RS232 ......................................................................................... 38
BÀI 8: ĐIỀU KHIỂN ĐỘNG CƠ DC....................................................................... 46
BÀI 9: ĐO KHOẢNG CÁCH BẰNG CẢM BIẾN SIÊU ÂM SRF05 ................... 51

ĐƢỜNG KHÁNH SƠN Trang 1


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

THIẾT BỊ THỰC HÀNH


Kit BOOK 1 do công ty R&P phát triển, là một bo mạch phát triển giúp ngƣời
mới học PIC làm quen với các tính năng cũng nhƣ các công cụ làm việc với PIC .
BOOK1 là một dự án nằm trong chƣơng trình tài trợ cho các trƣờng đại học, và phổ
biến PIC cho sinh viên kỹ thuật.
Adapter, cáp usb, cáp kết nối… đƣợc cung cấp kèm theo kit.
Máy tính có cài đặt các phần mềm CCS 5.015, PICkit 2 v2.61, MATLAB
2012a, Proteus 8 Professional.

Hình 1: Thiết bị thực hành Kit BOOK 1 do công ty R&P phát triển.

ĐƢỜNG KHÁNH SƠN Trang 2


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

SƠ ĐỒ KHỐI KIT BOOK 1

ĐƢỜNG KHÁNH SƠN Trang 3


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

SƠ ĐỒ NGUYÊN LÝ KIT BOOK 1

ĐƢỜNG KHÁNH SƠN Trang 4


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ĐƢỜNG KHÁNH SƠN Trang 5


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ĐƢỜNG KHÁNH SƠN Trang 6


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ĐƢỜNG KHÁNH SƠN Trang 7


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 1 : LED ĐƠN


1.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Điều khiển thiết bị ngoại vi bằng các Port của VĐK.
• Điều khiển việc hiển thị bằng cách sử dụng LED đơn.
1.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình điều khiển LED đơn ở các chế độ khác nhau.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối LED đơn .
• Biết cách viết các chƣơng trình tạo thời gian trễ với các khoảng thời gian bất
kỳ.
1.3.Giới thiệu chung
LED (viết tắt của Light Emitting Diode, có nghĩa là điốt phát quang) là các điốt
có khả năng phát ra ánh sáng hay tia hồng ngoại, tử ngoại. Cũng giống nhƣ điốt, LED
đƣợc cấu tạo từ một khối bán dẫn loại p ghép với một khối bán dẫn loại n.
Hoạt động của LED giống với nhiều loại điốt bán dẫn. Khối bán dẫn loại p chứa
nhiều lỗ trống tự do mang điện tích dƣơng nên khi ghép với khối bán dẫn n (chứa các
điện tử tự do) thì các lỗ trống này có xu hƣớng chuyễn động khuếch tán sang khối n.
Cùng lúc khối p lại nhận thêm các điện tử (điện tích âm) từ khối n chuyển sang. Kết
quả là khối p tích điện âm (thiếu hụt lỗ trống và dƣ thừa điện tử) trong khi khối n tích
điện dƣơng (thiếu hụt điện tử và dƣ thừa lỗ trống).
Ở biên giới hai bên mặt tiếp giáp, một số điện tử bị lỗ trống thu hút và khi chúng
tiến lại gần nhau, chúng có xu hƣớng kết hợp với nhau tạo thành các nguyên tử trung
hòa.
Quá trình này có thể giải phóng năng lƣợng dƣới dạng ánh sáng (hay các bức xạ
điện từ có bƣớc sóng gần đó).
Tùy theo mức năng lƣợng giải phóng cao hay thấp mà bƣớc sóng ánh sáng phát
ra khác nhau (tức màu sắc của LED sẽ khác nhau). Mức năng lƣợng (và màu sắc của
LED) hoàn toàn phụ thuộc vào cấu trúc năng lƣợng của các nguyên tử chất bán dẫn.
LED thƣờng có điện thế phân cực thuận cao hơn điốt thông thƣờng, trong khoảng 1,5
đến 3 V. Nhƣng điện thế phân cực nghịch ở LED thì không cao. Do đó, LED rất dễ bị
hƣ hỏng do điện thế ngƣợc gây ra.
Loại LED Điện thế phân cực thuận
Đỏ 1,4 - 1,8V
Vàng 2 - 2,5V
Xanh lá cây 2 - 2,8V

ĐƢỜNG KHÁNH SƠN Trang 8


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Sơ đồ nguyên lý trên kit BOOK 1

1.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PIC kit 2 v2.61 đƣợc cài trên máy.
Chạy thực nghiệm và kiểm tra kết quả.
1.5. Bài tập
 Bài tập 1.1: Viết chƣơng trình chớp tắt led ở port e với thời gian delay 250 ms:
Chƣơng trình mẫu gợi ý :
#include <16F887.h>
#include <def_887.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD,
NOWRT
#use delay(clock=20000000)
void main() {
trise = 0x00;
porte=0xff;
while (1) {
Porte = 0x00;
delay_ms(250);
Porte = 0xFF;
delay_ms(250);
}
}

 Bài tập 1.2 : Viết chƣơng trình chớp tắt các led ở port e với thời gian delay 1s.
 Bài tập 1.3 : Viết chƣơng trình chớp tắt led D4 ở port e với thời gian delay 1s,
led D5 với thời gian delay 0,5 s.

ĐƢỜNG KHÁNH SƠN Trang 9


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 2 : HIỂN THỊ KÝ TỰ TRÊN LCD


2.1.Nhiệm vụ
• Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Điều khiển thiết bị ngoại vi bằng các Port của VĐK.
• Khảo sát nguyên lý hoạt động và nguyên lý điều khiển LCD.
• Điều khiển để hiển thị các thông tin trên màn hình tinh thể lỏng LCD (loại 2
hàng x 16 ký tự).
2.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình điều khiển LCD.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối LCD trên mô hình thí
nghiệm.
• Nắm đƣợc nguyên lý và các kỹ thuật điều khiển để hiển thị các thông tin trên
LCD.
• Biết cách viết các chƣơng trình ứng dụng để hiển thị các dạng thông tin khác
nhau trên LCD tùy theo nhu cầu sử dụng.
2.3. Giới thiệu chung
Ngày nay, thiết bị hiển thị LCD (Liquid Crystal Display) đƣợc sử dụng trong
rất nhiều các ứng dụng của VĐK. 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ẻ…
Có rất nhiều loại LCD với nhiều hình dáng và kích thƣớc khác nhau, trên hình
1 là hai loại LCD thông dụng.

Hình 2.1: Hai loại LCD thông dụng


Khi sản xuất LCD, nhà sản xuất đã tích hợp chíp điều khiển (HD44780) bên
trong lớp vỏ và chỉ đƣa các chân giao tiếp cần thiết. Các chân này đƣợc đánh số thứ tự
và đặt tên nhƣ hình 2.2.

ĐƢỜNG KHÁNH SƠN Trang 10


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Hình 2.2: Sơ đồ chân của LCD


 Chức năng các chân:

ĐƢỜNG KHÁNH SƠN Trang 11


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

* Ghi chú : Ở chế độ“đọc”, nghĩa là MCU sẽ đọc thông tin từ LCD thông qua các
chân DBx.
Còn khi ở chế độ“ghi”, nghĩa là MCU xuất thông tin điều khiển cho LCD thông qua
các chân DBx.
 Sơ đồ khối của HD44780: Để hiểu rõ hơn chức năng các chân và hoạt động của
chúng, ta tìm hiểu sơ qua chíp HD44780 thông qua các khối cơ bản của nó.

Hình 2.3: Sơ đồ chân khối của HD44780


Để có thể ghi vào vị trí thứ x trên màn hình một kí tự y nào đó, ngƣời dùng
phải ghi vào vùng DDRAM tại địa chỉ x một chuỗi mã kí tự 8 bit trên CGROM.
Ví dụ: Ghi vào DDRAM tại địa chỉ“01” một chuỗi 8 bit “01100010” thì trên
LCD tại ô thứ 2 từ trái sang (dòng trên) sẽ hiển thị kí tự“b”.

ĐƢỜNG KHÁNH SƠN Trang 12


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Hình 2.4: Bảng mã ký tự (ROM code A00)


 Tập lệnh của LCD :
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ữa 2
thanh ghi này .

ĐƢỜNG KHÁNH SƠN Trang 13


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

* Với mỗi lệnh, LCD cần một khoảng thời gian để hoàn tất, thời gian này có thể
khá lâu đối với tốc độ của MCU, 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ỉ của 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 4 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.
• Các lệnh còn lại . (!!!)
CÁC LỆNH CỦA LCD

ĐƢỜNG KHÁNH SƠN Trang 14


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ĐƢỜNG KHÁNH SƠN Trang 15


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ĐƢỜNG KHÁNH SƠN Trang 16


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 Khởi tạo LCD:


Khởi tạo là việc thiết lập các thông số làm việc ban đầu. Đối với LCD, khởi tạo
giúp ta thiết lập các giao thức làm việc giữa LCD và MCU. Việc khởi tạo chỉ đƣợc
thực hiện 1 lần duy nhất ở đầu chƣơng trình điều khiển LCD và bao gồm các thiết lập
sau :
• Display clear : Xóa/không xóa toàn bộ nội dung hiển thị trƣớc đó.
• Function set : Kiểu giao tiếp 8bit/4bit, số hàng hiển thị 1 hàng/2 hàng, kiểu kí tự
5x8/5x10.
• Display on/off control: Hiển thị/tắt màn hình, hiển thị/tắt con trỏ, nhấp
nháy/không nhấp nháy.
• Entry mode set : các thiết lập kiểu nhập kí tự nhƣ: Dịch/không dịch, tự tăng/giảm
(Increment).
 Sơ đồ nguyên lý khối LCD trên kit BOOK 1

2.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter, kết nối LCD với kit.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Chạy thực nghiệm và kiểm tra kết quả.

ĐƢỜNG KHÁNH SƠN Trang 17


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

2.5. Bài tập


 Bài tập 2.1 : Viết chƣơng trình hiển thị các ký tự sau lên LCD: DAI HOC
KTCN CAN THO .
Chƣơng trình mẫu gợi ý :
#include <16f887.h>
#include <def_887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
void main()
{
Output_low(LCD_RW);
LCD_init();
while(true)
{
lcd_putcmd(0x85);
lcd_putcmd(0x01);//xoa man hinh
Printf( lcd_putchar,"DAI HOC");
delay_ms(1000);
lcd_putcmd(0x01);
Printf(lcd_putchar,"KTCN CAN THO");
delay_ms(1000);
lcd_putcmd(0x01);
}
}

o Nội dung file lcd_lib_4bit.c:


#include <stddef.h>
#define LCD_RS PIN_D1
#define LCD_RW PIN_D2
#define LCD_EN PIN_D3

#define LCD_D4 PIN_D4


#define LCD_D5 PIN_D5
#define LCD_D6 PIN_D6
#define LCD_D7 PIN_D7

// misc display defines-

#define Line_1 0x80

ĐƢỜNG KHÁNH SƠN Trang 18


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

#define Line_2 0xC0


#define Clear_Scr 0x01

// prototype statements
#separate void LCD_Init ( void );// ham khoi tao LCD
#separate void LCD_SetPosition ( unsigned int cX );//Thiet lap vi tri con tro
#separate void LCD_PutChar ( unsigned int cX );// Ham viet1kitu/1chuoi len LCD
#separate void LCD_PutCmd ( unsigned int cX) ;// Ham gui lenh len LCD
#separate void LCD_PulseEnable ( void );// Xung kich hoat
#separate void LCD_SetData ( unsigned int cX );// Dat du lieu len chan Data
// D/n Cong
#use standard_io (C)
#use standard_io (D)

//khoi tao LCD**********************************************


#separate void LCD_Init ( void )
{
LCD_SetData ( 0x00 );
delay_ms(200); /* wait enough time after Vdd rise >> 15ms */
output_low ( LCD_RS );// che do gui lenh
LCD_SetData ( 0x03 ); /* init with specific nibbles to start 4-bit mode */
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); /* set 4-bit interface */
LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */
LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */
LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */
LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */
LCD_PutCmd ( 0x01 ); /* clear display */
}
#separate void LCD_SetPosition ( unsigned int cX )
{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();

ĐƢỜNG KHÁNH SƠN Trang 19


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

#separate void LCD_PutChar ( unsigned int cX )


{
/* this subroutine works specifically for 4-bit Port A */
output_high ( LCD_RS );
LCD_PutCmd( cX );
output_low ( LCD_RS );
}

#separate void LCD_PutCmd ( unsigned int cX )


{
/* this subroutine works specifically for 4-bit Port A */
LCD_SetData ( swap ( cX ) ); /* send high nibble */
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); /* send low nibble */
LCD_PulseEnable();
}
#separate void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 3 ); // was 10
output_low ( LCD_EN );
delay_ms ( 3 ); // was 5
}

#separate void LCD_SetData ( unsigned int cX )


{
output_bit ( LCD_D4, cX & 0x01 );
output_bit ( LCD_D5, cX & 0x02 );
output_bit ( LCD_D6, cX & 0x04 );
output_bit ( LCD_D7, cX & 0x08 );
}

 Bài tập 2.2 : Viết chƣơng trình hiển thị trên LCD theo yêu cầu sau : Hàng thứ
nhất hiển thị họ tên sinh viên, hàng thứ hai hiển thị mã số sinh viên.
 Bài tập 2.3 : Viết chƣơng trình đếm số từ 0 đến 999 và hiển thị trên LCD.

ĐƢỜNG KHÁNH SƠN Trang 20


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 3 : XỬ LÝ NGẮT
3.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Điều khiển thiết bị ngoại vi bằng các nút nhấn.
• Lâp trình xử lý ngắt ngoài của VĐK PIC 16F887.
3.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình điều khiển thiết bị ngoại vi bằng các nút nhấn.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối nút nhấn .
• Nắm đƣợc nguyên lý hoạt động của ngắt ngoài.
• Biết cách viết các chƣơng trình xử lý ngắt ngoài của VĐK PIC 16F887.
3.3. Giới thiệu chung
Trong VĐK PIC có nhiều nguồn ngắt. Mỗi dòng VĐK có số lƣợng ngắt khác
nhau, PIC 14 có 14 ngắt, PIC 18 có 35 ngắt. Để biết cụ thể ta có thể vào mục View
>> Valid Interrupts . Khi đó một của sổ sẽ hiện ra liệt kê đầy đủ các nguồn ngắt của
từng con PIC.
Để viết một hàm phục vụ ngắt ta chỉ việc thêm khai báo #INT_tên_ngắt vào
trƣớc hàm phục vụ cho ngắt đó. Khi đó trình dịch sẽ hiểu đó là địa chỉ hàm cho ngắt,
khi có ngắt tƣơng ứng xảy ra thì nó sẽ nhảy đến vị trí đó. Lấy ví dụ khi ta muốn xử lý
ngắt ngoài, hàm sẽ đƣợc viết nhƣ sau:
#INT_EXT
Ext_isr()
{
// Nhập mã tại đây
}

 Sau đây là danh sách 1 số ngắt với chức năng tƣơng ứng :
#INT_GLOBAL : ngắt chung , nghĩa là khi có ngắt xảy ra , hàm theo sau chỉ
thị này đƣợc thực thi , bạn sẽ không đƣợc khai báo thêm chỉ thị ngắt nào khác khi sử
dụng chỉ thị này . CCS không sinh bất kỳ mã lƣu nào, hàm ngắt bắt đầu ngay tại
vector ngắt . Nếu bật nhiều cờ cho phép ngắt , có thể bạn sẽ phải hỏi vòng để xác định
ngắt nào. Dùng chỉ thị này tƣơng đƣơng viết hàm ngắt 1 cách thủ công mà thôi , nhƣ
là viết hàm ngắt với ASM vậy .
#INT_AD : chuyển đổi A /D đã hoàn tất.
#INT_BUSCOL : xung đột bus .
#INT_BUTTON : nút nhấn.
#INT_CCP1 : có Capture hay compare trên CCP1.

ĐƢỜNG KHÁNH SƠN Trang 21


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

#INT_CCP2 : có Capture hay compare trên CCP2.


#INT_COMP : kiểm tra bằng nhau trên Comparator.
#INT_EEPROM : hoàn thành ghi EEPROM.
#INT_EXT : ngắt ngoài.
#INT_EXT1 : ngắt ngoài 1.
#INT_EXT2 : ngắt ngoài 2.
#INT_I2C : có hoạt động I 2C.
#INT_LCD : có hoạt động LCD.
#INT_LOWVOLT : phát hiện áp thấp.
#INT_PSP : có data vào cổng Parallel slave.
#INT_RB : bất kỳ thay đổi nào trên chân B4 đến B7.
#INT_RC : bất kỳ thay đổi nào trên chân C4 đến C7.
#INT_RDA : data nhận từ RS 232 sẵn sàng.
#INT_RTCC : tràn Timer 0.
#INT_SSP : có hoạt động SPI hay I 2C.
#INT_TBE : bộ đệm chuyển RS 232 trống.
#INT_TIMER0 : một tên khác của #INT_RTCC.
#INT_TIMER1 : tràn Timer 1.
#INT_TIMER2 : tràn Timer 2.
#INT_TIMER3 : tràn Timer 3.
#INT_TIMER5 : tràn Timer 5.
#INT_OSCF : lỗi OSC.
#INT_PWMTB : ngắt của PWM time base.
#INT_IC3DR : ngắt đổi hƣớng ( direct ) của IC 3.
#INT_IC2QEI : ngắt của QEI.
#INT_IC1 : ngắt IC 1.
 CÁC HÀM THIẾT LẬP HOẠT ĐỘNG NGẮT
1 / enable_interrupts ( level )
Là tên các ngắt đã cho ở trên hay là GLOBAL để cho phép ngắt ở cấp toàn
cục.
Mọi ngắt của VĐK đều có 1 bit cờ ngắt , 1 bit cho phép ngắt . Khi có ngắt thì
bit cờ ngắt bị set =1, nhƣng ngắt có họat động đƣợc hay không tuỳ thuộc bit cho phép
ngắt . enable_interrupts (int_xxx )sẽ bật bit cho phép ngắt . Nhƣng tất cả các ngắt đều
không thể thực thi nếu bit cho phép ngắt toàn cục = 0 , enable_interrupts( global )sẽ
bật bit này .
ĐƢỜNG KHÁNH SƠN Trang 22
TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

VD : để cho phép ngắt timer0 và timer1 hoạt động:


enable_interrupts (int_timer0);
enable_interrupts (int_timer1 ) ;
enable_interrupts ( global ); // chỉ cần dùng 1 lần trừ phi muốn có thay đổi đặc
biệt
2 / disable_interrupts ( level )
Level giống nhƣ trên .
Hàm này vô hiệu 1 ngắt bằng cách set bit cho phép ngắt = 0 .
Disable_interrupts ( global ) set bit cho phép ngắt toàn cục =0 , cấm tất cả các
ngắt .
Không dùng hàm này trong hàm phục vụ ngắt vì không có tác dụng , cờ ngắt
luôn bị xoá tự động .
3 / clear_interupt ( level )
Level không có GLOBAL .
Hàm này xoá cờ ngắt của ngắt đƣợc chỉ định bởi level .
4 / ext_int_edge ( source , edge )
Hàm này thiết lập nguồn ngắt ngoàiEXTx là cạnh lên hay cạnh xuống .
Source : nguồn ngắt . Trên PIC 18 có 3 nguồn ngắt trên 3 chân EXT0 , EXT1 ,
EXT2 ứng với source = 0 ,1 , 2 . Các PIC khác chỉ có 1 nguồn EXT nên source = 0 .
Edge : chọn cạnh kích ngắt , edge = L_TO_H nếu chọn cạnh lên ( từ mức thấp
chuyển lên mức cao ) hay H_TO_L nếu chọn cạnh xuống .
 Sơ đồ nguyên lý trên kit BOOK 1

ĐƢỜNG KHÁNH SƠN Trang 23


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

3.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Chạy thực nghiệm và kiểm tra kết quả.
3.5. Bài tập
 Bài tập 3.1 : Viết chƣơng trình nhận nút nhấn ở chân B0 của PIC 16F887, cứ
mỗi lần ấn phím sẽ đảo trạng thái của các led ở port e.
Chƣơng trình mẫu gợi ý :
#include <16F887.h>
#include <def_887.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP,
NOCPD, NOWRT
#use delay(clock=20000000)
#int_ext
ext_isr()
{
porte=~porte;
}
void main() {
trisb = 0xff;
Port_B_pullups (1 );
trise = 0x00;
porte=0b00000000;
enable_interrupts(int_EXT);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
while (1) {
}

 Bài tập 3.2 : Viết chƣơng trình hiển thị số lần nhấn phím ở chân B0 của PIC
16F887 lên màn hính LCD 16x02.
 Bài tập 3.3 : Viết chƣơng trình nhận nút nhấn ở các chân B3-5 của PIC
16F887, hiển thị lên màn hính LCD 16x02.
 Bài tập 3.4 : Viết chƣơng trình nhận nút nhấn ở chân B0 của PIC 16F887 có xử
lý chống nhiễu.

ĐƢỜNG KHÁNH SƠN Trang 24


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 4 : XỬ LÝ ADC
4.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Điều khiển thiết bị ngoại vi bằng các nút nhấn.
• Lâp trình xử lý ngắt ngoài của VĐK PIC 16F887.
4.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình xử lý tín hiệu ADC.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối ADC .
• Nắm đƣợc nguyên lý hoạt động của ADC trong PIC 16F887.
• Biết cách viết các chƣơng trình xử lý ADC của VĐK PIC 16F887.
4.3. Giới thiệu chung
PIC có nhiều chân phục vụ xử lý ADC với nhiều cách thức khác nhau . Để
dùng ADC , bạn phải có khai báo #DEVICE cho biết dùng ADC mấy bit ( tuỳ chip hỗ
trợ , thƣờng là 8 hay 10 bit hoặc hơn) . Bạn cần lƣu ý là: 1 VĐK hỗ trợ ADC 10 bit thì
giá trị vào luôn là 10 bit , nhƣng chia cho 4 thì còn 8 bit . Do đó 1 biến trở chiết áp cấp
cho ngõ vào ADC mà bạn chọn chế độ 10 bit thì sẽ rất nhạy so với chế độ 8 bit ( vì 2
bit cuối có thay đổi cũng không ảnh hƣởng giá trị 8 bit cao và do đó kết quả 8 bit
ADC ít thay đổi ), nếu chƣơng trình có chế độ kiểm tra ADC để cập nhật tính toán ,
hay dùng ngắt ADC, thì nó sẽ chạy hoài thôi . Dùng ADC 8 bit sẽ hạn chế điều này .
Do đó mà CCS cung cấp chọn lựa ADC 8 hay 10 bit tùy mục đích sử dụng .
 Cấu hình bộ ADC :
+ Thông dụng nhất khi dùng ADC là sử dụng 1 biến trở , điều chỉnh bởi 1 nút
vặn , qua đó thu đƣợc 1 điện áp nhỏ hơn điện áp tham chiếu ( Vref – áp max ) , đƣa
vào chân biến đổi ADC , kết quả cho 1 giá trị số ADC 8 bit ( 0-255 ) hay ADC 10 bit
(0-1023 ) . Thƣờng thì áp Vref lấy bằng Vdd ( 5V ).
+ Trên các PIC có ngõ AVdd và AVss ( PIC 18 ) , thƣờng thì bạn luôn nối AVdd
tới Vdd , AVss tới Vss để đảm bảo họat động cho lập trình qua ICD 2 .
Các hàm sau phục vụ ADC :
1 / Setup_ADC ( mode ) :
+ Không trả về trị . Dùng xác định cách thức hoạt động bộ biến đổi ADC .
Tham số mode tuỳ thuộc file thiết bị *.h có tên tƣơng ứng tên chip bạn đang dùng ,
nằm trong thƣ mục DEVICES của CCS . Muốn biết có bao nhiêu tham số có thể dùng
cho chip đó , bạn mở file tƣơng ứng đọc , tìm tới chỗ các định nghĩa cho chức năng
ADC dùng cho chip đó tƣơng ứng với hàm này . Sau đây là các giá trị mode của
16F877A , ( 1 số khác có thể không có hoặc có thêm nhƣ 16F877A có thêm 1 số thứ
là ADC_CLOCK_DIV_2/4/8/16/32/64 . . .) :

ĐƢỜNG KHÁNH SƠN Trang 25


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

ADC_OFF : tắt hoạt động ADC ( tiết kiệm điện , dành chân cho hoạt động
khác ) .
ADC_CLOCK_INTERNAL : thời gian lấy mẫu bằng xung clock IC ( mất 2-6
us ) thƣờng là chung cho các chip .
ADC_CLOCK_DIV_2 : thời gian lấy mẫu bằng xung clock / 2 ( mất 0.4 us
trên thạch anh 20MHz )ADC_CLOCK_DIV_8 : thời gian lấy mẫu bằng xung clock /
8 ( 1.6 us ).
ADC_CLOCK_DIV_32 : thời gian lấy mẫu bằng xung clock / 32 ( 6.4 us ).
2 / Setup_ADC_ports ( value )
+ Xác định chân lấy tín hiệu analog và điện thế chuẩn sử dụng . Tùy thuộc bố
trí chân trên chip , số chân và chân nào dùng cho ADC và số chức năng ADC mỗi
chip mà value có thể có những giá trị khác nhau. Xem file tƣơng ứng trong thƣ mục
DEVICES để biết số chức năng tƣơng ứng chip đó . Để tƣơng thích chƣơng trình viết
cho phiên bản cũ , 1 số tham số có 2 tên khác nhau ( nhƣng cùng chức năng do định
nghĩa cùng địa chỉ ) , ở đây dùng phiên bản 3.227 . Lƣu ý : Vref : áp chuẩn , Vdd : áp
nguồn .
 Sau đây là các giá trị cho value ( chỉ dùng 1 trong các giá trị ):
ALL_ANALOGS : dùng tất cả chân sau làm analog : A0 A1 A2 A3 A5 E0 E1
E2 (Vref=Vdd).
NO_ANALOG : không dùng analog , các chân đó sẽ là chân I /O .
AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF : A0 A1 A2 A5 E0 E1
E2 Vref=A3.
AN0_AN1_AN2_AN3_AN4 : A0 A1 A2 A3 A5 ( tên thì giống nhau cho tất
cả thiết bị nhƣng 16F877 chỉ có portA có 5 chân nên A0 , A1 , A2 , A5 đƣợc dùng ,
A6 , A7 không có ) .
AN0_AN1_AN3 : A0 A1 A3 , Vref = Vdd
AN0_AN1_VSS_VREF : A0 A1 VRefh = A3
AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF : A0 A1 A5 E0 E1 E2
VRefh=A3 , VRefl=A2 .
AN0_AN1_AN2_AN3_AN4_AN5 : A0 A1 A2 A3 A5 E0
AN0_AN1_AN2_AN4_AN5_VSS_VREF : A0 A1 A2 A5 E0 VRefh=A3
AN0_AN1_AN4_AN5_VREF_VREF : A0 A1 A5 E0 VRefh=A3 VRefl=A2
AN0_AN1_AN4_VREF_VREF : A0 A1 A5 VRefh=A3 VRefl=A2
AN0_AN1_VREF_VREF : A0 A1 VRefh=A3 VRefl=A2
AN0 : A0
AN0_VREF_VREF : A0 VRefh=A3 VRefl=A2
VD : setup_adc_ports (AN0_AN1_AN3 ) ; // A0 , A1 , A3 nhận analog , áp
nguồn +5V cấp cho IC sẽ là điện áp chuẩn .
ĐƢỜNG KHÁNH SƠN Trang 26
TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

3 / Set_ADC_channel ( channel ) :
+ Chọn chân để đọc vào giá trị analog bằng lệnh Read_ADC ( ) . Giá
trị channel tuỳ số chân chức năng ADC mỗi chip .Với 16F877 ,channel có giá trị từ 0
-7 : 0-chân A0, 1-chân A1, 2-chân A2, 3-chân A3, 4-chân A5, 5-chân E0, 6-chân E1,
7-chân E2.
+Hàm không trả về trị . Nên delay 10 us sau hàm này rồi mới dùng
hàm read_ADC ( ) để bảo đảm kết quả đúng . Hàm chỉ hoạt động với A /D phần cứng
trên chip.
4 / Read_ADC ( mode ) :
+ Dùng đọc giá trị ADC từ thanh ghi (/ cặp thanh ghi ) chứa kết quả biến đổi
ADC . Lƣu ý hàm này sẽ hỏi vòng cờ cho tới khi cờ này báo đã hoàn thành biến đổi
ADC ( sẽ mất vài us ) thì xong hàm .
+ Nếu giá trị ADC là 8 bit nhƣ khai báo trong chỉ thị #DEVICE , giá trị trả về
của hàm là 8 bit , ngƣợc lại là 16 bit nếu khai báo #DEVICE sử dụng ADC 10 bit trở
lên.
+ Khi dùng hàm này, nó sẽ lấy ADC từ chân bạn chọn trong hàm
Set_ADC_channel( ) trƣớc đó. Nghĩa là mỗi lần chỉ đọc 1 kênh Muốn đổi sang đọc
chân nào, dùng hàm set_ADC_channel( ) lấy chân đó. Nếu không có đổi chân,
dùng read_ADC( ) bao nhiêu lần cũng đƣợc .
+ mode có thể có hoặc không , gồm có :
ADC_START_AND_READ : giá trị mặc định.
ADC_START_ONLY : bắt đầu chuyển đổi và trả về.
ADC_READ_ONLY : đọc kết quả chuyển đổi lần cuối.
#DEVCE 8 bit 10 bit 11 bit 16 bit
ADC=8 0-255 0-255 00-255 00-255
ADC=10 x 0-1023 x x
ADC=11 x x 0-2047 x
ADC=16 0-65280 0-65472 0-65504 0-65535
+ 16F877 chỉ hỗ trợ ADC 8 và 10 bit .

ĐƢỜNG KHÁNH SƠN Trang 27


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 Sơ đồ nguyên lý trên kit BOOK 1

4.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Nối jump cho 2 chân POT của J7 trên kit BOOK 1.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Điều chỉnh biến trở R7 và quan sát kết quả.
4.5. Bài tập
 Bài tập 4.1 : Viết chƣơng trình đọc giá trị ADC từ biến trở R7 và hiển thị lên
LCD 16x02
Chƣơng trình mẫu gợi ý :
#include <16f887.h>
#include <def_887.h>
#device *=16 ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
Int16 adc ;
void main()
{
output_low(LCD_RW);
LCD_init();
// Delay_us (100);
setup_adc(adc_clock_internal);
// Setup_ADC_ports (sAN3);
Set_ADC_channel (3) ;
Delay_us (10 ); // delay 10 us

while(true)
{
adc = read_adc () ;
lcd_putcmd(0x80);
lcd_putcmd(0x01);//xoa man hinh
delay_ms(100);
Printf(lcd_putchar,"GIA TRI ADC LA:");

ĐƢỜNG KHÁNH SƠN Trang 28


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

lcd_putcmd(Line_2);
Printf(lcd_putchar,"%04lu " , adc );
delay_ms(1000);
}

 Bài tập 4.2 : Viết chƣơng trình đọc giá trị ADC từ biến trở R7 và xuất ra giá trị
các led ở port e.
 Bài tập 4.3 : Viết chƣơng trình đọc giá trị ADC từ biến trở R7 và gởi lên máy
tính.

ĐƢỜNG KHÁNH SƠN Trang 29


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 5 : TIMER
5.1.Nhiệm vụ
• Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Viết chƣơng trình ứng dụng timer ở chế độ định thời.
• Viết chƣơng trình ứng dụng timer ở chế độ bộ đếm.
5.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của các bộ timer của PIC 16F887.
• Biết cách viết các chƣơng trình sử dụng các bộ timer của PIC 16F887 ở các
chế độ khác nhau.
• Biết cách viết các chƣơng trình tạo thời gian trễ với các khoảng thời gian bất
kỳ.
5.3. Giới thiệu chung
 CÁC LỆNH CỦA TIMER – COUNTER
Các lệnh của ngôn ngữ lập trình C liên quan đến timer/counter bao gồm:
Lệnh SETUP_TIMER_X()
Lệnh SET_TIMER_X()
Lệnh SETUP_COUNTERS()
Lệnh SETUP_WDT()
Lệnh RESTART_WDT()
Lệnh GET_TIMER_X()
 LỆNH SETUP_TIMER_1(MODE)
- Cú pháp: setup_timer_1(mode)
- Thông số: mode có thể là 1 hoặc 2 hằng số định nghĩa trong file device.h.
Các thông số gồm:
T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC
TC_CLK_OUT, T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4,
T1_DIV_BY_8.
Các hằng số từ nhiều nhóm khác nhau thì có thể or với nhau.
- Chức năng:
Khởi tạo cho TIMER1.
Với tần số thạch anh là 20MHz và khởi tạo T1_DIV_BY_8 thì timer sẽ tăng
giá trị sau mỗi khoảng thời gian 1.6µs. Timer sẽ tràn sau 104.8576 ms.
- Có hiệu lực: cho tất cả các VĐK PIC có timer 1.

ĐƢỜNG KHÁNH SƠN Trang 30


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 LỆNH SET_TIMERx(value)
- Cú pháp: set_timerX(value) ; x là 0, 1, 2
- Thông số: value là hằng số nguyên 8 hoặc 16 bit dùng để thiết lập giá trị
mới cho timer.
- Chức năng: thiết lập giá trị bắt đầu cho TIMER.
- Có hiệu lực: cho tất cả các VĐK PIC có timer.
 LỆNH GET_TIMERx()
- Cú pháp: value = get_timerX() ; x là 0, 1, 2
- Thông số: không có.
- Chức năng: đọc giá trị của TIMER/COUNTER.
- Có hiệu lực: cho tất cả các VĐK PIC có timer.
 Timer0
Các lệnh:
setup_TIMER_0(mode);
setup_COUNTERS (rtcc_state, ps_state); // hay setup_WDT().
set_TIMER0(value); // hay set_RTCC(value) :xác định giá trị ban đầu (8bit)
cho Timer0.
get_TIMER0(); // hay get_RTCC() :trả về số nguyên (8bit) của Timer0.
Trong đó mode là một hoặc hai constant (nếu dùng hai thì chèn dấu "|"ở giữa)
đƣợc định nghĩa trong file 16F877A.h gồm :
RTCC_INTERNAL : chọn xung clock nội
RTCC_EXT_L_TO_H : chọn bit cạnh lên trên chân RA4
RTCC_EXT_H_TO_L : chọn bit cạnh xuống trên chân RA4
RTCC_DIV_2 :chia prescaler 1:2
RTCC_DIV_4 1:4
RTCC_DIV_8 1:8
RTCC_DIV_16 1:16
RTCC_DIV_32 1:32
RTCC_DIV_64 1:64
RTCC_DIV_128 1:128
RTCC_DIV_256 1:256
rtcc_state là một trong những constant sau:
RTCC_INTERNAL
RTCC_EXT_L_TO_H
RTCC_EXT_H_TO_L
ps_state là một trong những constant sau:
RTCC_DIV_2
RTCC_DIV_4
RTCC_DIV_8
RTCC_DIV_16
ĐƢỜNG KHÁNH SƠN Trang 31
TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

RTCC_DIV_32
RTCC_DIV_64
RTCC_DIV_128
RTCC_DIV_256
WDT_18MS
WDT_36MS
WDT_72MS
WDT_144MS
WDT_288MS
WDT_576MS
WDT_1152MS
WDT_2304MS
 Timer1
Các lệnh:
setup_TIMER_1(mode);
set_TIMER1(value); // xác định giá trị ban đầu (16bit) cho Timer1
get_TIMER1(); // trả về số nguyên (16bit) của Timer1
mode gồm (có thể kết hợp bằng dấu "|"):
T1_DISABLED : tắt Timer1
T1_INTERNAL : xung clock nội (Fosc/4)
T1_EXTERNAL : xung clock ngoài trên chân RC0
T1_EXTERNAL_SYNC : xung clock ngoài đồng bộ
T1_CLK_OUT
T1_DIV_BY_1
T1_DIV_BY_2
T1_DIV_BY_4
T1_DIV_BY_8
 Timer2
Các lệnh:
setup_TIMER_2(mode, period, postscale);
set_TIMER2(value); // xác định giá trị ban đầu (8bit) cho Timer2
get_TIMER2(); // trả về số nguyên 8bit
Với mode gồm (có thể kết hợp bằng dấu "|"):
T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
T2_DIV_BY_16
period là số nguyên từ 0-255, xác định giá trị xung reset
postscale là số nguyên 1-16, xác định reset bao nhiêu lần trƣớc khi ngắt.
5.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
ĐƢỜNG KHÁNH SƠN Trang 32
TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Chạy thực nghiệm và kiểm tra kết quả.
5.5. Bài tập
 Bài tập 1 : Viết chƣơng trình chớp tắt led ở port e với thời gian delay 1s sử
dụng timer của PIC 16F887.
Chƣơng trình mẫu gợi ý :
#include <16F887.h>
#include <def_887.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=2000000)
#byte PORTB = 0x06
int16 count;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count == 2000) // 2000*500us = 1000000us = 1s
{
count=0;
porte=~porte;
}
}
//Chuong trinh chinh
void main(void)
{
trise = 0x00;
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
enable_interrupts(global);
set_timer0(6);// T_dinhthi = 2*(256 - 6)*1us = 500us
porte=0x00;
while(true)
{
}
}

 Bài tập 5.2 : Viết chƣơng trình đếm từ 0 đến 9999 sử dụng timer của PIC
16F887, hiển thị trên LCD 16x02.
 Bài tập 5.3 : Viết chƣơng trình đếm số lần ấn phím sử dụng timer của PIC
16F887, hiển thị trên LCD 16x02.

ĐƢỜNG KHÁNH SƠN Trang 33


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 6: GIAO TIẾP I2C


6.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Lập trình giao tiếp i2c giữa VĐK PIC 16F887 với các thiết bị ngoại vi.
• Lập trình đo nhiệt độ bằng ic TC74 của Mircochip.
6.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình giao tiếp i2c giữa VĐK PIC 16F887 với các
thiết bị ngoại vi, giữa các VĐK ở các chế độ khác nhau.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối cảm biến nhiệt độ TC74 của
Mircochip .
6.3. Giới thiệu chung
Ngày nay trong các hệ thống điện tử hiện đại, rất nhiều ICs hay thiết bị ngoại vi
cần phải giao tiếp với các ICs hay thiết bị khác – giao tiếp với thế giới bên ngoài. Vói
mục tiêu đạt đƣợc hiệu quả cho phần cứng tốt nhất với mạch điện đơn giản, Phillips đã
phát triển một chuẩn giao tiếp nối tiếp 2 dây đƣợc gọi là I2C. I2C là tên viết tắt của
cụm từ Inter ‐ Intergrated Circuit – Bus giao tiếp giữa các IC với nhau.
I2C mặc dù đƣợc phát triển bới Philips, nhƣng nó đã đƣợc rất nhiều nhà sản
xuất IC trên thế giới sử dụng. I2C trở thành một chuẩn công nghiệp cho các giao tiếp
điều khiển, có thể kể ra đây một vài tên tuổi ngoài Philips nhƣ: Texas Intrument (TI),
Maxim‐Dallas, analog Device, National Semiconductor … Bus I2C đƣợc sử dụng làm
bus giao tiếp ngoại vi cho rất nhiều loại IC khác nhau nhƣ các loại VĐK 8051, PIC,
AVR, ARM, chíp nhớ nhƣ RAM tĩnh (Static Ram), EEPROM, bộ chuyển đổi tƣơng
tự số (ADC), số tƣơng tự (DAC), IC điểu khiển LCD, LED…

Hình 6.1: Bus I2C và các thiết bị ngoại vi


 Đặc điểm giao tiếp I2C:
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL). SDA
là đƣờng truyền dữ liệu 2 hƣớng, còn SCL là đƣờng truyền xung đồng hồ và chỉ theo
một hƣớng. Nhƣ hình vẽ trên, khi một thiết bị ngoại vi kết nối vào đƣờng I2C thì chân
SDA của nó sẽ nối với dây SDA của bus, chân SCL sẽ nối với dây SCL.

ĐƢỜNG KHÁNH SƠN Trang 34


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Hình 6.2: Kết nối thiết bị vào bus I2C ở chế độ chuẩn (Standard mode)
và chế độ nhanh (Fast mode)
Mỗi dây SDA hay SCL đều đƣợc nối với điện áp dƣơng của nguồn cấp thông
qua một điện trở kéo lên (pull‐up resistor). Sự cần thiết của các điện trở kéo này là vì
chân giao tiếp I2C của các thiết bị ngoại vi thƣờng là dạng cực máng hở (open‐drain
or open‐collector).
Giá trị của các điện trở này khác nhau tùy vào từng thiết bị và chuẩn giao tiếp,
thƣờng dao động trong khoảng 1KΩ đến 4.7KΩ.
Một thiết bị hay một IC khi kết nối với bus I2C, ngoài một địa chỉ (duy nhất)
để phân biệt, nó còn đƣợc cấu hình là thiết bị chủ (master) hay tớ (slave). Tại sao lại
có sự phân biệt này ? Đó là vì trên một bus I2C thì quyền điều khiển thuộc về thiết bị
chủ (master). Thiết bị chủ nắm vai trò tạo xung đồng hồ cho toàn hệ thống, khi giữa
hai thiết bị chủ/tớ giao tiếp thì thiết bị chủ có nhiệm vụ tạo xung đồng hồ và quản lý
địa chỉ của thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trò chủ động,
còn thiết bị tớ giữ vai trò bị động trong viêc giao tiếp.
Về dữ liệu truyền trên bus I2C, một bus I2C chuẩn truyền 8‐bit dữ liệu có
hƣớng trên đƣờng truyền với tốc độ là 100Kbits/s – Chế độ chuẩn (Standard mode).
Tốc độ truyền có thể lên tới 400Kbits/s – Chế độ nhanh (Fast mode) và cao nhất là
3,4Mbits/s – Chế độ cao tốc (High‐speed mode).
Một bus I2C có thể hoạt động ở nhiều chế độ khác nhau:
- Một chủ một tớ (one master – one slave)
- Một chủ nhiều tớ (one master – multi slave)
- Nhiều chủ nhiều tớ (Multi master – multi slave)
Dù ở chế độ nào, một giao tiếp I2C đều dựa vào quan hệ chủ/tớ. Giả thiết một
thiết bị A muốn gửi dữ liệu đến thiết bị B, quá trình đƣợc thực hiện nhƣ sau:
‐ Thiết bị A (Chủ) xác định đúng địa chỉ của thiết bị B (tớ), cừng với việc xác
định địa chỉ, thiết bị A sẽ quyết định việc đọc hay ghi vào thiết bị tớ.
‐ Thiết bị A gửi dữ liệu tới thiết bị B

ĐƢỜNG KHÁNH SƠN Trang 35


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

‐ Thiết bị A kết thúc quá trình truyền dữ liệu


Khi A muốn nhận dữ liệu từ B, quá trình diễn ra nhƣ trên, chỉ khác là A sẽ
nhận dữ liệu từ B. Trong giao tiếp này, A là chủ còn B vẫn là tớ. Chi tiết việc thiết lập
một giao tiếp giữa hai thiết bị sẽ đƣợc mô tả chi tiết trong các mục dƣới đây.
 Module I2C trong VĐK PIC
Với những tiện ích đem lại, khối giao tiếp I2C đã đƣợc tích hợp cứng trong khá
nhiều loại VĐK khác nhau. Trong các loại VĐK PIC dòng Mid‐range phổ biến tại
Việt Nam, chỉ từ 16F88 mới có hỗ trợ phần cứng I2C, còn các loại 16F84, 16F628 thì
không có. Với những loại VĐK không có hỗ trợ phần cứng giao tiếp I2C, để sử dụng
ta có thể dùng phần mềm lập trình, khi đó ta sẽ viết một chƣơng trinh diều khiển 2
chân bất kỳ của VĐK để nó thực hiện giao tiếp I2C (các hàm START, STOP,
WRITE, READ). Trong bài viết này ta đề cập đến việc sử dụng giao tiếp I2C của các
loại PIC có tích hợp khối I2C sẵn trong nó, mà cụ thể là VĐK PIC16F887.
 Cách thức sử dụng Module I2C trong CCS
Trong việc lập trình cho PIC sử dụng giao tiếp I2C của nó trong các ứng dụng,
ngƣời lập trình có thể thực hiện một cách dễ dàng với trình dịch CCS. Nói dễ dàng ở
đây là chỉ về mặt cú pháp lệnh, ta không cần sử dụng nhiều câu lệnh khó nhớ nhƣ
trong lập trình ASM.
Việc khởi tạo, chọn chế độ hoạt động và thực hiện giao tiếp của I2C đã có các
hàm dựng sẵn của CCS thực hiện. Các hàm liệt kê dƣới đây là của phiên bản CCS
3.242, đó là:
‐ i2c_isr_state(): Thông báo trạng thái giao tiếp I2C
‐ i2c_start(): Tạo điều kiện START
‐ i2c_stop(): Tạo điều kiện STOP
‐ i2c_read(): Đọc giá trị từ thiết bị I2C, trả về giá trị 8 bit
‐ i2c_write(): Ghi giá trị 8 bit đến thiết bị I2C
Để sử dụng khối I2C ta sử dụng khai báo sau:
#use i2c(chế_độ, tốc độ, sda = PIN_C4, scl=PIN_C3)
‐ Chế độ: Master hay Slave
‐ Tốc độ: Slow (100KHz) hay Fast (400KHz)
‐ SDA và SCL là các chân i2c tƣơng ứng của PIC
Sau khai báo trên, ta có thể sử dụng các hàm nêu trên để thực hiện, xử lý các
giao tiếp i2c với các thiết bị ngoại vi khác.

ĐƢỜNG KHÁNH SƠN Trang 36


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 Sơ đồ nguyên lý trên kit BOOK 1

6.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
6.5. Bài tập
 Bài tập 6.1 : Viết chƣơng trình đọc giá trị nhiệt độ từ TC 74 và hiển thị trên
LCD 16x02.
Chƣơng trình mẫu gợi ý :
#include <16f887.h>
#include <def_887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use i2c(Master, sda = PIN_C4, scl=PIN_C3)
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
int temp;
void main()
{
output_low(LCD_RW);
LCD_init();
while(true)
{
lcd_putcmd(0x80);
lcd_putcmd(0x01);//xoa man hinh
delay_ms(100);
i2c_start();
i2c_write(0x90);
i2c_write(0x00);
i2c_start();
i2c_write(0x91);
temp=i2c_read(0);
i2c_stop();
Printf(lcd_putchar,"nhiet do :%i oC",temp);
delay_ms(1000);
}
}
 Bài tập 6.2 : Viết chƣơng trình đọc giá trị thứ, ngày, tháng, năm từ ic RTC
DS1307 và hiển thị trên LCD 16x02.
 Bài tập 6.3 : Viết chƣơng trình đồng hồ số hiển thị trên LCD 16x02 bao gồm
giờ, phút, giây, nhiệt độ môi trƣờng.

ĐƢỜNG KHÁNH SƠN Trang 37


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 7: GIAO TIẾP RS232


7.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Lập trình giao tiếp RS232 giữa VĐK PIC 16F887 với máy tính.
• Lập trình truyền dữ liệu từ PC xuống PIC 16F887.
7.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình giao tiếp RS232 giữa VĐK PIC 16F887 với
máy tính.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối giao tiếp máy tính dùng IC
MAX232.
7.3. Giới thiệu chung
Vấn đề giao tiếp giữa PC và VĐK rất quan trọng trong các ứng dụng điều
khiển, đo lƣờng... Ghép nối qua cổng nối tiếp RS232 là một trong những kỹ thuật
đƣợc sử dụng rộng rãi để ghép nối các thiết bị ngoại vi với máy tính. Nó là một chuẩn
giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là 2 thiết bị, chiều
dài kết nối lớn nhất cho phép để đảm bảo dữ liệu là 12.5 đến 25.4m, tốc độ 20kbit/s
đôi khi là tốc độ 115kbit/s với một số thiết bị đặc biệt. Ý nghĩa của chuẩn truyền thông
nối tiếp nghĩa là trong một thời điểm chỉ có một bit đƣợc gửi đi dọc theo đƣờng
truyền.
Có hai phiên bản RS232 đƣợc lƣu hành trong thời gian tƣơng đối dài là
RS232B và RS232C. Nhƣng cho đến nay thì phiên bản RS232B cũ thì ít đƣợc dùng
còn RS232C hiện vẫn đƣợc dùng và tồn tại thƣờng đƣợc gọi là tên ngắn gọn là chuẩn
RS232.
Các máy tính thƣờng có 1 hoặc 2 cổng nối tiếp theo chuẩn RS232C đƣợc gọi là
cổng Com. Chúng đƣợc dùng ghép nối cho chuột, modem, thiết bị đo lƣờng...Trên
main máy tính có loại 9 chân hoặc lại 25 chân tùy vào đời máy và main của máy tính.
Việc thiết kế giao tiếp với cổng RS232 cũng tƣơng đối dễ dàng, đặc biệt khi chọn chế
độ hoạt động là không đồng bộ và tốc độ truyền dữ liệu thấp.
 Ƣu điểm của giao diện nối tiếp RS232
+ Khả năng chống nhiễu của các cổng nối tiếp cao.
+ Thiết bị ngoại vi có thể tháo lắp ngay cả khi máy tính đang đƣợc cấp điện.
+ Các mạch điện đơn giản có thể nhận đƣợc điện áp nguồn nuôi qua công nối tiếp.
 Những đặc điểm cần lƣu ý trong chuẩn RS232
+ Trong chuẩn RS232 có mức giới hạn trên và dƣới (logic 0 và 1) là +-12V. Hiện
nay đang đƣợc cố định trở kháng tải trong phạm vi từ 3000 ôm - 7000 ôm
+ Mức logic 1 có điện áp nằm trong khoảng -3V đến -12V, mức logic 0 từ +-3V
đến 12V.

ĐƢỜNG KHÁNH SƠN Trang 38


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

+ Tốc độ truyền nhận dữ liệu cực đại là 100kbps ( ngày nay có thể lớn hơn)
+ Các lối vào phải có điện dung nhỏ hơn 2500pF.
+ Trở kháng tải phải lớn hơn 3000 ôm nhƣng phải nhỏ hơn 7000 ôm.
+ Độ dài của cáp nối giữa máy tính và thiết bị ngoại vi ghép nối qua cổng nối tiếp
RS232 không vƣợt qua 15m nếu chúng ta không sử model.
+ Các giá trị tốc độ truyền dữ liệu chuẩn :
50,75,110,750,300,600,1200,2400,4800,9600,19200,28800,38400....56600,115
200 bps.
 Các mức điện áp đƣờng truyền
RS 232 sử dụng phƣơng thức truyền thông không đối xứng, tức là sử dụng tín
hiệu điện áp chênh lệch giữa một dây dẫn và đất. Do đó ngay từ đầu tiên ra đời nó đã
mang vẻ lỗi thời của chuẩn TTL, nó vấn sử dụng các mức điện áp tƣơng thích TTL để
mô tả các mức logic 0 và 1. Ngoài mức điện áp tiêu chuẩn cũng cố định các giá trị trở
kháng tải đƣợc đấu vào bus của bộ phận và các trở kháng ra của bộ phát.
Mức điện áp của tiêu chuẩn RS232C ( chuẩn thƣờng dùng bây giờ) đƣợc mô tả
nhƣ sau:
+ Mức logic 0 : +3V , +12V.
+ Mức logic 1 : -12V, -3V.
Các mức điện áp trong phạm vi từ -3V đến 3V là trạng thái chuyển tuyến.
Chính vì từ - 3V tới 3V là phạm vi không đƣợc định nghĩa, trong trƣờng hợp thay đổi
giá trị logic từ thấp lên cao hoặc từ cao xuống thấp, một tín hiệu phải vƣợt qua quãng
quá độ trong một thơì gian ngắn hợp lý. Điều này dẫn đến việc phải hạn chế về điện
dung của các thiết bị tham gia và của cả đƣờng truyền. Tốc độ truyền dẫn tối đa phụ
thuộc vào chiều dài của dây dẫn. Đa số các hệ thống hiện nay chỉ hỗ trợ với tốc độ
19,2 kBd .
 Cổng RS232 trên PC
Hầu hết các máy tính cá nhân hiện nay đều đƣợc trang bị ít nhất là 1 cổng Com
hay cổng nối tiếp RS232. Số lƣợng cổng Com có thể lên tới 4 tùy từng loại main máy
tính. Khi đó các cổng Com đó đƣợc đánh dấu là Com 1, Com 2, Com 3...Trên đó có 2
loại đầu nối đƣợc sử dụng cho cổng nối tiếp RS232 loại 9 chân (DB9) hoặc 25 chân
(DB25). Tuy hai loại đầu nối này có cùng song song nhƣng hai loại đầu nối này đƣợc
phân biệt bởi cổng đực (DB9) và cổng cái (DB25).
Ta xét sơ đồ chân cổng Com 9 chân:

ĐƢỜNG KHÁNH SƠN Trang 39


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Trên là các kí hiệu chân và hình dạng của cổng DB9


Chức năng của các chân nhƣ sau:
+ chân 1 : Data Carrier Detect (DCD) : Phát tín hiệu mang dữ liệu
+ chân 2: Receive Data (RxD) : Nhận dữ liệu
+ chân 3 : Transmit Data (TxD) : Truyền dữ liệu
+ chân 4 : Data Termial Ready (DTR) : Đầu cuối dữ liệu sẵn sàng đƣợc kích
hoạt bởi bộ phận khi muốn truyền dữ liệu
+ chân 5 : Singal Ground ( SG) : Mass của tín hiệu
+ chân 6 : Data Set Ready (DSR) : Dữ liệu sẵn sàng, đƣợc kích hoạt bởi bộ
truyền khi nó sẵn sàng nhận dữ liệu
+ chân 7 : Request to Send : yêu cầu gửi,bô truyền đặt đƣờng này lên mức hoạt
động khi sẵn sàng truyền dữ liệu
+ chân 8 : Clear To Send (CTS) : Xóa để gửi ,bô nhận đặt đƣờng này lên mức
kích hoạt động để thông báo cho bộ truyền là nó sẵn sàng nhận tín hiệu
+ chân 9 : Ring Indicate (RI) : Báo chuông cho biết là bộ nhận đang nhận tín
hiệu rung chuông.
 Quá trình truyền dữ liệu:
Truyền dữ liệu qua cổng nối tiếp RS232 đƣợc thực hiện không đồng bộ. Do
vậy nên tại một thời điểm chỉ có một bit đƣợc truyền (1 kí tự). Bộ truyền gửi một bit
bắt đầu (bit start) để thông báo cho bộ nhận biết một kí tự sẽ đƣợc gửi đến trong lần
truyền bit tiếp the . Bit này luôn bắt đầu bằng mức 0.. Tiếp theo đó là các bit dữ liệu
(bits data) đƣợc gửi dƣới dạng mã ASCII( có thể là 5,6,7 hay 8 bit dữ liệu) Sau đó là
một Parity bit ( Kiểm tra bit chẵn, lẻ hay không) và cuối cùng là bit dừng - bit stop có
thể là 1, 1,5 hay 2 bit dừng.
 Tốc độ Baud
Đây là một tham số đặc trƣng của RS232. Tham số này chính là đặc trƣng cho
quá trình truyền dữ liệu qua cổng nối tiếp RS232 là tốc độ truyền nhận dữ liệu hay còn
gọi là tốc độ bit. Tốc độ bit đƣợc định nghĩa là số bit truyền đƣợc trong thời gian 1
giây hay số bit truyền đƣợc trong thời gian 1 giây. Tốc độ bit này phải đƣợc thiết lập ở
bên phát và bên nhận đều phải có tốc độ nhƣ nhau ( Tốc độ giữa VĐK và máy tính
phải chung nhau 1 tốc độ truyền bit).
Ngoài tốc độ bit còn một tham số để mô tả tốc độ truyền là tốc độ Baud. Tốc độ
Baud liên quan đến tốc độ mà phần tử mã hóa dữ liệu đƣợc sử dụng để diễn tả bit
đƣợc truyền còn tôc độ bit thì phản ánh tốc độ thực tế mà các bit đƣợc truyền.Vì một

ĐƢỜNG KHÁNH SƠN Trang 40


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

phần tử báo hiệu sự mã hóa một bit nên khi đó hai tốc độ bit và tốc độ baud là phải
đồng nhất
Một số tốc độ Baud thƣờng dùng: 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600,
19200, 28800, 38400, 56000, 115200 … Trong thiết bị họ thƣờng dùng tốc độ là
19200
Khi sử dụng chuẩn nối tiếp Cáp cổng Com RS232 thì yêu cầu khi sử dụng chuẩn là
thời gian chuyển mức logic không vƣợt quá 4% thời gian truyền 1 bit. Do vậy, nếu tốc
độ bit càng cao thì thời gian truyền 1 bit càng nhỏ thì thời gian chuyển mức logic càng
phải nhỏ. Điều này làm giới hạn tốc Baud và khoảng cách truyền.
 Bit chẵn lẻ hay Parity bit
Đây là bit kiểm tra lỗi trên đƣờng truyền. Thực chất của quá trình kiểm tra lỗi
khi truyền dữ liệu là bổ xung thêm dữ liệu đƣợc truyền để tìm ra hoặc sửa một số lỗi
trong quá trình truyền . Do đó trong chuẩn RS232 sử dụng một kỹ thuật kiểm tra chẵn
lẻ.
Một bit chẵn lẻ đƣợc bổ sung vào dữ liệu đƣợc truyền để ch thấy số lƣợng các bit "1"
đƣợc gửi trong một khung truyền là chẵn hay lẻ.
Một Parity bit chỉ có thể tìm ra một số lẻ các lỗi chả hạn nhƣ 1,3,,5,7,9... Nếu
nhƣ một bit chẵn đƣợc mắc lỗi thì Parity bit sẽ trùng giá trị với trƣờng hợp không mắc
lỗi vì thế không phát hiện ra lỗi. Do đó trong kỹ thuật mã hóa lỗi này không đƣợc sử
dụng trong trƣờng hợp có khả năng một vài bit bị mắc lỗi.
Việc giao tiếp giữa VĐK và máy tính là bài lập trình khá quan trọng khi ta làm
việc với các dòng VĐK khác nhau. Với VĐK PIC cũng vậy, trong mỗi IC PIC đều có
tích hợp một khối giao tiếp máy tính USART. Ta sử dụng khối giao tiếp này để truyền
dữ liệu lên máy tính và xử lý dữ liệu đó tùy vào mục đích của ngƣời lập trình.
Để truyền nhận dữ liệu giữa VĐK truyền lên với máy tính ta có thể sử dụng
các phần mềm giao tiếp COM có sẵn hay viết một chƣơng trình mới, sử dụng các
ngôn ngữ lập trình nhƣ C++, VB, Delphi, MATLAB…
Sơ đồ nguyên lý trên kit BOOK 1

ĐƢỜNG KHÁNH SƠN Trang 41


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 Các lệnh hỗ trợ giao tiếp RS232 trong CCS:


Để sử dụng giao thức này , phải có 2 khai báo nhƣ sau :
#use delay (clock = 40000000 ) // VDK đang dùng OSC 40Mhz
#use rs232 (baud=19200 , parity=n , xmit=pin_C6 , rcv=pin_C7 ) // baud= 19200 ,
không chẵn lẻ , chân truyền C6 , chân nhận C7 .
 Các hàm liên quan :
Printf ( )
Getc ( ) putc ( )
Getch ( ) putchar ( )
Getchar ( ) fputc ( )
Fgetc ( ) puts ( )
Gets ( ) fputs ( ) Fgets ( )
Kbhit ( )
Assert ( )
Perror ( )
Set_uart_speed ( )
Setup_uart ( )
Tất cả các hàm trên đòi hỏi phải khai báo chỉ thị tiền xử lý #use RS232 ( . . .).
Hàm perror ( ) đòi hỏi thêm #include<errno.h > . Hàm assert() đòi hỏi thêm
#include<assert.h> .
 printf (string ) Printf (cstring ,values . . . )
Dùng xuất chuỗi theo chuẩn RS232 ra PC .
String là 1 chuỗi hằng hay 1 mảng ký tự ( kết thúc bởi ký tự null ) .
Value là danh sách các biến , cách nhau bởi dấu phẩy .
Bạn phải khai báo dạng format của value theo kiểu %wt .Trong đó w có thể có
hoặc không , có giá trị từ 1-9 chỉ rõ có bao nhiêu ký tự đƣợc xuất ra ( mặc định không
có thì có bao nhiêu ra bấy nhiêu ), hoặc 01-09 sẽ chèn thêm 0 cho đủ ký tự hoặc 1.1-
1.9 cho trƣờng hợp số thực . còn t là kiểu giá trị .
t có thể là :
C : 1 ký tự
S : chuỗi hoặc ký tự
U : số 8 bit không dấu
x : số 8 bit kiểu hex ( ký tự viết thƣờng ,VD : 1ef )
X : số 8 bit kiểu hex ( ký tự viết hoa ,VD : 1EF )
D : số 8 bit có dấu

ĐƢỜNG KHÁNH SƠN Trang 42


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

e : số thực có luỹ thừa VD : e12


f : số thực
Lx : số hex 16 /32 bit ( ký tự viết thƣờng )
LX : hex 16 /32 bit ( ký tự viết hoa )
Lu : số thập phân không dấu
Ld : số thập phân có dấu
% : ký hiệu %
Ví dụ :
Specifier Value=0x12 Value=0xfe
%03u 018 254
%u 18 254
%2u 18 *
%5 18 254
%d 18 -2
%x 12 Fe
%X 12 FE
%4X 0012 00FE
* Result is undefined - Assume garbage.
Ví dụ :
Int k =6 ;
Printf ( “ hello “ );
Printf ( “ %u “ , k );
 KBHIT ( ) :
Thƣờng thì chúng ta dùng RC6 và RC7 cho RX và TXtrong giao tiếp cổng
COM , VDK PIC trang bị phần cứng phục vụ việc này với thanh ghi gởi và nhận và
các bit bào hiệu tƣơng ứng . Do đó khi dùng RS232 hỗ trợ từ phần cứng thì KHBIT ( )
trảvề TRUE nếu 1 ký tự đã đƣợc nhận ( trong bộ đệm phần cứng ) và sẵn sàng cho
việc đọc , và trả về 0 nếu chƣa sẵn sàng .
Hàm này có thể dùng hỏi vòng xem khi nào có data nhận từ RS232 để đọc .
7.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.

ĐƢỜNG KHÁNH SƠN Trang 43


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Viết chƣơng trình truyền dữ liệu từ PC bằng MATLAB.


Tiến hành chạy thực nghiệm và quan sát kết quả.
7.5. Bài tập
 Bài tập 7.1 : Viết chƣơng trình truyền dữ liệu giữa PC và PIC 16F887 với yêu
cầu sau: Truyền ký tự “b” và “t” từ PC thông qua chƣơng trình MATLAB, khi
PIC nhận đƣợc ký tự “b” thì bật các LED ở port e, khi PIC nhận đƣợc ký tự “t”
thì tắt các LED ở port e.
Chƣơng trình mẫu gợi ý :
#include <16f887.h>
#include <def_887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
char value1;
#int_RDA
void RDA_interrupt(){
value1 = getc();
if (value1=='b')
PORTe=0xff;
if (value1=='t')
PORTe=0x00;
}
void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
trise=0x00;
ENABLE_INTERRUPTS(INT_RDA);
enable_interrupts(GLOBAL);
while (1) {
}
}

Chƣơng trình MATLAB truyền dữ liệu từ PC:

s=serial('com1','BaudRate',9600);
fopen(s);
fprintf(s,'b');
fclose(s)
delete(s)
clear s

clear all
s=serial('com1','BaudRate',9600);
fopen(s);
fprintf(s,'t');
fclose(s)

ĐƢỜNG KHÁNH SƠN Trang 44


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

delete(s)
clear s

 Bài tập 7.2 : Viết chƣơng trình truyền chuỗi “ THUC TAP VI DIEU KHIEN”
từ PC xuống PIC 16F887 sau đó hiển thị chuỗi nhận đƣợc lên LCD 16x02.
 Bài tập 7.3 : Viết chƣơng trình đọc giá trị nhiệt độ từ IC TC 74 sau đó truyền
giá trị đọc đƣợc lên PC qua cổng RS232.

ĐƢỜNG KHÁNH SƠN Trang 45


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 8: ĐIỀU KHIỂN ĐỘNG CƠ DC


8.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Lập trình điều khiển động cơ DC bằng VĐK PIC 16F887.
8.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình điều khiển động cơ DC bằng VĐK PIC
16F887.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối điều khiển động cơ DC
dùng IC L298.
8.3. Giới thiệu chung
Để cho động cơ 1 chiều hoạt động, chúng ta cần đặt 1 điện áp 1 chiều vào động
cơ và 1 dòng điện 1 chiều sẽ chạy qua động cơ, động cơ sẽ quay theo 1 chiều nào đó.
Nếu chúng ta đổi chiều của điện áp 1 chiều này, động cơ sẽ quay ngƣợc lại. Chú ý:
điện áp V và dòng I không nên vƣợt quá giá trị đƣợc ghi trên động cơ, nếu không
động cơ sẽ bị hỏng. Tuy nhiên nếu ta đặt 1 điện áp thấp hơn V hoặc 1 dòng điện thấp
hơn I, thì tốc độ và độ chịu tải của động cơ sẽ giảm theo.
 Điều khiển chiều quay dùng mạch cầu H:
Để điều khiển chiều quay của động cơ 1 chiều, chúng ta cần đặt điện áp lên
động cơ. Có 1 mạch phổ biến dùng để điều khiển động cơ gọi là cầu H. Nó đƣợc gọi
nhƣ vậy bởi vì mạch này trông giống hình chữ „H‟. Một trong những khả năng cực
hay của mạch này là nó cho phép điều khiển động cơ tiến lên hoặc lùi lại ở bất kỳ tốc
độ nào, ngoài ra nó còn có thể dùng 1 nguồn điện độc lập.

Hình 8.1: Mạch cầu H

ĐƢỜNG KHÁNH SƠN Trang 46


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Khi đầu vào „Direction‟ ở trạng thái cao thì motor sẽ chuyển sang chế độ
hƣớng bình thƣờng. Nếu đầu vào „Direction‟ ở trạng thái thấp thì motor sẽ quay
ngƣợc chiều.
 IC L298:
Có rất nhiều loại IC dùng cho mạch cầu H. Loại phổ thông dùng cho motor
dòng thấp là L293B và motor dòng cao là L298.
IC L298 là một IC tích hợp nguyên khối gồm 2 mạch cầu H bên trong. Với
điện áp làm tăng công suất đầu ra từ 5V – 47V , dòng lên đến 4A, L298 rất thích hợp
trong những ứng dụng công suất nhỏ nhƣ động cơ DC loại vừa …
Chức năng các chân của L298:
- 4 chân INPUT: IN1, IN2, IN3, IN4 đƣợc nối lần lƣợt với các chân 5, 7, 10, 12
của L298. Đây là các chân nhận tín hiệu điều khiển.
- 4 chân OUTPUT: OUT1, OUT2, OUT3, OUT4 (tƣơng ứng với các chân
INPUT) đƣợc nối với các chân 2, 3, 13, 14 của L298. Các chân này sẽ đƣợc nối với
động cơ.
- Hai chân ENA và ENB dung để điều khiển các mạch cầu H trong L298. Nếu
ở mức logic “1” (nối với nguồn 5V) thì cho phép mạch cầu H hoạt động, nếu ở mức
logic “0” thì mạch cầu H không hoạt động.
Với bài toán của mình ở trên, các bạn chỉ cần lƣu ý đến cách điều khiển chiều
quay với L298:
- Khi ENA = 0: Động cơ không quay với mọi đầu vào .
- Khi ENA = 1:
- INT1 = 1; INT2 = 0: động cơ quay thuân.
- INT1 = 0; INT2 = 1: động cơ quay nghịch.
- INT1 = INT2: động cơ dừng ngay tức thì.(tƣơng tự với các chân ENB, INT3,
INT4).
Sơ đồ nguyên lý trên kit BOOK 1:

ĐƢỜNG KHÁNH SƠN Trang 47


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

 Điều khiển tốc độ DC Motor dùng chỉnh độ rộng xung (Pulse Width
Modulation -PWM):
Điều khiển độ rộng của xung là cách bật tắt nhanh nguồn điện lên motor. Nếu
tần số bật tắt mà đủ cao, motor sẽ chạy ở một tốc độ ổn định nhờ mômen quay của
bánh xe.
Bằng cách thay đổi chu kỳ hoạt động của tín hiệu (thay đổi độ rộng xung –
PWM), tức là khoảng thời gian “Bật”, nguồn điện trung bình đặt lên motor sẽ thay đổi
và dẫn đến thay đổi tốc độ.
 SƠ ĐỒ KHỐI PWM của PIC16F887

Khối PWM gồm có 2 mạch so sánh: mạch so sánh 8 bit với mạch so sánh 10
bit. Mạch so sánh 8 bit sẽ so sánh giá trị đếm của timer 2 với giá trị của thanh ghi PR2
(period register), giá trị trong timer 2 tăng từ giá trị đặt trƣớc cho đến khi bằng giá trị
của PR2 thì mạch so sánh sẽ set flip flop RS làm ngõ ra CCPx lên mức 1. Đồng thời
nạp giá trị 10 bit từ thanh ghi CCPRxL sang thanh ghi CCPRxH, timer2 bị reset và bắt
đầu đếm lại cho đến khi giá trị của timer 2 bằng giá trị của CCPRxH thì mạch so
sánh sẽ reset flip flop RS làm ngõ ra CCPx về mức 0. Quá trình này lặp lại.
Dạng sóng điều chế PWM nhƣ sau:

ĐƢỜNG KHÁNH SƠN Trang 48


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Chu kỳ không thay đổi, muốn thay đổi thời gian xung ở mức 1 thì ta thay đổi
hệ số chu kỳ (duty cycle). Khi hệ số chu kỳ thay đổi thì điện áp hay dòng trung bình
thay đổi. Hệ số chu kỳ càng lớn thì dòng trung bình càng lớn, nếu điều khiển động cơ
sẽ làm thay đổi tốc độ.
 TÍNH CHU KỲ XUNG PWM:
Chu kỳ PWM của PIC16F877A đƣợc tính theo công thức:
PERIODPWM = [(PR2) +1] * 4 * TOSC * PVTMR2
Trong đó: TOSC là chu kỳ của tụ thạch anh tạo dao động.
PVTMR2 (prescale value) giá trị chia trƣớc của timer2.
Khi giá trị của timer 2 (TMR2) bằng giá trị của thanh ghi PR2 thì 3 sự kiện
theo sau sẽ xảy ra:
· Thanh ghi TMR2 bị xóa
· Tín hiệu ngõ ra CCPx lên mức 1, ngoại trừ hệ số chu kỳ bằng 0% thì CCPx
vẫn ở mức 0.
· Hệ số chu kỳ PWM đƣợc chuyển từ thanh ghi CCPRxL sang thanh ghi
CCPRxH.
 HỆ SỐ CHU KỲ XUNG PWM
Hệ số chu kỳ đƣợc thiết lập bởi giá trị lƣu trong thanh ghi 10 bit gồm CCPRxL
8 bit và 2 bit còn lại là bit thứ 4 và thứ 5 ở trong thanh ghi CCPxCON – kí hiệu
là CCPxCON<5:4>.
Giá trị của hệ số chu kỳ là 10 bit nên có thể thay đổi từ 0 đến 1023 tạo ra 1024
cấp giá trị điều khiển. Giá trị 10 bit thì 8 bit có trọng số lớn lƣu trong thanh ghi
CCPRxL và 2 bit còn lại có trọng số thấp thì ở CCPxCON<5:4>.
Hệ số chu kỳ của PIC16F877A đƣợc tính theo công thức:
DUTY_ CYCLEPWM = (CCPRxL:CCPxCON < 5 : 4 >) * TOSC* PVTMR2.
8.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Kết nối động cơ DC với kit BOOK 1.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Tiến hành chạy thực nghiệm và quan sát kết quả.
8.5. Bài tập
 Bài tập 8.1 : Viết chƣơng trình điều khiển động cơ DC bằng nút nhấn nối với
ngắt ngoài của PIC 16F887.

ĐƢỜNG KHÁNH SƠN Trang 49


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Chƣơng trình mẫu gợi ý :


#include <16f887.h>
#include <def_887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#int_ext
ext_isr()
{
set_tris_c(0xf9);
output_c(0);
setup_timer_2(t2_div_by_4,124,1);
setup_ccp1(ccp_pwm);
set_pwm1_duty(125);
}

void main()
{
trisb = 0xff;
Port_B_pullups (1 );
enable_interrupts(int_ext);
ext_int_edge(H_TO_L);
enable_interrupts(GLOBAL);
while (true) {
}
}

 Bài tập 8.2 : Viết chƣơng trình điều khiển tốc độ và chiều quay của động cơ
DC.
 Bài tập 8.3 : Viết chƣơng trình đo tốc độ động cơ DC hiển thị lên LCD 16x02.
 Bài tập 8.4 : Viết chƣơng trình điều khiển tốc độ động cơ DC bằng PC qua
cổng RS 232.

ĐƢỜNG KHÁNH SƠN Trang 50


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

BÀI 9: ĐO KHOẢNG CÁCH BẰNG CẢM BIẾN SIÊU ÂM SRF05


9.1.Nhiệm vụ
Thực hành lập trình ứng dụng trên máy tính, biên dịch chƣơng trình, nạp vào
VĐK và sử dụng mô hình thí nghiệm để kiểm chứng.
• Lập trình đo khoảng cách bằng cảm biến siêu âm kết nối với VĐK PIC
16F887.
9.2.Yêu cầu
• Nắm vững các tập lệnh của VĐK PIC 16F887.
• Biết cách viết các chƣơng trình đo khoảng cách bằng cảm biến siêu âm kết nối
với VĐK PIC 16F887.
• Nắm đƣợc sơ đồ và nguyên lý hoạt động của khối cảm biến siêu âm SRF05.
9.3. Giới thiệu chung
Để đo khoảng cách, ta có nhiều phƣơng pháp đo khác nhau nhƣ siêu âm, hồng
ngoại,lazer…,trong bài này sẽ sử dụng cảm biến SRF 05 của Devantech.
1. Giới thiệu về SRF05
- SRF05 là cảm biến siêu âm dùng để đo khoảng cách với vật cản, đƣợc ứng
dụng nhiều trong robot dò đƣờng, công nghiệp ô tô.

Hình 9.1 : Cảm biến siêu âm SRF 05


- Khoảng cách đo: 3cm-4m.
- SRF05 sử dụng nguyên lý phản xạ của sóng đề đo khoảng cách. Khi muốn đo
khoảng cách SRF05 sẽ phát ra một 8 xung với tốc độ 40Khz. Sau đó nó sẽ chờ đợi
xung phản xạ về. Từ thời gian giữa xung đi và xung về ta có thể dễ dàng tính đƣợc
khoảng cách từ SRF05 tới vật cản.

Hình 9.2 : Cảm biến siêu âm SRF 05

ĐƢỜNG KHÁNH SƠN Trang 51


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

- Khi phát ra xung, và chờ xung phản xạ về, chân ECHO của SRF05 sẽ đƣợc
kéo lên cao. khi có xung phản xạ về chân ECHO sẽ đƣợc kéo xuống thấp, hoặc sau
30ms nếu không có xung phản xạ về.
SRF05 có thể thiết lập 2 mode hoạt động khác nhau thông qua các chân điều
khiển MODE.
Nối hoặc không nối chân MODE xuống GND cho phép cảm biến đƣợc điều
khiển thông qua giao tiếp dùng 1 chân hay 2 chân IO. Trong demo này, ta sẽ sử dụng
mode thứ 2.
ng:
Trong mode này,SRF05sử dụng cả 2 chân trigger và echo cho việc giao tiếp
với MCU.
Để sử dụng mode này,ta chỉ cần để trống chân Mode của module,điện trở bên
trong module sẽ kéo chân pin này lên mức 1.

Hình 9.3 : Cấu hình SRF 05 ở mode 1


Để điều khiển SRF05,ta cần cấp cho chân TRIGGER một xung điều khiển với
độ rộng tối thiểu 10uS. Sau đó một khoảng thời gian, đầu phát sóng siêu âm sẽ phát ra
sóng siêu âm, vi xử lý tích hợp trên module sẽ tự xác định thời điểm phát sóng siêu
âm và thu sóng siêu âm. Vi xử lý tích hợp này sẽ đƣa kết quả thu đƣợc ra chân ECHO.
Độ rộng xung vuông tại chân ECHO tỉ lệ với khoảng cách từ cảm biến tới vật thể.

Hình 9.4 : Nguyên lý hoạt động của SRF 05 ở mode 1

ĐƢỜNG KHÁNH SƠN Trang 52


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

Đƣợc thiết kế nhằm cho mục đích tiết kiệm chân pin cho MCU, nên trong
mode này, SRF05 chỉ sử dụng 1 chân pin cho 2 chức năng TRIGGER và ECHO. Để
sử dụng mode này, ta kết nối chân Mode xuống GND (0v).

Hình 9.5 : Cấu hình SRF 05 ở mode 2


Để điều khiển SRF05,đầu tiên xuất một xung với độ rộng tối thiểu 10uS vào
chân TRIGGER-ECHO (chân số 3) của cảm biến. Sau đó vi xử lý tích hợp trên cảm
biến sẽ phát ra tín hiệu điều khiển đầu phát siêu âm. Sau 700uS kể từ lúc kết thúc tín
hiệu điều khiển, từ chân TRIGGER-ECHO có thể đọc ra một xung mà độ rộng tỉ lệ
với khoảng cách từ cảm biến tới vật thể.

Hình 9.6 : Nguyên lý hoạt động của SRF 05 ở mode 2


9.4.Thực hiện
Kết nối cáp USB từ mạch nạp trên kit BOOK 1 với máy tính, cấp nguồn cho
mạch PIC qua adapter.
Kết nối SRF 05 với kit BOOK 1.
Viết chƣơng trình cho PIC bằng CCS C, sau đó biên dịch ra file hex.
Nạp file hex xuống PIC bằng phần mềm PICkit 2 v2.61 đƣợc cài trên máy.
Tiến hành chạy thực nghiệm và quan sát kết quả.

ĐƢỜNG KHÁNH SƠN Trang 53


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

9.5. Bài tập


Bài tập 9.1 : Viết chƣơng trình đo khoảng cách bằng cảm biến siêu âm kết nối
với VĐK PIC 16F887.
 Chƣơng trình mẫu gợi ý :
#include <16f887.h>
#include <def_887.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
#define PIN_TRIGGER PIN_A3

int1 echo = 0;
int16 value = 0;
void Trigger()
{
output_high(PIN_TRIGGER);
delay_us(12);
output_low(PIN_TRIGGER);
}
#int_CCP1
void CCP1_isr(void)
{
if(echo == 1)
{
setup_ccp1(CCP_CAPTURE_FE); // falling fulse
set_timer1(0);
echo = 0;
}
else
{
setup_ccp1(CCP_CAPTURE_RE); // rising fulse
value = CCP_1;
echo = 1;
}
}

void main()
{
output_low(LCD_RW);
LCD_init();

setup_adc_ports(NO_ANALOGS);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
setup_ccp1(CCP_CAPTURE_RE); // raising fulse
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
float distance = 0;

while(TRUE)
{
Trigger();
while(echo == 0)
{}
distance = value * 0.8 / 58;
lcd_putcmd(0x85);
lcd_putcmd(0x01);//xoa man hinh
printf(LCD_PutChar, "KHOANG CACH : ");

ĐƢỜNG KHÁNH SƠN Trang 54


TÀI LIỆU THỰC TẬP VI ĐIỀU KHIỂN DRAFT

lcd_putcmd(Line_2);
printf(LCD_PutChar, "%fcm", distance);
delay_ms(100);
}
}
}

 Bài tập 9.2 : Viết chƣơng trình đo khoảng cách bằng cảm biến siêu âm SRF 05
kết nối với VĐK PIC 16F887, gởi giá trị đo đƣợc lên máy tính.
 Bài tập 9.3 : Viết chƣơng trình điều khiển robot di chuyển song song cách
tƣờng một khoảng cách không đổi là 40 cm sử dụng cảm biến siêu âm SRF 05
kết nối với VĐK PIC 16F887.

ĐƢỜNG KHÁNH SƠN Trang 55

You might also like