You are on page 1of 167

Đại Học Công Nghiệp Thành Phố Hồ Chí Minh

**********************

Bài Giảng
Kỹ Thuật Vi Xử Lý

Bộ môn: Điện Tử Máy Tính


GV: Vũ Thị Hồng Nga
Mail: hongngavuh@yahoo.com
 Giới thiệu chung về môn học:
- Số tiết lý thuyết: 30
- Cách tính điểm: TK: 20% ; GK: 30%; CK: 50%
- Hình thức thi: tự luận/tiểu luận
 SV chuẩn bị các phần mềm sau:
- phần mềm viết code: MPLAB
- Phần mềm mô phỏng: PROTEUS
- Các file mô phỏng mẫu trên elearning
 Yêu cầu:
- SV đăng nhập elearning để lấy tài liệu môn học
- Nộp bài tập lớn qua elearning theo đúng thời gian qui định
- Từ buổi học thứ 3 các nhóm chuẩn bị laptop để làm bài tập

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


Ôn lại kiến thức kỹ thuật số

- Số nhị phân
- Số thập phân
- Số HEX
- Cách chuyển đổi số nhị phân sang HEX và ngược lại

- Mã nhị phân
- Mã BCD
- Mã led bảy đoạn

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


Ôn lại kiến thức kỹ thuật số
1. Các hệ thống số đếm
1.1. Số thập phân (Decimal Numbers)
 Cơ số = 10
 Ký tự = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
 Trọng số = (cơ số) vị trí

Biểu diễn của một số thập phân có dạng sau:

2016.0510 = (2 x 103)+(0 x 102)+(1 x 101)+(6 x 100) + (0 x 10-1)+(5 x 10-2)


Ôn lại kiến thức kỹ thuật số

1.3. Số nhị phân (Binary Numbers)


 Cơ số = 2
 Ký tự = { 0, 1}
 Trọng số = (cơ số) vị trí

Ví dụ: Tìm giá trị thập phân của số nhị phân 10110.012

10110.012= (1 x 24)+(0 x 23)+(1 x 22) +(1 x 21)+(0 x 20)+(0 x 2-1)+(1 x 2-2)

= 16 + 0 + 4 + 2 + 0 + 0 + 0.25 = 22.25
Ôn lại kiến thức kỹ thuật số

1.2. Số thập lục phân (Hexadecimal Numbers)


 Cơ số = 16
 Ký tự = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F }
 Trọng số = (cơ số) vị trí

Ví dụ: Tìm giá trị thập phân của số thập lục phân 2AB16
2AB 16 = (2 x 162)+(10 x 161)+(11 x 160)
= 512 + 160 + 11 = 683
2. Đổi số từ hệ thập lục phân sang nhị phân và ngược lại
2.1 chuyển từ thập lục phân sang nhị phân
Thay mỗi chữ số trong hệ thập lục phân bằng 4 bit nhị phân
tương ứng.
2.2 chuyển từ nhị phân sang thập lục phân
Từ dấu phẩy thập phân ta gom lần lượt các nhóm 4 bit về
hai phía. Thay thế giá trị của mỗi nhóm 4 bit này bằng 1 số
thập lục phân tương ứng.
(nếu nhóm đầu và cuối không đủ 4 bit thì ta thêm 0 vào cho
đủ 4 bit mà không làm thay đổi giá trị của số đã cho).
Vi dụ: Từ nhị phân sang thập lục phân:

0 01 1 1 0 1 1 0 1 0 1 1 1 0 1 , 0 1 1 0 1 0 1 0
3 B 5 D , 6 A H

Ví dụ: Từ thập lục phân sang nhị phân:

2 C 9 , E 8

0 0 1 0 1 1 0 0 1 0 0 1 , 1 1 1 0 1 0 0 0 (B)

8
Các loại mã thường gặp trong kỹ thuật số
Mã led bảy đoạn anode chung
Mã led bảy đoạn cathode chung
CHƯƠNG 1
GIỚI THIỆU CHUNG

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


1. Tổng quan về hệ vi xử lý
a. Vi xử lý - microprocessor
- Vi xử lý còn được gọi là bộ vi xử lý, là một linh kiện điện tử máy
tính được chế tạo từ các transistor thu nhỏ tích hợp lên trên một vi
mạch đơn
- Vi xử lý có các khối chức năng cần thiết để lấy dữ liệu, xử lý dữ
liệu và xuất dữ liệu ra ngoài sau khi đã xử lý. Và chức năng chính
của Vi xử lý chính là xử lý dữ liệu, chẳng hạn như cộng, trừ, nhân,
chia, so sánh...
- Vi xử lý không có khả năng giao tiếp trực tiếp với các thiết bị ngoại
vi, nó chỉ có khả năng nhận và xử lý dữ liệu. Thường dùng trong các
ứng dụng lớn, tính toán phức tạp.
- Vì một số nhược điểm trên nên các nhà chế tạo tích hợp một ít bộ
nhớ và một số mạch giao tiếp ngoại vi cùng với vi xử lý vào một IC
duy nhất được gọi là Vi điều khiển - Microcontroller
VD: Bộ vi xử lý Intel 80486DX2
b. Vi điều Khiển - microcontroller
- Vi điều khiển là một hệ thống bao gồm một bộ vi xử lý có hiệu suất
vừa và nhỏ kết hợp với các khối ngoại vi như bộ nhớ, các module
vào/ra, các module biến đổi số sang tương tự và tương tự sang số,...
- Vi điều khiển có giá thành rẻ hơn nhiều so với vi xử lý, dễ sử dụng,
do đó nó được sử dụng rộng rãi vào nhiều ứng dụng có chức năng
đơn giản, không đòi hỏi tính toán phức tạp.
- Vi điều khiển được xây dựng với phần cứng dành cho người sử
dụng đơn giản hơn, nhưng tốc độ xử lý chậm hơn và khả năng tính
toán ít hơn, dung lượng chương trình bị giới hạn
- Vi điều khiển thường được dùng trong các hệ thống nhúng, các thiết
bị điện, điện tử, máy giặt, lò vi sóng, điện thoại, đầu đọc DVD, thiết
bị đa phương tiện, dây chuyền tự động,...
1. Tổng quan về hệ vi xử lý
1. Tổng quan về hệ vi xử lý

Read Only Memory


1. Tổng quan về hệ vi xử lý

Random Access Memory


1. Tổng quan về hệ vi xử lý

Mạch điện giao tiếp


1. Tổng quan về hệ vi xử lý

Thiết bị ngoại vi (xuất/nhập)


1. Tổng quan về hệ vi xử lý

Bus địa chỉ


1. Tổng quan về hệ vi xử lý

Bus dữ liệu
1. Tổng quan về hệ vi xử lý

Bus điều khiển


2.CPU - Central Processing Unit
- CPU đóng vai trò chủ đạo trong hệ vi xử lý. Nó quản lý
tất cả các hoạt động của hệ và thực hiện các thao tác trên
dữ liệu.
- CPU đọc mã lệnh được ghi dưới dạng các bit 0 và bit 1 từ
bộ nhớ sau đó nó sẽ giải mã các lệnh này thành dãy các
xung điều khiển tương ứng với các thao tác trong lệnh để
điều khiển các khối khác thực hiện từng bước các thao tác
đó, từ đó tạo các xung điều khiển cho toàn hệ thống
Sơ đồ khối đơn giản của 1 CPU
 IR: thanh ghi
lệnh/con trỏ lệnh
 PC: bộ đếm
