Giáo trình Vi điều khiển PIC

Chúng ta sẽ thấy rõ điều này hơn ở sau.

PIC16F877 có đặc điểm phần cứng và các chức năng:

- 368 bytes bộ nhớ dữ liệu RAM. 8K Words bộ nhớ chương trình

FLASH (trong đó mỗi word của dòng mid-range là 14bit), 256 bytes

EEPROM

- Có 3 bộ định thời Timer0, Timer1, Timer2

- Có khả năng xử lý ngắt từ nhiều nguồn ngắt khác nhau như ngắt

ngoài, ngắt tràn Timer, ngắt ngoại vi như ngắt ADC .

- Chức năng CCP gồm Comparator (Bộ so sánh), Capture và PWM

(ðiều biến độ rộng xung)

- Chức năng giao tiếp đồng bộ nối tiếp SSP (Synchnorous Serial Port)

bao gồm 2 giao tiếp SPI và giao tiếp I2C

- Chức năng bộ truyền/phát không đồng bộ đa năng nối tiếp USART

(Universal Serial Asynchnorous Receiver/Transmitter) ở dạng mô đun

phần cứng phục vụ cho giao tiếp theo chuẩn RS- 232, do đó ta không

cần quan tâm đến các thao tác cấp thấp khi sử dụng RS-232. ðây là

chức năng hữu ích trong việc giao tiếp với PC của MC

 

pdf 35 trang kimcuc 22922
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi điều khiển PIC", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Vi điều khiển PIC

Giáo trình Vi điều khiển PIC
Microcontroller Training Center 
DKS GROUP  
1
Microcontroller Training Center 
DKS GROUP  
2
MỤC LỤC 
Bài 1.Giới thiệu vi ñiều khiển PIC 4 
1.Giới thiệu các loại chip PIC 4 
2. Giới thiệu vi ñiều khiển PIC16F877 5 
3.Tổ chức bộ nhớ PIC16F877 8 
 3.1.Tổ chức bộ nhớ chương trình 8 
 3.2.Bộ nhớ dữ liệu 8 
 3.2.Một số thanh ghi quan trọng 8 
4.Lập trình cho PIC 9 
 4.1.Giới thiệu 18 
4.2.Phần mềm lập trình cho PIC 18 
4.3.Giới thiệu phần mềm CCS 18 
Bài 2.Giao tiếp vào ra IO 27 
 1.Giao tiếp IO 27 
1.1.Giới thiệu 27 
1.2.Các cổng vào ra 23 
 2.Sơ ñồ mạch 29 
 3.Lập trình 30 
 4.Nạp chương trình cho chip 35 
Bài 3.Giao tiếp với led 7 thanh 39 
 1.Nguyên lý 39 
 2.Nguyên lý hoạt ñộng 39 
Bài 4.Giao tiếp với bàn phím 42 
Microcontroller Training Center 
DKS GROUP  
3
1.Sơ ñồ nguyên lý 42 
2.Nguyên lý hoạt ñộng 42 
3.Mã nguồn 43 
4.Kỹ thuật chống rung 44 
Bài 5.Bộ chuyển ñổi ADC 46 
1.Sử dụng ADC với CCS 46 
2.Hàm hỗ trợ 46 
 Bài 6.ðiều chế ñộ rộng xung (PWM) 50 
1.ðôi nét về PWM 50 
2.Sơ ñồ khối PWM 52 
3.Hàm trong CCS 54 
Bài 7.Giao tiếp máy tính 58 
1.Giao tiếp RS-232 58 
2.Hàm hỗ trợ 58 
Bài 8.Giao tiếp I2C 64 
1.Giới thiệu chung 64 
2.ñặc ñiểm giao tiếp I2C 64 
3.Start ,stop 66 
4.ðịnh dạng dữ liệu truyền 67 
5.ðịnh dạng ñịa chỉ cho thiết bị 62 
6.Truyền dữ liệu trên bus I2C ,master-slave 69 
7.Chế ñộ Multi-master 72 
8.Modul I2C trong vi ñiều khiển PIC 72 
9.ñặc ñiểm phần cứng 72 
10.Cách sử dụng I2C trong CCS 73 
Bài 9.Giao tiếp LCD 74 
Microcontroller Training Center 
DKS GROUP  
4
1.Giới thiệu LCD 16x2 74 
2.LCD với CCS (4 bit) 80 
3.Ví dụ 82 
 Khái niệm vi ñiều khiển (microcontroller – MC) ñã khá quen thuộc với 
