1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển

139 12 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tổng Quan Về Vi Điều Khiển
Trường học Trường Đại Học Sư Phạm Kỹ Thuật Hưng Yên
Chuyên ngành Công Nghệ Thông Tin
Thể loại Tài Liệu
Định dạng
Số trang 139
Dung lượng 5,16 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Kiến trúc Von-Neumann và kiến trúc Havard Đối với kiến trúc Von-Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đĩ ta cĩ thể tổ chức, cân đối một cách linh h

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN

LẬP TRÌNH VI ĐIỀU KHIỂN

TRÌNH ĐỘ ĐÀO TẠO: ĐẠI HỌC

(INFORMATION TECHNOLOGY)

Trang 2

MỤC LỤC

Bài 1: TỔNG QUAN VỀ VI ĐIỀU KHIỂN 6

1.1 Tổng quan về vi điều khiển 6

1.1.1 Sơ đồ tổng quan 6

1.1.2 Một số dòng vi điều khiển phổ biến 7

1.2 Vi điều khiển PIC/PIC 16F877A 8

1.2.1 Kiến trúc PIC 9

1.2.2 RISC và CISC 9

1.2.3 Các dòng PIC 10

1.2.4 PIC 16F877A 11

1.2.4.1 Sơ đồ chân/sơ đồ khối 11

1.2.4.2 Tổ chức không gian bộ nhớ 13

1.3 Quy trình phát triển ứng dụng trên vi điều khiển 16

1.3.1 Ngôn ngữ lập trình 17

1.3.2 Mạch nạp 17

1.3.3 Lập trình cho PIC trên CCS 18

1.4 Quy trình phát triển ứng dụng 19

Bài 2: CỔNG VÀO RA CỦA PIC 16F877A 21

2.1 Các cổng vào ra (nhập/xuất) 21

2.1.1 PORT A 21

2.1.2 PORT B 23

24

2.1.3 PORT C 25

2.1.4 PORT D 26

2.1.5 PORT E 28

2.2 Lập trình điều khiển 29

2.2.1 Các lệnh vào ra trong CCS 29

2.2.1.1 Các hàm sử lý bít và phép toán 29

2.2.1.2 Các hàm vào ra 30

2.2.2 Bài tập áp dụng 35

Bài 3: THỰC HÀNH: LẬP TRÌNH ĐIỀU KHIỂN VÀO RA 36

Trang 3

Bài 4: LẬP TRÌNH HIỂN THỊ 37

4.1 Tổng quan về led 7 thanh 37

4.2 Kỹ thuật lập trình 38

4.2.1 Phương pháp xuất dữ liệu trực tiếp 40

4.2.2 Phương pháp Quét Led 43

4.3 Tổng quan về LCD 46

4.4 Lập trình với LCD 51

4.4.1 Lập trình với Assembly 51

4.5 Lập trình với LCD 4 bit 53

4.6 Lập trình với LCD 8 bit 55

Bài 5: THỰC HÀNH: LẬP TRÌNH HIỂN THỊ 58

Bài 6: BỘ TIMER/COUTER 59

6.1 Tổng quan về bộ timer/counter 59

6.2 Hoạt động của bộ timer/counter 59

6.3 Các bộ timer/counter 61

6.3.1 Bộ timer 0 61

6.3.2 Bộ timer 1 64

6.3.3 Bộ TIMER 2 68

6.4 Lập trình với CCS 70

6.4.1 Các lệnh trong ccs 70

Bài 7: THẢO LUẬN VỀ BỘ ĐỊNH THỜI – BỘ ĐẾM 76

7.1 Bộ timer/counter 76

7.2 Câu hỏi và bài tập thảo luận 76

Bài 8: THỰC HÀNH VỀ BỘ ĐỊNH THỜI – BỘ ĐẾM 76

Bài 9: BỘ CHUYỂN ĐỔI TƯƠNG TỰ-SỐ 77

9.1 Tổng quan về ADC/DAC 77

9.1.1 Tổng quan 77

9.1.2 Chuyển đổi ADC 77

9.1.3 Một số khái niệm 77

9.1.4 Quy trình chuyển đổi AD 78

Trang 4

9.2 Bộ ADC trên PIC 84

9.2.1 Sơ đồ khối ADC 84

9.2.2 Quy trình chuyển đổi từ tương tự sang số bao gồm các bước sau: 84

9.2.3 Lựa chọn nguồn xung cho chuyển đổi ADC 85

9.3 Lập trình với CCS 86

Bài 10: THỰC HÀNH: LẬP TRÌNH BỘ CHUYỂN ĐỔI ADC 90

Bài 11: NGẮT TRÊN PIC 91

11.1 Tổng quan về ngắt 91

11.2 Ngắt trên PIC 91

11.2.1 Cấu trúc chương trình dung ngắt 94

11.2.2 Một số ngắt thường dùng 95

11.3 Lập trình ngắt với CCS 96

11.3.1 Các lệnh phục vụ ngắt 96

11.3.2 Ví dụ áp dụng 97

Bài 12: THỰC HÀNH: LẬP TRÌNH NGẮT 102

Bài 13: BỘ CCP 103

13.1 Bộ CCP 103

13.1.1 Capture 103

13.1.2 Bộ so sánh 103

13.1.3 Bộ PWM (Pulse Width Modulation) 106

13.2 Lập trình với CCS 109