chương trình
 Instruction decode
and control unit:
đơn vị giải mã lệnh
và điều khiển
 ALU: đơn vị số
học và logic
 Registers: các
thanh ghi
Hoạt động CPU cho chu kỳ tìm nạp lệnh:
Thao tác tìm nạp lệnh:
• Nội dung của thanh ghi
PC đưa lên bus địa chỉ.
• Tín hiệu điều khiển
đọc(Read) chuyển sang
trạng thái tích cực.
• Mã lệnh (Opcode) từ
bộ nhớ được đưa lên
bus dữ liệu
• Mã lệnh được chuyển
vào thanh ghi IR trong
CPU
• PC được tăng lên để
chuẩn bị tìm nạp lệnh
kế từ bộ nhớ.
Hoạt động CPU cho thao
tác giải mã thực hiện lệnh:
 Mã lệnh từ thanh ghi IR
được đưa vào đơn vị giải mã
lệnh và điều khiển.
 Đơn vị giải mã lệnh và điều
khiển sẽ thực hiện giải mã
opcode và tạo ra các tín hiệu
để điều khiển việc xuất nhập
dữ liệu giữa ALU và các
thanh ghi (registers).
 Căn cứ trên các tín hiệu điều
khiển này, ALU thực hiện các
thao tác đã được xác định.
3. Bộ nhớ bán dẫn trong Hệ Vi Xử Lý
Bộ nhớ chỉ đọc (ROM)
• Chỉ cho phép đọc thông tin ra từ ROM.
• Lưu giữ chương trình điều khiển hoạt động của hệ thống.
• Thông tin trong ROM không bị mất ngay cả khi nguồn điện
cung cấp không còn.
Bộ nhớ truy xuất ngẫu nhiên (RAM)
• Thông tin trong RAM sẽ bị mất ngay khi nguồn điện cung
cấp không còn.
• Cho phép ghi thông tin vào RAM và đọc thông tin ra từ
RAM.
• Lưu giữ dữ liệu, một phần chương trình điều khiển hệ
thống, các ứng dụng và kết quả tính toán.
Cấu trúc và phân loại ROM – RAM

A0 – AN: các chân địa chỉ (Address - N: số chân địa chỉ).
D0 – DM: các chân dữ liệu (Data - M: số chân dữ liệu).
OE: ngõ ra cho phép xuất (Output Enable).
CS: ngõ vào cho phép IC hoạt động (Chip Select).
WR: ngõ vào cho phép ghi (Write) – chỉ có ở RAM
Phân loại ROM
 MROM (Mask ROM): ROM mặt nạ.
 PROM (Programmable ROM): ROM lập trình được.
 EPROM (Eraseable PROM): ROM lập trình và xóa được.
 UV-EPROM (Ultra Violet EPROM): ROM xóa bằng tia
cực tím.
 EEPROM (Electric EPROM): ROM lập trình và xóa
bằng tín hiệu điện.
 Flash ROM: ROM lập trình và xóa bằng tín hiệu điện.
Phân loại RAM
 SRAM (Static RAM- RAM tĩnh) : là một loại bộ nhớ sử dụng
công nghệ bán dẫn. Từ "tĩnh" nghĩa là bộ nhớ vẫn lưu dữ liệu nếu
có điện

 DRAM (Dynamic RAM-RAM động): là loại bộ nhớ truy cập ngẫu


nhiên lưu mỗi bit dữ liệu trong một tụ điện riêng biệt trên một mạch
tích hợp. Vì các tụ điện bị rò điện tích nên thông tin sẽ bị mất dần
trừ khi dữ liệu được nạp lại đều đặn
Dung lượng của bộ nhớ:
• Dung lượng của bộ nhớ hay còn gọi là kích thước của bộ nhớ
nói lên khả năng lưu trữ thông tin nhiều hay ít của bộ nhớ
• Đơn vị cơ bản đo lượng thông tin trong hệ vi xử lý là BIT.
BIT có thể lưu trữ một trong hai trạng thái thông tin là 0
hoặc 1
• Một dãy 8 BIT được gọi là 1 BYTE. Thuật ngữ BYTE để chỉ
một đơn vị lưu trữ dữ liệu trên hệ vi xử lý. Ngoài ra, người ta
còn dùng các đơn vị bội của byte như sau:
Kilobyte (KB) 1 (KB) = 210 (B) = 1,024 (B)
Megabyte (MB) 1 (MB) = 210 (KB) = 1,024 (KB)
Gigabyte (GB) 1 (GB) = 210 (MB) = 1,024 (MB)
Terabyte (TB) 1 (TB) = 210 (GB) = 1,024 (GB)
Petabyte (PB) 1 (PB) = 210 (TB) = 1,024 (TB).
32
4. Cách xác định dung lượng bộ nhớ bán dẫn 8 bit
a. Căn cứ vào số chân địa chỉ
DUNG LƯỢNG = 2N x M (bit)
• N: số chân (bit) địa chỉ.
• M: số chân (bit) dữ liệu.

Ví dụ: Bộ nhớ bán dẫn 8 bit có 15 đường địa chỉ.


Cho biết dung lượng của bộ nhớ là bao nhiêu?
Giải
Số chân (bit) địa chỉ: 15 chân N = 15
Số chân (bit) dữ liệu: 8 chân M=8
Dung lượng = 215 x 8 (bit) = 32.768 x 8 (bit) = 32 (KB)
b. Căn cứ vào mã số

MÃ SỐ = XXYYYY
• XX: xác định loại bộ nhớ.
27: UV-EPROM 28: EEPROM
61, 62: SRAM 40, 41: DRAM
• YYYY: xác định dung lượng.

DUNG LƯỢNG = YYYY (Kbit)

Ví dụ: Bộ nhớ bán dẫn 8 bit có mã số 27256.


