Вы находитесь на странице: 1из 65

Môn: Vi xử lý

Trương Ngọc Anh (2001)


anhtn@hcmute.edu.vn
0902680065

I. Tài liệu:
1. Giáo trình Vi xử lý – Vi điều khiển PIC 16F887 (8/2016)
2. www.microchip.com (NSX – datasheet)
3. www.picvietnam.com (diễn đàn)
4. Trang LMS.
20 10
40 45
40 45
II. Thi:
- Chuyên cần: 10% (điểm danh, nộp bài tập)
- Giữa kỳ 1: 20% (50-60 phút, đề đóng, không dùng máy tính)
- Giữa kỳ 2: 20% (60-75 phút, tk 1 tờ A4 viết tay) hoặc bài
tập lớn (quay video clip các thao tác).
- Cuối kỳ: 50% (90 phút, tk 1 tờ A4 viết tay)
VD: Giữa kỳ: 4 và 4  CC: 20% = 2đ, GK: 40% - 40%
 1.6 (40% của 4) + 1.6 + 2 = 5.2
 2 (40% của 5) + 2 + 2 =6
20/40/40 10/45/45
10 - 2 1
3- 1.2 1.35
* Nội dung thi: 10 - 4 4.5
= 7.2 6.85
- Giữa kỳ đợt 1: 2 câu 3 ý
Câu 1a (3đ): Viết kết quả từ đoạn lệnh cho sẵn.
VD 4_13/58 (không dùng máy tính)

Trang 001
Ôn lại đổi số hex  nhị phân.
phép logic AND, OR, EXOR, chương 4.
Câu 1b (3đ): Viết lệnh từ lưu đồ cho sẵn.
VD Trang 93.
Câu 2 (4đ): Viết chương trình hoàn chỉnh điều khiển led đơn
(sáng dần, tắt dần, sáng dồn, chớp tắt, xen kẻ…)  Có thể mô
phỏng được. (VD Tr. 77)

- Giữa kỳ đợt 2: Led 7 đoạn, nút nhấn, Timer/Counter (chương 5 -


chương 6).
o Vẽ sơ đồ nguyên lý
o Vẽ lưu đồ
o Viết chương trình
VD: Trang 92,93.

- Cuối kỳ: 3 câu – 90 phút – vẽ sơ đồ n.lý, vẽ lưu đồ, viết CT


o Chương 7  hết: ADC, Ngắt, UART, PWM.
o Bao gồm: led 7 đoạn, LCD, nút nhấn, led đơn (phần nhỏ).

Trang 002
CHƯƠNG 1
KHẢO SÁT VI ĐIỀU KHIỂN PIC 16F887

I. GIỚI THIỆU:
- Phân biệt Vi xử lý và Vi điều khiển ?
Micro_processor – Micro_controller
MPU – MCU

Vi xử lý là gì ? CPU – Central Processing Unit


CPU – có khối số học (ALU) tính toán +, -, *, /,
AND, OR, NOT
- có Register (thanh ghi) chứa dữ liệu khi xử lý

Hệ thống vi xử lý  Hình 1-2/2


- CPU
- Memory (RAM, ROM)
ROM: Chứa chương trình điều khiển.
RAM: Chứa dữ liệu tạm thời khi xử lý.
- I/O: Khối xuất/nhập (input/output).
NX:
 HT VXL – 3 khối trên rời nhau (độc lập). VD: PC

Trang 003
 Vi điều khiển khác VXL ở chỗ là 3 khối trên tích hợp
chung 1 chip.
Tiêu chí lựa chọn VXL hay VĐK:
- Nhu cầu nâng cấp.
- Tốc độ xử lý, số lượng dữ liệu cần xử lý.
VD: Hình 1_1/2

II. KHẢO SÁT VI ĐIỀU KHIỂN PIC 16F887:


1. Thông số cơ bản:
- Vi điều khiển 8 bit: là khả năng xử lý (xuất/nhập) dữ liệu tại một
thời điểm là ≤ 8 bit.
VD: Đọc 1 dữ liệu 16 bit
- VĐK 8 bit đọc ??? lần  2 lần
- VĐK 16 bit  1 lần
N.xét: nhiều bit cần nhiều chân giao tiếp, cùng tốc độ (tần số)
nhưng số bit càng cao thì xử lý càng nhanh.
- Họ VĐK 8 bit của Microchip:
PIC 10, 12, 14 (Low Performance)
16 (Mid-range)
18 (High Performance)
(CPU, Memory, I/O, module tích hợp,…)

- Lựa chọn theo thị trường, kinh tế,… Chọn họ 16.


- Thông số cơ bản của VĐK (trang 4): xem GT có ghi chú
 Cấu trúc RISC  35 lệnh đơn. (CISC > 200 lệnh)

Trang 004
 Tốc độ: ≤ 20MHz (dùng dao động thạch anh bên ngoài)
fLàm_việc = ¼ fThạch_Anh
( /4 là do 1 lệnh cần phải có 4 xung dao động của thạch
anh)
fthạch_anh = 20Mhz  fLV = 5 MHz  T = 200ns
 VĐK thực hiện được 5 triệu lệnh/1s.
 Dao động nội: 31kHz  8MHz (2 triệu lệnh/1s)
 Điện áp cung cấp: 2V – 5.5V
 Có mạch reset bên trong khi mới cấp nguồn.
 PUT PWRT
 BOR
 WDT (trang 74) Watchdog timer – Bộ định thời giám sát thời
gian  tự động reset VĐK khi bị treo (có công việc xử lý nhưng
không kết thúc)
- 16xxx ?  Xem bảng 1-1/7.
- Tiêu chí lựa chọn Vi điều khiển:
+ Program Memory: Bộ nhớ chương trình (Flash ROM)
Đơn vị: words  2 bytes = 16 bit
Trong trường hợp này: 14 bit
VĐK có: 8192 ô nhớ x 14 bit (PIC16F887)
Ta có: 1 lệnh cần 1 ô nhớ để lưu
 ta có thể lưu 8192 lệnh.
 160 trang A4 (50 lệnh/1 trang A4)
+ Data memory: Bộ nhớ dữ liệu (8 bit = 1 byte)
- RAM: 368 ô nhớ x 8 bit
- EEPROM: 256 ô nhớ x 8 bit (đếm s.phẩm)
+ I/O: 35 (xem trang 8, hình 1-6)
Port A,B,C,D (8 bit) x 4 = 32

Trang 005
Port E = 3
NX: Do VĐK 8 bit nên các port ≤ 8 bit, bộ nhớ dữ liệu lưu
được cũng 8 bit.
+ ADC: chuyển đổi tương tự  số (Analog to Digital Converter)
 Giao tiếp với cảm biến (temperature, humidity,
pressure...)
+ PWM (CCP): Pulse Width Modulation – Điều chế độ rộng xung
 Điều khiển tốc độ động cơ DC (thay đổi điện áp DC)
 Điều khiển độ sáng của led đơn
+ UART: Truyền dữ liệu nối tiếp bất đồng bộ
 Kết nối: VĐK  VĐK hoặc VĐK  PC
 Tiết kiệm chân kết nối khi truyền đi xa
+ Timer/Counter: Bộ định thời/Bộ đếm xung
 Timer dùng để tạo thời gian chính xác (đếm xung tính
thời gian, 1 xung = 1 T (s)), đếm xung bên trong lấy từ
bộ dao động.
 Counter dùng để đếm xung bên ngoài (đếm sản
phẩm, đo tần số - đếm xung trong 1s, đo tốc độ - đếm
số vòng quay / 1s)
 Timer/Counter là 1 module phần cứng độc lập được
điều khiển bởi phần mềm, khi có xung đến thì counter
tự động tăng giá trị (không phụ thuộc vào vi điều khiển
khi đang xử lý công việc khác)  tránh trường hợp đếm
thiếu xung (mất xung).

2. Khảo sát sơ đồ chân và chức năng chân của VĐK PIC16F887:


- Trang 10
- Vi điều khiển nói chung, phải có 3 tín hiệu cơ bản:

Trang 006
Nguồn, dao động (đồng bộ), reset
(Linh kiện nói chung: Vào, Ra, Điều khiển)
 Nguồn: VDD (VCC), VSS (GND)  CMOS (TTL) (11,12,31,32)
 Dao động: Thạch anh  OSC1, OSC2 (13,14) (XTAL1, XTAL2)
 Reset: MCLR\ (1) – Master Clear
Lưu ý: Nếu không thấy dao động thạch anh và mạch reset thì ta
ngầm hiểu là đang sử dụng bên trong.
VD: Tr.77

* Tóm tắt:
1. Phân biệt VXL, HT VXL, VĐK.
2. Khảo sát VĐK
 Họ VĐK 8 bit.
 Họ VĐK 8 bit của Microchip (PIC 10,12,14,16,18)
i. Chọn lựa (CPU, Mem., I/O, module tích hợp)
ii. ADC, UART, PWM, Timer/Counter,…
 Sơ đồ chân và chức năng chân
 Kết nối (3 tín hiệu cơ bản: nguồn, dao động, reset)
 Dao động, reset tích hợp bên trong hoặc kết nối bên