Bài 14: THẢO LUẬN VỀ NGẮT/ADC/CCP 114

Bài 15: THỰC HÀNH: LẬP TRÌNH VỚI BỘ CCP 115

Bài 16: LẬP TRÌNH TRUYỀN THÔNG 116

16.1 Tổng quan 116

16.2 Chuẩn RS232 116

16.3 Lập trình với CCS 120

16.4 Chuẩn giao tiếp SPI 128

16.4.1 Tổng quan 128

16.4.2 Chuẩn SPI Trong vi điêu khiển PIC 16F877A 129

16.5 Chuẩn giao tiếp I2C 130

Trang 5

16.5.1 Giới thiệu chung về I2C 130

16.5.2 Đặc điểm giao tiếp I2C 131

16.5.3 Đặc điểm của giao tiếp I2C 131

16.5.4 START and STOP conditions 133

16.5.5 Định dạng truyền dữ liệu 134

16.5.6 Định dạng thiết bị chủ tớ 135

16.5.7 Truyền dữ liệu trên bus I2C, chế độ Master-Slave 136

16.6 Lập trình với CCS 138

Bài 17: THẢO LUẬN VỀ GIAO TIẾP NỐI TIẾP 139

Bài 18: THỰC HÀNH: LẬP TRÌNH GHÉP NỐI 139

Bài 19: THỰC HÀNH: LẬP TRÌNH TỔNG HỢP 139

Trang 6

Bài 1: TỔNG QUAN VỀ VI ĐIỀU KHIỂN 1.1 Tổng quan về vi điều khiển

1.1.1 Sơ đồ tổng quan

Vi điều khiển là một hệ thống bao gồm một vi xử lý có hiệu suất đủ dùng và giá thành thấp (khác với các bộ vi xử lý đa năng dùng trong máy tính) kết hợp với các khối ngoại vi như bộ nhớ, các mô đun vào/ra, các mô đun biến đổi số sang tương tự và tương tự sang số (hình 1.2) Ở máy tính thì các mô đun thường được xây dựng bởi các chíp và mạch ngoài hình 1.1)

Hình 1.1 Sơ đồ tổng quan của máy tính

Trang 7

Hình 1.2 Sơ đồ tổng quan của vi điều khiển 1.1.2 Một số dòng vi điều khiển phổ biến

❖ Họ vi điều khiển Atmel

o Dòng 8051 (8031, 8051, 8751, 8951, 8032, 8052, 8752, 8952)

o Dòng Atmel AT91 (Kiến trúc ARM THUMB)

o Dòng AT90, Tiny & Mega – AVR (Atmel Norway design)

o Dòng Atmel AT89 (Kiến trúc Intel 8051/MCS51)

o Dòng MARC4

❖ Họ vi điều khiển Microchip

o PIC 8-bit (xử lý dữ liệu 8-bit, 8-bit data bus)

▪ Từ lệnh dài 12-bit (Base-line): PIC10F, PIC12F và một vài PIC16F

▪ Từ lệnh dài 14-bit (Mid-Range và Enhance Mid-Range): PIC16Fxxx, PIC16F1xxx

▪ Từ lệnh dài 16-bit (High Performance): PIC18F

o PIC 16-bit (xử lý dữ liệu 16-bit)

▪ PIC điều khiển động cơ: dsPIC30F

▪ PIC có DSC: dsPIC33F

▪ Phổ thông: PIC24F, PIC24E, PIC24H

o PIC 32-bit (xử lý dữ liệu 32-bit): PIC32MX

Trang 8

❖ Họ vi điều khiển Freescale Semiconductor Từ năm 2004, những vi điều khiển này được phát triển và tung ra thị trường bởi Motorola

o Dòng 32-bit: 386EX, i960

❖ Họ vi điều khiển STMicroelectronics

Trang 9

1.2.1 Kiến trúc PIC

Cấu trúc phần cứng của một vi điều khiển được thiết kế theo hai dạng kiến trúc: kiến trúc Von Neuman và kiến trúc Havard Tổ chức phần cứng của PIC được thiết kế theo kiến trúc Havard Điểm khác biệt giữa kiếntrúc Havard và kiến trúc Von-Neuman

là cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình

Hình 1.3 Kiến trúc Von-Neumann và kiến trúc Havard

Đối với kiến trúc Von-Neuman, bộ nhớ dữ liệu và bộ nhớ chương trình nằm chung trong một bộ nhớ, do đó ta có thể tổ chức, cân đối một cách linh hoạt bộ nhớ chương trình và bộ nhớ dữ liệu Tuy nhiên điều này chỉ có ý nghĩa khi tốc độ xử lí của CPU phải rất cao, vì với cấu trúc đó, trong cùng một thời điểm CPU chỉ có thể tương tác với bộ nhớ dữ liệu hoặc bộ nhớ chương trình Như vậy có thể nói kiến trúc Von-Neuman không thích hợp với cấu trúc của một vi điều khiển

Đối với kiến trúc Havard, bộ nhớ dữ liệu và bộ nhớ chương trình tách ra thành hai bộ nhớ riêng biệt Do đó trong cùng một thời điểm CPU có thể tương tác với cả hai