Cho biết dung lượng của bộ nhớ là bao nhiêu?
Giải
Bộ nhớ thuộc loại UV-EPROM XX = 27
Dung lượng = 256 (Kbit) = 32 (KB)
5. Phân biệt bộ VI XỬ LÝ – VI ĐIỀU KHIỂN
a. Cấu trúc phần cứng
- Cấu trúc chính của Vi xử lý (Microprocessor) là CPU
- Cấu trúc Vi điều khiển (Microcontroller) gồm có:
• Đơn vị xử lý trung tâm (CPU).
• Bộ nhớ chương trình (ROM).
• Bộ nhớ dữ liệu (RAM).
• Mạch giao tiếp nối tiếp.
• Mạch giao tiếp song song.
• Mạch điều khiển ngắt.
• Các mạch điều khiển khác.
b. Các ứng dụng
- Vi xử lý: thường dùng trong các ứng dụng lớn, tính toán
phức tạp.
- Vi điều khiển : Ứng dụng nhỏ, tính toán đơn giản, dễ kết
nối nối phần cứng.
c. Các đặc trưng của tập lệnh
Vi xử lý
• Có nhiều kiểu định địa chỉ.
• Độ dài từ dữ liệu xử lý: Byte, Word, Double word, …
Vi điều khiển
• Có ít kiểu định địa chỉ.
• Độ dài từ dữ liệu xử lý: Bit, Byte.
6. Tiêu chí chọn loại VI ĐIỀU KHIỂN khi thiết kế
Các tiêu chí cơ bản khi chọn bộ Vi điều khiển
• Đáp ứng yêu cầu tính toán một cách hiệu quả và kinh
tế.
• Có sẵn các công cụ phát triển phần mềm (chương trình
mô phỏng, trình biên dịch, trình hợp dịch và gỡ rối).
• Khả năng đáp ứng về số lượng ở hiện tại cũng như ở
tương lai.
Các loại Vi điều khiển thông dụng
• 68xxx của Motorola.
• 80xxx, AVR, ARM của Intel.
• Z8xx của Zilog.
• PIC16xxx, PIC18xxx của Microchip Technology.
Các tham số kỹ thuật cần chú ý
• Tốc độ IC
• Kiểu IC: DIP, QFP,… (DIP: vỏ dạng hai hàng chân,
QFP: vỏ vuông dẹt).
• Công suất tiêu thụ.
• Dung lượng bộ nhớ ROM và RAM tích hợp sẵn trên
chip.
• Số chân vào/ra và bộ định thời trên chip.
• Khả năng dễ dàng nâng cao hiệu suất hoặc giảm công
suất tiêu thụ.
• Giá thành IC
7. Giới thiệu về vi điều khiển PIC
- PIC (Programmable Intelligent Computer) nghĩa là “Máy tính thông
minh khả trình” xuất phát từ Vi điều khiển PIC đầu tiên PIC1650, do
hãng General Instrument đặt tên.
- Sau đó hãng Microchip tiếp tục phát triển loại PIC này và cho ra đời
gần 100 loại PIC đến nay.
- Các dòng PIC hiện nay:
+ Dòng PIC 12Cxx có độ dài lệnh 12bit (Basic-line).
+ Dòng PIC 10F, 12F, 16F có độ dài lệnh 14bit (Mid-range).
+ Dòng PIC 18F có độ dài lệnh 16bit (High-End).
+ Dòng dsPIC là dòng PIC mới hiện nay.
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)

40
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)

41
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)

42
• Kiến trúc 8-bit PIC® MCU (Baseline, Mid-Range, Enhanced Mid-Range,
PIC18)

43
• 16-bit PIC® MCU: PIC24F, PIC24H, PIC24E
• 16-bit dsPIC® DSC: dsPIC30F, dsPIC33F, dsPIC33E.

44
• 32-bit PIC® MCU: PIC32

45
7. Giới thiệu về PIC (tt)
• Có hai kiểu kiến trúc vi điều khiển là Von Neumann và
Harvard
• Kiến trúc Von Neumann: Có chung một không gian bộ nhớ
cho cả chương trình và dữ liệu, sử dụng chung hệ thống bus
nên tốc độ xử lý thông tin sẽ có nhiều hạn chế
• Kiến trúc Harvard: Có hai không gian bộ nhớ tách biệt nhau
(một cho chương trình và một cho dữ liệu), sử dụng hai hệ
thống bus do đó có thể hoạt động cả hai bộ nhớ trong cùng
một thời điểm, nên tốc độ xử lý thông tin được cải thiện rất
nhiều.

46
Vi điều khiển PIC chúng ta tìm hiểu trong môn học này (Họ 8-bit PIC®
MCU Mid-Range) sử dụng kiến trúc Harvard.

47
RISC – CISC
• Vi điều khiển được tổ chức theo kiến trúc Harvard còn được gọi là Vi
điều khiển RISC (Reduced Instruction Set Computer) hay vi điều
khiển có tập lệnh rút gọn. Là một phương pháp thiết kế vi điều khiển
theo hướng đơn giản hóa tập lệnh, thời gian thực thi tất cả các lệnh
đều như nhau. Phổ biến là: ARM, AVR, SuperH, MIPS, SPARC, DEC
Alpha, PA-RISC, PIC và PowerPC của IBM
• Vi điều khiển được tổ chức theo kiến trúc Von Neumann còn được gọi
là Vi điều khiển CISC (Complex Instruction Set Computer) hay vi
điều khiển có tập lệnh phức tạp, với độ dài mã lệnh luôn là bội số của
Byte. Là một phương pháp thiết kế vi điều khiển theo hướng phức tạp
hóa tập lệnh, thời gian thực thi của các lệnh khác nhau. Phổ biến là:
Motorola 68x, Intel x86, MCS-51.

48
CHƯƠNG 2:
CẤU TRÚC PHẦN CỨNG
PIC16F887

Khoa Công Nghệ Điện Tử Bộ môn Điện Tử Máy Tính


Nội dung:
 Tổ chức bộ nhớ PIC16F887
 Sơ đồ khối tổng quát PIC16F887
 Tổng quan về cổng xuất nhập PIC16F887
 Cấu trúc phần cứng PIC16F887

GV: Vũ Thị Hồng Nga Khoa Công Nghệ Điện Tử


1. Tổ chức bộ nhớ của PIC16F887
• Bộ nhớ chương trình (Program Memory)
8192 (Words – 14 bit) Flash ROM
• Bộ nhớ dữ liệu (Data Memory)
368 (Bytes – 8 bit) RAM
256 (Bytes – 8 bit) EEPROM
• 24/35 chân xuất/nhập
• 15 nguồn ngắt (Interrupt)
• 2 bộ định thời/đếm 8 bit (Timer 0 và Timer 2)
• 1 bộ định thời/đếm 16 bit (Timer 1)
• 1 bộ định thời giám sát (WatchDog Timer)
• 2 bộ bắt giữ/so sánh/điều xung (Capture/Compare/PWM)
• 1 bộ biến đổi tương tự sang số 10 bit (ADC-10 bit)
• 5 cổng giao tiếp song song (Port A, B, C, D, E).
1. Tổ chức bộ nhớ của PIC16F887 (tt)
• 1 bộ giao tiếp nối tiếp đồng bộ và bất đồng bộ (USART,
MSSP)
• 2 bộ so sánh tương tự (Analog Comparator)
• Chế độ tiết kiệm năng lượng (Sleep Mode)
• Tầm điện áp làm việc lớn (2.0V – 5.5V)
• Tích hợp nhiều tính năng nhằm tăng độ tin cậy khi làm việc
(POR, PWRT, OST, BOR, WDT), bảo mật và hiệu suất.
• Tích hợp tính năng gỡ rối chương trình (Debug)
• Nạp chương trình bằng cổng nối tiếp (In-Circuit Serial
Programming)
• Tập lệnh gồm 35 lệnh
• Tần số hoạt động tối đa 20MHz
SƠ ĐỒ CHÂN CỦA PIC16F887
• Kiểu chân PDIP:

5
SƠ ĐỒ CHÂN CỦA PIC16F887
• Kiểu chân QFN:

6
SƠ ĐỒ CHÂN CỦA PIC16F887
• Kiểu chân TQFP:

7
2. SƠ ĐỒ KHỐI TỔNG QUÁT CỦA PIC16F887
2. SƠ ĐỒ KHỐI TỔNG QUÁT CỦA PIC16F887

9/19
3. Các PORT xuất nhập của PIC16F887
PIC16F887 có 5 PORT xuất/nhập: PORTA, PORTB, PORTC,
PORTD, PORTE

10
3.1 Cấu hình chiều dữ liệu cho PORT
Để cấu trình chiều dữ liệu cho PORTx ta dùng thanh ghi
TRISx, với x là tên port cần cấu hình.
TRISA  cấu hình chiều dữ liệu cho PORTA
TRISB  cấu hình chiều dữ liệu cho PORTB
TRISC  cấu hình chiều dữ liệu cho PORTC
TRISD  cấu hình chiều dữ liệu cho PORTD
TRISE  cấu hình chiều dữ liệu cho PORTE