ngoài.

Trang 007
Trang 008
CHƯƠNG 2
TỔ CHỨC BỘ NHỚ, THANH GHI

I. KIẾN TRÚC BỘ NHỚ:


- Phân biệt cấu trúc Von Neumann và Harvard. Hình 2-1/20.
II. TỔ CHỨC BỘ NHỚ:
- Bộ nhớ chương trình. (Program Mem.)
- Bộ nhớ dữ liệu. (Data Mem.)

* Bộ nhớ chương trình:


Hình 2-2, Trang 21.
Thanh ghi PC, Bộ nhớ ngăn xếp – Stack, phân bổ trang bộ nhớ.
* Bộ nhớ dữ liệu:
Hình 2-6, Trang 30.
Thanh ghi thông dụng, thanh ghi đặc biệt.

Trang 009
CHƯƠNG 3
LỆNH HỢP NGỮ

I. GIỚI THIỆU:
- Phân biệt lệnh hợp ngữ và ngôn ngữ C.
II. LỆNH HỢP NGỮ:
- Mã lệnh. Trang 41
- Lệnh hợp ngữ. Trang 42

Trang 010
CHƯƠNG 4
NGÔN NGỮ LẬP TRÌNH C

I. KIỂU DỮ LIỆU: Tr.54


- 4 kiểu: INT1, INT8, INT16, INT32 (1, 8, 16, 32 BIT)
- Khai báo biến (số ô nhớ cần để chứa dữ liệu).
- tiết kiệm bộ nhớ
VD: 8 bit – 1 ô nhớ, 16 bit – 2 ô nhớ. - tăng tốc độ xử lý,
khi khai báo kiểu dữ
- 8 bit (256 trạng thái = 0-255). liệu phù hợp (không
- SIGNED (có dấu), UNSIGNED (không dấu) dư không thiếu)

- Có dấu = không dấu / 2.


- Cấu trúc khai báo biến:
Dấu Số_bit Tên_biến_1, tên_biến_2,… ;

II. CÁC TOÁN TỬ CƠ BẢN:

Trang 011
Câu 1:
A = 0xB7;
B = 0x5C;
X = A | B;
B = ~A;
Y = A^B;
Z = X & Y;
FOR(I=0; I<3; I=I+2)
{
B++;
A = (A<<2) | 0x32;
}

Câu 2:
A = 0xD8;
B = 0x6A;
X = A^B;
A = ~A;
Y = X & A;
Z = B | Y;
WHILE(B < 0x6C)
{
B++;
Z = (A>>2) + 0x03;
}

Câu 3:
A = 0x4D;
B = 0XE3;
X = A & B;
B = ~(B^0X3F);
Y = X | B;
IF(Y < X ) Z = A<<4;
ELSE Z = A>>4;
DO
{
A++;
X = (X>>2) | 0XC0;
}
WHILE(A < 0X4F);

Câu 4:
A = 0x05;
B = 0xBD;
X = A^B;
FOR(K = 2; K>0; K--)
{
FOR(J = 0; J<K; J++)
{
A = (A<<2) | 0x03;
B = (B>>2) & 0xFC;
}
}
IF(A != B) { Z = (A & B) >> 3; }
ELSE { Z = (A | B) << 3; }

Trang 012
GỢI Ý GIẢI
Câu 1:
8421 8421
A=
B=
X=
B=
Y=
Z=
Lặp: I = 0: I <3: đúng  thực hiện nội dung lặp
B =
A<<2 =
| 0x32 =
A =
I++ =
_______________________
Lặp: I = …: I < 3: đúng (tiếp tục)
sai (kết thúc vòng lặp for)

Câu 2:

So sánh: B < 0x : đúng  thực hiện nd lặp của while
B++ =
A >> 2 =
+ 0x03 =
Z =
Quay lại so sánh tiếp: B < 0x : đúng thực hiện tiếp
sai kết thúc vòng lặp while

Câu 3:

So sánh (Y < X): đúng  thực hiện nội dung của IF bỏi ELSE
sai  thực hiện nội dung của ELSE bỏ IF
Thực hiện (*): (Do/While)
A =
X >> 2 =
| 0xC0 =
X =
So sánh (A < 0x ): đúng  quay lại (*) thực hiện tiếp lần kế
sai  kết thúc vòng lặp Do/While

Câu 4:

Lặp: K = 0: K > 0: đúng
Lặp: J = 0: J < K: đúng
A=
B=
J++ =
Lặp: J = … : J < K: đúng tiếp tục, sai kết thúc
_____________
K-- =
Lặp: K = …: K > 0: đúng tiếp tục, sai kết thúc

Trang 013
CHƯƠNG 5: GIAO TIẾP NGOẠI VI

I. CẤU TRÚC PORT:


- Dòng vào/ra của vi điều khiển là 25mA.
- Thiết lập ngõ vào/ra cho port.
Hình 5-2
SET_TRIS_D(0X00);

II. CÁC LỆNH HỖ TRỢ CỦA PHẦN MỀM CCS:


Trang 66

III. GIAO TIẾP LED ĐƠN:


1. PHẦN CỨNG:
* Các tín hiệu tối thiểu của vi điều khiển:
- Nguồn (VDD, VSS) x 2 (xem tr. 10)
- Dao động (thạch anh ngoài) > 8MHz
và tối đa 20MHz (dao động nội 31KHz –
8Mhz – trang 5). Đồng bộ hệ thống
- Reset (Clear) – tr. 10 – MCLR\ - tích
cực mức thấp. Khởi động lại hệ thống

Trang 014
• Nếu không thấy dao động thạch anh
và mạch Reset là ngầm hiểu ở bên
trong (tr. 5).

* Giao tiếp các linh kiện ngoại vi:


- Led đơn: led sáng mức 1 và led sáng
mức 0. (Ch: 5, I. cấu trúc port).
- Tải AC: Relay, optotriac – MOC3020
(Google).

2. Phần mềm:
- Cấu trúc chương trình C – bài giảng.
- Giải thuật

Trang 015
TRƯỜNG HỢP ĐẦU
TIÊN

VIẾT THÀNH LỆNH

Trang 016
- Sáng dần 1 lần 2 led.
- Sáng dần 5 led, mỗi lần 2 led
Dịch trái
FOR (3 LẦN)
2 bit
Y = ((Y<<2) | 0X03) & 0x1F;
OR 0x03
Lặp 3 lần x 2 led/mỗi lần

- Giải thuật che bit (masked – mặt nạ)


0011 1111 - trạng thái t.tế
& 0001 1111 = 0x1F
______________

0001 1111 - trạng thái mong muốn

AND với: 0 – luôn bằng 0


1 – bằng chính nó (k. đổi)
OR với: 0 – bằng chính nó
1 – luôn bằng 1
- Sáng dần:

Trang 017
0000 0000 - RD7 .. RD0
0000 0100 - bắt đầu từ RD2
FOR (6 LẦN)
0000 1100
0001 1100 << 1 Y = (Y<<1) | 0X04;
… OR 0x04
1111 1100 Lặp 6 lần

BÀI TẬP:

SÁNG DẦN 7 LED TỪ RD0 - RD6, 2 LẦN, MỖI LẦN SÁNG 2 LED
RỒI
SÁNG DẦN 6 LED TỪ RD5-RD0, 2 LẦN, MỖI LẦN SÁNG 1 LED

0000 0000
0000 0011
...
0111 1111

0000 0000
0010 0000
FOR (4 LẦN)

Y = ((Y<<2) | 0X03) & 0x7F;


FOR (6 LẦN)
8421 8421
0111 1111 = 0x7F
Y = (Y>>1) | 0x20;
Trang 018
- ĐIỀU KHIỂN SỐ LED > 8: dùng 2 port trở lên
VD: 16 led
PORT C PORT D
0000 0000 0000 0000
- Lệnh xuất thì chỉ có 8 bit (VĐK 8 BIT)
- Xử lý 16 led dùng 1 biến 16 bit (INT16)
1 0x01
1
Y = (Y<<1) | 0x0001; //16 bit – 4 số hex
- Nguyên tắc tách 8 bit cao và 8 bit thấp từ
biến 16 bit
YTHẤP = Y; // 8 bit = 16 bit
 YTHẤP sẽ nhận 8 bit thấp
2 biến 8 bit
của Y, còn 8 bit cao bỏ
8 bit cao
YCAO = Y>>8; 8 bit thấp

Y = 0000 0000 0000 0000


YCAO = 0000 0000 0000 0000
kg quan tâm 8 bit cao … bỏ …

Trang 019
Di chuyển vị trí 8 bit cao qua vị trí của 8 bit thấp, sau
đó gán giá trị.
• LỆNH:
Y = (Y<<1) | 0X0001;
OUTPUT_D(Y);
OUTPUT_C(Y>>8);
DELAY_MS(500);

PORT B PORT C PORTD


