Dòng PIC với giá thành không quá đắt lại đủ mạnh về tính năng, đủ bộ nhớ cho hầu hết các ứng dụng nên đã và đang được dùng phổ biến.. Trong dòng vi điều khiển này, có một họ PIC với độ d
Trang 2HÀ NỘI, 2014
Trang 3LỜI CẢM ƠN
Trước tiên, tôi xin bày tỏ lòng kính trọng và biết ơn sâu sắc tới thầy Phùng Công Phi Khanh Thầy đã tận tình hướng dẫn giúp tôi hoàn thành khóa luận Tôi cũng xin gửi lời cảm ơn đến toàn thể các thầy, cô giáo trong khoa Vật Lý, các thầy cô trong trường Đại học Sư phạm Hà Nội 2 - những người đã giúp đỡ tôi trong suốt quá trình học tập và tạo điều kiện thuận lợi giúp tôi hoàn thành khóa luận này
Cuối cùng, tôi xin cảm ơn gia đình, bạn bè và người thân đã luôn giúp
đỡ, cổ vũ, động viên tôi trong suốt quá trình học tập và hoàn thành khóa luận Tôi xin chân thành cảm ơn!
Hà Nội, tháng 5 năm 2014
Sinh viên thực hiện
Đỗ Thị Hạnh
Trang 4LỜI CAM ĐOAN
Tôi xin cam đoan đề tài “ĐIỀU KHIỂN HỆ THỐNG ĐÈN LED DÙNG
PIC 16F877A” là kết quả của sự nỗ lực cố gắng nghiên cứu, tìm tòi, tra cứu
tài liệu và sự giúp đỡ tận tình của thầy Phùng Công Phi Khanh cùng các thầy,
cô giáo trong khoa Vật Lý trường Đại học Sư phạm Hà Nội 2
Các kết quả được nêu trong khóa luận này là trung thực và chưa từng được công bố trong bất kì nghiên cứu nào
Tôi xin hoàn toàn chịu trách nhiệm với những gì mình khẳng định trên đây
Trang 5MỤC LỤC
Trang
PHẦN I MỞ ĐẦU 5
PHẦN II NỘI DUNG 8
Chương 1 Tổng quan về vi điều khiển PIC 8
1.1 PIC là gì? 8
1.2 Kiến trúc PIC 8
1.3 Các dòng PIC và cách lựa chọn vi điều khiển 9
1.4 Ngôn ngữ lập trình cho PIC 10
1.5 Mạch nạp PIC 10
Chương 2 Vài nét về vi điều khiển PIC 16F877A 11
2.1 Sơ đồ chân của vi điều khiển PIC 16F877A 11
2.2 Một vài thông số về vi điều khiển PIC 16F877A 12
2.3 Sơ đồ khối vi điều khiển PIC 16F877A 13
2.4 Tổ chức bộ nhớ 15
2.4.1 Bộ nhớ chương trình 15
2.4.2 Bộ nhớ dữ liệu 17
2.4.3 Stack 19
2.5 Các cổng xuất nhập của PIC 16F877A 19
2.5.1 Port A 19
2.5.2 Port B 20
2.5.3 Port C 22
2.5.4 Port D
2.5.5 Port E
24 24 2.6 Tập lệnh của vi điều khiển PIC 26
Chương 3 Phần mềm Proteus 33
Trang 6Chương 4 Ứng dụng 36
4.1 Điều khiển Led tự động 36
4.1.1 Yêu cầu 36
4.1.2 Thiết kế mạch điện 37
4.1.3 Thiết kế phần mềm 39
4.1.3.1 Sơ đồ khối 39
4.1.3.2 Chương trình 40
4.2 Điều khiển Led sử dụng nút bấm
4.2.1 Yêu cầu
41 41 4.2.2 Thiết kế mạch điện 42
4.2.3 Thiết kế phần mềm 44
4.2.3.1 Sơ đồ khối 44
4.2.3.2 Chương trình 44
PHẦN III KẾT LUẬN 46
TÀI LIỆU THAM KHẢO 47
Trang 7bổ sung về kiến thức cũng như về ứng dụng cho dòng vi điều khiển cũ Dòng PIC với giá thành không quá đắt lại đủ mạnh về tính năng, đủ bộ nhớ cho hầu hết các ứng dụng nên đã và đang được dùng phổ biến Trong dòng vi điều khiển này, có một họ PIC với độ dài lệnh là 14 bit và bộ nhớ Flash có khả năng ghi, xóa tới 100000 lần đã và đang được khai thác để phát triển các ứng dụng Đó chính là PIC 16F877A Việc nghiên cứu phát triển các ứng dụng của họ PIC này ngày càng thu hút được sự quan tâm, chú ý của sinh viên các trường kĩ thuật Trong số rất nhiều các ứng dụng của nó, chúng ta phải kể đến một số ứng dụng điển hình như: việc phát triển thông tin trong thông tin liên lạc, điều khiển tự động các máy móc, chế tạo Robot, điều khiển các đèn giao thông hay những dãy đèn Led trong các biển quảng cáo, trang trí…
Xuất phát từ thực tế đó, chúng tôi chọn đề tài:
“ĐIỀU KHIỂN HỆ THỐNG ĐÈN LED DÙNG PIC 16F877A”
Nhằm đáp ứng nhu cầu học hỏi của bản thân về vi điều khiển đồng thời góp phần trong xu hướng chung của sinh viên ngành kĩ thuật làm quen và
khai thác sử dụng vi điều khiển PIC
Trang 82 Mục đích nghiên cứu
Tìm hiểu về vi điều khiển PIC 16F877A
Nghiên cứu ứng dụng của vi điều khiển PIC 16F877A trong việc điều
khiển dãy đèn Led
3 Nhiệm vụ nghiên cứu
Tổng quan về vi điều khiển PIC
Tìm hiểu dòng PIC 16F877A và mô phỏng hoạt động của nó trong việc điều khiển đèn Led
4 Đối tượng nghiên cứu
Vi điều khiển PIC 16F877A
Phần mềm Proteus hỗ trợ thiết kế mạch điện
6 Phương pháp nghiên cứu
Sử dụng phương pháp nghiên cứu lí thuyết kết hợp với phương pháp
thực nghiệm
7 Ý nghĩa khoa học của đề tài
Điều khiển hệ thống đèn Led là một ứng dụng thực tế mà hiện nay đang phát triển rất mạnh mẽ và được ứng dụng rộng rãi trong đời sống Nghiên cứu
đề tài “ĐIỀU KHIỂN HỆ THỐNG ĐÈN LED DÙNG PIC 16F877A” là bước
tiếp cận đầu tiên khi bắt đầu học về dòng PIC 16F877A Những kiến thức thu được sau khi hoàn thành xong đề tài này sẽ là những kiến thức nền tảng để có
thể tiếp tục nghiên cứu, phát triển những ứng dụng tiếp theo
Trang 98 Cấu trúc của khóa luận
Cấu trúc khóa luận gồm 4 chương:
Chương 1 Tổng quan về vi điều khiển PIC
Giới thiệu chung về vi điều khiển PIC: Giới thiệu về kiến trúc PIC, các dòng PIC, cách lựa chọn vi điều khiển, ngôn ngữ lập trình cho PIC và mạch nạp PIC
Chương 2 Vài nét về vi điều khiển PIC 16F877A
Tìm hiểu những nét cơ bản về vi điều khiển PIC 16F877A: Tìm hiểu về
sơ đồ chân, sơ đồ khối, tổ chức bộ nhớ, các cổng xuất nhập và tập lệnh của PIC 16F877A
Chương 3 Phần mềm mô phỏng Proteus
Giới thiệu một cách cơ bản về nhiệm vụ và đặc điểm của phần mềm Proteus
Chương 4 Ứng dụng
Trong chương này, chúng tôi giới thiệu ứng dụng cụ thể của vi điều khiển PIC 16F877A trong việc điều khiển dãy đèn Led
Trang 10PHẦN II NỘI DUNG Chương 1 Tổng quan về vi điều khiển PIC
1.1 PIC là gì ?
PIC là viết tắt của “Programable Intelligent Computer’’ có thể dịch là
“máy tính lập trình thông minh” do hãng Genenral Instrument đặt tên cho vi
điều khiển đầu tiên của họ là PIC 1650 PIC 1650 được thiết kế để dùng làm
các thiết bị ngoại vi cho vi điều khiển CP1600 Vi điều khiển này sau đó được
nghiên cứu phát triển thêm và từ đó hình thành nên dòng vi điều khiển PIC
Cấu trúc phần cứng của một vi điều khiển được thiết kế theo hai kiểu
kiến trúc: Kiến trúc Havard và kiến trúc Von-Neuman
Data memory
Trang 11Tổ 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 hai kiểu kiến trúc là ở cấu trúc bộ nhớ dữ liệu và bộ nhớ chương trình
Đố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 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 do 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
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 (vi điều khiển có tập lệnh phức tạp) vì độ dài lệnh luôn là bội số của 8 bit
Đối với kiến trúc Havard, bộ nhớ dữ liệu và bộ nhớ chương trình tách 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ể 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
Vi điều khiển được thiết kế theo kiến trúc Havard còn được gọi là vi điều khiển RISC (vi điều khiển có tập lệnh rút gọn)
1.3 Các dòng PIC và cách lựa chọn vi điều khiển
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
F: PIC có bộ nhớ Flash
Trang 12Bê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 PIC 16F877A 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
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 được nhiề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, 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
1.4 Ngôn ngữ lập trình cho PIC
Ngôn ngữ lập trình cho PIC rất đa dạng Ngôn ngữ lập trình thấp có MPLAB được cung cấp miễn phí bởi nhà sản xuất Microchip Các ngôn ngữ lập trình cấp cao hơn bao gồm: C, Basic, Pascal, Ngoài ra còn có một số ngôn ngữ lập trình được phát triển dành riêng cho PIC như PICBasic, MikroBasic,…
1.5 Mạch nạp PIC
Đây là một dòng sản phẩm rất đa dạng dành cho vi điều khiển PIC Có thể sử dụng các mạch nạp được cung cấp bởi nhà sản xuất là hãng Microchip như: PICSTART plus, MPLAB ICD 2, MPLAB ICD 3, PRO MATE II Có thể dùng các sản phẩm này để nạp cho vi điều khiển khác thông qua chương trình MPLAB Ngoài ra còn có WARP- 13A, P16PRO40
Trang 13Chương 2 Vài nét về vi điều khiển PIC 16F877A
2.1 Sơ đồ chân của vi điều khiển PIC 16F877A
Hình 2.1 Sơ đồ chân của vi điều khiển PIC 16F877A
PIC 16F877A có 40 chân được chia thành 5 Port Trong đó có 2 chân cấp nguồn, 2 chân GND, 2 chân thạch anh và 1 chân dùng để Reset vi điều khiển
5 Port của PIC 16F877A bao gồm: Port B, Port D, Port C (mỗi Port có 8 chân), Port A có 6 chân và Port E có 3 chân
Trang 142.2 Một vài thông số về vi điều khiển PIC 16F877A
PIC 16F877A là một vi điều khiển với kiến trúc RISC Đâ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 (4 chu kì của bộ dao động) Là họ vi điều khiển có 40 chân, mỗi chân có một chức năng khác nhau Trong đó có một số chân đa công dụng (đa hợp), mỗi chân có thể hoạt động như một đường xuất/nhập độc lập hoặc là một chức năng đặc biệt dùng để giao tiếp với các thiết bị ngoại vi Tốc độ hoạt động tối đa cho phép là 20MHz với một chu kì lệnh là 200ns
Một vài thông số về vi điều khiển PIC 16F877A:
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 100000 lần
Bộ nhớ EEPROM với khả năng ghi xóa được 1000000 lần
Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm
Có 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) thông qua 2 chân
Watchdog Timer với bộ dao động trong
Trang 152.3 Sơ đồ khối vi điều khiển PIC 16F877A
Sơ đồ khối của PIC 16F877A bao gồm các khối chức năng sau:
Khối ALU (Arithmetic Logic Unit)
Khối bộ nhớ chương trình (Flash Program Memory)
Khối bộ nhớ chứa dữ liệu (EEPROM - Data EPROM)
Khối bộ nhớ file thanh ghi RAM (RAM file Register)
Khối giả mã lệnh và điều khiển (Instruction Decode Control)
Khối thanh ghi đặc biệt
Khối ngoại vi Timer
Khối giao tiếp nối tiếp
Khối chuyển đổi tín hiệu tương tự sang số ADC
Khối các Port xuất/nhập
Trang 16Hình 2.2 Sơ đồ khối vi điều khiển PIC 16F877A
Trang 17có tác dụng Bộ nhớ chương trình còn có các ngăn xếp (stack) với 8 mức Vector Reset được đặt ở địa chỉ 0000h và vector ngắt ngoại vi được đặt ở địa chỉ 0004h Khi PIC được Reset thì chương trình sẽ nhảy về vị trí vector Reset
và bắt đầu thực hiện tại đó
Trang 18Hình 2.3 Bộ nhớ chương trình PIC16F877A
Trang 19Các vùng RAM đa mục đích (GPR – General Purpose RAM) có chiều rộng là 8 bit và được truy cập trực tiếp hoặc gián tiếp thông qua thanh ghi chức năng đặc biệt
Các thanh ghi chức năng đặc biệt được sử dụng bởi bộ xử lý trung tâm
và các hàm chức năng ngoại vi để điều khiển hoạt động của các thiết bị Các thanh ghi chức năng đặc biệt được chia làm 2 loại: loại thứ nhất dùng cho các chức năng ngoại vi (ngắt, so sánh, điều biến xung PWM, ), loại thứ hai dùng cho các chức năng bên trong của vi điều khiển (các phép tính số học, truy xuất dữ liệu, )
Trang 20Hình 2.4 Sơ đồ bộ nhớ dữ liệu PIC16F877A
Trang 212.4.3 Stack
Stack không nằm trong bộ nhớ chương trình hay bộ nhớ dữ liệu mà là một vùng nhớ đặc biệt không cho phép đọc hay ghi Khi lệnh CALL được thực hiện hay khi một ngắt xảy ra làm chương trình bị rẽ nhánh, giá trị của bộ đếm chương trình PC tự động được vi điều khiển cất vào trong Stack Khi một trong các lệnh RETURN, RETLW hay RETFIE được thực thi, giá trị PC
sẽ tự động được lấy ra từ trong Stack, vi điều khiển sẽ thực hiện tiếp chương trình theo đúng quy trình định trước
Trong vi điều khiển PIC 16F877A, bộ nhớ Stack có khả năng chứa được
8 địa chỉ và hoạt động theo cơ chế xoay vòng Nghĩa là, giá trị cất vào bộ nhớ Stack lần thứ 9 sẽ ghi đè lên giá trị cất vào Stack lần đầu tiên và giá trị cất vào
bộ nhớ Stack lần thứ 10 sẽ ghi đè lên giá trị cất vào Stack lần thứ 2 Các thao tác với bộ nhớ này sẽ hoàn toàn được điều khiển bởi CPU
2.5 Các cổng xuất nhập của vi điều khiển PIC 16F877A
“clear” bit điều khiển tương ứng với chân đó trong thanh ghi TRISA
Đọc thanh ghi Port A là đọc trạng thái ở các chân nhưng khi ghi thì dữ liệu sẽ vào ở mạch chốt Port Tất cả hoạt động ghi gồm ba giai đoạn: đọc - hiệu chỉnh - ghi, do đó ghi dữ liệu vào một Port được hiểu ngầm là đọc dữ liệu từ Port rồi hiệu chỉnh và sau cùng là ghi dữ liệu vào mạch chốt dữ liệu Hoạt động của mỗi chân được lựa chọn bằng cách clear/set các bit điều khiển cho phù hợp trong thanh ghi ADCON1 hoặc thanh ghi CMCON1
Trang 22Khi các chân của Port A được sử dụng là ngõ vào thì các bit của thanh ghi TRISA phải luôn bằng 1
Bảng 2.2 Bảng các chức năng của Port A
RA2/AN2/VREF-/CVREF Bit 2 Port I/O hoặc VREF- hoặc CVREFRA3/AN3/ VREF+ Bit 3 Port I/O hoặc VREF+
RA4/TOCKI/C1OUT Bit 4 Port I/O hoặc ngõ vào xung
clock cho Timer 0 hoặc ngõ ra
Ba chân của Port B được đa hợp với mạch điện gỡ rối bên trong và chức năng lập trình điện áp thấp: RB3/PGM, RB6/PGC, RB7/PGD
Mỗi chân của Port B có một điện trở kéo lên nguồn Vdd Chức năng này hoạt động khi bit RBPU (OPTION<7>) được xóa Khi Port B được thiết lập
là các ngõ ra thì sẽ tự động tắt chức năng điện trở kéo lên cũng tương tự khi CPU bị Reset lúc mới cấp điện
Trang 23Bảng 2.3 Bảng các chức năng của Port B
RB0/INT Bit 0 Port I/O hoặc ngõ vào ngắt Có lập trình
điện trở kéo lên
RB1 Bit 1 Port I/O Có lập trình điện trở kéo lên
RB2 Bit 2 Port I/O Có lập trình điện trở kéo lên
RB3/PGM Bit 3 Port I/O hoặc lập trình ở chế độ LVP Có
lập trình điện trở kéo lên
RB4 Bit 4 Port I/O (ngắt khi có thay đổi) Có lập
trình điện trở kéo lên
RB5 Bit 5 Port I/O (ngắt khi có thay đổi) Có lập trình
điện trở kéo lên
RB6/PGC Bit 6
Port I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối Có lập trình điện trở kéo lên Xung lập trình nối tiếp
RB7/PGD Bit 7
Port I/O (ngắt khi có thay đổi) hoặc chân mạch gỡ rối Có lập trình điện trở kéo lên
Dữ liệu lập trình nối tiếp
Bốn chân RB4 - RB7 có chức năng ngắt (Interrupt) khi trạng thái chân Port thay đổi (khi chân Port được quy định là Output thì chức năng này không hoạt động) Chỉ có những chân được thiết lập ở cấu hình là ngõ vào thì mới có chức năng ngắt Các chân ngõ vào (RB4-RB7) được so sánh với giá trị cũ đã được chốt trong lần đọc trước của Port B
Trang 24Khi có trạng thái sai lệch giữa hai giá trị này, ngắt sẽ xảy ra với cờ ngắt RBIF (INTCON<0>) bật lên, ngắt có thể làm cho vi điều khiển thoát khỏi trạng thái Sleep Mode
Điều kiện không tương thích sẽ tiếp tục làm cờ báo ngắt RBIF bằng 1 Khi đọc Port B sẽ chấm dứt điều kiện không tương thích và cho phép xóa bit
cờ báo ngắt RBIF
2.5.3 Port C
Port C gồm 8 chân từ RC0 - RC7 Việc ghi các giá trị nào vào thanh ghi TRISC sẽ quy định các chân của Port C là Input hay Output: Output = 0, Input = 1
Việc đọc thanh ghi Port C tương ứng với việc đọc các trạng thái của các chân của Port C Việc ghi giá trị vào thanh ghi Port C sẽ thay đổi các trạng thái của các chân của Port C
Các chân của Port C được đa hợp với các chức năng ngoại vi (bộ so sánh, bộ Timer1, bộ PWM và các chuẩn giao tiếp nối tiếp I2C, SPI, SSP, UART) Khi các hàm chức năng ngoại vi được cho phép, thì cần quan tâm chặt chẽ tới giá trị các bit của thanh ghi TRISC Một số chức năng ngoại vi sẽ ghi các giá trị 0 đè lên các bit của thanh ghi TRISC và mặc định các chân là ngõ vào Do đó cần phải xem xét kỹ các tính năng của các hàm ngoại vi để thiết lập giá trị các bit trong thanh ghi TRISC cho chính xác