các sinh viên CNTT, ñiện tử, ñiều khiển tự ñộng cũng như Cơ ñiện tử Nó 
là một trong những IC thích hợp nhất ñể thay thế các IC số trong việc thiết 
kế mạch logic. Ngày nay ñã có những MC tích hợp ñủ tất cả các chức năng 
của mạch logic. Nói như vậy không có nghĩa là các IC số cũng như các IC 
mạch số lập trình ñược khác như PLD không cần dùng nữa. MC cũng có 
những hạn chế mà rõ ràng nhất là tốc ñộ chậm hơn các mạch logic MC 
cũng là một máy tính – máy tính nhúng vì nó có ñầy ñủ chức năng của một 
máy tính. Có CPU, bộ nhớ chương trình, bộ nhớ dữ liệu, có I/O và các bus 
trao ñổi dữ liệu. Cần phân biệt khái niệm MC với khái niệm vi xử lý 
(microprocessor – MP) như 8088 chẳng hạn. MP chỉ là CPU mà không có 
các thành phần khác như bộ nhớ I/O, bộ nhớ. Muốn sử dụng MP cần thêm 
các chức năng này, lúc này người ta gọi nó là hệ vi xử lý (microprocessor 
system). Do ñặc ñiểm này nên nếu ñể lựa chọn giữa MC và MP trong một 
mạch ñiện tử nào ñó thì tất nhiên người ta sẽ chọn MC vì nó sẽ rẻ tiền hơn 
nhiều do ñã tích hợp các chức năng khác vào trong chip. Trong phạm vi môn 
học kiến trúc máy tính, chúng em xin chọn một loại MC ñể tìm hiểu với mục 
ñích cuối cùng là hiểu hết các chức năng của MC này và thiết kế, lắp ráp 
một mạch ño nhiệt ñộ dùng MC. Có rất nhiều loại MC ñể lựa chọn như họ 
8051 của Atmel, Philips AVR của Atmel, dòng 68000 (32bit) của Motorola 
Ở ñây xin chọn PIC của hãng microchip (www.microchip.com) vì sự phổ 
biến của nó. Có một ñiều khá thú vị là trong sản phẩm trò chơi ñiện tử 
PlayStation của Sony cũng có PIC.Theo ñánh giá thì PIC là dòng MC 8 bit 
sử dụng nhiều nhất trên thế giới tại thời ñiểm năm 2006 này. Việt Nam có lẽ 
cũng không phải là một ngoại lệ. 
1.Giới thiệu các loại chip PIC 
 Như ñã nói ở phần trước, ở ñây ta sẽ chọn vi ñiều khiển PIC ñể tìm hiểu, 