0000 0000 0000 0000 0000 0000 = Y (INT32)
Y
Y >> 8
Y>>16

TỔNG KẾT:
- SÁNG DẦN 1 LED/1 LẦN.
- SÁNG DẦN NHIỀU LED/1 LẦN.
- SÁNG DẦN CÓ SỬ DỤNG PP CHE BIT.
- SÁNG DẦN CÓ SỐ LED > 8.
- SÁNG DẦN VỊ TRÍ BẤT KỲ.

Trang 020
• TẮT DẦN:
1111 1111 Y = Y<<1;
1111 1110
1111 1100

* Qui trình:
Ban đầu: sáng hết – Y = 0xFF;
Xuất ra port
Delay
Vòng lặp theo số led:
Dịch trái, phải (không cần OR,…)
Xuất
Delay

* ND Thi led đơn: Sáng dần và tắt dần.


1111 1111
1011 1111 = 0XBF
1001 1111

Dịch >>
1 bit
AND để tạo ra mức 0 - and với giá trị đầu tiên có bit bắt đầu = 0

Y = ((Y>>1) & 0XBF) | 0x80;

1011 1111
>>1 0101 1111
&0XBF 1011 1111
0001 1111 --> LED ĐẦU TIÊN BỊ ẢNH HƯỞNG, TA MUỐN LUÔN = 1 (SÁNG)
OR 1000 0000 = 0x80
1001 1111 Trang 021
CHƯƠNG 5: GIAO TIẾP NGOẠI VI

IV. GIAO TIẾP LED 7 ĐOẠN:


1. PHẦN CỨNG: Tr. 81
2. PHẦN MỀM:

- Hiển thị số trên led 7 đoạn: (GIẢI MÃ – HIỂN THỊ)


* GIẢI MÃ:
- TÁCH SỐ (DV, CH, TR…): 1 LED 7 ĐOẠN CHỈ HIỂN THỊ 1 SỐ
VD 4-5 và 4-6.
GIẢI THUẬT: CHIA 10 NHIỀU LẦN
%: CHIA LẤY SỐ DƯ
/: CHIA LẤY SỐ NGUYÊN
15%10 = 1 DƯ 5  % LẤY KẾT QUẢ LÀ 5
15/10 = 1 DƯ 5  LẤY KẾT QUẢ LÀ 1

- LẤY MÃ 7 ĐOẠN CỦA SỐ ĐẾM


+ TẠO MÃ – TRANG 81
VD: Hiển thị số 0 – ta phải cho các đoạn led a,b,c,d,e,f sáng; g,dp tắt

 Led 7 đoạn là loại Anode chung (0: sáng, 1: tắt)


Vị trí đoạn A ứng với bit thấp của port (RD0, RC0…), do phần cứng.

T T S S S S S S

Trang 022
Trang 023
+ LƯU MÃ – BT MẪU TRANG 82

CONST: HẰNG SỐ - LƯU VÀO ROM (CỐ ĐỊNH), TIẾT KIỆM RAM

UNSIGNED CHAR: KIỂU DỮ LIỆU 8 BIT (7 ĐOẠN + DẤU CHẤM)


MA7DOAN: TÊN MẢNG (DẠNG BIẾN CÙNG TÊN, KHÁC CHỈ SỐ)
[10]: 10 PHẦN TỬ TỪ 0-9
MA7DOAN[0] : 1 BIẾN
MA7DOAN[1] : 1 BIẾN
2 BIẾN NÀY CÙNG TÊN, KHÁC CHỈ SỐ
 CON TRỎ, CHỈ SỐ CHÍNH LÀ CON TRỎ
{0XC0, 0XF9,…., 0X90};
0XC0: MÃ 7 ĐOẠN SỐ 0  PHẦN TỬ THỨ 0 = MA7DOAN[0]

0X90: MÃ 7 ĐOẠN SỐ 9  PHẦN TỬ THỨ 9 = MA7DOAN[9]


+ LẤY MÃ 7 ĐOẠN CỦA SỐ ĐẾM = ĐẶT SỐ ĐẾM VÀO TRONG MẢNG
DV = 1
MADV = MA7DOAN[DV] = MA7DOAN[1] = 0XF9
(MÃ 7 ĐOẠN SỐ 1)
- XÂY DỰNG HÀM GIẢI MÃ:

Trang 024
VOID GIAI_MA()
{
DV = MA7DOAN [DEM%10]; // TÁCH SỐ + LẤY MÃ
CH = MA7DOAN [DEM/10%10];
TR = MA7DOAN [DEM/100];

//XÓA SỐ 0 VÔ NGHĨA – VD: 005  5; 105  105


IF(TR == 0XC0) // LẤY MÃ 7 ĐOẠN SO SÁNH VỚI MÃ 7Đ SỐ 0
{
TR = 0XFF; //MÃ TẮT LED – 1: TẮT (ANODE CHUNG)
chứa mã
IF(CH == 0XC0)
7 đoạn CH = 0XFF;
}
}

- HÀM HIỂN THỊ (XUẤT MÃ 7 ĐOẠN RA PORT ĐIỀU KHIỂN LED)

VOID HIEN_THI()
{
//TÙY VÀO PHẦN CỨNG: PORT D,C,B (DV,CH,TR)
OUTPUT_D(DV);
OUTPUT_C(CH); đọc đề
OUTPUT_B(TR);
}

3. BÀI TẬP MẪU: ĐẾM 0-9


- CẤU TRÚC CHƯƠNG TRÌNH C
- LƯU ĐỒ GIẢI THUẬT
KHỞI TẠO CÁC PORT B,D,C LÀ NGÕ RA
TD: DEM = 0
GIẢI MÃ
HIỂN THỊ
DELAY (QUAN SÁT)
X: DEM + 1
GIẢI MÃ
HIỂN THỊ
DELAY
QUAY LẠI VỊ TRÍ X NẾU DEM < 9 (DEM CHƯA = 9)
QUAY LẠI TỪ ĐẦU – VỊ TRÍ TD

KHỞI TẠO CÁC PORT B,D,C LÀ NGÕ RA


TD: DEM = 0
X: GIẢI MÃ
HIỂN THỊ
DELAY (QUAN SÁT)
DEM + 1
QUAY LẠI VỊ TRÍ X NẾU DEM < 10
QUAY LẠI TỪ ĐẦU – VỊ TRÍ TD

Trang 025
KHỞI TẠO CÁC PORT B,D,C LÀ NGÕ RA
TD: VÒNG LẶP DEM = 0-9  FOR(DEM = 0; DEM<10; DEM++)
GIẢI MÃ
HIỂN THỊ
DELAY (QUAN SÁT)
QUAY LẠI TỪ ĐẦU – VỊ TRÍ TD

* VIẾT LỆNH:
//KHAI BAO THU VIEN
#INCLUDE<TV_16F887.C>

//KHAI BAO BIEN


UNSIGNED INT8 DV,CH,TR,DEM;

//VIET HAM CON


VOID GIAI_MA()
{
DV = MA7DOAN [DEM%10]; // TÁCH SỐ + LẤY MÃ
CH = MA7DOAN [DEM/10%10];
TR = MA7DOAN [DEM/100];

//XÓA SỐ 0 VÔ NGHĨA
IF(TR == 0XC0) // LẤY MÃ 7 ĐOẠN SO SÁNH VỚI MÃ 7Đ SỐ 0
{
TR = 0XFF; //MÃ TẮT LED – 1: TẮT (ANODE CHUNG)
IF(CH == 0XC0)
CH = 0XFF;
}
}

VOID HIEN_THI()
{
//TÙY VÀO PHẦN CỨNG: PORT D,C,B (DV,CH,TR)
OUTPUT_D(DV);
OUTPUT_C(CH);
OUTPUT_B(TR);
}

//VIET HAM CHINH


VOID MAIN()
{ //VOID SETUP()
//KHOI TAO BAN DAU – KHỞI TẠO PORT
SET_TRIS_B(0X00);
SET_TRIS_C(0X00);
SET_TRIS_D(0X00);
//KHOI TAO CAC MODULE

//KHOI TAO BAN DAU

Trang 026
//VONG LAP TUAN HOAN
WHILE(TRUE) // VOID LOOP()
{
DEM = 0;
GIAI_MA();
HIEN_THI();
DELAY_MS(1000);
WHILE(DEM<9)
{
DEM++;
GIAI_MA();
HIEN_THI();
DELAY_MS(1000);
}
}
}

Trang 027
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CẤU TRÚC CHƯƠNG TRÌNH C

//KHAI BÁO THƯ VIỆN


- TV_16F887.C
- TV_LCD.C
- PHÍM MA TRẬN
//KHAI BÁO UART
//ĐỊNH NGHĨA – NÚT NHẤN
//KHAI BÁO BIẾN
//VIẾT HÀM NGẮT – NẾU CÓ (UART, TIMER, ADC)
//VIẾT HÀM CON
- GM + HT LED 7 ĐOẠN
- GM_LCD + HT_LCD
- PHÍM NHẤN
- ĐỌC ADC
//VIẾT HÀM CHÍNH
VOID MAIN() thiết lập vào/ra cho port