bộ nhớ, như vậy tốc độ xử lí của vi điều khiển được cải thiện đáng kể Một điểm cần chú ý nữa là tập lệnh trong kiến trúc Havard có thể được tối ưu tùy theo yêu cầu kiến trúc của vi điều khiển mà không phụ thuộc vào cấu trúc dữ liệu Ví dụ, đối với vi điều khiển dòng 16F, độ dài lệnh luôn là 14 bit (trong khi dữ liệu được tổ chức thành từng byte), còn đối với kiến trúc Von-Neuman, độ dài lệnh luôn là bội số của 1 byte (do dữ liệu được tổ chức thành từng byte) Đặc điểm này được minh họa cụ thể trong hìnhVon Neuman và kiến trúc Havard

1.2.2 RISC và CISC

Trang 10

VonNeuman Khái niệm này được hình thành nhằm cải tiến tốc độ thực thi của một vi điều khiển.Qua việc tách rời bộ nhớ chương trình và bộ nhớ dữ liệu, bus chương trình

và bus dữ liệu, CPU có thể cùng một lúc truy xuất cả bộ nhớ chương trình và bộ nhớ

dữ liệu, giúp tăng tốc độ xử lí của vi điều khiển lên gấp đôi Đồng thời cấu trúc lệnh không còn phụ thuộc vào cấu trúc dữ liệu nữa mà có thể linh động điều chỉnh tùy theo khả năng và tốc độ của từng vi điều khiển Và để tiếp tục cải tiến tốc độ thực thi lệnh, tập lệnh của họ vi điều khiển PIC được thiết kế sao cho chiều dài mã lệnh luôn cố định (ví dụ đối với họ 16Fxxxx chiều dài mã lệnh luôn là 14 bit) và cho phép thực thi lệnh trong một chu kì của xung clock ( ngoại trừ một số trường hợp đặc biệt như lệnh nhảy, lệnh gọi chương trình con … cần hai chu kì xung đồng hồ) Điều này có nghĩa tập lệnh của vi điều khiển thuộc cấu trúc Havard sẽ ít lệnh hơn, ngắn hơn, đơn giản hơn để đáp ứng yêu cầu mã hóa lệnh bằng một số lượng bit nhất định Vi điều khiển được tổ chức theo kiến trúc Havard 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 Vi điều khiển được thiết kế theo kiến trúc Von-Neuman 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ì mã lệnh của nó không phải là một

số cố định mà luôn là bội số của 8 bit (1 byte)

1.2.3 Các dòng PIC

Các kí hiệu của vi điều khiển PIC:

PIC12xxxx: độ dài lệnh 12 bit

PIC16xxxx: độ dài lệnh 14 bit

PIC18xxxx: độ dài lệnh 16 bit

C: PIC có bộ nhớ EPROM (chỉ có 16C84 là EEPROM)

F: PIC có bộ nhớ flash

LF: PIC có bộ nhớ flash hoạt động ở điện áp thấp

LV: tương tự như LF, đây là kí hiệu cũ

Bên cạnh đó một số vi điệu khiển có kí hiệu xxFxxx là EEPROM, nếu có thêm chữ A ở cuối là flash (ví dụ PIC16F877 là EEPROM, còn PIC16F877A là flash) Ngoài ra còn có thêm một dòng vi điều khiển PIC mới là dsPIC Ở Việt Nam phổ biến nhất là các họ vi điều khiển PIC do hãng Microchip sản xuất

Trang 11

❖ Cách lựa chọn một vi điều khiển PIC phù hợp:

Trước hết cần chú ý đến số chân của vi điều khiển cần thiết cho ứng dụng Có nhiều vi điều khiển PIC với số lượng chân khác nhau, thậm chí có vi điều khiển chỉ có

8 chân, ngoài ra còn có các vi điều khiển 28, 40, 44, … chân Cần chọn vi điều khiển PIC có bộ nhớ flash để có thể nạp xóa chương trình đượcnhiều lần hơn Tiếp theo cần chú ý đến các khối chức năng được tích hợp sẵn trong vi điều khiển, các chuẩn giao tiếp bên trong Sau cùng cần chú ý đến bộ nhớ chương trình mà vi điều khiển cho phép Ngoài ra mọi thông tin về cách lựa chọn vi điều khiển PIC có thể được tìm thấy trong cuốn sách “Select PIC guide” do nhà sản xuất Microchip cung cấp

Hình 1.4 Các dòng vi điều khiển PIC hiện nay

1.2.4 PIC 16F877A

1.2.4.1 Sơ đồ chân/sơ đồ khối

Trang 12

Hình 1.5 Sơ đồ chân của vi điều khiển PIC 16F877A

Trang 13

Hình 1.6: Sơ đồ khối của PIC 16F877A

1.2.4.2 Tổ chức khơng gian bộ nhớ

Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory)

a Bộ nhớ chương trình

Trang 14

Hình 1.7: Bộ nhớ chương trình của PIC 16F877A

Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash, dung lượng bộ nhớ 8K word (1 word = 14 bit) và được phân thành nhiều trang (từ page0 đến page 3 Như vậy bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192 lệnh (vì một lệnh sau khi mã hóa sẽ có dung lượng 1 word (14 bit)

Để mã hóa được địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương trình có dung lượng 13 bit (PC<12:0>) Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset vector) Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt vector)

Bộ nhớ chương trình không bao gồm bộ nhớ stack và không được địa chỉ hóa bởi

bộ đếm chương trình, bộ nhớ stack sẽ được đề cập cụ thể trong phần sau

b Bộ nhớ dữ liệu