tuy nhiên việc chọn loại nào trong họ này cũng là một ñiều cần quan tâm. 
PIC có rất nhiều dòng từ PIC12xx, PIC16xx, PIC18xx ñến dsPIC theo thứ 
tự ñộ phức tạp của từng dòng chip tăng lên, việc tìm hiểu chức năng của 
Microcontroller Training Center 
DKS GROUP  
5
từng dòng này nằm ngoài phạm vi kiến thức của chúng em do ñó ở ñây xin 
chọn loại cao nhất trong dòng 16 ñó là PIC16F877 (mid-range). Nó là loại vi 
ñiều khiển loại trung với kích cỡ 1 lệnh là 14 bit (dòng 12 kích cỡ lệnh là 
12bit, 18 có kích cỡ 16bit) 
Chữ F trong tên gọi thể hiện bộ nhớ chương trình ở ñây là bộ nhớ FLASH 
(có thể xoá và nạp lại xxxx lần) 
2. Giới thiệu về PIC16F877 
Hình 1.2.PIC16F877 
a.PIC16F877 mang tất cả các ñặc ñiểm chung của các dòng PIC. 
- Nó là máy tính có tập lệnh rút gọn (RISC). ðiều ñó có nghĩa là số lệnh của 
nó hạn chế ñến mức tối thiểu ( 35 lệnh). Tại sao là RISC lại có lợi và phát 
triển sau này? Như ta ñã biết ñể có thể thực hiện một chức năng nào ñó thì vi 
ñiều khiển cần phải thực hiện các lệnh trong bộ nhớ chương trình (code 
memory) ñược lưu dưới dạng các số nhị phân của nó bằng các bộ giải mã 
(decoder). ðiều ñó cũng có nghĩa là nếu MC càng có nhiều tập lệnh càng 
cần nhiều bộ decoder ñể giải mã. Như vậy số mạch giải mã tích hợp trong 
chip sẽ cần nhiều lên. ðiều này làm cho chip cần tiêu thụ nhiều năng lượng 
hơn cũng như chip sẽ dễ bị nóng hơn. Như vậy nếu như ứng dụng cần tiêu 
thụ ít năng lượng thì người ta sẽ chọn RISC. Và có lẽ một phần nguyên nhân 
là do mạch của nó ñơn giản hơn nên RISC như PIC chẳng hạn ñược mọi 
người ñánh giá là loại MC chống nhiễu tốt nhất trong dòng 8 bit. Tất nhiên 
Microcontroller Training Center 
DKS GROUP  
6
RISC cũng có ñiều không tốt, như ñể thực hiện một phép tính toán có thể 
phức tạp hơn một chút như lệnh nhân 2 số 8 bit hay chia số 16 bit cho 8 bit 
chẳng hạn thì cần viết các hàm cần một chút thủ thuật tính toán (ðó là nếu 
viết trực tiếp bằng ngôn ngữ Assembly còn nếu viết bằng các ngôn ngữ cấp 
cao như C thì sẽ không cần). Khi ñã xây dựng một trình dịch bằng ngôn ngữ 
C chẳng hạn thì những việc khó khăn về thuật toán hoàn toàn do trình biên 
dịch (compiler) xử lý nghĩa là nếu xét về mặt tốn công sức lập trình về các 
thuật toán thì RISC cũng xem không tốn công hơn so với CISC. Có thể hình 
dung chuyển từ CISC sang RISC là quá trình chuyển sự phức tạp từ phần 
cứng sang sự phức tạp về phần mềm. Trái lại CISC lại có số lượng các thanh 
ghi cũng như bộ nhớ ít hơn cần có ít hơn RISC vì: ðể thao tác một chức 
năng nào ñó CISC cần thao tác với số thanh ghi nhỏ hơn RISC. Ngoài ra bộ 
nhớ chương trình cũng giảm hơn rất nhiều. Tưởng tượng nếu RISC cần thực 
hiện 1 phép toán nào ñó mà cần 5 lệnh chẳng hạn. Thay vì ñó trong máy tính 
CISC người ta thiết kế một bộ giải mã lệnh ñể giải mã lệnh thay cho cả 5 
lệnh này, như vậy rõ ràng trong máy tính CISC cần có thêm 1 bộ giải mã 
lệnh nhưng mã nguồn lưu trữ trong chương trình lại giảm ñi ñược 1/5. Gần 
ñây lại xuất hiện xu hướng ngược lại là chuyển từ phần mềm về phần cứng 
và có lẽ sự lựa chọn tốt nhất trong tương lai sẽ là trung gian giữa hai loại ñể 
trung hoà các ñặc tính của cả RISC lẫn CISC. Chính vì là RISC nên các lệnh 
của PIC ñã ñược tối giản hoá, tất cả các lệnh trừ các lệnh thay ñổi con trỏ 
chương trình(Program Counter - PC) ñều tốn 1 chu kỳ máy ( các lệnh thay 
ñổi PC tốn 2 chu kỳ máy). ðiều này là khác với CISC có thể có những lệnh 
tốn nhiều chu kỳ máy vì thực ra bản thân lệnh của CISC ñó cũng có thể coi 
là bao gồm nhiều lệnh của RISC vậy. 
PIC là MC mang cấu trúc Havard là cấu trúc có các ñường bus dữ liệu và 
bus chương trình riêng lẻ. ðiều này làm cho chương trình có thể ñược thực 
hiện ñồng thời các thao tác giải mã thực hiện lệnh với các thao tác ñọc dữ 
liệu cùng lúc. ðiều này khác với cấu trúc Von Neumann có 2 ñường bus này 
chung do ñó cùng lúc chỉ thực hiện 1 công việc. (Vẽ sơ ñồ tìm nạp) . ðây là 
nguyên nhân làm cho cấu trúc Von neumann thực hiện 1 lệnh lâu hơn máy 
mang cấu trúc Harvard. Tất nhiên người ta chỉ thấy ñược cái lợi của cấu trúc 
Harvard khi mà công nghệ sản xuất chip ñã ñược phát triển lên. 
Cũng cần phải nhớ là MC ñã ñược phát triển từ những dòng ñời trước rồi và 
sau này nó có thêm các chức năng khác vào vậy một câu hỏi ñược ñặt ra là 
nếu không có các chức năng phần cứng này thì trước ñây người ta sẽ làm 
Microcontroller Training Center 
DKS GROUP  
7
thế nào ñể thực hiện các chức năng cần thiết? Thực tế người ta vẫn làm ñược 
các công việc ñó nhưng là bằng phần mềm. Người viết mã sẽ phải thực hiện 
các chức năng ñó bằng một số phương pháp nào ñấy. Còn khi tích hợp sẵn 
vào trong phần cứng rồi thì việc thực hiện sẽ ñơn giản hơn trước ñây. ðiều 
này có vẻ như lại ñi ngược với khuynh hướng ñã nêu ở trên ñối với các bộ 
giải mã lệnh. Quá trình giải mã lệnh chuyển từ phức tạp phần cứng sang 
phức tạp phần mềm. Còn quá trình thực hiện các chức năng khác lại chuyển 
từ phức tạp phần mềm sang phần cứng. Hai quá trình này không có gì mâu 
thuẫn với nhau mà ngược lại nó là một sự bổ sung cho nhau. Có thể sau này 
ta sẽ thấy rõ hơn ñiều này nhưng ở ñây xin ñược nói sơ qua nguyên nhân. 
Quá trình giải mã lệnh nếu như dùng trong RISC thì sự phức tạp phần mềm 
ở ñây ngoài các giải thuật (là ñiều không ñáng ngại vì qua thời gian các giải 
thuật này sẽ ñược tích luỹ dần dần cũng như xây dựng ñược các compiler 
ngôn ngữ cấp trung và cấp cao như C, Pascal) là khó khăn ra thì các phép 
tính cần những thứ trung gian thực hiện lúc này là bộ nhớ chính xác hơn là 
các thanh ghi (càng ngày càng rẻ và dễ chế tạo). Còn ở quá trình thực hiện 
các chức năng khác thì nếu không có phần cứng thêm vào thì các phần cứng 
hiện thời ñược sử dụng sẽ mất công vào việc này mà sẽ không thực hiện 
ñược việc khác. Chúng ta sẽ thấy rõ ñiều này hơn ở sau. 
PIC16F877 có ñặc ñiểm phần cứng và các chức năng: 
- 368 bytes bộ nhớ dữ liệu RAM. 8K Words bộ nhớ chương trình 
FLASH (trong ñó mỗi word của dòng mid-range là 14bit), 256 bytes 
EEPROM 
- Có 3 bộ ñịnh thời Timer0, Timer1, Timer2 
- Có khả năng xử lý ngắt từ nhiều nguồn ngắt khác nhau như ngắt 
ngoài, ngắt tràn Timer, ngắt ngoại vi như ngắt ADC. 
- Chức năng CCP gồm Comparator (Bộ so sánh), Capture và PWM 
(ðiều biến ñộ rộng xung) 
- Chức năng giao tiếp ñồng bộ nối tiếp SSP (Synchnorous Serial Port) 
bao gồm 2 giao tiếp SPI và giao tiếp I2C 
- Chức năng bộ truyền/phát không ñồng bộ ña năng nối tiếp USART 
(Universal Serial Asynchnorous Receiver/Transmitter) ở dạng mô ñun 
phần cứng phục vụ cho giao tiếp theo chuẩn RS- 232, do ñó ta không 
cần quan tâm ñến các thao tác cấp thấp khi sử dụng RS-232. ðây là 
chức năng hữu ích trong việc giao tiếp với PC của MC 
Microcontroller Training Center 
DKS GROUP  
8
- Bộ chuyển ñổi ADC 10 bit chuyển ñổi tín hiệu tương tự thành tín hiệu 
số 10 bit. Nguồn ñiện áp tham chiếu có thể chọn từ nguồn ngoài hoặc 
từ nguồn Vdd và Vss cấp cho PIC 
- Chức năng giao tiếp song song PSP (Parralel Slave Port) 
- Chức năng Watchdog Timer 
1. Tổ chức bộ nhớ 
2. Giao tiếp vào ra I/O 
3. Sử dụng Timer 
4. Ngắt 
5. Sử dụng EEPROM và FLASH ñể lưu tham số 
6. Môñun CCP (Capture/Compare/PWM) 
7. Bộ biến ñổi tương tự - số ADC 10bit, 8bit 
8. Giao tiếp không ñồng bộ với máy tính qua chuẩn RS-232 bằng 
USART 
9. Các giao tiếp nối tiếp ñồng bộ SPI và I2C 
10. Tóm gọn về tập lệnh 
ðể có thể có cách ñọc dễ hiểu, trong quá trình giới thiệu chi tiết các chức 
năng tích hợp trong chip, ta sẽ giới thiệu luôn các lệnh cần thiết tương ứng 
cần dùng. 
3.Tổ chức bộ nhớ của PIC 16F877 
3.1.Tổ chức bộ nhớ chương trình 
 Nhìn vào sơ ñồ bên ta có thể hình dung về bộ nhớ chương trình của 