{
//KHỞI TẠO BAN ĐẦU
SET_TRIS…
//KHỞI TẠO LCD, ADC, PWM, TIMER, COUNTER, NGẮT
//TRẠNG THÁI BAN ĐẦU CỦA HT – khi mới cấp điện
//VÒNG LẶP TUẦN HOÀN
WHILE(TRUE)
{
//CÔNG VIỆC THỰC HIỆN LIÊN TỤC
}
}

Trang 028
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

* LCD:
I. Phần cứng:
- Trang 106, 107.

- Những ô đen là ma trận điểm 5x7 hoặc 5x8 hoặc 5x10 (cột x
hàng)

VD:
- LCD có 2 hàng, 16 cột  LCD 16x2 (cột x hàng)
- Bên trong module LCD có IC LCD Controller – Hitachi.
- Alphanumeric (chữ và số theo mã ASCII)
 Kết nối và lập trình để gửi dữ liệu (yêu cầu) cho LCD (không
điều khiển các ma trận điểm)
- Sơ đồ chân và chức năng chân: Bảng 5-3/106
+ Nguồn, Vào, Ra, Điều khiển (phân loại tín hiệu)
+ Nguồn:
VDD: 5V, VSS: 0V (CMOS)
VCC GND (TTL)
(Mạch số - Nguyễn Hữu Phương)

Trang 029
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

A: Anode - Backlight – Đèn nền


K: Cathode
+ Vào:
D7-D0: 8 bit dữ liệu – ngõ vào khi ghi LCD
+ Ra:
D7-D0: ngõ ra khi đọc LCD
+ Điều khiển:
RS: Chọn thanh ghi
= 0: thanh ghi lệnh
= 1: thanh ghi hiển thị
VD:
Gửi lệnh xóa màn hình - 0x01 (RS = 0)
Gửi mã ASCII số 0 - 0x30 (RS = 1)
R/W: Chọn chế độ ghi/đọc
=0: chế độ ghi
=1: chế độ đọc
E: Enable – cho phép ghi/đọc

Trang 030
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

- ADJ: (Dò theo thứ tự chân – số 3)  V0 : Điều chỉnh độ tương


phản (contrast)  điều chỉnh bằng điện áp.
* Biến thể sơ đồ nguyên lý:
- Anode qua 1 công tắc và 1 điện trở nối lên nguồn.
- R/W nối GND (luôn = 0, luôn ở chế độ ghi)
+ Vì LCD chỉ đọc trạng thái báo bận khi đang xử lý để chuẩn
bị gửi yêu cầu kế tiếp  thay thế bằng việc trì hoãn (delay)
- LCD giao tiếp theo chuẩn 4 bit (D4-D7, bỏ D0-D3)  Còn lại
3 + 4 = 7 (<1 port – 8 bit)
- Thanh ghi dịch – 74HC595 (4 chân – SER In, SCK, RCK, G\) –
chuyển dữ liệu nối tiếp sang song song.
- Dùng IC chuẩn I2C – 2 chân (SDA, SCL).

II. PHẦN MỀM:


* Dùng thư viện có sẵn: #include<TV_LCD.C> (trang 110)
- Khai báo phần cứng (dùng port E, port D)
- Hàm:
o LCD_SETUP(); //KHỞI TẠO LCD
o LCD_COMMAND(); //GỬI LỆNH
o LCD_DATA(); //GỬI NỘI DUNG HIỂN THỊ
- CẤU TRÚC CHƯƠNG TRÌNH C
- HIỂN THỊ LCD: 2 BƯỚC
o XÁC ĐỊNH VỊ TRÍ - TRANG 109 – LCD_COMMAND
o GỬI DỮ LIỆU – LCD_DATA

VOID GM_LCD() //TÁCH SỐ - LẤY MÃ ASCII


{
DV = NDO%10 + 0X30;

Trang 031
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CH = NDO/10%10 + 48; // 0X30 = 48


IF(CH == 0X30) CH = ‘ ’; //KHOẢNG TRẮNG
}

VOID HT_LCD()
{ // HÀNG 1: DO NHIET DO
// HÀNG 2: XXOC (CUỐI HÀNG) – XX: N.ĐỘ
LCD_COMMAND(0X80); //HÀNG 1
LCD_DATA(“DO NHIET DO”); //CHUỖI – DẤU NHÁY KÉP

LCD_COMMAND(0XC0+12); //0XCC – CUỐI HÀNG 2


LCD_DATA(CH);
LCD_DATA(DV);
LCD_DATA(0XDF);
LCD_DATA(‘C’); //1 KÝ TỰ - DẤU NHÁY ĐƠN
}

* DỰA THEO DATASHEET:


- Timing Diagram (Tr.108) – Giản đồ thời gian  Qui trình
ghi/đọc.
Trục X: trục thời gian  tín hiệu trước, sau
Trục Y: thứ tự tín hiệu vào  ra.
- Bảng mã lệnh: Trang 107 + Datasheet
0x08 : Tắt màn hình
0x0C: hiển thị màn hình

Trang 032
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

0x0F: bật con trỏ, nhấp nháy con trỏ


0x01: Xóa màn hình
0x80: Chọn địa chỉ đầu hàng 1
0xC0: Chọn địa chỉ đầu hàng 2
* Xác định mã lệnh:
 Đổi mã qua nhị phân
 Xác định bit 1 cao nhất
 Gióng vị trí bit cao nhất từ trên xuống  gặp 1
dừng lại và gióng qua trái  lệnh.
- Bảng mã ASCII.
- Vị trí hiển thị trên LCD.

* DÙNG THƯ VIỆN LCD CỦA CCS:


1. Khai báo chân kết nối: xem trong bài mẫu và thư viện lcd.c
//LCD Module Connections
#define LCD_RS_PIN PIN_E0
#define LCD_RW_PIN PIN_E1
#define LCD_ENABLE_PIN PIN_E2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
//End LCD Module Connections
2. Các hàm cơ bản:
- lcd_init(); // khởi tạo LCD (ngoài while(true))

Trang 033
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

- lcd_gotoxy(x,y); // x:cột, y:hàng (1,1)


- lcd_putc(mã ASCII);
‘\f’ : mã lệnh = 0x01 - Clear display
‘\n’ : mã lệnh = 0xC0 - Go to start of second line
‘\b’ : Move back one position
Số đếm: lấy mã ASCII (số đếm + 0x30)
lcd_putc(donvi + 0x30);
Ký tự:
Lcd_putc(‘A’);
Chuỗi ký tự:
Lcd_putc(“ABC”);
- Hàm tổng hợp: hiển thị số và chữ
Printf(lcd_putc, “Chuỗi = %d %f”, biến1, biến 2);
Xem thêm trong phần mềm CCS, F1 (help)  Search  printf
 OK.

%03u 018

%u 18
- lcd_send_byte(thanh ghi, dữ liệu);
o thanh ghi =0: mã lệnh, =1: mã hiển thị
o dữ liệu 8 bit
Trang 107: mã lệnh
0x08 : Tắt màn hình
0x0C: hiển thị màn hình
0x0F: bật con trỏ, nhấp nháy con trỏ
0x01: Xóa màn hình

Trang 034
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

0x80: Chọn địa chỉ đầu hàng 1


0xC0: Chọn địa chỉ đầu hàng 2

Trang 035
BÀI TẬP 5_9:
* Nhận xét:
- Dùng biến trạng thái thay thế cho cách dùng while bằng if.
- Nhấn giữ ON, OFF  cho 1 kết quả sáng hoặc tắt led (đạt yêu cầu).
- Nhấn giữ INV  đảo trạng thái nhiều lần  thêm chờ nhã phím để
tránh trường chưa kịp nhã phím  chương trình kiểm tra nhiều lần nhấn.
 chống dội cho phím (kiểm tra phím 2 lần + chờ nhã phím)
(Qui trình chống dội trang 94)
• Viết lệnh cho hàm chống dội: THI  ghi vào tờ A4

VOID CD_PHIM()
{
IF(!INPUT(PHIM))
{
DELAY_MS(20); //CHỜ HẾT XUNG DỘI
IF(!INPUT(PHIM)) //KIỂM TRA LẦN 2  CHỐNG NHIỄU
{
//XỬ LÝ CHỨC NĂNG PHÍM
//ĐỌC ĐỀ

//CHỜ NHÃ
WHILE(!INPUT(PHIM));
}
}
}

VD: Nút nhấn UP: tăng biến DEM 1 đơn vị và khi lớn hơn 60 thì cho về 0.

VOID CD_UP()
{
IF(!INPUT(UP))
{
DELAY_MS(20); //CHỜ HẾT XUNG DỘI
IF(!INPUT(UP)) //KIỂM TRA LẦN 2  CHỐNG NHIỄU
{
//XỬ LÝ CHỨC NĂNG PHÍM
//ĐỌC ĐỀ
DEM++;
IF(DEM > 60 ) DEM = 0;
//CHỜ NHÃ

Trang 036
WHILE(!INPUT(UP));
}
}
}