Trang 15

Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank Đối với PIC16F877A bộ nhớ dữ liệu được chia ra làm 4 bank Mỗi bank có dung lượng 128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFG (Special FunctionRegister) nằm ở các vùngđịa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) nằm ở vùng địa chỉ còn lại trong bank Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như thanhghi STATUS) sẽ được đặt ở tất cà các bank của bộ nhớ dữ liệu giúp thuận tiện trong quátrình truy xuất và làm giảm bớt lệnh của chương trình Sơ đồ cụ thể của bộ nhớ dữ liệu của PIC 16F877A như hình 1.7

Trang 16

Hình 1.8 Bộ nhớ dữ liệu của PIC 16F877A

c Các thông số cơ bản

Đây là vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài

14 bit Mỗi lệnh đều được thực thi trong một chu kì xung clock Tốc độ hoạt động tối

đa cho phép là 20 MHz với một chu kì lệnh là 200ns Bộ nhớ chương trình 8Kx14 bit,

bộ nhớ dữ liệu 368x8 byte RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256x8 byte Số PORT I/O là 5 với 33 pin I/O

❖ Các đặc tính ngoại vi bao gồmcác khối chức năng sau:

o Timer0: Bộ đếm 8 bit với bộ chia tần số 8 bit

o Timer1: Bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa

vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep

o Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler

o Hai bộ Capture/so sánh/điều chế độ rông xung

o Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C

o Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ

o Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD,

WR, CS ở bên ngoài

o Đặc tính Analog: 8 kênh chuyển đổi ADC 10 bit

o Hai bộ so sánh

o Bên cạnh đó là một vài đặc tính khác của vi điều khiển như:

▪ Bộ nhớ flash với khả năng ghi xóa được 100.000 lần

▪ Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm

▪ Khả năng tự nạp chương trình với sự điều khiển của phần mềm

Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial

Programming)

▪ Watchdog Timer với bộ dao động trong

▪ Chức năng bảo mật mã chương trình

▪ Chế độ Sleep

▪ Có thể hoạt động với nhiều dạng Oscillator khác nhau

1.3 Quy trình phát triển ứng dụng trên vi điều khiển

Trang 17

1.3.1 Ngôn ngữ lập trình

Hợp ngữ (Assembly): Đây là một tập hợp các mã gợi nhớ để thực hiện một

chức năng nào đó Hợp ngữ là ngôn ngữ lập trình gần với ngôn ngữ máy nhất và mỗi dòng vi điều khiển đều luôn có một tập lệnh hợp ngữ nhất định Nhà sản xuất cũng bắt buộc phải có một trình biên dịch hợp ngữ dành riêng cho dòng vi điều khiển đó Ngôn ngữ cấp cao: Hầu hết các ngôn ngữ cấp cao dành cho các vi điều khiển

đều dừng lại ở ngôn ngữ C Tuy nhiên ở mỗi cấp độ khác nhau ngôn ngữ C cũng chia

ra nhiều dạng khác nhau Với PIC chúng ta có thể có những trình biên dịch ngôn ngữ

C dành riêng như sau: CCS, Hi-Tech C, C18, C30, C33,

Bộ trình biên dịch C18, C30, C33, … là bộ trình biên dịch được hãng Microchip thiết

kế chuyên dụng để lập trình cho vi điều khiển PIC và nó được đưa ra khi một dòng vi điều khiển PIC nào đó ra đời Chính vì đặc điểm này các trình biên dịch này rất phù hợp với việc lập trình cho dòng vi điều khiển mà nó hỗ trợ Đây là một dạng ngôn ngữ thao tác trên phần cứng, có thể can thiệp vào cấp thanh ghi của vi điều khiển để quy định chức năng của từng module căn bản trong vi điều khiển Đồng thời ngôn ngữ cũng hỗ trợ các hàm tính toán, cách khai báo, các cấu trúc lệnh của ngôn ngữ C căn bản Điều này giúp người lập trình dễ dàng hơn rất nhiều so với việc sử dụng hợp ngữ

mà vẫn đảm bảo hiểu rõ được cách thức làm việc của vi điều khiển ở mức thanh ghi

1.3.2 Mạch nạp

Các loại mạch nạp bản chất cũng chỉ là tạo ra được mức điện áp phù hợp trên các chân VSS, VDD, MCLR, để đưa PIC vào chế độ nạp, và truyền dữ liệu trên chân PGD

và PGC cho PIC Các mạch nạp thiết kế khác nhau chủ yếu là do khả năng điều chỉnh,

và ổn định điện áp, và cách thức truyền dữ liệu vào PIC Vì vậy, sự khác biệt chủ yếu giữa các mạch nạp, nằm ở chỗ nó có thể hỗ trợ nạp cho nhiều dòng PIC khác nhau hay không, ở khả năng điều chỉnh điện áp của PIC

Một số lại mạch nạp:

• Mạch nạp Olimex: PG1D, PG2C, PG3B, ICD1, ICD2, MCP_COM, MCP_USB

• Mạch nạp Microchip: PIC StartPlus, ICD2

• Mạch nạp GTP: GTP_Lite, GTP_USB

• Sản phẩm của PIC Việt Nam: PIC1 (cải tiến từ PG2C), PIC2 (cải tiến từ

Trang 18

1.3.3 Lập trình cho PIC trên CCS

// Code here

} void main() {

// Enter code here!

}

b 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 <tên_file.c> //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

c Ví dụ

#include <16f877a.h>