PIC:Bộ nhớ chương trình có 8KWords (1 word = 14 bits) ñược phân 
thành 4 trang có ñịa chỉ như bên. Cần nhớ với con trỏ chương trình PC là 
13 bit thì kích cỡ ñịa chỉ tối ña ñánh ñược là 213 = 8K do ñó ta có thể 
thấy với dòng mid-range thì kích thước bộ nhớ chương trình PIC16F877 
ñã là tối ña có thể ñạt ñược ñến, với những loại kém hơn trong mid-range 
thì bộ nhớ ít hơn do ñó khi PC tăng vượt quá giá trị bộ nhớ của nó sẽ xảy 
ra hiện tượng quay vòng trở lại phần ñầu của bộ nhớ chương trình 
Có 8 stack. Stack là nơi ta lưu PC lúc cần phục vụ cho các thao tác ngắt 
cũng như chương trình con. Chỉ có 8 mức stack ñiều ñó có nghĩa là nếu 
có 9 lần ñẩy vào stack thì lần ñầu tiên sẽ bị mất ñịa chỉ trở về và chương 
trình sẽ bị chạy sai. PIC không có cờ ngắt báo xảy ra tràn stack. 
3.2.Bộ nhớ dữ liệu 
PIC là loại chip có bộ xử lý chỉ quản lý một không gian ñịa chỉ duy nhất, 
gọi là không gian ñịa chỉ bộ nhớ. 
Microcontroller Training Center 
DKS GROUP  
9
Bộ nhớ dữ liệu phân thành 4 banks như hình bên phân thành hai vùng là 
vùng các thanh ghi trạng thái và ñiều khiển, vùng 2 là vùng các thanh ghi 
ña mục ñích. Nếu muốn thực hiện một chức năng nào ñó thông thường ta 
cần thao tác với các thanh ghi ñiều khiển ñể thiết lập một số cài ñặt cần 
thiết, còn vùng các thanh ghi ña mục ñích GPR (General Purpose 
Register) thường ñể lưu các biến trung gian phục vụ cho các thao tác tính 
toán. Microchip xem vùng không gian nhớ RAM như là các thanh ghi 
mặc dù chức năng của nó thực sự không phải như các thanh ghi, nó chỉ 
dùng ñể chứ dữ liệu. Nếu muốn thao tác với thanh ghi nào trước tiên ta 
phải xem nó thuộc bank nào trong 4 bank sau ñó ta phải chuyển ñến bank 
ñó bằng cách thao tác với 2 bít RP1 và RP0 của thanh ghi trạng thái 
STATUS như bảng dưới với các lệnh 
BCF STATUS, RP1 
BSF STATUS, RP0 
sẽ chuyển về bank 1. 
Các tên STATUS, RP1, RP0 khi dịch ra không có ý nghĩa gì với PIC mà 
nó chỉ là các tên ñịnh danh ñã ñược khai báo trong tệp tiêu ñề (mà ta sẽ 
phải include ở ñầu chương trình) của MPASM (Trình biên dịch 
assembler) tương ứng với giá trị ñịa chỉ của thanh ghi ñó, cũng có thể 
chuyển các bank bằng cách sử dụng macro ñã ñược trình biên dịch hợp 
ngữ BANKSEL. 
Nếu ta viết 
BCF 0x03, 6 
BSF 0x03, 5 
Thì cũng hoàn toàn tương ñương với lệnh trên (lúc này không cần thiết 
include nữa) 
3.3.Một số thanh ghi quan trọng 
 a) Thanh ghi trạng thái 
 Cũng giống như tất cả các bộ vi xử lý khác, ở ñây ta có thanh ghi trạng 
