ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Bài 1. Khái quát vi điều khiển. Vi điêu khiển (microcontroller _ thường được viết tắt là uC, MCU) là một mạch tích hợp, bên trong được cấu tạo bởi các nhân xử lý, bộ nhớ và có khả năng lập tr ình giao giao tiếp với thiết bị ngoại vi. Các bộ vi điều khiển thường được sử dụng trong các sản phẩm, thiết bị điều khiển tự động, các hệ thống điều khiển từ xa, x a, và các hệ thống nhúng.
Các thành phần cơ bản của vi điều khiển:
Hình 1.1 C ấu ấu trúc cơ bản một vi điều
khiển PIC.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Bộ nhớ (Memory) (Memory) Bộ nhớ được sử dụng lưu trữ dữ liệu và chương tr ình.
Hình 1.2 Bộ nhớ trong vi điều khiển.
Hình 1.3 Các thanh ghi trong bộ nhớ vi điều khiển.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Đơn vị xử lý trung tâm-CPU Là nơ i xử lý dữ liệu: nhân, nhân, chia, chia, cộng, trừ hay di chuyển dữ liệu từ bộ nhớ này này đến bộ nhớ khác. khác.
Hình 1.4 CPU trong vi điều khiển.
Bus. Các đường dẫn được gọi là đường bus. Về v ật lý, nó đại diện c ủa 8, 16, hay nhiều h ơ n s ố l ượng dây trong đườngg bus. Có hai loại bus: bus địa chỉ và bus dữ liệu. một đườn
Hình 1.5 Các d ạng ạng Bus.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Đơn vị ngõ vào ngõ ra. Các ngõ nhập xuất của vi điều khiển được gọi là các port. Có nhiều loại port: port ngõ nh ập, port ngõ xuất, hay port hai hướng.
Hình 1.6 Các đơn vị nhập xuất.
Truyền thông nối tiếp. Là dạng truyền thông vớ i s ố lượng đườ ng ng dây truyền d ẫn ít, cụ thể chúng ta sẽ thực hiện sử dụng ba đườ ng ng dây dẫn, và một trong trong các đườ ng ng dây dẫn đó đượ c sử dụng như là đườ ng ng truyền dữ liệu, dây dẫn khác đượ c sử dụng như là đườ ng ng nhận dữ li ệu, còn đườ ng ng dẫn thứ ba đượ c sử dụng như một đườ ng ng chuẩn cho cả nhập và xuất. Dữ liệu trên đườ ng ng truyền là các mức logic “0” và “1”.
Hình 1.7 Truyền thông nối tiếp.
Bộ định thời(Timer)
Hình 1.8 Bộ định thờ i. i.
Tuy nhiên, để sử dụng trong công nghiệp chú chúng ng ta cần thêm một vài khối. Một trong các khối đó là khối timer mà nó quan tr ọng đối v ớ i chúng ta bở i vì nó có thể cho chúng ta thông tin v ề thờ i gian, khoảng thờ i
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
gian, nghi thức,… Đơ n vị cơ bản của timer đó là b ộ đếm tự do (free-run counter), trong thực tế nó là một thanh ghi mà giá tr ị số của nó tăng lên 1 trong các kho ảng thờ i gian bằng nhau, để nhận lấy giá trị của nó trong suốt khoảng T1 và T2 và trên cơ sở của các điểm khác nhau của nó chúng ta có th ể quyết định thờ i gian trôi qua bao lâu. Đó là một phần quan quan trọng của vi điều khiển.
Watchdog. Một yêu cầu cần chú chú ý là là ch chức năng hoàn chỉnh của vi điều khiển suốt thờ i gian chạy của nó. Giả sử rằng khi có một trở ngại (điều này thườ ng ng xảy ra trong công nghi ệp) vi điều khiển của chúng ta ngừng thực thi chươ ng ng trình, hay tệ hơ n, n, nó làm việc không đúng.
Hình 1.9 Watchdog.
D ĩ nhiên, nhiên, nếu điều đó xảy ra vớ i máy tính, chúng ta đơ n giản chỉ việc reset nó và nó s ẽ tiếp tục làm việc. Tuy nhiên, không có nút reset để đưa vào vi điều khiển và để giải quyết v ấn đề c ủa chúng ta. Để gi ải quyết v ấn đề đó, chúng ta cần đưa ra một khối đượ c gọi là watchdog watchdog.. Sự thật khối này là một bộ đếm chạy tự do khác, tại đó chươ ng ng trình chúng ta c ần ghi một bit 0 trong mỗi lần thực thi đúng. Trong trườ ng ng hợ p chươ ng ng trình bị nghẽn, bit 0 sẽ không đượ c ghi, và bộ đếm sẽ reset vi điều khiển để đạt giá trị tối đa của nó. Nó sẽ làm chươ ng ng trình thực thi lại. Đó là thành phần quan trọng của mỗi lần lập trình để có thể nhận ra mà không c ần giám sát.
Chuyển đổi tương tự sang số. Khối này có chức n ăng hổ trợ vi vi điều khiển giao tiếp vớ i các tín hiệu ngõại vi. Tín hiệu t ươ ng ng tự bên bên ngõà ngõàii sẽ đượ c lấy mẫu và lượ ng ng tử hóa thành 0 và 1 để vi điều khiển có thể xử lý.
Hình 1.10 Bộ ADC.
Lập tr ình cho vi điều khiển.
Viết chươ ng ng trìn trình h là một công việc đặc biệt vớ i vi điều khiển, là việc sử dụng các ngôn ngữ lập trìn trình h tạo lập điều khiển quá trình hoạt động cho vi điều khiển. Lập trình có thể đượ c th ực hiện trong một vài ngôn ngữ nh ư Assembler(h ợ p ngữ), C và Basic, mà nó đượ c sử dụng thông dụng. Hợ p ng ữ thuộc v ề mức ngôn ngữ cấp th ấp vớ i khả năng l ập trình chậm, nhưng nó sẽ chiếm khoảng bộ nhớ ít và cho k ết qu ả t ốt nhất. L ập trình trong ngôn ng ữ C thì nó dễ dàng hơ n để vi ết, d ễ dàng để hiểu, nhưng thực thi chậm hơ n so vớ i hợ p ngữ. Basic là dễ nhất để học, và cấu trúc ngôn ngữ của nó
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
gần vớ i chúng ta, nhưng giống ngôn ngữ C nó cũng chậm hơ n hợ p ngữ trong vi ệc thực thi. thi. Tron Trong g nhi nhiều trườ ng ng hợ p, p, chúng ta cần ch chú ý đến yêu cầu về tốc độ xử lý, kích cỡ b bộ nhớ để lựa chọn ngôn ngữ.
Hình 1.11 Lậ p trình và biên d ịch.
Để lập trình cho vi điều khiển, chúng ta cần có các thành ph ần: máy tính, phần mềm biên dịch (compiler), bộ lập trình (kit nạp). Phần mềm biên dịch sẽ biên dịch ngôn ngữ lập trình thành file bin ho ặc là file hex. B ộ lập trình sẽ truyền các file bin(hay file hex) vào trong b ộ nhớ chương tr ình của vi điều khiển và lưu trữ dướ i dạng mã nhị phân “0” và “1”.
Hình 1.12 Quá trình lậ p trình, biên d ịch và nạp cho vi điề u khiể n. n.
Vi điều khiển đượ c k ết nối vớ i thiết bị ngõại vi. Mỗi khi đượ c cấp nguồn, vi điều khiển sẽ thực hiện các thao tác theo chương tr ình đã đượ c thiết lập để điều khiển các thiết bị ngõại vi.
Một số loại vi điều khiển thường gặp trên thị trường hiện nay:
-
Vi điều khiển họ 8051: AT89C51, AT89C52,..... Vi điều khiển họ AVR: AT90S8515, AT90S8535, ATMega32,.... Vi điều khiển PIC: 16F84, 16F877A, Pic18F, Pic24C, dsPic,....
-
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Bài 2. Sơ lượ c PIC16F877A 2.1Giới thiệu: PIC 16F877 16F877A A có đặc điểm chính như sau: -
Có 5 Port xuất nhập.
-
Có 8 kênh chuyển đổi ADC 10-bit.
-
Có 2 kênh PWM PWM 10-bit. it.
-
Có 256bytes bộ nhớ dữ liệu EEPROM.
-
Ngoài ra ra có tích hợp các dạng giao
tiếp I2C, SPI, serial,....
2.2 Sơ đồ chân và chức năng các chân:
Hình 2.1 S ơ đồ
chân chân PIC16F877A. PIC16F877A.
Chức năng các chân: Chân
MCRL / MCRL / V PP (1)
có 2 chức năng:
* MCRL : là ngõ vào Reset tích c ực mức thấp. * VPP: khi lập tr ình cho PIC PIC thì đóng vai tr ò là ngõ vào nh ận điện áp lập tr ình. Chân RA0/AN0(2) có 2 chức năng: * RA0: nhập/ xuất số. * AN0: ngõ vào tương tự k ênh ênh thứ 0. Chân RA1/AN1(3) có 2 chức năng: * RA1: nhập/ xuất số. * AN1: ngõ vào tương tự k ênh ênh thứ 1. Chân RA2/AN2/VREF-/CVREF (4) * RA2: RA2: nhập/ xuất số. * AN2: AN2: ngõ ngõ vào tương tự k ênh ênh thứ 2.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A * VREF-: ngõ vào điện áp chuẩn(thấp) của bộ A/D.
* CVREF: điện áp tham chiếu VREF ng n gõ ra bộ so sánh. Chân RA3/AN3/VREF+ (5) * RA3: nhập/ xuất số. * AN3: ngõ vào tương tự k ênh ênh thứ 3. * VREF+: ngõ vào điện áp chuẩn(cao) của bộ A/D. Chân RA4/T0CK RA4/T0CKI/C1OU I/C1OUT T (6): * RA4: nhập/ xuất số. * T0CKI: ngõ vào xung clock clock bên ngõài cho Timer. Timer. * C1OUT: ngõ ra bộ so sánh 1. Chân RA5 / AN 4 / SS / C 2OUT (7): * RA5: nhập/ xuất số. * AN4: ngõ vào tương tự k ênh ênh thứ 4. * SS : ngõ vào chọn lựa SPI phụ. * C2OUT: ngõ ra bộ so sánh 2. Chân RB0/INT (33): * RB0: nhập/xuất số. * INT: ngõ vào nhận tín hiệu ngắt ngõài. Chân RB1 (34), RB2 (35): nh ập / xuất số. Chân RB3/PGM(36) * RB3: nhập/ xuất số. * PGM: Chân cho phép lập tr ình điện áp thấp ICSP. Chân RB4 RB4 (37), RB5 RB5 (38): nhập / xuất số. Chân RB6/PGC(39) * RB6: nhập/ xuất số. * PGC: xung clock l ập tr ình ICSP. ICSP. Chân RB7/PGD(40) * RB7: nhập/ xuất số. * PGD: mạch gỡ rối và dữ liệu lập tr ình ICSP. ICSP. Chân RC0/T1OCO/T1CKl (15): * RC0: nhập/ xuất số. * T1OCO: T1OCO: ngõ ngõ vào bộ dao động Timer1. * T1CKl: ngõ vào vào xung clock bên ngoài ngoài Timer1 Chân RC1/T1OSI/CCP2 (16):
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A * RC1: xuất/ nhập số. * T1OSI: ngõ vào bộ dao động Timer1. * CCP2: Ngõ vào Capture Capture 2, ngõ ra Compare 2, ngõ ra PWM 2.
Chân RC2/CCP1 (17): * RC2: xuất/ nhập số. * CCP1: ngõ vào Capture 1, ngõ ra Compare 1, ngõ ra PWM1. Chân RC3/SCK/SCL (18): * RC3: xuất/nhập số. * SCK: ngõ vào xung clock n ối tiếp đồng bộ/ ngõ ra của chế độ SPI. * SCL: xung clock ch ế độ I2C. Chân RC4/SDI/SDA (23): * RC4: xuất/nhập số. * SDI: dữ liệu vào SPI. * SDA: dữ liệu I2C. Chân RC5/SDO (24): * RC5: xuất/ nhập số. * SDO: dữ liệu ra SPI. Chân RC6/TX/CK (25): * RC6: xuất/nhập số. * TX: truyền bất đồng bộ USART.
* CK: xung đồng bộ USART. Chân RC7/RX/DT (26): * RC7: xuất/nhập số. * RX: nhận bất đồng bộ USART. * DT: dữ liệu đồng bộ USART. Chân Chân RD0/PSP RD0/PSP0 0 (19): * RD0: RD0: xuất/ nhập số. * PSP0: dữ liệu port slave song song. Các chân: RD1/PSP1 (20), (20), RD2/PSP2 (21), (21), RD3/PSP3 (22), (22), RD4/PSP4 RD4/PSP4 (27), RD5/PSP5 RD5/PSP5 (28), RD6/PSP6 (29), RD7/PSP7 RD7/PSP7 (30) tương tự như trên. Chân RE 0 / RD / AN 5 (8): * RE0: xuất/nhập số. * RD : điều khiển đọc port slave song song. * AN5: ngõ vào tương tự 5.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Chân RE 1 / WR / AN 6 (9): * RE1: xuất/nhập số. * WR : điều khiển ghi port slave song song. * AN6: ngõ vào tương tự 6. Chân RE 2 / CS / AN 7 (10): * RE2: xuất/nhập số. * CS : điều khiển ghi port slave song song. * AN7: ngõ vào tương tự 7. Chân OSC1/CLKI (13): * OSC1: ngõ vào dao động thạch anh. * CLKI: ngõ vào ngu ồn xung bên ngoài. Chân OSC2/CLKO (14): * OSC2: ngõ ra dao động thạch anh. * CLKO: ở chế độ RC, ngõ ra của OSC2, bằng ¼ tần
số của OSC1, và chính là tốc độ chu kỳ câu
lệnh. Chân VDD(11, VDD(11, 32) và VSS(12, VSS(12, 31): 31): các chân chân nguồn của PIC.
2.3 Port nhập xuất và các thanh ghi định hướng. Tổng số chân nhập xuất trong PIC có là 35 chân, đủ các chức năng để kết nối với hầu hết các thiết bị ngoại vi, tạo thành nhiều ứng dụng. 35 chân nhập xuất này được chia thành 5 port với tên gọi: Port A, Port B, Port C, Port D, Port E. Mỗi Port của PIC có một thanh ghi định hướng TRIS qui định các chân của Port đó là ngõ đóng vai vai tr ò ngõ ra, khi thanh ghi TRIS = 1 thì vào hay ngõ ra: khi thanh ghi TRIS = 0 thì Port t ương ứng đóng Port tương tương ứng đóng vai trò ngõ vào. Ví d ụ: PortA kết nối với các thiết bị ngoại vi; với nút nhấn, n hấn, tín hiệu từ các mạch logic là các thành phần ngõ vào, do đó khai báo các chân đó có TRIS = 1; với các thành phần cần điều khiển như rơle, led th ì cần khai báo các chân đó có TRIS = 0.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 2.2 Điều khiển vào ra các PORT vi điều khiển.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Bài 3. Sử dụng phần mềm biên dịch PIC C Compiler. Có rất nhiều phần mềm dùng để soạn thảo v à biên dịch ngôn ngữ C cho vi điều khiển PIC: MPLAB ph ần mềm PIC C Compiler. C18, Hitech C Compiler,.... Ở chuyên đề này, chúng ta sẽ sử dụng phần
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
3.1 Các bước tạo một Project trong PIC
C Compiler.
Khởi động PIC C Complier:
Hình 3.1 Khởi động PIC C Compiler.
Tạo Project mới:
Hình 3.2 T ạo ạo một Project mới.
Đặt tên cho Project:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 3.3 Đặt t ên ên Project mới.
Chọn PIC và thạch anh sử dụng:
Hình 3.4Chọn loại PIC lập tr ình. ình.
Hoàn thành tạo Project:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 3.4 Giao diện lập tr ình. ình.
3.2Viết chương tr ình, biên dịch và nạp cho PIC. Viết chương tr ình:
Hình 3.5 Cách viết chương tr ình. ình.
Biên dịch: trên Menu Compile chọn Compile, trình biên dịch tạo ra file Hex.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 3.6 Biên d ịch ình. ịch chương tr ình.
3.3 Nạp chương tr ình vào PIC dùng PICkit 2 Programmer Khởi động PICkit 2:
Hình 3.7 Giao diện PICkit2.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Vào Menu File chọn Import Hex, chọn file hex vừa biên dịch xong. Nhấn Write để nạp vào PIC.
Hình 3.8 N ạp ùng PICkit2. ạp PIC d ùng
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Bài 4. S ử dụng phần mềm Proteus mô phỏng Vi điều khiển. đ iện tử, đặc biệt là mô Phần mềm Proteus của hãng Labcenter Electronics hỗ trợ mô phỏng các mạch điện phỏng vi điều khiển.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Khởi động Proteus:
Hình 4.1Khởi động Proteus.
Lấy linh kiện:
Hình 4.2Lấy linh kiện từ thư viện.
Chọn PIC 16F877A, nhấn OK
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.3Nhập t ên ên linh kiện cần lấy.
Đặt linh kiện vào giao diện:
Hình 4.4 Đặt linh kiện.
Lấy LED từ thư viện linh kiện:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.5 Lấy đ èn èn Led t ừ thư viện.
Đặt 8 led vào giao diện:
Hình 4.6 Đặt đ èn èn Led.
Lấy điện trở:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.7 Lấy điện trở.
Và đặt điện trở vào giao diện:
Hình 4.8 Đặt điện trở.
Thay đổi giá trị điện trở bằng cách click phải vào điện trở, chọn Edit Properties, cửa sổ Edit Component cho phép thay đổi giá trị điện trở. Đổi giá trị trị 10K thành 180Ohm
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.9C ửa ửa sổ Edit Component.
Lấy GND:
Hình 4.10Lấy GND.
Kết nối dây bằng cách click chuột vào các chân cần kết nối và đi dây.
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.11 N ối ối dây.
Kết nối các thành phần Reset và thạch anh:
Hình 4.12 Thành phần Reset và bộ dao động thạch anh.
Mạch sau khi đã hoàn thành:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.13 M ạch ạch kết nối hoàn chỉnh.
Nạp File ONOFF.hex vào PIC: Click phải PIC chọn Edit Properties, tại vị trí Program File click trỏ đến file ONOFF.hex.
Hình 4.14 N ạp ạp file Hex cho PIC.
Vào Menu Debug, chọn Start để chạy mô phỏng:
ng H ư ớ
d ẫ 16F877A ẫ n l ậ ậ p trình PIC 16F877A
Hình 4.15 Thực hiện
mô phỏng.
Kết quả hiển thị:
Hình 4.16 K ết ết quả hiển thị.