Trang 19

#include <def_877a.h>

#device *=16 ADC=8

#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,

NOLVP, NOCPD, NOWRT

#use delay(clock=20000000)

void main()

{

// Thiet lap che do cho PORTB

TRISB = 0x00; // Tat ca PORTB deu la cong xuat du lieu

PORTB = 0xFF;

While(1) { PORTB = 0;

delay_ms(250);

PORTB = 0xFF;

delay_ms(250);

} }

1.4 Quy trình phát triển ứng dụng

Quy trình phát triển ứng dụng trên vi điều khiển bao gồm các bước:

Bước 1: Viết chương trình cho vi điều khiển sử dụng ngôn ngữ Assembly hoặc

Trang 20

Hình 1.9: Quy trình phát triển ứng dụng trên vi điều khiển

Trang 21

Bài 2: CỔNG VÀO RA CỦA PIC 16F877A 2.1 Các cổng vào ra (nhập/xuất)

Cổng vào ra (I/O port) chính là phương tiện mà vi điều khiển dùng để tương tác với thế giới bên ngoài Sự tương tác này rất đa dạng và thông qua quá trình tương tác

đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng Một xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và số lượng chân trong mỗi cổng có thể khác nhau Bên cạnh đó, do vi điều khiển được tích hợp sẵn bên trong các đặc tính giao tiếp ngoại

vi nên bên cạnh chức năng là cổng xuất nhập thông thường, một số chân xuất nhập còn

có thêm các chức năng khác để thể hiện sự tác động của các đặc tính ngoại vi nêu trên đối với thế giới bên ngoài Chức năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể được xác lập và điều khiển được thông qua các thanh ghi SFR liên quan đến chân xuất nhập đó Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB, PORTC, PORTD và PORTE

2.1.1 PORT A

PORTA (RPA) bao gồm 6 I/O pin (Hình 2.1) Đây là các chân “hai chiều” (bidirectional pin), nghĩa là có thể xuất và nhập được Chức năng I/O này được điều khiển bởi thanh ghi TRISA(địa chỉ 85h)

Muốn xác lập chức năng của một chân trong PORTA là input, ta “set” bit điều khiển tương ứng với chân đó trong thanh ghi TRISA và ngược lại, muốn xác lập chức năng của một chân trong PORTA là output, ta “clear” bit điều khiển tương ứng với chân đó trong thanh ghi TRISA Thao tác này hoàn toàn tương tự đối với các PORT và các thanh ghi điều khiển tương ứng TRIS (đối với PORTA là TRISA, đối với PORTB

là TRISB, đối với PORTClà TRISC, đối với PORTD là TRISD và đối với PORTE là TRISE)

Bên cạnh đó PORTA còn là ngõ ra của bộ ADC, bộ so sánh, ngõ vào analog ngõ vào xung clock của Timer0 và ngõ vào của bộ giao tiếp MSSP (Master Synchronous Serial Port) Đặc tính này sẽ được trình bày cụ thể trong phần sau

Các thanh ghi SFR liên quan đến PORTA bao gồm:

Trang 22

• TRISA (địa chỉ 85h) : điều khiển xuất nhập

• CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh

• CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp

Hình 2.1 Sơ đồ khối của Port A

Trang 23

❖ Các thanh ghi liên kết của PORT A

Bảng 2.1: Các thanh ghi liên kết của PORT A

❖ Bảng các chức năng của PORT A

Bảng 2.2: Các chức năng của PORT A

2.1.2 PORT B

PORTB (RPB) gồm 8 pin I/O Thanh ghi điều khiển xuất nhập tương ứng là TRISB Khi TRISB = 1 (set) thì Port B là port nhập và ngược lại khi TRISB = 0 (clear) thì Port B là port xuất

Bên cạnh đó một số chân của PORTB còn được sử dụng trong quá trình nạp chương trình cho vi điều khiển với các chế độ nạp khác nhau (RB3/PGM, RB6/PGC, RB7/PGD)

PORTB còn liên quan đến ngắt ngoại vi và bộTimer0 (RB7:RB4)

PORTB còn được tích hợp chức năng điện trở kéo lên được điều khiển bởi chương trình Bit điều khiển là RBPU =0 thì cho phép mở tất cả các điện trở kéo lên, khi Port B được thiết lập là ngõ ra thì sẽ tự động tắt chức năng này

Trang 24

• PORTB (địa chỉ 06h) : chứa giá trị các pin trong PORTB

• TRISB (địa chỉ 86h) : điều khiển xuất nhập

• OPTION_REG (địa chỉ 81h) : điều khiển ngắt ngoại vi và bộ Timer0

Hình 2.2: Sơ đồ khối của PORT B

❖ Các thanh ghi liên kết của Port B

Bảng 2.3: Các thanh ghi liên kết của Port B

❖ Các chức năng của Port B

Bảng 2.4: Các chức năng cảu Port B

Trang 25

2.1.3 PORT C

PORTC (RPC) gồm 8 pin I/O Thanh ghi điều khiển xuất nhập tương ứng là TRISC Khi TRISC = 1 (set) thì Port C là port nhập và ngược lại khi TRISC = 0 (clear) thì Port C là port xuất

Bên cạnh đó PORTC còn chứa các chân chức năng của bộ so sánh, bộ Timer1,

bộ PWM và các chuẩn giao tiếp nối tiếp I2C, SPI, SSP, USART