VD: Nút nhấn truyền dữ liệu nối tiếp UART (TRUYEN): khi nhấn truyền giá trị
biến DEM.

VOID CD_TRUYEN()
{
IF(!INPUT(TRUYEN))
{
DELAY_MS(20); //CHỜ HẾT XUNG DỘI
IF(!INPUT(TRUYEN)) //KIỂM TRA LẦN 2  CHỐNG NHIỄU
{
//XỬ LÝ CHỨC NĂNG PHÍM
//ĐỌC ĐỀ
PUTC(DEM);

//CHỜ NHÃ
WHILE(!INPUT(TRUYEN));
}
}
}

* GIẢI THUẬT NÚT NHẤN:


- Nút nhấn có 1 trạng thái  có hoặc không cần chống dội.
VD: ON  8 led sáng : Y = 0xFF;
OFF  8 led tắt: Y = 0;
START  TT_SS = 1; //CHO PHÉP LÀM VIỆC
STOP  TT_SS = 0; //NGỪNG
(THI  THỰC TẾ NÊN CHỐNG DỘI  CHỐNG NHIỄU)
- Nút nhấn có 2 trạng thái  phải chống dội.
VD: START/STOP  TT_SS = ~TT_SS; //01 , 10
// KHAI BÁO BIẾN - INT1 TT_SS;
MODE: chọn chế độ (như tốc độ quạt – SPEED) 0,1,2,3

Trang 037
INT8 CHEDO;

 CHEDO++;
IF(CHEDO == 4) CHEDO = 0;
- Nút nhấn yêu cầu có nhấn thì xử lý, không nhấn thì không thực hiện gì 
xử lý trực tiếp trong hàm con.
VD: Nút nhấn UP, nhấn thì tăng DEM 1 đơn vị, không nhấn thì không
thực hiện gì.
//xử lý chức năng phím (trong hàm con chống dội)
DEM++;
- Nút nhấn yêu cầu nhớ trạng thái (chế độ) khi nhấn  dùng biến trạng thái.
VD: Nút nhấn UP, chọn chế độ đếm lên tự động, sau đó mặc dù không
còn nhấn nhưng số đếm vẫn tăng tự động.
//xử lý chức năng phím (trong hàm con chống dội)
TT_UD = 1; //chọn chế độ đếm lên

//trong hàm chính


WHILE(TRUE)
{
CD_UP();
CD_DW();

IF(TT_UD == 1)
{
DEM++;
IF(DEM > 60) DEM = 0;
}

IF(TT_UD == 0)
{
DEM--;
IF(DEM == -1) DEM = 60; // SIGNED INT8 DEM;
}

GIẢI MÃ (LED 7 ĐOẠN HOẶC LCD)


HIỂN THỊ (LED 7Đ HOẶC LCD)
DELAY (QUAN SÁT)
}

Trang 038
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CHƯƠNG 6

TIMER/COUNTER

I. GIỚI THIỆU:
 Timer là bộ định thời: tạo thời gian chính xác.
 Vào: f  T (s)
 Ra: Số xung đếm được x T = thời gian cụ thể.
Hình 6-1/118
 fTIMER = fTA / 4.
 Counter là bộ đếm xung bên ngoài (đếm sản phẩm, đo
tần số, đo tốc độ động cơ – vòng/s)
Timer/Counter là 1 module phần cứng độc lập được
điều khiển bởi phần mềm, khi có xung đến thì counter tự
động tăng giá trị (không phụ thuộc vào vi điều khiển khi
đang xử lý công việc khác)  tránh trường hợp đếm thiếu
xung (mất xung).
II. CẤU TRÚC: Hình 6-1/118
- Chế độ Timer 0:
T0CS = 0 (timer)
PSA = 1: Xung vào trực tiếp bộ đếm (1:1 – vào:ra)
PSA = 0: Xung đi qua bộ chia trước
VD: 2:1 – vào 2 xung : ra 1 xung
Timer 0 – 8 bit: đếm được 255 xung
 xung ngõ vào = 255 x 2
 Timer đếm được nhiều xung (tạo ra nhiều thời
gian khác nhau) khi dùng bộ chia.

Trang 039
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

 Chế độ Counter 0:
T0CS = 1 (Counter)
T0SE = 0 (chọn xung cạnh lên – để tăng bộ đếm)
PSA = 1 (Xung vào trực tiếp – 1:1)
 Điều khiển các bit trong thanh ghi OPTION_REG (trang 119).
III. CÁC LỆNH HỖ TRỢ CỦA PHẦN MỀM CCS:
1. SETUP_TIMER_X( ): external

SETUP_TIMER_0(T0_EXT_L_TO_H | T0_DIV_1);
T0CS = 1, T0SE = 0 PSA = 1(1:1)
 Thiết lập thông số cho Timer ở chế độ Counter.
2. SET_TIMERX( ):
SET_TIMER0(0);
 Thiết lập giá trị cho Counter/Timer (ban đầu counter =
0 vì chưa có sản phẩm nào)
 Tùy theo Timer 0,2 (giá trị thiết lập là 8 bit <=255),
Timer 1 (16 bit <=65535)
3. GET_TIMERX( ):
 Đọc giá trị của Counter/Timer.

IV. BÀI TẬP MẪU:


 Phần cứng: (T0CKI – Counter 0) – Bài mẫu 6-7/137
 Phần mềm:
 Cấu trúc chương trình C.
 //Khởi tạo Counter (ngoài while(true))
o SETUP_TIMER_0 (T0_EXT_L_TO_H | T0_DIV_1);
o SET_TIMER0(0);
 //Đọc Counter và so sánh (trong while(true))
o T0 = GET_TIMER0();
o IF(T0 >= số đếm cuối) SET_TIMER0(0);

Trang 040
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

Đọc bài mẫu trong sách VXL có ghi chú.


Bài 6-7/137 – Thay đổi nội dung:
 Cạnh xung: L_TO_H H_TO_L
 Tỷ lệ chia: T0_DIV_1
2 / 4 / … 256

Bài tập 6-4/139


 Timer/Counter 0,2 – 8 bit: 0-255
 Timer/Counter 1 – 16 bit: 0 – 65535
// COUNTER DEM LEN
UNSIGNED INT16 KQ_T0;

TAM = GET_TIMER0( );
IF (TAM == 1)
{ SET_TIMER0(0);
KQ_T0 ++;
IF(KQ_T0 == 1000) KQ_T0 = 0;
}

// COUNTER DEM XUONG


UNSIGNED INT16 KQ_T0=999;

TAM = GET_TIMER0( );
IF (TAM == 1)
{ SET_TIMER0(0);
KQ_T0 --;
IF(KQ_T0 == 0) KQ_T0 = 999;
}


* Counter 1:
- Phần cứng: 6-8/139  nối vào T1CKI (T0  T0CKI)
- Phần mềm: T.tự counter 0.
T1 = GET_TIMER1( ); //khởi tạo counter 1
IF(T1 == 100) SET_TIMER1(0); SETUP_TIMER_1(T1_EXTERNAL | T1_DIV_BY_1 );
SET_TIMER1(0);

Trang 041
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

TS_GM( );
HIEN_THI( );

* TIMER:
1. Xác định chu kỳ T của ngõ vào xung của Timer.
T = 1 / ((fTA/4) / Tỷ lệ chia trước)
TRANG 122, H6-7
/4: theo cấu trúc của Timer
Tỷ lệ chia trước: 1,2,4,8 (Timer 1)
VD: fTA = 20 MHz, tỷ lệ chia trước = 8
 T = 1.6 uS
2. Xác định số xung cần đếm = thời gian cần tạo / T
VD: Tạo 1s  1s / 1.6uS = 1.000.000 / 1.6 = 625 000 xung
Ta có: Timer 1 đếm tối đa <= 65.535 xung (16 bit)
 Timer đếm nhiều lần ( 62.500 xung x 10 lần)
3. X.định giá trị bắt đầu của Timer = số tràn – số xung cần đếm
- Số tràn = số đếm lớn nhất + 1 = 65535 + 1 = 65.536
- Timer bắt đầu = 65.536 – 62.500 = 3036
4. Kiểm tra cờ tràn để xác định Timer đếm xong 1 chu kỳ.
- Định nghĩa cờ tràn: #bit TMR1IF = 0x0C.0
(Trang 131) vùng nhớ bank thanh
ghi - trang 30
- Kiểm tra cờ tràn:
IF(TMR1IF == 1) //Timer tràn
{
TMR1IF = 0; //XÓA CỜ TRÀN
SET_TIMER1(3036); //THIẾT LẬP LẠI GIÁ TRỊ CHO CHU KỲ MỚI
BDT++; //QUẢN LÝ SỐ LẦN TIMER ĐẾM
}

IF(BDT >= 10)