thái STATUS tại các ñịa chỉ 03h, 83h,103h, 183h nằm ở cả 4 bank. 
Thanh ghi trạng thái có ñịa chỉ tại 4 bank ñể ta có thể tiện trong quá trình 
thao tác, hơn nữa ngay bản thân các bit xác ñịnh vị trí bank cũng nằm 
trong thanh ghi trạng thái 
IRP: Bit lựa chọn bank ñược dùng trong chế ñộ truy nhập ñịa chỉ gián 
tiếp 
Microcontroller Training Center 
DKS GROUP  
10
RP1:RP0 Bit lựa chọn bank ñược dùng trong chế ñộ truy nhập ñịa chỉ 
trực tiếp 
TO : Bit Time-out 
1 = Sau khi bật nguồn hoặc lệnh CLRWDT, hoặc lệnh SLEEP 
0 = 1 time-out của WDT xảy ra (WDT = watch dog timer) 
PD : Bit Power-down 
1 = Sau khi bật nguồn hoặc lệnh CLRWDT 
0 = Sự thực hiện lệnh SLEEP 
Z : Cờ trạng thái zero 
1 = Thao tác logic hoặc số học bằng 0 
0 = khác 0 
DC : Bit carry/borrow chữ số 
1 = carry từ 4 bit thấp 
0 = không carry từ 4 bit thấp 
C : Carry/borrow 
1 = carry từ bit MSb 
0 = không carry từ bit MSb 
b)Thanh ghi trạng thái OPTION 
Nó chức các bit ñiều khiển ñể cấu hình 
RBPU : Bit enable ñiện trở kéo lên ở PORTB 
INTEDG : Bit xác ñịnh cạnh lên của ngắt ngoài tại chân RB0/INT 
T0CS : Bit lựa chọn nguồn clock của timer0 
T0SE : ............ 
PSA: Bit gán tỷ lệ Prescaler 
1 = Gán cho WDT 
0 = Gán cho môñun Timer0 
PS2:PS0 Bit lựa chọn tỷ lệ gán 
c)Thanh ghi INTCON(Thanh ghi ñiều khiển ngắt chung) 
GIE : Bit enable tất cả các nguồn ngắt, nếu muốn disable tất cả các nguồn 
ngắt chỉ cần disable nguồn ngắt này, còn nếu enable 1 nguồn ngắt nào ñó 
thì enable bit này sẽ là lệnh cuối cùng 
PEIE: Bit enable các ngắt ngoại vi 
TMR0IE: Bi ... ining Center 
DKS GROUP  
21
4.3.3. Tab Other 
Tab này cho phép ta thiết lập các thông số cho các bộ 
Capture/Comparator/PWM. 
Capture - Bắt giữ 
- Chọn bắt giữ xung theo sườn dương (rising edge) hay sườn âm (falling 
edge) của xung vào 
- Chọn bắt giữ sau 1, 4 hay 16 xung (copy giá trị của TimerX vào thanh ghi 
lưu trữ CCCPx sau 1, 4 hay 16 xung). 
Compare - So sánh 
- Ta có các lựa chọn thực hiện lệnh khi xảy ra bằng nhau giữa 2 ñối tượng so 
sánh là giá trị của Timer1 với giá trị lưu trong thanh ghi ñể so sánh. Bao 
gồm: 
o Thực hiện ngắt và thiết lập mức 0 
o Thực hiện ngắt và thiết lập mức 1 
Microcontroller Training Center 
DKS GROUP  
22
o Thực hiện ngắt nhưng không thay ñổi trạng thái của chân PIC. 
o ðưa Timer1 về 0 nhưng không thay ñổi trạng thái chân. 
PWM - ðiều chế ñộ rộng xung 
- Lựa chọn về tần số xung ra và duty cycle. Ta có thể lựa chọn sẵn hay tự 
chọn tần số,tất nhiên tần số ra phải nằm trong một khoảng nhất ñịnh. 
Comparator - So sánh ñiện áp 
- Lựa chọn mức ñiện áp so sánh Vref. Có rất nhiều mức ñiện áp ñể ta lựa 
chọn. Ngoài ra ta còn có thể lựa chọn cho ñầu vào của các bộ so sánh. 
4.3.4.Tab Interrupts và Tab Driver 
Tab Interrupts cho phép ta lựa chọn nguồn ngắt mà ta muốn sử dụng. Tùy 
vào từng loại PIC mà số lượng nguồn ngắt khác nhau, bao gồm: ngắt ngoài 
0(INT0), ngắt RS232,ngắt Timer, ngắt I2C-SPI, ngắt onchange PORTB.v.v 
Tab Drivers ñược dùng ñể lựa chọn những ngoại vi mà trình dịch ñã hỗ trợ 
các hàm giao tiếp. ðây là nhưng ngoại vi mà ta sẽ kết nối với PIC, trong các 
IC mà CCS hỗ trợ, ñáng chú ý là các loại EEPROM như 2404, 2416, 2432, 
Microcontroller Training Center 
DKS GROUP  
23
9346, 9356Ngoài ra còn có IC RAM,PCF8570, IC thời gian thực DS1302, 
Keypad 3x4, LCD, ADC Chi tiết ta có thể xem trong 
- thư mục Driver của chương trình: \...\PICC\Drivers 
Hình 2.7: Tab Interrupts 
Microcontroller Training Center 
DKS GROUP  
24
Hình 2.8: Tab Driver 
Sau các bước chọn trên, ta nhấn OK ñể kết thúc quả trình tạo một Project 
trong CCS,một Files ten_project.c ñược tạo ra, chứa những khai báo cần 
thiết cho PIC trong một Files 
ten_project.h. Dưới ñây là nội dung một files chương trình mẫu. 
#include D:\1-PIC project\chuong trinh test.HEX.h 
#int_EXT 
EXT_isr() 
{ 
// Code here 
} 
Void Chuong_trinh_con() 
{ 
// Code here 
} 
void main() 
{ 
setup_adc_ports(AN0); 
Microcontroller Training Center 
DKS GROUP  
25
setup_adc(ADC_CLOCK_INTERNAL); 
setup_psp(PSP_DISABLED); 
setup_spi(FALSE); 
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); 
setup_timer_2(T2_DISABLED,0,1); 
setup_comparator(NC_NC_NC_NC); 
setup_vref(FALSE); 
enable_interrupts(INT_EXT); 
enable_interrupts(INT_TBE); 
enable_interrupts(INT_RDA); 
enable_interrupts(GLOBAL); 
// Enter your code here 
} 
Chuong_trinh_mau.h 
#include 
#device adc=8 
#FUSES NOWDT,HS,NOPUT,NOPROTECT,NODEBUG, 
#use delay(clock=20000000) 
#define SRAM_SCL PIN_C3 
#define SRAM_SDA PIN_C4 
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=9) 
4.3.5. Mẫu chương trình chuẩn cho lập trình CCS 
 Phần trên ta ñã tìm hiểu cách tạo một Project trong CCS, tuy nhiên theo 