Các thanh ghi điều khiển liên quan đến PORTC:

• PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC

TRISC (địa chỉ 87h) : điều khiển xuất nhập

Trang 26

Hình 2.3: Sơ đồ khối của Port C

Các thanh ghi liên kết của Port C

Bảng 2.5: Các thanh ghi liên kết của Port C

Các chức năng của Port C

Bảng 2.6: Các chức năng của Port C

2.1.4 PORT D

PORTD (RPD) gồm 8 chân I/O, thanh ghi điều khiển xuất nhập tương ứng là

TRISD Khi TRISD = 1 (set) thì Port D là port nhập và ngược lại khi TRISD = 0

(clear) thì Port D là port xuất

PORTD còn là cổng xuất dữ liệu của chuẩn giao tiếp PSP (Parallel Slave Port)

Các thanh ghi liên quan đến PORTD bao gồm:

Trang 27

Thanh ghi PORTD : chứa giá trị các pin trong PORTD

Thanh ghi TRISD : điều khiển xuất nhập

Hình 2.4: Sơ đồ khối của PORT D

❖ Các thanh ghi liên kết của Port D

Bảng 2.7: Các thanh ghi liên kết của Port D

❖ Các chức năng của Port D

Bảng 2.8: Các chức năng của Port D

Trang 28

2.1.5 PORT E

PORTE (RPE) gồm 3 chân I/O Thanh ghi điều khiển xuất nhập tương ứng là TRISE Khi TRISD = 1 (set) thì Port E là port nhập và ngược lại khi TRISE = 0 (clear) thì Port E là port xuất

Các chân của PORTE có ngõ vào analog Bên cạnh đó PORTE còn là các chân điều khiển của chuẩn giao tiếp PSP

Các thanh ghi liên quan đến PORTE bao gồm:

• PORTE : chứa giá trị các chân trong PORTE

• TRISE : điều khiển xuất nhập và xác lập các thông số cho chuẩn giao tiếp PSP

ADCON1 : thanh ghi điều khiển khối ADC

Trang 29

Hình 2.5: Sơ đồ khối của Port E

Các thanh ghi liên kết của Port E

Bảng 2.9: Các thanh ghi liên kết của Port E

Các chức năng của Port E

Bảng 2.10: Các chức năng của Port D

2.2 Lập trình điều khiển

2.2.1 Các lệnh vào ra trong CCS

2.2.1.1 Các hàm sử lý bít và phép toán

a Hàm Bit_set, Bit_clear

Cú pháp: Bit_set (var, bit)

Chức năng: Dùng để thiết lập hoặc xóa vị trí bit trong var

var: biến 8, 16, 32 bit bất kỳ

Trang 30

Cú pháp: Bit_test (var, bit)

Tác dụng: Dùng để kiểm tra vị trí bit trong biến var

Hàm trả về 0 hay 1 là giá trị bit đó trong var

var: biến 8, 16, 32 bit

bit: vị trí bit trong var

Ví dụ:

Giả sử có biến x 32 bit đếm từ 0 lên và muốn kiểm tra xem nó có lớn hơn

4096 không (4096= 2^12 =1000000000000b) :

If (x >= 4096) // phép kiểm tra này mất ~5 us

Trong 1 vòng lặp, việc kiểm tra thường xuyên như vậy sẽ làm mất 1 thời gian đáng kể Để tối ưu, chỉ cần dùng:

If (bit_test (x, 12) ) : chỉ mất ~ 0 4 us (20 Mhz thạch anh)

Do đó việc kiểm tra đếm lên tới những giá trị đặc biệt (2^ i) thì dùng hàm này rất tiện lợi

c Hàm Swap

Cú pháp: Swap (var)

var: biến 1 byte

Hàm này đảo vị trí 4 bit trên với 4 bit dưới của var, tương đương var

Trang 31

a Hàm Output_low, Output_high

Cú pháp:

Output_low ( pin ) Output_high (pin ) Pin: Tên chân của vi điều khiển, ví dụ pin_A0, pin_A1 (tên được định nghĩa trong thư viện device.h)

Chức năng: Dùng thiết lập mức 0 ( low hay 0V ) hay mức 1 ( high hay 5V ) cho chân