{ BDT = 0;

Trang 042
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

//XỬ LÝ KHI ĐỦ THỜI GIAN, VD: 1s


DEM++;

BT: TƯƠNG TỰ BÀI 6-3/132


THỜI GIAN SÁNG 1S, TẮT 2S

GỢI Ý:
IF(BDT < 10) LED SÁNG; //1s
IF(BDT > 10) LED TẮT; //2s
IF(BDT >= 30) BDT = 0;
 TÍNH TỔNG TG CỦA 1 CHU KỲ ĐIỀU KHIỂN.
 SO SÁNH TỪNG KHOẢNG THỜI GIAN.

BÀI TẬP: TẠO TẦN SỐ NGÕ RA


VD: 1kHz  T = 1 ms  TH = 0.5ms , TL = 0.5ms
 Dùng Timer tạo ra thời gian trên
 Số xung cần đếm: 0.5ms/1.6us = 312.5  313

TL
TH

T = 1 ms 100%
TH (duty cycle) = 70 %
--> 0,7 ms = 700 uS
TL = 1 - 0,7 ms = 0,3 ms = 300 uS

--> Cho Timer đếm 1 lần 0,1ms --> 7 lần (0,7ms) + 3 lần (0,3ms) = 10 lần (1ms)

tính (tr. 42)

tính (trang 42)

Trang 043
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CHƯƠNG 7 – ADC

I. GIỚI THIỆU: (Ch.1 – tập)


Analog  Digital
Analog (V, I, R): thường là quy về V.
Môi trường xung quanh, thế giới thực  cảm
biến (sensor)  V (điện áp).
VD: Cảm biến nhiệt độ LM35 (10mV/1oC)

II. CẤU TRÚC: (Hình 7-1/146)


- Vào: 14 kênh tương tự (AN0 – AN13) – được
chọn thông qua 4 bit CHS3-CHS0.
- Ra: giá trị số 10 bit = 210 = 1024 = 0-1023
o 2 thanh ghi 8 bit = 16 bit để lưu 10 bit
o Canh trái hoặc canh phải kết quả c.đổi.
- Điều khiển:
o GO/DONE\: Cho phép chuyển đổi và chờ
chuyển đổi xong.
o ADON: Cấp nguồn cho ADC
o VREF(+), VREF(-) : Điện áp tham chiếu (quyết
định mối quan hệ vào/ra)
o Chọn tần số lấy mẫu.
CT:

8 bit
10 bit = 2^10 = 1024
Trang 044
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

N: Ngõ ra số
Vin: điện áp tương tự ngõ vào
256: 28 (ADC 8 bit)
VREF(+): chọn 5V (VDD)
VREF(-): chọn 0V (VSS)
N = 1 đơn vị
 VIN = (5V*1)/256 = 19.6 mV

ADC 10 bit: VIN = (5V*1)/1023 = 4.887 mV


Xem thêm công thức trang 152.

5V/1023 = 4.887mV

SS: Step size (độ phân giải)  VIN


(Giá trị điện áp tương tự ngõ vào ứng với ngõ ra thay
đổi 1 đơn vị)
4.887 mV  ADC  1 đơn vị
10 mV ? 2.046 đv
1oC (LM35)

1oC  2.046 đơn vị


?  100 đơn vị (kết quả đọc ADC)
 Nhiệt độ đo = Kết quả ADC / 2.046
Tỷ lệ chênh lệch
Trang 045
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

III. CÁC LỆNH HỖ TRỢ CỦA CCS: Tr. 150


1. SETUP_ADC(ADC_CLOCK_DIV_32);
 Chọn tần số lấy mẫu FOSC/32 (trang 149).
2. SETUP_ADC_PORTS (sAN0 | sAN1 | VSS_VDD);
 Thiết lập ngõ vào tương tự và Vref
tr. 72
3. HÀM ĐỌC ADC:
VOID DOC_ADC_KENH() 0-13
{
SET_ADC_CHANNEL(KENH); //KENH = 0,1
phải có, chờ VĐK xử lý chọn kênh
DELAY_MS(1);
KQ_ADC_KENH = 0; đọc đề
FOR(I=0; I<200; I++)
{
KQ_ADC_KENH = KQ_ADC_KENH + READ_ADC();
// KẾT QUẢ TRƯỚC ĐÓ + KQ MỚI ĐỌC
có thể bỏ, read_adc() đã có bước
DELAY_MS(1);
chờ và đọc, delay để tăng thời gian
} đọc (thời gian cập nhật)

KQ_ADC_KENH = KQ_ADC_KENH / 200 / 2.046;


// CHIA 200 LẤY TRUNG BÌNH
// CHIA CHO TỶ LỆ CHÊNH LỆCH
}

Trang 046
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

IV. BÀI TẬP MẪU: 7-1/151


1. Phần cứng:
2. Phần mềm:
o Cấu trúc CT C.
o Khai báo ADC 10 bit:
 #DEVICE ADC=10
 ĐẶT SAU DÒNG #INCLUDE<16F887.H>
o //KHỞI TẠO ADC
 SETUP_ADC…
 SETUP_ADC_PORT…
o HÀM ĐỌC ADC

Trang 047
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CHƯƠNG 8
NGẮT

I. GIỚI THIỆU: - SÁCH Hình 8-1/160


Ngắt là 1 sự kiện xảy ra không định
trước, khi xảy ra ngắt thì CT chính sẽ
dừng mọi việc lại để ưu tiên xử lý ngắt,
sau khi xử lý xong thì quay lại CT chính
tiếp tục.
Khi xử lý ngắt ta lưu ý thời gian tránh
xóa cờ tràn, tự động
ảnh hưởng đến CT chính.
- Ngắt Timer: xảy ra khi Timer tràn.
- Ngắt UART nhận: xảy ra khi có dữ liệu
gửi tới đủ 8 bit.
- Ngắt ADC: sau khi chuyển đổi xong.
II. CẤU TRÚC: - SÁCH - Hình 8-2/161
III. CÁC LỆNH HỖ TRỢ CỦA CCS:
IV. BT MẪU:
1. PHẦN CỨNG:
2. PHẦN MỀM:

Trang 048
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

III. CÁC LỆNH HỖ TRỢ CỦA CCS: (tờ A4)


1. ENABLE_INTERRUPTS(…)
- GLOBAL: NGẮT TOÀN CỤC
- INT_TIMER1: NGẮT TIMER 1
- INT_AD: NGẮT ADC
- INT_RDA: UART NHẬN
2. DISABLE_INTERRUPTS()

UART khởi tạo ở trên


2 bước đầu chương trình
//khởi tạo ngắt
#USE RS232 ...
//khởi tạo các module Timer, ADC, …
//cho phép ngắt
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
 XỬ LÝ NGẮT: //VIẾT HÀM NGẮT
#INT_NGẮT
//CỐ ĐỊNH – THEO THƯ VIỆN
VOID TÊN_HÀM() //TÙY Ý
{ - XẢY RA NGẮT KHI NÀO ? NGẮT NHẬN DỮ LIỆU
VD: CÓ DỮ LIỆU

- ĐỌC ĐỀ --> CÓ DỮ LIỆU THÌ SAO ?


NHẬN --> SO SÁNH.... XỬ LÝ
}

Trang 049
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

10-4/214,
IV. BT MẪU: 8-2/168

BÀI TẬP 10-1/216 - UART


1. Phần cứng:
2. Phần mềm: Cấu trúc CT C
Viết lại bài mẫu 10-1, 10-3

Trang 050
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CHƯƠNG 9
PWM

I. GIỚI THIỆU: - SÁCH – CH.1 –


TẬP TIMER 2, TR. 126
Hình 9-2/179
II. CẤU TRÚC: - SÁCH - Hình 9-3/180
III. CÁC LỆNH HỖ TRỢ CỦA CCS:
IV. BT MẪU:
1. PHẦN CỨNG:
2. PHẦN MỀM:

III. CÁC LỆNH HỖ TRỢ CỦA CCS:


1. SETUP_CCP1(CCP_PWM);
Chọn chế độ PWM.
P. Cứng: CCP1 – RC2
CCP2 – RC1

Trang 051
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

2. SETUP_TIMER_2(T2_DIV_
BY_16, 249, 1);
Thiết lập chu kỳ T của ngõ
ra xung (tần số ngõ ra f) –
period. Trang 181 – Hình
9-5
 Lệnh 1,2  //khởi tạo PWM

3. SET_PWM1_DUTY(Value);
Thiết lập độ rộng xung (Duty
Cycle)
Chuyển thông số dạng % 
giá trị số
VD:
100% độ rộng  1000
50%  ? (500)
SET_PWM1_DUTY((INT16) VALUE);
ÉP KIỂU DỮ LIỆU
--> SET_PWM1_DUTY((INT16) 200); // LUÔN ĐỦ 10BIT

**************************
INT16 DORONG;

DORONG = 200;
SET_PWM1_DUTY(DORONG);
Trang 052
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

Công thức tính toán thông số cho


PWM: trang 187 + 188.
Công thức 1: đọc đề

FOSC: tần số dao động của thạch anh

Công thức 2:

PERIODPWM: chu kỳ T – cho F  T


TOSC: C.thức 1
PVTMR2: chọn 16 – tỷ lệ chia trước Timer 2
 Tính PR2
 Đưa vào lệnh số 2 (SETUP_TIMER_2)

Trang 053
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

Công thức 3:
Duty_Cycle = PeriodPWM_MAX
(100% độ rộng xung)

=
PeriodPWM : đề cho
TOSC: C.thức 1
PVTMR2: chọn 16
 100% độ rộng xung  1000
 50%  ? (500)
 Đưa vào lệnh số 3.

IV. BT MẪU:
Bài 9-1/187
1. Phần cứng: CCP1
2. Phần mềm: Cấu trúc CT C

Trang 054
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

Bài 9-3/192
1. Phần cứng:
ENA – PIN_C0
CCP1
CCP2
IC L298 – KHỐI CÔNG SUẤT
BẢNG 9-2
- 3 CÁCH DỪNG
- CẤP ĐIỆN ĐỂ ĐK Đ.CƠ
(2 DÂY)  ĐẢO CHIỀU
CẤP NGUỒN  QUAY
NGƯỢC LẠI.
VẼ VÀO TỜ A4 – NGUYÊN LÝ
2. Phần mềm:
- Cấu trúc CT C

Trang 055
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

BÀI TẬP ĐẢO CHIỀU

9-2/195
SET_PWM1_DUTY(VALUE);
SET_PWM2_DUTY(0);

(DÙNG 2 KHỐI PWM)


 KHỞI TẠO THÊM
SETUP_CCP2(CCP_PWM);

SET_PWM1_DUTY(0);
SET_PWM2_DUTY(VALUE);
NÚT DAO_CHIEU

HÀM KT_DC

IF(TT_DC == 1)
{
THUẬN
}
ELSE
{
NGHỊCH
}
Trang 056
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

CHƯƠNG 10
TRUYỀN DỮ LIỆU NỐI TIẾP

I. GIỚI THIỆU:
II. CẤU TRÚC:
III. CÁC LỆNH HỖ TRỢ CỦA CCS:
IV. BT MẪU:
1. PHẦN CỨNG:
2. PHẦN MỀM:
Tr. 198

I. GIỚI THIỆU: UART

- ĐỒNG BỘ: XUNG CK – SPI.


- BẤT ĐỒNG BỘ:
o BIT START – NHẬN DỮ LIỆU
o BIT STOP – K.THÚC NHẬN
o GIAO THỨC: UART
 RS232: <15m
10-12, TR.208
 RS485: <1500m
UART PROTOCOL
 TỐC ĐỘ TRUYỀN = NHẬN
RS232
 9600 BAUD
 BPS – BIT PER SECOND
 4800, 2400,1200…

Trang 057
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

II. CẤU TRÚC:


HÌNH 10-3/200
III. CÁC LỆNH HỖ TRỢ CCS: (TỜ A4)
1. KHỞI TẠO UART
#USE RS232(BAUD = 9600, XMIT =
PIN_C6, RCV = PIN_C7)
4800 UART CỨNG
2400