cách ñó mất khá nhiều thời gian, mặt khác mỗi người lập trình sẽ tạo ra 
nhưng form tài liệu theo cách riêng khác nhau, không ñồng nhất. Tài liệu 
không ñược chuẩn hóa sẽ gây một số khó khăn cho người ñọc, người ñọc có 
thể không hiểu hết những gì mà người lập trình muốn diễn ñạt.Với mục ñích 
ñưa ra một form tài liệu chuẩn cho việc lập trình bằng CCS, qua tham khảo 
bản mẫu cho lập trình bằng ASM của anh Falleaf trên diễn ñàn 
WWW.PICVIETNAM.COM .Tôi ñưa ra ñây một form tài liệu cho việc viết 
lập trình bằng CCS. ði kèm văn bản này còn có các files nguồn cho văn bản 
mẫu, bao gồm files cho PIC16F877A, 16F876A, 16F88. Về sau khi lập trình 
bạn chỉ việc copy tài liệu này vào thư mục chứa Project của bạn, sửa ñổi tên 
files.Khi cần thay ñổi nội dung cấu hình cho PIC bạn chi việc tham khảo qua 
PIC Wizard , xem code và copy ñưa vào Project. 
Microcontroller Training Center 
DKS GROUP  
26
Mô tả nội dung chương trình. 
- #include 16f877a.h : ði kèm chương trình dịch, chứa khai báo về các 
thanh ghi trong mỗi con PIC, dùng cho việc cấu hình cho PIC. 
- #include def_877a.h: Files do người lập trình tạo ra, chứa khai báo về các 
thanh ghi trong PIC giúp cho viêc lập trình ñược dễ dang hơn ví dụ ta co thể 
gán PORTB =0xAA (chi tiết files này sẽ trình bày trong phần dưới ñây) 
- #device *=16 ADC = 10: Khai báo dùng con trỏ 8 hay 16 bit, bộ ADC là 8 
hay 10 bit 
- #FUSES NOWDT, HS: Khai báo về cấu hình cho PIC 
- #use delay(clock=20000000): Tần số thạch anh sử dụng 
- #use rs232 (baud=9600,): Khai báo cho giao tiếp nối tiếp RS232 
- #use i2c(master, SDA=PIN_C4,): Khai báo dùng I2C, chế ñộ hoạt 
ñộng 
- #include :Khai báo các files thư viện ñược sử dụng ví dụ 
LCD_lib_4bit.c 
- #INT_xxx : Khai báo ñịa chỉ chương trình phục vụ ngắt 
- Void tên_chương_trình (tên_biến) {}: Chương trình chính hay chương 
trình con 
Chương trình mẫu cho PIC16F877A 
//================================================= ======= 
// Ten chuong trinh : Mach test den LED_1 
// Nguoi thuc hien : Falleaf 
// Ngay thuc hien : 23/05/2005 
// Phien ban : 1.0 
// Mo ta phan cung : Dung PIC16F877A - thach anh 20MHz 
// : LED giao tiep voi PORTB 
// : Cuc am cua LED noi voi GND 
// : RB0 - RB7 la cac chan output 
//---------------------------------------------------------------- 
// Ngay hoan thanh : 23/05/2005 
// Ngay kiem tra : 23/05/2005 
// Nguoi kiem tra : Doan Hiep 
//---------------------------------------------------------------- 
// Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau 
// : hoac cac chu thich khac 
// : vd, dung che do Power On Reset, PORTB = 00000000 
// : hoac, chuong trinh viet cho PIC Tutorial 
// : hoac, chuong trinh nay hoan toan mien phi va co the dung cho 
// : moi muc dich khac nhau 
//================================================= ======= 
Microcontroller Training Center 
DKS GROUP  
27
#include 
#include 
#device *=16 ADC=8 
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP 
#use delay(clock=20000000) 
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) 
#use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) 
#int_xxx // Khai bao chuong trinh ngat 
xxx_isr() { 
// Code here 
} 
void Ten_chuong_trinh_con(Ten_Bien) { 
// Code here 
} 
void main() { 
// Enter code here! 
} 
Người báo cáo: Nguyễn Chí Linh Tài liệu: TUT01.01.PVN 
Ngày: 4/2/2006 Trang: 12/32 
Chương trình mẫu cho PIC16F876A 
//================================================= 
======= 
// Ten chuong trinh : Mach test den LED_1 
// Nguoi thuc hien : Falleaf 
// Ngay thuc hien : 23/05/2005 
// Phien ban : 1.0 
// Mo ta phan cung : Dung PIC16F876A - thach anh 20MHz 
// : LED giao tiep voi PORTB 
// : Cuc am cua LED noi voi GND 
// : RB0 - RB7 la cac chan output 
//---------------------------------------------------------------- 
// Ngay hoan thanh : 23/05/2005 
// Ngay kiem tra : 23/05/2005 
// Nguoi kiem tra : Doan Hiep 
//---------------------------------------------------------------- 
// Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau 
// : hoac cac chu thich khac 
// : vd, dung che do Power On Reset, PORTB = 00000000 
// : hoac, chuong trinh viet cho PIC Tutorial 
// : hoac, chuong trinh nay hoan toan mien phi va co the dung cho 
// : moi muc dich khac nhau 
//================================================= 
======= 
Microcontroller Training Center 
DKS GROUP  
28
#include 
#include 
#device *=16 ADC=8 
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, 
NOWRT 
#use delay(clock=20000000) 
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) 
#use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) 
#int_xxx // Khai bao chuong trinh ngat 
xxx_isr() { 
// Code here 
} 
void Ten_chuong_trinh_con(Ten_Bien) { 
// Code here 
} 
void main() { 
// Enter code here! 
} 
Chương trình mẫu cho PIC16F88 
//================================================= =======A 
// Ten chuong trinh : Mach test den LED_1 
// Nguoi thuc hien : Falleaf 
// Ngay thuc hien : 23/05/2005 
// Phien ban : 1.0 
// Mo ta phan cung : Dung PIC16F88 - thach anh 20MHz 
// : LED giao tiep voi PORTB 
// : Cuc am cua LED noi voi GND 
// : RB0 - RB7 la cac chan output 
//---------------------------------------------------------------- 
// Ngay hoan thanh : 23/05/2005 
// Ngay kiem tra : 23/05/2005 
// Nguoi kiem tra : Doan Hiep 
//---------------------------------------------------------------- 
// Chu thich : Mo ta cac diem khac nhau cua cac phien ban khac nhau 
// : hoac cac chu thich khac 
// : vd, dung che do Power On Reset, PORTB = 00000000 
// : hoac, chuong trinh viet cho PIC Tutorial 
// : hoac, chuong trinh nay hoan toan mien phi va co the dung cho 
// : moi muc dich khac nhau 
//================================================= ======= 
#include 
Microcontroller Training Center 
DKS GROUP  
29
#include 
#device *=16 ADC=8 
#FUSES NOWDT, HS, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG 
#use delay(clock=20000000) 
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bits=9) 
#use i2c(Master,Fast,sda=PIN_B1,scl=PIN_B4) 
#int_xxx // Khai bao chuong trinh ngat 
xxx_isr() { 
// Code here 
} 
void Ten_chuong_trinh_con(Bien) { 
// Code here 
} 
void main() { 
// Enter code here! 
} 
1. Giao tiếp vào ra I/O 
 1.1.Giới thiệu 