IC Hàm này sẽ đặt pin làm ngõ ra, có độ dài 2-4 chu kỳ máy (cũng có thể xuất xung dùng set_tris_X() và #use fast_io)

Ví dụ: : chương trình sau xuất xung vuông chu kỳ 500ms , duty =50% ra chân B0, nối

B0 với 1 led sẽ làm nhấp nháy led

b Hàm Output_bit ()

Cú pháp: Output_bit (pin, value)

Pin: Tên chân của vi điều khiển được định nghĩa trong thư viện device.h

Value: Nhận một trong hai giá trị là 0 hoặc 1

Giá trị 0: Đưa Pin tương ứng về mức thấp (low hay 0v)

Trang 32

Chức năng: Xuất tín hiệu của từng chân vi điều khiển lên mức cao hoặc xuống mức

thấp

Ví dụ: Viết chương trình nhấp nháy đèn led được kết nối trên chân B1 của vi điều

khiển với thời gian 1s

int1 x; // x mặc định = 0 Main()

{

while (1 ) {

Chức năng: Thiết lập chân (pin) là chế độ nhập và thả nổi chân tín hiệu này để thiết

bị khác bên ngoài có thể toàn quyền điều khiển và đưa dữ liệu vào vi điều khiển

Ví dụ:

if( (data & 0x80)==0 )

output_low(pin_A0); // chân A0 là chân ngõ ra

else

output_float(pin_A0); //chân A0 là chân ngõ vào

d Hàm Output_X()

Cú pháp : Output_X (value)

X: Là tên các cổng tương ứng (a, b, c, d, e)

Value: Giá trị là 1 byte (8 bit)

Chức năng: Hàm này được dùng để xuất một byte ra cổng Cổng điều khiển phụ thuộc

vào khai báo điều khiển #USE *_IO trước đó

Trị trả về : không

Trang 33

Yêu cầu : không

Ví dụ:

OUTPUT_B(0xf0); // Xuất giá trị 11110000b ra port B

OUTPUT_C(11110000b) ;

e Hàm INPUT()

Cú pháp: value = input (pin)

Value: Là một biến ta định nghĩa để chứa giá trị từ lệnh input (pin)

Pin: Tên chân của vi điều khiển được định nghĩa trong thư viện device.h Trị trả về: 0 (or FALSE) nếu giá trị trên chân IC là 0

1 (or TRUE) nếu giá trị trên chân IC là 1

Chức năng: Hàm này trả về trạng thái các chân

Ví dụ:

while ( !input(PIN_B1) ); // waits for B1 to go high

if ( input(PIN_A0) ) printf("A0 is now high\r\n");

Yêu cầu : không

Chức năng: Hàm trả về giá trị là giá trị đang hiện hữu trên các port

Ví dụ:

data = input_b(); //đọc giá trị trên Port B và đưa vào biến data

M = input_e(); //đọc giá trị trên Port E và đưa vào biến M

g Hàm SET_TRIS_X ()

Cú pháp: SET_TRIS_X(value)

Trang 34

Tham số: Value là giá trị 8 bit

Yêu cầu: Sử dụng với #use_fast_io()

Chức năng: Định nghĩa các chân trên các port tương ứng là cổng vào hoặc ra (giá trị

#byte portB = 0x6 // 16F877 có port b ở địa chỉ 6h

#bit B0 = portB 0 // biến B0 chỉ đến chân B0

#bit B1=portB.1 // biến B1 chỉ đến chân B1

#bit B2=portB.2 // biến B2 chỉ đến chân B2

#bit B3=portB.3 // biến B3 chỉ đến chân B3

#bit B4=portB.4 // biến B4 chỉ đến chân B4

#bit B5=portB.5 // biến B5 chỉ đến chân B5

#bit B6=portB.6 // biến B6 chỉ đến chân B6

#bit B7=portB.7 // biến B7 chỉ đến chân B7

Main() {

set_tris_B ( 126 ) ; //portB=01111110b

if ( B7 ) //nếu ngõ vào chân B7 là 1 thì xuất 3 cặp xung đối nghịch

{

B1 = 1 ; B2 = 0 ; B3 = 1 ; B4 = 0 ; B5 = 1 ;

Trang 35

B6 = 0 ; }

2.2.2 Bài tập áp dụng

Bài 1: Cho sơ đồ mạch như hình vẽ

Viết chương trình:

a) Các led nhấp nháy với thời gian 1s

b) Ban đầu các led đều tắt, khi nhấn nút thì 8 led sẽ sáng

c) Ban đầu các led đều tắt, khi nhấn nút thì các các cặp led đối xứng sẽ sáng lần lượt từ ngoài vào trong, khi các led sáng hết thì lặp lại quy trình như ban đầu

Trang 36

d) Ban đầu các led đều tắt, khi nhấn nút thì các led sẽ sáng lần lượt từ trái sang phải, khi các đèn sáng hết sẽ lặp lại chu trình ban đầu (tắt hết và sáng lần lượt lại)

Bài 2: Kết nối các led và nút nhấn sang các cổng bất kì và thực hiện theo yêu cầu như

bài 1

Bài 3: THỰC HÀNH: LẬP TRÌNH ĐIỀU KHIỂN VÀO RA

Trang 37

Bài 4: LẬP TRÌNH HIỂN THỊ 4.1 Tổng quan về led 7 thanh

Trong các thiết bị, để báo trạng thái hoạt động của thiết bị đó cho người sử

dụng với thông số chỉ là các dãy số đơn thuần, thường người ta sử dụng "led 7 đoạn"

Led 7 đoạn được sử dụng khi các dãy số không đòi hỏi quá phức tạp, chỉ cần hiện thị

số là đủ, chẳng hạn led 7 đoạn được dùng để hiển thị nhiệt độ phòng, trong các đồng

hồ treo tường bằng điện tử, hiển thị số lượng sản phẩm được kiểm tra sau một công

đoạn nào đó

Led 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình và có

thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới, bên phải của led 7

đoạn Tám led đơn trên led 7 đoạn có Anode(cực +) hoặc Cathode(cực -) được nối

chung với nhau vào một điểm, được đưa chân ra ngoài để kết nối với mạch điện 8 cực

còn lại trên mỗi led đơn được đưa thành 8 chân riêng, cũng được đưa ra ngoài để kết

nối với mạch điện Nếu led 7 đoạn có Anode(cực +) chung, đầu chung này được nối

với +Vcc, các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led

chỉ sáng khi tín hiệu đặt vào các chân này ở mức 0 Nếu led 7 đoạn có Cathode(cực -)

chung, đầu chung này được nối xuống Ground (hay Mass), các chân còn lại dùng để

điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các

chân này ở mức 1

Hình 4.1: Sơ đồ kết nối led 7 đoạn

Vì led 7 đoạn chứa bên trong nó các led đơn, do đó khi kết nối cần đảm bảo

dòng qua mỗi led đơn trong khoảng 10mA-20mA để bảo vệ led

Nếu kết nối với nguồn 5V có thể hạn dòng bằng điện trở 330Ω trước các chân

nhận tín hiệu điều khiển

Trang 38

Sơ đồ vị trí các led được trình bày như hình bên: Các điện trở 330Ω là các điện trở bên ngoài được kết nối để giới hạn dòng điện qua led nếu led 7 đoạn được nối với nguồn 5V Chân nhận tín hiệu a điều khiển led a sáng tắt, ngõ vào b để điều khiển led

b Tương tự với các chân và các led còn lại

Hình 4.2: Ký hiệu trên led 7 đoạn

Hình 4.3: Dạng số hiển thị lên Led 7 đoạn

Trang 39

Led anot chung

Led anot chung muốn cho led sáng thì chân COM (chân chung) có mức logic 1, các led với các chân tương ứng từ a, b, c, d, e, f, g, g, dp phải là mức logic 0

Bảng 4.1: Bảng mã cho led anot chung (a là bit MSB, dp là LSB)

Bảng 4.2: Bảng mã cho led anot chung (a là bit LSB, dp là MSB)

Led katot chung

Trang 40

Led anot chung muốn cho led sáng thì chân COM (chân chung) có mức logic 0, các led với các chân tương ứng từ a, b, c, d, e, f, g, g, dp phải là mức logic 1

Bảng 4.3: Bảng mã cho led Katot chung (a là bit MSB, dp là LSB)

Bảng 4.4: Bảng mã cho led Katot chung (a là bit LSB, dp là MSB)

4.2.1 Phương pháp xuất dữ liệu trực tiếp

Là phương pháp xuất dữ liệu trực tiếp để hiển thị lên led 7 thanh

Đặc điểm: Phương pháp này đơn giản, dễ lập trình nhưng sẽ tốn tài nguyên I/O của vi điều khiển và khó giải quyết với các bài toán cần nhiều led 7 thanh

Để giảm bớt sự tiêu tốn tài nguyên I/O của vi điều khiển khi lập trình theo phương pháp này người ta thường kết hợp với các IC giải mã như 7447, 74247

Ví dụ 1: Cho sơ đồ kết nối như hình vẽ, viết chương trình hiển thị đếm từ số 0 đến 9

trên led 7 thanh

Ngày đăng: 26/12/2023, 05:04

HÌNH ẢNH LIÊN QUAN

Hình 1.4. Các dòng vi điều khiển PIC hiện nay - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 1.4. Các dòng vi điều khiển PIC hiện nay (Trang 11)
Hình 1.6: Sơ đồ khối của PIC 16F877A - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 1.6 Sơ đồ khối của PIC 16F877A (Trang 13)
Hình 1.7: Bộ nhớ chương trình của PIC 16F877A - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 1.7 Bộ nhớ chương trình của PIC 16F877A (Trang 14)
Hình 4.5: Kết nối led 7 thanh với port D  Code: - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 4.5 Kết nối led 7 thanh với port D Code: (Trang 41)
Hình 4.13: Sơ đồ kết nối LCD chế độ 8bit - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 4.13 Sơ đồ kết nối LCD chế độ 8bit (Trang 56)
Hình 6.6: Sơ đồ khối của bộ Timer1 - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 6.6 Sơ đồ khối của bộ Timer1 (Trang 66)
Hình 6.10. Giản đồ thời gian xung đếm của Counter1. - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 6.10. Giản đồ thời gian xung đếm của Counter1 (Trang 68)
Hình 6.11: Sơ đồ khối bộ Timer2 - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 6.11 Sơ đồ khối bộ Timer2 (Trang 69)
Hình 9.10: Sơ đồ khối của ADC trên PIC 16F877A - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 9.10 Sơ đồ khối của ADC trên PIC 16F877A (Trang 84)
Hình 11.1: Sơ đồ logic của các ngắt trong vi điều khiển PIC 16F877A - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 11.1 Sơ đồ logic của các ngắt trong vi điều khiển PIC 16F877A (Trang 92)
Hình 11.2: Sơ đồ ghép nối xử lý ngoài và hiển thị trên port D - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 11.2 Sơ đồ ghép nối xử lý ngoài và hiển thị trên port D (Trang 98)
Hình 11.3: Sơ đồ ghép nối xử lý ngoài trên port B - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 11.3 Sơ đồ ghép nối xử lý ngoài trên port B (Trang 101)
Hình 13.2: Các kiểu hoạt động của bộ so sánh - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 13.2 Các kiểu hoạt động của bộ so sánh (Trang 106)
Hình 13.3: Sơ đồ khối của bộ PWM - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 13.3 Sơ đồ khối của bộ PWM (Trang 107)
Hình 14.1: Sơ đồ kết nối PIC16F877A - Lập trình vi điều khiển bài 1 tổng quan về vi điều khiển
Hình 14.1 Sơ đồ kết nối PIC16F877A (Trang 115)

🧩 Sản phẩm bạn có thể quan tâm

w