2. NHẬN DỮ LIỆU:
IF(KBHIT())
{
DL_NHAN = GETCH();
//XỬ LÝ DỮ LIỆU SAU KHI NHẬN
//NẾU CẦN
IF(DL_NHAN == 1) TT_SS = 1;
IF(DL_NHAN == 0) TT_SS = 0;
//IF(TT_SS == 1)
}
HOẶC XỬ LÝ DL NHẬN BÊN NGOÀI
(các biến trạng thái – VD: TT_SS = 1)
IF(TT_SS == 1)

Trang 058
Bài giảng tóm tắt Vi xử lý – Trương Ngọc Anh – UTE – ver 1 - 2016

3. TRUYỀN DỮ LIỆU:
PUTC(VALUE);
0,1
0X30
‘A’
(8 BIT)

IV. BT MẪU:
BÀI 10-1/208
1. PHẦN CỨNG: VẼ VÀO TỜ A4

BÀI TẬP MẪU (LMS)


BÀI 9-3
VDK-VDK-UART

Trang 059
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT ĐỀ THI CUỐI KỲ HỌC KỲ 1 - NĂM HỌC 2016-2017
THÀNH PHỐ HỒ CHÍ MINH Môn: VI XỬ LÝ
KHOA ĐIỆN-ĐIỆN TỬ Mã môn học: MICR330363
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP Đề số/Mã đề: 01 Đề thi có: 02 trang
------------------------- Thời gian: 90 phút.
Sinh viên chỉ được tham khảo một tờ giấy A4 viết tay

Câu 1: (3 điểm)
Cho hệ thống điều khiển động cơ DC 2 cấp tốc độ dùng vi điều khiển PIC16F887 và
IC L298, động cơ dùng nguồn 12VDC, dòng 2A, có 3 nút nhấn CD_1, CD_2, CD_3. Vi điều
khiển sử dụng tần số dao động 8 Mhz.
a. Vẽ sơ đồ nguyên lý kết nối (1 điểm)
b. Viết chương trình thực hiện các yêu cầu sau: (2 điểm)
Dùng PWM của PIC để điều khiển thay đổi tốc độ động cơ DC, 3 nút nhấn tương ứng
với 3 cấp độ 0%, 50%, 100%. Chu kỳ tín hiệu PWM là 1ms.

Câu 2: (3.5 điểm)


Cho hệ thống đo nhiệt độ gồm: vi điều khiển PIC16F887 kết nối 1 cảm biến nhiệt độ
LM35 (giá trị ngõ ra 10mV/1oC, 0-150oC) tương ứng kênh 4 (AN4), LCD 16x2, 1 nút nhấn
C_DOI nối với RC0, 1 loa DC kết nối với RC1 (mức 1 loa kêu, mức 0 loa tắt). Tần số dao
động cho vi điều khiển tùy chọn.
Hãy viết chương trình thực hiện tất cả các yêu cầu sau:
- Hiển thị của LCD như sau (1.5 điểm):
Hàng 1: N.Do = XX do C
Hàng 2: GT cai = YY do C
Trong đó XX là giá trị nhiệt độ đo, YY là giá trị cài đặt. Nội dung “XX
do C” va “YY do C” hiển thị cuối hàng 1 và 2. Mặc định giá trị cài YY = 45.
- Khi nhấn nút C_DOI thì sẽ chuyển giá trị độ C sang độ K, màn hình LCD như
bên dưới và hiển thị ngược lại khi nhấn tiếp tục: (1 điểm)
Hàng 1: N.Do = ZZZ do K
Hàng 2: GT cai = QQQ do K
Biết giá trị độ K = giá trị độ C + 273. ZZZ và QQQ là giá trị độ K.
- Khi giá trị nhiệt độ đo (độ C hoặc độ K) lớn hơn hoặc bằng giá trị nhiệt độ cài
đặt thì chỉ nhấp nháy giá trị XX (hoặc ZZZ nếu đo theo độ K) theo chu kỳ 0,5s sáng
và 0,5s tắt; đồng thời điều khiển loa kêu và ngược lại giá trị nhiệt độ nhỏ hơn giá trị
cài thì hiển thị bình thường và loa tắt. (1 điểm)

Số hiệu: BM1/QT-PĐBCL-RĐTV Trang: 1/2


Trang 060
Câu 3: (3.5 điểm)
Cho hệ thống gồm hai vi điều khiển PIC16F887 được ký hiệu là VĐK_TTAM và
VĐK_TRAM, giao tiếp theo chuẩn truyền dữ liệu nối tiếp bất đồng bộ UART, tốc độ baud =
4800. Tần số dao động cho vi điều khiển tùy chọn.
- VĐK_TTAM kết nối với 1 nút nhấn MODE.
- VĐK_TRAM kết nối với 8 led đơn.
a. Viết chương trình cho VDK_TTAM (1 điểm) gồm:
- Mặc định ban đầu chọn chế độ 1.
- Khi nhấn nút MODE thì sẽ chọn chế độ:
Chế độ 1: không gửi mã điều khiển.
Chế độ 2: gửi tuần tự mã điều khiển (từ 0-3) để điều khiển 3 led đơn của
VĐK_TRAM với thời gian trì hoãn mỗi lần gửi là 2s, khi lớn hơn 3 thì quay về 0.
Chế độ 3: gửi mã điều khiển là ký tự “T” (mã hex là 0x54) cho
VĐK_TRAM.
b. Vẽ lưu đồ (1 điểm) và viết chương trình cho VĐK_TRAM dùng ngắt để nhận
dữ liệu (1.5 điểm)
- Mặc định ban đầu 4 led giữa 8 led đơn sáng 2s rồi tắt hết.
- Khi nhận được mã điều khiển là 0 thì 8 led tắt, mã điều khiển là 1 thì led thứ
1 (led ở vị trí bit thấp nhất) sáng, mã điều khiển là 2 thì led thứ 2 sáng, mã điều khiển
là 3 thì led thứ 3 sáng, lưu ý tại mỗi thời điểm chỉ có 1 led sáng các led còn lại tắt.
- Khi nhận được mã điều khiển “T”, thì chớp tắt led đơn liên tục với chu kỳ 1s
sáng, 1s tắt.