11
Ví dụ : Thanh ghi TRISB cấu hình chiều dữ liệu cho
PORTB
PORTB Tri-State Register (TRISB)
TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

TRISBi = 1  chân RBi là input


TRISBi = 0  chân RBi là output
Với i là chỉ số bit

12
Ví dụ: Cấu hình chiều dữ liệu cho PORTB như sau :
chân RB7,RB6,RB5,RB4 là input; RB3,RB2,RB1,RB0 là output
PORTB Register (PORTB)
RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

PORTB Tri-State Register (TRISB)


TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0

Giải:
Cách 1: cấu hình từng chân
TRISB7 = 1; TRISB6 =1; TRISB5 = 1; TRISB4 = 1;
TRISB3 = 0; TRISB2 =0; TRISB1 = 0; TRISB0 = 0;
Cách 2: cấu hình theo PORT
TRISB = 0B11110000 //định dạng theo số nhị phân
TRISB = 0XF0; //định dạng theo số HEX 13
Ví dụ:
Cấu hình PORTC có chân RC0,RC2,RC6 là input, các chân còn lại
là output :
TRISC = 0B01000101; //định dạng theo số nhị phân
Hoặc:
TRISC = 0X45; //định dạng theo số hex

14
3.1 Cấu hình kiểu dữ liệu cho PORT
- PIC16F887 có thể làm việc với tín hiện digital và analog,
do đó ta phải cấu hình kiểu dữ liệu cho các PORT trước khi
lập trình.
- PIC16F887 có 14 chân analog AN0, AN1,…AN13. Các chân
này có thể cấu hình theo 3 cách sau:
+ analog input
+ digital input
+ digital output
- Các chân còn lại của các PORT là các chân digital, được
cấu hình theo 2 cách sau:
+ digital input + digital output
- Khi reset PIC thì các chân analog mặc định được cấu hình
là analog input 15
TỔNG QUAN VỀ CỔNG XUẤT NHẬP

16
3.1 Cấu hình kiểu dữ liệu cho PORT
Thanh ghi cấu hình kiểu dữ liệu cho PORT là: ANSEL, ANSELH
Analog Select Register (ANSEL)

ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

Analog Select High Register (ANSELH)

ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

ANSi = 1  Chân ANi có kiểu dữ liệu analog


ANSi = 0  Chân ANi có kiểu dữ liệu digital
Với i là chỉ số bit

17
VD: hãy cấu hình chân RE2 là analog input
VD: Hãy cấu hình chân RE2 là analog input
Analog Select Register (ANSEL)

ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

Analog Select High Register (ANSELH)

ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

input: TRISE2 = 1
Giải:
RE2 là kênh AN7
analog: ANS7 = 1
Hoặc ANSEL = 0X80
19
VD 1
Cho port E của PIC16F887 có cấu hình như sau:
Analog Input
Digital Output
Digital Input
• Hãy xác định giá trị của thanh ghi TRISE, ANSEL, ANSELH

TRISE7 TRISE6 TRISE5 TRISE4 TRISE3 TRISE2 TRISE1 TRISE0

ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

ANS13 ANS12 ANS11 ANS10 ANS9 ANS8

20
Đáp án:
Cho port E của PIC16F887 có cấu hình như sau:
Analog Input
Digital Output
Digital Input

Giá trị của thanh ghi TRISE, ANSEL, ANSELH là:

TRISE - - - - X 1 0 1

ANSEL 0 0 1 x x x x x

ANSELH x x x x x x

Chọn : TRISE = 0X05;


22
ANSEL = 0X20;
ANSELH = 0X00;
3.3 Tính năng điện trở kéo lên (Pull-up Resistor)
• Chỉ áp dụng cho Port B : RB0  RB7
• Phải cấu hình các chân kích hoạt điện trở kéo lên là digital input
• Kích hoạt điện trở kéo: sử dụng thanh ghi WPUB và bit RBPU trong
thanh ghi OPTION

PIC16F887

23
Kích hoạt điện trở kéo lên cho PORTB :
Sử dụng thanh ghi WPUB và bit RBPU trong thanh ghi
OPTION
OPTION_REG Register (OPTION_REG)

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0

RBPU = 1  Cấm kích hoạt điện trở kéo lên


RBPU = 0  Cho phép kích hoạt điện trở kéo lên
Weak Pull-Up PORTB Register (WPUB)

WPUB7 WPUB6 WPUB5 WPUB4 WPUB3 WPUB2 WPUB1 WPUB0

WPUBi = 1  Cho phép kích hoạt điện trở kéo lên tại chân RBi
WPUBi = 0  Cấm kích hoạt điện trở kéo lên tại chân RBi
Với i = (0,1,2,3,4,5,6,7) là chỉ số bit

24
Ví dụ: Kích hoạt tính năng điện trở kéo lên cho chân RB3
OPTION_REG Register (OPTION_REG)

1 = Cấm 0 = Cho phép

Weak Pull-Up PORTB Register (WPUB)

1 WPUB2 WPUB1 WPUB0


WPUB7 WPUB6 WPUB5 WPUB4 ICOB3

1 = Cho phép 0 = Cấm

RBPU = 0
WPUB3 = 1
RB3
Pull-up Resistor 25
Ví dụ: Cấu hình PORT cho phần cứng sau, các chân nối với thạch anh
và MCLR không cần cấu hình.
PORTE : chân 0,1,2 digital output
Cấu hình
PORTB : chân 0,1,2 digital input, có điện trở kéo lên
Đáp án: Cấu hình PORT cho phần cứng sau, các chân nối với thạch
anh và MCLR không cần cấu hình.
ANSEL = 0X00;
ANSELH = 0X00;

TRISE = 0X00;
TRISB = 0XFF;

nRBPU = 0;
WPUB0 = 1;
WPUB1 = 1;
WPUB2 = 1;
// WPUB = 0X07;