Thông thường, trong một hệ vi xử lý, người ta lại phải ghép nối chip vi xử lý 
với các mô ñun vào ra, tuy nhiên với tất cả các loại vi ñiều khiển ñều tích 
hợp mô ñun vào ra vào trong chip. Bởi vì có thể nói, thao tác vào ra là thao 
tác quan trọng nhất mà bất cứ vi ñiều khiển nào cần có 
 1.2.Các cổng vào ra trong PIC16F877 
ðể giảm bớt số chân ra, một số chân của PIC là các chân ña chức năng, nó 
phục vụ cho các thiết bị ngoại vi. Ở ñây khái niệm thiết bị ngoại vi không có 
nghĩa là 1 chip khác mua rời bên ngoài mà là các mô ñun ñược tích hợp sẵn 
trong chip như các mô ñun ADC.... Khi các thiết bị ngoại vi này ñược enable 
thì các chân này không ñược sử dụng như các chân của các cổng I/O thông 
thường nữa. 
PIC16F877 có 5 cổng vào ra là PORTA, PORTB, PORTC, PORTD, 
PORTE, tương ứng với nó là các thanh ghi cấu hình TRISA, TRISB, 
TRISC, TRISD, TRISE. Trong PIC, các ngăn nhớ trong RAM ñược gọi là 
các thanh ghi, tất nhiên thực tế thì không ñúng bởi vì các thanh ghi ñược 
xem là các thành phần của CPU, còn các ngăn nhớ lại thuộc bộ nhớ. 
1.3.Thanh ghi PORTA(bank0) và TRISA(bank1) 
Microcontroller Training Center 
DKS GROUP  
30
PORTA có 6 bit, 2 hướng (vào và ra). Các bit cấu hình hướng nằm trong 
thanh ghi TRISA, nếu bit tương ứng bằng 0 thì bit ñó là output và ngược lại 
sẽ là input. 
Việc ñọc nội dung của thanh ghi PORTA sẽ ñọc các trạng thái của các chân, 
trong khi ghi lên PORTA thì sẽ ghi lên chốt cổng. Mặt khác, tất cả các hoạt 
ñộng ghi ñều là hoạt ñộng ñọc-sửa-ghi (read-modify-write). Do ñó ghi ñến 1 
cổng nghĩa là các chân của cổng ñược ñọc, giá trị ñược sửa và sau ñó ghi lại 
lên chốt dữ liệu của cổng. 
Chân RA4 ñược dồn kênh với ñầu vao clock của mô ñun Timer0 gọi là chân 
RA4/T0CKI. Chân này là 1 ñầu vào Trigger-Schmitt và ñầu ra hở máng. Tất 
cả các chân PORTA khác có mức ñiện áp ñầu vào theo mức TTL, còn ñiện 
áp ddaauf ra theo mức CMOS. 
Các chân PORTA khác ñược dồn kênh với các ñầu vào analog và ñầu vào 
ñiện áp tham chiếu analog Vref cho cả mô ñun ADC và Bộ so sánh 
bộ biến ñổi tương tự số ADC 10 bit, 8bit. Hoạt ñộng của các chân này ñược 
lựa chọn bằng cách set/clear các bit ñiều khiển thích hợp trong ADCON1 và 
CMCON.Thanh ghi TRISA ñiều khiển hướng của các chân của cổng ngay 
cả khi các chân này ñược sử dụng như ñầu vào analog. ðể nó là ñầu vào 
analog thì bit tương ứng của TRISA cũng phải set 
ðoạn mã sau khởi tạo PORTA 
BCF STATUS, RP0 
BCF STATUS, RP1 ; Chuyển về bank0 chứa PORTA 
CLRF PORTA 
BSF STATUS, RP1 ; Về bank 1 
MOVLW 0X06 
MOVWF ADCON1 ; Cấu hình tất cả các chân là digital 
MOVLW 0XCF 
MOVWF TRISA ; RA là output, RA input 
1.2.Thanh ghi PORTB và TRISB 
PORTB là thanh ghi 8 bit, 2 hướng. Quan hệ với TRISB cũng tương tự 
PORTA. 
Các chân của PORTB ñược dồn kênh với 1 số chức năng ñặc biệt khác và 
các chức năng debug ngay trong mạch (không phải gỡ chip ra khỏi mạch), 
và chức năng lập trình ở chế ñộ ñiện áp thấp: RB3/PGM, RB6/PGC, 
RB7/PGD. ðây là những chức năng ñặc biệt của CPU. 
Microcontroller Training Center 
DKS GROUP  
31
Mỗi chân của PORTB có 1 ñiện trở kéo lên nhỏ bên trong. Một bit ñiều 
khiển dùng ñể “bật” (enable) tất cả các ñiện trở này lên, ñây chính là chức 
năng của bit RBPU trong thanh ghi OPTION. ðiện trở này ñược tự ñộng 
disable khi cổng này ñược cấu hình làm output. 
RB0/INT là chân dồn kênh với ngắt ngoài mà ta sẽ miêu tả trong phần ngắt 
1.3 Thanh ghi PORTC và TRISC 
PORTC là thanh ghi 8 bit, 2 hướng. Có bộ ñệm ñầu vào Trigger Schmitt. Nó 
cũng ñược dồn kênh với vài chức năng ñặc biệt khác. 
1.4 Thanh ghi PORTD và TRISD 
Là cổng 8 bit, 2 hướng. có bộ ñệm ñầu vào Trigger Schmitt 
Nó dồn kênh thêm với chức năng giao tiếp cổng song song Slave (parallel 
Slave Port) bằng cách thiết lập bit ñiều khiển PSPMODE (TRISE) 
1.5 Thanh ghi PORTE và TRISE 
Có 3 chân, có bộ ñệm ñầu vào kiểu Trigger Schmitt. Dồn kênh với các ñầu 
vào analog mà ta sẽ xem xét trong phần ADC. TRISE do còn thừa 5 bit 
không sử dụng trong cấu hình PORTE do ñó các bit thừa này ñược dùng ñể 
cấu hình các chức năng khác như chức năng cổng song song PSP. 
2.Sơ ñồ mạch 
ðây là sơ ñồ mạch giao tiếp với Led ñơn dùng cho PIC 16F877A 
Microcontroller Training Center 
DKS GROUP  
32
3. Lập trình 
Bài học này sẽ hướng dẫn các bạn cách lập trình ñiều khiển các con led nhấp 
nháy. 
Các bạn thực hành theo các bước sau: 
-Khởi ñộng phần mềm CCS , click vào project /wizard,,rồi gõ tên project cần 
tạo. 
Màn hình sẽ hiển thị bảng thông số cho phép bạn lựa chọn 
Bạn có thể lựa chọn các thông số tuỳ ý , như chọn device (chọn loại chip 
ñược sử dụng) 16F877A ,tần số thạch anh 20MHZ .Ngoài ra còn các thông 
số khác như driver , I/O pin ,timer .communication. 
Microcontroller Training Center 
DKS GROUP  
33
Sau khi thiết lập các thông số ,bạn click ok ,ñể bước vào màn hình soạn 
thảo chương trình. 
Microcontroller Training Center 
DKS GROUP  
34
Soạn thảo mã nguồn như sau 
#include "E:\nguyencan\DKS\led.h" 
#fuses NOWDT,NOPROTECT,HS 
#use delay(clock=20000000) 
void main() 
{ 
 set_tris_b(0x00); 
 while(1) 
 { 
 output_high(PIN_B0); 
 delay_ms(1000); 
 output_low(PIN_B0); 
 delay_ms(1000); 
 } 
Microcontroller Training Center 
DKS GROUP  
35
} 
ñoạn mã trên có tác dụng lập trình ñể con led nối với chân RB0 bật tắt liên 
tục. 
Giải thích các lệnh trong chương trình 
#fuses NOWDT,NOPROTECT,HS 
Lệnh này cho phép chọn các chế ñộ lập trình NOWDT là không chọn chế ñộ 
watchdog ,NOPROTECT là không có chế ñộ bảo vệ mã nguồn.HS là dao 
ñộng thạch anh. 
#use delay(clock=20000000) 
Hàm này chọn chế ñộ delay theo tần số thạch anh là 20MHZ 
void main() 
{ 
set_tris_b(0x00); 
 while(1) 
 { 

File đính kèm:

  • pdfgiao_trinh_vi_dieu_khien_pic.pdf