Ghi chú: Cán bộ coi thi không được giải thích đề thi.

Chuẩn đầu ra của học phần (về kiến thức) Nội dung kiểm tra
[G 4.1]: Hiểu và ứng dụng được hệ thống vi điều khiển vào thực tế. Câu 1
[G 1.3]: Thiết kế và lập trình điều khiển dùng ngôn ngữ C cho các hệ thống Câu 2
điều khiển.
[G 2.3]: Có kỹ năng thiết kế và xây dựng qui trình điều khiển cho hệ thống Câu 3
dùng vi điều khiển PIC 16F887.

Ngày tháng năm 20


Thông qua bộ môn

Số hiệu: BM1/QT-PĐBCL-RĐTV Trang: 2/2


Trang 061
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT ĐÁP ÁN CUỐI KỲ HỌC KỲ 1 - NĂM HỌC 2016-2017
THÀNH PHỐ HỒ CHÍ MINH Môn: VI XỬ LÝ
KHOA ĐIỆN-ĐIỆN TỬ Mã môn học: MICR330363
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP Đề số/Mã đề: 01 Đề thi có: 02 trang
------------------------- Thời gian: 90 phút.
Sinh viên chỉ được tham khảo một tờ giấy A4 viết tay

Câu 1: (3 điểm)
//KHAI BAO THU VIEN VOID KT_PHIM_100()
#INCLUDE <TV_16F887.C> {
IF(INPUT(PHIM_100) == 0)
//DINH NGHIA - NUT NHAN {
#DEFINE PHIM_0 PIN_E0 SET_PWM1_DUTY((INT16)500);
#DEFINE PHIM_50 PIN_E1 }
#DEFINE PHIM_100 PIN_E2 }

//KHAI BAO BIEN //VIET HAM CHINH


VOID MAIN()
//VIET HAM CON {
VOID KT_PHIM_0() //KHOI TAO BAN DAU
{ SET_TRIS_E(0X07);
IF(INPUT(PHIM_0) == 0) //KHOI TAO PWM
{ SETUP_CCP1(CCP_PWM);
SET_PWM1_DUTY(0);
} SETUP_TIMER_2(T2_DIV_BY_16,124
} ,1);
VOID KT_PHIM_50() SET_PWM1_DUTY(0);
{
IF(INPUT(PHIM_50) == 0) WHILE(TRUE)
{ {
SET_PWM1_DUTY((INT16)250); KT_PHIM_0();
} KT_PHIM_50();
} KT_PHIM_100();
}
}

Trang 062 Trang: 1/2


Câu 2: (3.5 điểm)
// KHAI BAO THU VIEN VOID HT_K4()
#INCLUDE <TV_16F887.C> {
#INCLUDE <TV_LCD.C> LCD_COMMAND(0X80);
#DEFINE C_DOI PIN_C0 LCD_DATA("N.Do =");
LCD_COMMAND(0X80+8);
// KHAI BAO BIEN LCD_DATA(TR_K4);
UNSIGNED INT16 ND_K4,GT_CAI; LCD_DATA(CH_K4);
UNSIGNED INT8 DV_K4, CH_K4, TR_K4, LCD_DATA(DV_K4);
DV_GT_CAI, CH_GT_CAI, TR_GT_CAI;
IF(TT_CDOI == 0) LCD_DATA(" do C");
UNSIGNED INT8 I;
ELSE LCD_DATA(" do K");
INT1 TT_CDOI,TT_NN;

LCD_COMMAND(0XC0);
// VIET HAM CON
LCD_DATA("GT cai =");
VOID KT_CDOI()
LCD_COMMAND(0XC0+8);
{
LCD_DATA(TR_GT_CAI);
IF(INPUT(C_DOI) == 0)
LCD_DATA(CH_GT_CAI);
{
LCD_DATA(DV_GT_CAI);
DELAY_MS(20);
IF(TT_CDOI == 0) LCD_DATA(" do C");
IF(INPUT(C_DOI) == 0)
ELSE LCD_DATA(" do K");
{
}
TT_CDOI = ~TT_CDOI;
}
VOID DO_K4()
WHILE(INPUT(C_DOI) == 0);
{
}
SET_ADC_CHANNEL(4);
}
DELAY_MS(1);
ND_K4 = 0;
VOID GM_K4()
FOR(I=0; I<100; I++)
{
{
DV_K4 = ND_K4%10 + 0X30;
ND_K4 = ND_K4 + READ_ADC();
CH_K4 = ND_K4/10%10 + 0X30;
DELAY_MS(1);
TR_K4 = ND_K4/100 + 0X30;
}
ND_K4 = ND_K4/100/2.046;
DV_GT_CAI = GT_CAI%10 + 0X30;
}
CH_GT_CAI = GT_CAI/10%10 + 0X30;
TR_GT_CAI = GT_CAI/100 + 0X30;
}

Trang 063 Trang: 2/2


S// VIET HAM CHINH GT_CAI = 45 + 273;
VOID MAIN() }
{ ELSE
//KHOI TAO BAN DAU GT_CAI = 45;
SET_TRIS_D(0X00);
SET_TRIS_E(0X00); GM_K4();
SET_TRIS_C(0X01); IF(TT_NN==1)
{
//KHOI TAO LCD LCD_COMMAND(0X80+8);
LCD_SETUP(); LCD_DATA(" ");
LCD_COMMAND(0XC0+8);
//KHOI TAO ADC LCD_DATA(" ");
SETUP_ADC(ADC_CLOCK_DIV_32); DELAY_MS(500);
SETUP_ADC_PORTS(SAN4 | VSS_VDD); HT_K4();
DELAY_MS(500);
TT_CDOI = 0; }
// VONG LAP TUAN HOAN ELSE HT_K4();
WHILE(TRUE)
{ IF(ND_K4 > GT_CAI)
KT_CDOI(); { TT_NN = 1; OUTPUT_HIGH(PIN_C1); }
//DO NHIET DO - K4 ELSE
DO_K4(); { TT_NN = 0; OUTPUT_LOW(PIN_C1); }
IF(TT_CDOI == 1) }
{ }
ND_K4 = ND_K4 + 273;

Trang 064 Trang: 3/2


Câu 3: (3.5 điểm)
 VĐK_TTAM:
//KHAI BAO THU VIEN VOID MAIN()
#INCLUDE <TV_16F887.C> {
#DEFINE MODE PIN_E0 //KHOI TAO BAN DAU
//KHAI BAO UART SET_TRIS_E(0XFF);
#USE RS232(BAUD = 4800, XMIT=PIN_C6, TT_MODE = 1;
RCV=PIN_C7) //VONG LAP TUAN HOAN
//KHAI BAO BIEN WHILE(TRUE)
UNSIGNED INT8 I,J,TT_MODE; {
//VIET HAM CON KT_MODE();
VOID KT_MODE() IF(TT_MODE == 2)
{ {
IF(INPUT(MODE) == 0) FOR(I=0;I<4;I++)
{ {
DELAY_MS(20); PUTC(I);
IF(INPUT(MODE) == 0) FOR(J=0; J<20; J++) //DELAY CO KT PHIM
{ {
TT_MODE++; KT_MODE(); DELAY_MS(100);
IF(TT_MODE == 4) TT_MODE = 1; }
WHILE(INPUT(MODE) == 0); }
} }
} IF(TT_MODE == 3) { PUTC('T'); }
} }
//VIET HAM CHINH }
 VĐK_TRAM:
//KHAI BAO THU VIEN VOID MAIN()
#INCLUDE <TV_16F887.C> {
//KHAI BAO UART //KHOI TAO BAN DAU
#USE RS232(BAUD = 4800, XMIT=PIN_C6, SET_TRIS_D(0X00);
RCV=PIN_C7) SET_TRIS_B(0X00);
//KHAI BAO BIEN OUTPUT_D(0X3C);
UNSIGNED INT8 DL_NHAN, TT_NN; DELAY_MS(2000);
//VIET HAM NGAT OUTPUT_D(0X00);
#INT_RDA ENABLE_INTERRUPTS(GLOBAL);
VOID NGAT_UART() ENABLE_INTERRUPTS(INT_RDA);
{ //VONG LAP TUAN HOAN
DL_NHAN = GETCH(); WHILE(TRUE)
IF(DL_NHAN == 0) OUTPUT_D(0X00); {
IF(DL_NHAN == 1) OUTPUT_D(0X01); IF(TT_NN == 1)
IF(DL_NHAN == 2) OUTPUT_D(0X02); {
IF(DL_NHAN == 3) OUTPUT_D(0X04); OUTPUT_D(0X00);
IF(DL_NHAN == 'T') TT_NN = 1; DELAY_MS(1000);
ELSE TT_NN = 0; OUTPUT_D(0XFF);
} DELAY_MS(1000);
//VIET HAM CON }
}
//VIET HAM CHINH }

Trang 065 Trang: 4/2

Вам также может понравиться