28
Tổng kết chung
1. Cấu trúc và các thanh ghi cấu hình PORTA
• Port A có 8 chân: RA0  RA7
• Thanh ghi TRISA (TRISA0  TRISA7) : cấu hình chiều
dữ liệu.
TRISAi = 1: chân RAi là input
TRISAi = 0: chân RAi là output
• Thanh ghi ANSEL, ANSELH (ANS0  ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog
29
2. Cấu trúc và các thanh ghi cấu hình PORTB
• Port B có 8 chân: RB0  RB7
• Thanh ghi TRISB (TRISB0  TRISB7) : cấu hình chiều
dữ liệu.
TRISBi = 1: chân RBi là input
TRISBi = 0: chân RBi là output
• Thanh ghi ANSEL, ANSELH (ANS0  ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog
• Thanh ghi WPUB và bit RBPU : kích hoạt điện trở kéo lên

30
3. Cấu trúc và các thanh ghi cấu hình PORTC
• Port C có 8 chân: RC0  RC7
• Thanh ghi TRISC (TRISC0  TRISC7) : cấu hình chiều
dữ liệu
TRISCi = 1: chân RCi là input
TRISCi = 0: chân RCi là output
• PORTC không có chân analog

31
4. Cấu trúc và các thanh ghi cấu hình PORTD
• Port D có 8 chân: RD0  RD7
• Thanh ghi TRISD (TRISD0  TRISD7) : cấu hình chiều
dữ liệu
TRISDi = 1: chân RDi là input
TRISDi = 0: chân RDi là output
• PORTD không có chân analog

32
5. Cấu trúc và các thanh ghi cấu hình PORTE
• Port E có 4 chân: RE0  RE3
• Thanh ghi TRISE (TRISE0  TRISE3) : cấu hình chiều
dữ liệu.
TRISEi = 1: chân REi là input
TRISEi = 0: chân REi là output
• Thanh ghi ANSEL, ANSELH (ANS0  ANS13) : cấu
hình kiểu dữ liệu.
ANSi = 0: chân ANi có kiểu dữ liệu là digital
ANSi = 1: chân ANi có kiểu dữ liệu là anolog

33
4. BỘ DAO ĐỘNG
• PIC16F887 Có thể hoạt động khi được cấp xung clock bên
trong hoặc bên ngoài
• Tần số tối đa để PIC16F887 hoạt động ổn định là 20 MHz
• Nguồn xung clock bên ngoài được cung cấp cho PIC16F887
thông qua chân OSC1/CLKIN và OSC2/CLKOUT
• Nguồn xung clock bên trong được cung cấp cho PIC16F887
do người dung lập trình bằng phần mềm.

34
BỘ DAO ĐỘNG

Oscillator Control Register (OSCCON)

IRCF2 IRCF1 IRCF0 OSTS HTS LTS SCS 35


4.1 chọn chế độ dao động bên ngoài:
Có 6 chế độ như sau :
EC – External clock with I/O on OSC2/CLKOUT
LP – 32 kHz Low-Power Crystal mode
XT – Medium Gain Crystal or Ceramic Resonator Oscillator
mode
HS – High Gain Crystal or Ceramic Resonator mode
RC – External Resistor-Capacitor (RC) with FOSC/4 output on
OSC2/CLKOUT
RCIO – External Resistor-Capacitor (RC) with I/O on
OSC2/CLKOUT.

36
4.2 Chế độ dao động bên trong:
Có 2 chế độ như sau :
INTOSC – Internal oscillator with FOSC/4 output on OSC2 and
I/O on OSC1/CLKIN
INTOSCIO – Internal oscillator with I/O on OSC1/CLKIN and
OSC2/CLKOUT.

37
Các chế độ xung clock được chọn bằng bit FOSC<2:0> trong
thanh ghi CONFIG1
• 000: LP Oscillator
• 001: XT Oscillator
• 010: HS Oscillator
• 011: EC Oscillator
• 100: INTOSCIO Oscillator
• 101: INTOSC Oscillator
• 110: RCIO Oscillator
• 111: RC Oscillator.

38
Lưu ý: nên chọn chế độ HS khi chạy các phần chứng trên
mô hình vi xử lý

Chế độ HS
(High Gain Crystal )

39
• Các thanh ghi có liên hệ với nguồn xung clock

X: Không biết – : Dự trữ (Đọc về có giá trị ‘0’


U: Không thay đổi Tô đậm: Không dùng cho bộ
dao động

52
5. RESET HỆ THỐNG
•Có nhiều loại tín hiệu reset:
MCLR\ Reset
POR (Power-On Reset)
BOR (Brown-Out Reset)
WDT Reset
•MCLR\ Reset là tín hiệu reset bên ngoài hoặc bên
trong
•WDT Reset, POR, BOR là các tín hiệu reset bên trong.

53
Sơ đồ khối mạch reset của PIC16F887

54
• MCLR\ Reset
• Cho phép reset PIC từ mạch điện bên ngoài
• Được chọn lựa và cho phép bằng bit MCLR trong thanh ghi CONFIG1
• MCLRE\ = 0: Tín hiệu reset được tạo ra bên trong PIC, chân RA3 là
ngõ vào số (pull-up)
• MCLRE\ = 1: Tín hiệu reset
được tạo ra từ mạch điện
bên ngoài PIC, chân RE3
trở thành ngõ vào reset PIC,
tích cực mức thấp.

Mạch điện tạo tín hiệu MCLR\ 55


• POR (Power-On Reset)
• Giữ PIC ở trạng thái reset (vào thời điểm mới cấp nguồn cho PIC)
cho đến khi điện áp nguồn cung cấp (VDD) đã đạt đến một giá trị đủ
cao để hoạt động tốt
• POR không tạo ra tín hiệu reset khi VDD bị giãm trong quá trình hoạt
động.
• Để kích hoạt lại POR, VDD phải giãm tới mức VSS và giữ trong thời
gian tối thiểu 100s.
• BOR (Brown-Out Reset)
• Tạo tín hiệu reset PIC khi điện áp nguồn cung cấp (VDD) giãm xuống
nhỏ hơn mức VBOR
• Được chọn lựa và cho phép bằng bit BOREN<1:0> trong thanh ghi
CONFIG1
• Giá trị VBOR được thiết lập bằng bit BOR4V trong thanh ghi CONFIG2
• BOR4V = 0: VBOR đặt ở mức 2.1V
• BOR4V = 1: VBOR đặt ở mức 4.0V.
56
• BOR (Brown-Out Reset)
VDD
VBOR

64ms
Internal
Reset

VDD
VBOR

64ms
Internal
Reset <64ms

VDD
VBOR

64ms
Internal
Reset

57
5. RESET HỆ THỐNG (TT)
• WDT Reset
• Tạo tín hiệu reset PIC sau một khoảng thời gian được lập trình trước
• Chu kỳ reset từ 1ms đến 268s
• Được chọn lựa và cho phép bằng bit WDTE trong thanh ghi
CONFIG1.

58
5. RESET HỆ THỐNG (TT)
VDD
• POR (Power-On Reset)
• Khi MCLR được nối với MCLR
TPWRT
VDD, một xung reset được
PWRT
tạo ra khi cạnh lên VDD
TOST
được phát hiện OST

 PWRT (Power Up Timer) Reset Execution

 PIC được giữ ở trạng thái reset trong 64ms để VDD tăng lên tới

một mức chấp nhận được (tính từ sau POR)


 OST (Oscillator Start-up Timer)
 PIC được giữ reset trong 1024 chu kỳ để bộ dao động (crystal,

resonator) ổn định tần số và biên độ; không hoạt động ở các chế
độ RC (tính từ sau POR hoặc Wake Up từ SLEEP).
59
6. NGUỒN CUNG CẤP
• Điện áp nguồn cung cấp từ 2.0V đến 5.5V
• Có 4 chân cấp nguồn:
• VDD (chân 11 và chân 32)  +2.0V đến +5.5V
• VSS (chân 12 và chân 31)  0V
• Cả 4 chân đều phải được kết nối thì PIC mới hoạt động.

60
LẬP TRÌNH NỐI TIẾP TÍCH HỢP
Được hỗ trợ cho các loại mạch nạp như: ICD2, PICkit2, PICkit3.

Application PCB VDD VDD

Pin Function
MCLR/VPP VPP Programming Voltage = 13V
ICSP Connector
VDD Supply Voltage
PIC16Fxxx

VSS Ground
VDD RB6 Clock Input
VSS
RB7 Data I/O & Command Input
RB6

RB7

Isolation
To application circuit
circuits

61
7. TỔ CHỨC BỘ NHỚ CỦA PIC16F887
Nội dung bao gồm:
• Bộ nhớ chương trình (Program Memory)
• Bộ đếm chương trình (Program Counter)
• Ngăn xếp (Stack)
• Bộ nhớ dữ liệu (Data Memory)
• RAM
• EEPROM
• Thanh ghi chức năng đặc biệt khác (Special Function
Registers).

62
BỘ NHỚ CHƯƠNG TRÌNH Reset Vector 0000h
• Dung lượng: 8K word
• 8K x 14bit = 14Kbyte
• Vectơ RESET: 0000h Interrupt Vector
0004h
0005h
• Bộ đếm chương trình (PC) sẽ đi tới địa chỉ ………………………

này ngay khi bị reset Page 0 07FFh


PCH = 00h
2K 0800h
• Vectơ ngắt: 0004h ………………………….

0FFFh
• Bộ đếm chương trình (PC) sẽ đi tới địa chỉ Page 1
2K 1000h
này ngay khi có một sự kiện ngắt bất kỳ. PCH = 08h …………………………………….

17FFh
Page 2 1800h
………………………….
2K
PCH = 10h 1FFFh

Page 3 2K
PCH = 18h

63
PCLATH
• Bộ đếm chương trình: PC<12:0>
• Có 13 bit (PCH + PCL)
• PCL: Từ kết quả ALU (8 bit) hoặc từ mã PCH<12:8> PCL
lệnh (11 bit) CALL, RETURN,
• PCH: Các bit chọn trang RETFIE, RETLW
• Được cập nhật từ PCLATH Stack Level 1
• Xác định trang hiện tại trong bộ nhớ
chương trình
• Ngăn xếp:
• Có 8 mức, hoạt động theo vòng kín Stack Level 8
• Dùng lưu lại nội dung của PC
• Cất vào (PUSH): CALL / Interrupt PROGRAM
• Lấy ra (POP): RETURN, RETFIE,RETLW. MEMORY

64
BỘ NHỚ DỮ LIỆU - RAM
• Dung lượng: 368Byte (368 x 8bit)
• Bộ nhớ dữ liệu được chia thành 4
Bank:
RP1 RP0 Bank
• Bank 0, Bank 1, Bank 2 và Bank 3
• Mỗi Bank có dung lượng 128 Byte, 0 0 Bank 0
gồm: 0 1 Bank 1
• Thanh ghi đa mục đích (GPR)  RAM
• Thanh ghi chức năng đặc biệt (SFR) 1 0 Bank 2
• Các Bank này được 1 1 Bank 3
lựa chọn bởi hai bit RP<1:0> nằm
trongthanh ghi STATUS.

65
THANH GHI CHỨC NĂNG ĐẶC BIỆT

• SFRs (Special Function Registers): PORTB 06h TRISB 86h


PORTC 07h TRISC 87h
• Khái niệm về thanh ghi chức năng
PORTD 08h TRISD 88h
• Được truy xuất (ghi hoặc đọc thông PORTE 09h TRISE 89h
tin) tương tự như một RAM tĩnh PCLATH 0Ah PCLATH 8Ah
• Một số thanh ghi có trong tất cả các INTCON 0Bh INTCON 8Bh
dãy (PCLATH, INTCON,…). PIR1 0Ch PIE1 8Ch
PIR2 0Dh PIE2 8Dh

Bank 0 Bank 1

66
THANH GHI CHỨC NĂNG ĐẶC BIỆT

67
CHƯƠNG 3
NGÔN NGỮ LẬP TRÌNH
VI ĐIỀU KHIỂN

GV: Vũ Thị Hồng Nga Khoa Công Nghệ Điện Tử


Nội dung:
 Trình bày tổng quan lập trình vi điền khiển
 Nhắc lại ngôn ngữ lập trình C
 Hướng dẫn vẽ lưu đồ giải thuật
 Lập trình điều kiển led đơn
 Lập trình điều kiển led bảy đoạn
 Lập trình điều kiển led matrix

GV: Vũ Thị Hồng Nga Khoa Công Nghệ Điện Tử


I. Tổng Quan Lập Trình Vi Điều Khiển
• Vi điều khiển truyền thông với con người thông qua ngôn
ngữ lập trình
• Ngôn ngữ lập trình: assembly, ngôn ngữ C,….
• Để vi điều khiển có thể hiểu một chương trình được viết
bằng ngôn ngữ lập trình thì nó cần phải được biên dịch
thành ngôn ngữ máy (mã máy)
• Mã nguồn (Source Code):
• Là tập tin dữ liệu được lưu trên máy tính
• Được thể hiện bằng ngôn ngữ lập trình
• Định dạng tập tin theo ngôn ngữ lập trình
VD: .ASM (ngôn ngữ assembly), .C( ngôn ngữ C)
3
• Mã máy (Machine Code):
• Là tập tin dữ liệu được lưu trên máy tính hoặc nạp xuống PIC
• Được thể hiện bằng các con số 0 hoặc 1
• Định dạng tập tin là .HEX
• Chương trình sau khi biên dịch sẽ được nạp vào vi điều khiển
bằng các bộ lập trình chuyên dụng dành cho PIC.
• Vi điều khiển sau khi được lập trình sẽ được gắn vào bo mạch
chủ để điều khiển toàn hệ thống hoạt động theo chương trình
mà không cần sự can thiệp của con người.

4
Các bước lập trình vi điều khiển

5
II. Nhắc lại ngôn ngữ lập trình C

6
1. Biến và Kiểu Dữ Liệu
a. Biến : Biến cho phép cung cấp một tên có ý nghĩa cho
mỗi vị trí nhớ
b. Hằng (constant) :
 Hằng là một giá trị không thay đổi trong suốt quá trình
thực thi chương trình
ví dụ:
5 số / hằng số nguyên
5.3 số / hằng số thực
‘Black’ hằng chuỗi
‘C’ hằng ký tự
 Biến lưu giữ các giá trị hằng
7
c.Từ khóa:
 Từ khóa là các từ dành riêng (reserved words) của C mà
người lập trình có thể sử dụng nó trong chương trình tùy
theo ý nghĩa của từng từ.
 Ta không được dùng từ khóa để đặt cho các tên của riêng
mình.
 Các từ khóa phải viết bằng chữ thường
Các từ khóa của C:
• asm • auto • break • case • cdecl • char • class • const • continue • _cs • default •
delete • do double • _ds • else • enum • _es • extern • _export • far • _fastcall •
float • for • friend • goto • huge • if • inline • int • interrupt • _loadds • long • near
• new • operator • pascal • private • protected • public • register • return •
_saveregs • _seg • short • signed • sizeof • _ss • static • struct • switch • template •
this • typedef • union • unsigned • virtual • void • volatile • while

8
d. Định danh:
• Tên của các biến (variables), các hàm (functions), các nhãn
(labels) và các đối tượng khác nhau do người dùng định nghĩa
gọi là định danh
 Chiều dài tối đa của tên là 32 ký tự, phân biệt chữ hoa và chữ
thường.
 Các nguyên tắc đặt tên định danh:
Tên định danh phải bắt đầu bằng một ký tự alphabet
Theo sau ký tự đầu có thể là các ký tự chữ, số …
Nên tránh đặt tên biến trùng tên các từ khoá
Tên biến nên mô tả được ý nghĩa của nó
Tránh dùng các ký tự gây lầm lẫn
Nên áp dụng các quy ước đặt tên biến chuẩn khi lập trình
9
Ví dụ:
 Các tên định danh đúng: delta, a_1, Num_ODD, ABC
 Các tên định danh sai:
3a_1 (ký tự đầu là số)
num-odd (sử dụng dấu gạch ngang)
int (đặt tên trùng với từ khóa)
del ta (có khoảng trắng)
f(x) (có dấu ngoặc tròn)

10
e. Kiểu Dữ Liệu
 Kiểu dữ liệu mô tả loại dữ liệu sẽ được lưu trong biến
 Tên biến đặt sau kiểu dữ liệu

kiểu dữ liệu tên biến

Ví dụ : khai báo biến “varName” có kiểu dữ liệu “int”


int varName;

11
e. Kiểu Dữ Liệu
Kiểu dữ liệu cơ bản

int
float double char void

12
e. Kiểu Dữ Liệu

13
f. Các kiểu định dạng số nguyên trong C
• Bát phân: viết bắt đầu bằng số 0
• Nhị phân: viết bắt đầu bằng số 0B
• Thập phân: viết bắt đầu bằng số từ 1 đến 9
• Thập lục phân: viết bắt đầu bằng 0x

VD: PORTA = 0X4A = 0B01001010

14
2. Các phép toán trong C:
Toán tử Chức năng
Các phép toán số học + Cộng
- Trừ
* Nhân
/ Chia lấy phần nguyên
% Chia lấy phần dư

Toán tử Chức năng


< Nhỏ hơn
<= Nhỏ hơn hoặc bằng
Các toán tử so sánh
> Lớn hơn
>= Lớn hơn hoặc bằng
== Bằng
!= khác 15
Toán tử Chức năng
& AND
Các toán tử trên bit | OR
~ NOT
^ XOR
<< DỊCH PHẢI
>> DỊCH TRÁI

Toán tử Chức năng


&& AND logic
Các toán tử luận lý || OR logic
! NOT logic
16
3. Thứ tự ưu tiên của các phép toán
Độ ưu tiên Các phép toán Trình tự kết hợp

1 ( ) [ ] -> Trái sang phải


2 ! ~ & * – ++ – – (type) sizeof Phải sang trái
3 */% Trái sang phải
4 +– Trái sang phải
5 << >> Trái sang phải
6 < <= > >= Trái sang phải
7 == != Trái sang phải
8 & Trái sang phải
9 ^ Trái sang phải
10 | Trái sang phải
11 && Trái sang phải
12 || Trái sang phải
13 ?: Phải sang trái
14 = += –= *= /= %= <<= >>= &= ^= |= Phải sang trái
15 , Trái sang phải 17
4 .Phép gán:
 Phép gán là thay thế giá trị hiện tại của biến bằng một giá
trị mới.
 Các phép gán: =, +=, –=, *=, /=, %=, <<=, >>=, &=, |=,
^=
Ví dụ 10 : ta có giá trị ban đầu của i = 3
•i = i + 3 →i=6
• i += 3 i=i+3 →i=6
• i *= 3 i=i*3 →i=9

18
5. Định dạng dữ liệu nhập xuất
%c : Ký tự đơn
%s : Chuỗi
%d : Số nguyên thập phân có dấu
%f : Số chấm động (ký hiệu thập phân)
%e : Số chấm động (ký hiệu có số mũ)
%g : Số chấm động (%f hay %g)
%x : Số nguyên thập phân không dấu
%u : Số nguyên hex không dấu
%o : Số nguyên bát phân không dấu

19
6. Biến toàn cục và biến cục bộ
• Biến toàn cục: vị trí biến đặt bên ngoài tất cả các hàm,
cấu trúc...Các biến này có ảnh hưởng đến toàn bộ
chương trình. Chu trình sống của nó là bắt đầu chạy
chương trình đến lúc kết thúc chương trình.
• Biến cục bộ: Vị trí biến đặt bên trong hàm, cấu trúc….
Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc đó….
Chu trình sống của nó bắt đầu từ lúc hàm, cấu trúc được
gọi thực hiện đến lúc thực hiện xong.

20
7. Các cấu trúc điều khiển thường dùng
Cấu trúc điều khiển rẽ nhánh:
if / if else
switch…case
Cấu trúc điều khiển vòng lặp:
for
while
do while
Cấu trúc rẽ nhánh if / if ….else
if
(biểu_thức_điều_kiện)
{
if
(biểu_thức_điều_kiện) Lệnh 1;
{ Lệnh 2;
Lệnh 1; …
Lệnh 2; Lệnh n;
… }
Lệnh n; else
} {
Lệnh 1;
Lệnh 2;

Lệnh n;
}
switch (biểu_thức_chọn)
{
case Giá_Trị_1:
Lệnh 1;
..
Lệnh n;
break;
case Giá_Trị_2:
Cấu trúc rẽ nhánh Lệnh 1;
Switch … case ..
Lệnh n;
break;
default:
Lệnh 1;
..
Lệnh n;
break;
}
Cấu trúc vòng lặp:

while (điều_kiện_lặp) for (biểu_thức_1;biểu_thức_2;biểu_thức_3)


{ {
Lệnh 1; Lệnh 1;
Lệnh 2; Lệnh 2;
… …
Lệnh n; Lệnh n;
} }
8. Lưu đồ giải thuật
VD: Vẽ lưu đồ giải và biện luận phương trình bậc nhất: ax + b = 0
SV cài đặt các phần mềm và tài liệu sau:

- Phần mềm viết code: MPLAB


- Phần mềm mô phỏng : PROTEUS
- Sơ đồ mạch mô phỏng PROTEUS
Phần mềm viết code MPLAB
Phần mềm mô phỏng proteus
KIT RP hoặc mô hình thí nghiệm vi xử lý Bộ nạp chip PICKIT 2
VD1:
Lập trình điều khiển led đơn D1 và D2 chớp tắt với Ton = Toff = 500ms
Lưa đồ giải thuật:
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF );
#define _XTAL_FREQ 4000000

void main()
{
ANSEL = 0X00;
ANSELH = 0X00;
TRISE = 0X00;
while(1)
{

PORTE = 0X00;
__delay_ms(500); //su dung 5 lan ham __delay_ms(100)
PORTE = 0X06;
__delay_ms(500);
}
}
Sinh viên xem video hướng dẫn
sử dụng mplab và mô phỏng mạch trên proteus
VD 2: lập trình điều khiển 8 led đơn nối với PORTD sang đuổi từ
trái sang phải và lặp lại

Bảng dữ liệu:
00000000
10000000
01000000
00100000
00010000
00001000
00000100
00000010
00000001
Hãy vẽ lưu đồ giải thuật lập trình điều khiển 8 led đơn sáng đuổi
từ trái sang phải và lặp lại
VD 2: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng đuổi từ
trái sang phải và lặp lại
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF &
CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000

void main (void) temp = 0x80;// 10000000


{ for(j=1;j<=8;j++)
unsigned char i,j,temp; {
ANSEL = 0; PORTD = temp;
ANSELH = 0; __delay_ms(500);
TRISD = 0x00; temp = temp >> 1;
while(1) }
{ }
PORTD = 0x00; }
__delay_ms(500);

37
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển 8 LED sáng dần từ
phải sang trái, Led nối với port D
• Lưu đồ giải thuật:

Bảng dữ liệu Table


b'00000000
b'00000001
b'00000011
b'00000111
b'00001111
b'00011111
b'00111111
b'01111111
b'11111111

39
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng dần
từ phải qua trái
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF
& BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
const unsigned char a[] = while(1)
{0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF}; {
void main() for(j=0;j<=8;j++)
{ {
unsigned char j; PORTD = a[j];
__delay_ms(500);
ANSEL = 0X00; }
ANSELH = 0X00; }
TRISD = 0X00; }
PORTD = 0X00;
40
Ví dụ 3: Dựa vào sơ đồ, viết chương trình điều khiển LED sáng dần
từ phải qua trái (cách 2)
void main()
{
unsigned char i;
TRISD = 0X00;
while(1)
{
PORTD = 0X00;
__delay_ms(500);
PORTD = 0X01;
__delay_ms(500);
for (i=1;i<=7;i++)
{
PORTD = PORTD | (PORTD << 1);
__delay_ms(500);
}
}
}
41
Ví dụ 4: Dựa vào sơ đồ, viết chương trình hiển thị số 03 chớp
tắt trên 2 led7SEG (LED4)

42
Lưu đồ giải thuật
Hướng dẫn:
- Xác định led 7 đoạn dùng loại nào: anode hay cathode?
- Tìm mã led 7 đoạn cho số 3, số 0
- Chọn Ton = ? Toff =?
- Xác định led hien thị nối với port nào?
- Cấu hình port: digital, output
- Xuất dữ liệu ra port
Giải:
- led 7 đoạn dùng loại anode chung  0 sáng, 1 tắt
- mã led 7 đoạn cho số 3 là 10110000 = 0XB0
- mã led 7 đoạn cho số 0 là 11000000 = 0XC0
- Chọn Ton = Toff = 500ms
- led hien thị nối với PORTD,C
- Cấu hình PORTD,C: digital, output
- Xuất dữ liệu ra portD,C
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000

void main()
{ PORTD = 0XFF;
TRISD = 0X00; PORTC = 0XFF;
PORTD = 0XFF; __delay_ms(500);
TRISC = 0X00;
PORTC = 0XFF; }
}
while(1)
{
PORTD = 0XB0;
PORTC = 0XC0;
__delay_ms(500);
Ví dụ 5: viết chương trình hiển thị số đếm 00-15 trên 2
led7SEG, thời gian sáng mỗi trạng thái là 500ms

47
Lưu đồ giải thuật
BEGIN

Cấu hình PORTC,D


Digital output

Khao báo mã
led7SEG
A[]={0xC0, .0X90}

i=0

CH = i/10
DV = i%10

PORTC=A[CH]
PORTD=A[DV]

delay500ms

i = i++

i <=15
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
#define _XTAL_FREQ 4000000
const unsigned char a[]= {0xC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
unsigned char i,ch,dv;
void main()
{
TRISD = 0X00; PORTD = 0XFF;
TRISC = 0X00; PORTC = 0XFF;
while(1)
{
for (i=0;i<16;i++)
{
ch = i/10;
dv = i%10;
PORTD = a[dv];
PORTC = a[ch];
__delay_ms(500);
}
}
} 49
Ví dụ 6 : Viết chương trình hiển thị số đếm 0023 trên 2
led7SEG có sử dụng IC giải mã
Ví dụ 6: Viết chương trình hiển thị số đếm 0023 trên 2 led7SEG có sử
dụng IC giải mã
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF &
CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_ON);
#define _XTAL_FREQ 4000000
void main()
{ unsigned char i,a;
TRISD = 0X00; PORTD = 0X00;
while(1)
{ for (i=0; i<24; i++)
{ a = i/10;
PORTD = (a<<4)|(i%10);
__delay_ms(500);
}
}
}
VD 7: viết chương trình điều khiển nút nhấn
Nhấn nút 1 (RB0) : led7seg hiển thị số 12 trong 1s
Nhấn nút 2 (RB1) : led7seg hiển thị số 24 trong 1s

52
Lưu đồ giải thuật

Lưu đồ giải thuật


#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
#define sw0 RB0
#define sw1 RB1
void khai_bao_port(void) void so_12 (void)
{ {
ANSEL = 0X00; PORTD = 0XA4;
ANSELH = 0X00; PORTC = 0XF9;
__delay_ms(1000);
TRISD = 0X00; }
PORTD = 0X00; void so_24 (void)
{
PORTC = 0X00; PORTD = 0X99;
TRISC = 0X00; PORTC = 0XA4;
__delay_ms(1000);
TRISB = 0XFF; }
PORTB = 0XFF;
nRBPU = 0;
WPUB0 = 1;
WPUB1 = 1;
}
void main (void)
{
khai_bao_port();
while (1)
{
if(!sw0)
{
__delay_ms(10);
while(!sw0);
so_12();
PORTC = 0xFF;
PORTD = 0xFF;
}
else if(!sw1)
{
__delay_ms(10);
while(!sw1);
so_24();
PORTC = 0xFF;
PORTD = 0xFF;
}
}
}
Ví dụ 8: viết chương trình hiển thị chữ A trên led matrix

56
Gợi ý:
PORCx sẽ cấp tín hiệu cho chân anode của các led trên cùng 1 hàng
PORDx sẽ cấp tín hiệu cho chân cathode của các led trên cùng 1
cột
 để led[x,y] sáng thì RCx = 0 và Rdy =1
Ta thực hiện quét cột (PORTD) và xuất dữ liệu hàng (PORTC)

Ví dụ : hiển thị chữ A


- Dữ liệu hàng cho PORTC là
0xFF,0x83,0xED,0xEE,0xED,0x83,0xFF,0xFF
- Quét cột: cho lần lượt các cột sáng cho các
chân của PORTD lần lượt bằng 1
#include <htc.h> Đáp án Cách 1
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
PORTB = 0XEE;
void main(void)
PORTD = 0X08;
{
__delay_ms(3);
ANSEL = 0X00; ANSELH = 0X00;
PORTB = 0XED;
TRISD = 0X00; PORTD = 0X00;
PORTD = 0X10;
TRISC = 0X00; PORTC = 0XFF;
__delay_ms(3);
while(1) PORTB = 0X83;
{ PORTB = 0XFF; PORTD = 0X20;
PORTD = 0X01; __delay_ms(3);
__delay_ms(3); PORTB = 0XFF;
PORTB = 0X83; PORTD = 0X40;
PORTD = 0X02; __delay_ms(3);
__delay_ms(3); PORTB = 0XFF;
PORTB = 0XED; PORTD = 0X80;
PORTD = 0X04; __delay_ms(3);
__delay_ms(3); }
}
#include <htc.h> Đáp án Cách 2
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
const unsigned char a[]= {0xFF,0x83,0xED,0xEE,0xED,0x83,0xFF,0xFF};
void main(void)
while(1)
{
{
unsigned char scancode,i;
scancode = 0x01;
ANSEL = 0X00;
for(i=0;i<=7;i++)
ANSELH = 0X00;
{
PORTC = a[i];
TRISD = 0X00;
PORTD = scancode;
PORTD = 0X00;
__delay_ms(3);
PORTD = 0x00;
TRISC = 0X00;
scancode = scancode << 1;
PORTC = 0X00;
}
}
}
Ví dụ 9: viết chương trình hiển thị hình “trái tim” trên led
matrix trong 2s

60
#include <htc.h>
#include <math.h>
__CONFIG (FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF &
BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF);
#define _XTAL_FREQ 4000000
const unsigned char a[]= {0xF3,0xE1,0xC1,0x83,0xC1,0xE1,0xF3,0xFF};
void main(void) for(i=0;i<83;i++) //2000:24 = 83
{ { vitri=0x01;
unsigned char scancode,i; for(j=0;j<8;j++)
ANSEL = 0X00; {
ANSELH = 0X00; PORTC=a[j];
PORTD=vitri;
TRISD = 0X00; __delay_ms(3);
PORTD = 0X00; PORTD=0x00;
vitri = vitri << 1;
TRISC = 0X00; PORTD=0x00;
PORTC = 0X00; }
}
PORTC=0xFF; PORTD=0x00;
while (1);
}

You might also like