HỌC PIC QUA VÍ dụ hot
Trang 1TỰ HỌC LẬP TRÌNH C CHO PIC QUA VÍ DỤ
Biên Soạn: Ch Phan Vinh Hiếu
Tập 1: Dành cho người mới bắt đầu
Trang 2Lời nói đầu:
Trên thế giới, dòng Vi điều khiển Pic (Programmable Interlligent Controller)
đang được sử dụng ngày càng rộng rải trong mọi lãnh vực của đời sống do các tính năng vượt trội của nó so với các dòng VĐK khác Do đó, nhu cầu học tập, nghiên cứu và ứng dụng Vi Điều Khiển Pic trong giới sinh viên các trường khối kỷ thuật cũng như của các anh chị đang làm việc trong các lĩnh vực Điện-Điện Tử-Tự Động Hóa ngày càng cao Tuy nhiên, tài liệu Tiếng Việt của VĐK Pic hiện nay chưa nhiều và còn nặng tính lý thuyết, học thuật mà chưa đi sâu vào thực tế ứng dụng nên còn gây nhiều khó khăn cho người học Từ lý do đó, tôi viết cuốn”” này với mong muốn là đem tới cho độc giả một cách tiếp cận VĐK mới: dể hiểu, dể làm, ít tốn thời gian và tiết kiệm chi phí nhất nhưng vẫn đảm bảo lượng kiến thức cần thiết để các bạn có thể tự mở rông, nâng cao Trong cuốn sách này chúng ta từng bước học cách lập trình và sử dụng các modul của Pic qua các bài tập thực tế, trực quang Tài liệu chắc chắn không tránh khỏi thiếu sót, tôi mong nhận được ý kiến đóng góp chân thành của các bạn để các ấn bản sau được tốt hơn Rất cám ơn
Mọi thư từ, ý kiến, đóng góp và thắc mắc xin gởi về địa chỉ: hieuphanvinh@gmail.com
Handphone: 0983053941
Trang 3Mục lục
Phần 1: Các bước chuẩn bị trước khi làm việc với PIC
1- Tổng quan
2- Giới thiệu và hướng dẩn cài đặt CCSC
3- Ráp mạch hoạt động của Pic
4- Ráp mạch nạp của Pic
5- Giới thiệu và sử dụng chương trình Win Pic-800
6- Kiểm tra mạch nạp và mạch test
7- Giới thiệu VĐK Pic-Pic 16f877a
8- Cấu trúc cơ bản của một chương trình C cho Pic
Phần 2: Các bài thực hành
Bài tập 1: Bặt tắt đèn Led
Bài tập 2: DK dong co buoc
Bài tập 3: Điều khiển tốc độ động cơ DC
Bài tập 4: Giao tiếp với bàn phím
Bài tập 5: Quét Led 7 đoạn
Bài tập 6: Đo - hiển thị nhiệt độ
Trang 4Phần 1: Các bước chuẩn bị trước khi làm việc với PIC
1 Tổng quan:
Để làm việc với VĐK chúng ta cần có 3 thứ cơ bản: Trình biên dịch (Compiler), Mạch-chương trình nạp(Programmer) và Kit thực hành
- Về trình biên dịch : Chúng ta sử dụng CCSC phiên bản 4.0.11 cho phép
chúng ta dùng ngôn ngữ C để lập trình cho Pic, trình biên dịch này các bạn có thể tự tải trên mạng hoặc lấy trong đĩa CD đính kèm theo sách
- Mạch nạp(Programmer) và Kit thực hành: Tối có tặng kèm theo sách 2
PCB: 1 PCB mạch nạp loại JMD Programmer và 1 PCB kit thực hành
khá đơn giản để các bạn có thể mua linh kiện về tự ráp, trong đĩa CD tôi
có ghi danh sách linh kiện cần mua và hướng dẩn chi tiết cách lắp ráp, các bạn chịu khó nghiên cứu Ngoài ra, các bạn có thể sử dụng bất kỳ loại mạch nạp và kit test nào mà các bạn có miễn là có nguyên lý phần cứng giống như yêu cầu mà tôi mô tả ở mỗi bài tập
- Chương trình nạp: Chúng ta sử dụng chương trình Winpic 800 phiên bản
-, trong đĩa CD tôi cũng đã hướng dẩn chi tiết cách sử dụng
2 Hướng dẩn cài đặt và sử dụng CCSC:
Một trong những khó khăn với người học khi lần đầu tiếp cận với VĐK là việc lập trình bằng hợp ngữ do sự khó hiểu và phức tạp của nó Do đó tôi chọn ngữ C để giới thiệu với các bạn nhằm tạo sự dể chịu cũng như rút ngắn thời gian làm việc cho người dùng VĐK Với ưu thế về sự đơn giản, tiện lợi, C dường như là 1 giải pháp cho người học VĐK Tuy nhiên, nếu có thời gian các bạn nên tìm hiểu thêm về hợp ngử để có nền tảng vững chắc
Trang 5Để cài thành công trình biên dịch này các bạn phải tuân thủ theo 3 bước sau:
Bước thứ 1: Cài đặt chương trình
Click vào tập tin pcwhupd để cài đặt
Click next
Chọn thư mục cài đặt Click next
Click next Để bắt đầu quá trình cài đặt
Trang 6Sau khi hoan tat máy sẽ hiện ra thông báo đòi file đăng ký:
Nhấn cancel Rồi nhấn Finish
Bước thứ 2: Đăng ký
Sau đó bạn chép file KeyfileGen từ tập tin CCS_PCWH_4.016
vào thư mục cài đặt C:\Program Files\PICC để đăng ký sử dụng
Click vào KeyfileGen lúc đó sẽ hiện lên bảng thông báo sau:
Click vào Tab Generar licencias.org sẽ xuất hiện:
Trang 7Bạn tìm đường dẩn đến thư mục cài đặt PICC
Sau đó click vào PICC rồi nhấn OK
Bước thứ 3: Cuối cùng là cài phần update cho chương trình
Bạn click vào tập tin ideutilsupd trong thư mục CCS_PCWH_4.016 ở đĩa CD:
Tiếp tục Click next
Trang 8Sau khi hoàn tất bạn nhấn finish rồi khởi động lại máy
Hướng dẫn sử dụng CCSC
Sau khi khởi động lại máy, trên màn hình Desktop sẽ xuất hiện Icon:
Click vào Icon này cửa sổ làm việc chính sẽ mỡ ra Mục Help
Thanh Menu
Save
Trên thanh Menu có các mục là: File, Project, Edit, Search, Compile, View, Tools,
Debug, Document, Users Bạn nhấn vào từng mục để xem các chức năng cụ thể
Trang 9Lưu nội dung chương trình
Lưu nội dung chương trình với 1 tên khác
*
* Mục Tool (công cụ):
COMPILE
Xác định giòng Pic đang lập trình
Xem mã asm được dịch từ file C
Nhấn vào đây (hoặc nh ắn F9) để dịch ra file hex.
Dùng để hiển thị nội dung VĐK gởi về PC qua cổng RS232.
Dùng để dịch ngược file hex về file.asm hay c
Dùng để chuyển đổi giá trị giữa các hệ đếm(deca-binary-hexa 8 16 32)
Trang 10* Mục Edit (Chỉnh sữa):
Mục Help (hỗ trợ, hướng dẫn):
*
Nhấn vào đây (hoặc F1) để mở Help
Thư viện tập lệnh phần cứng của PIC Thư viện tập lệnh C
- Ráp mạch hoạt động của Pic
Trang 11Vi điều khiển Pic có rất nhiều loại, nhiều dòng như: 12fxxx, 16fxxx, 18fxxx,
Bảng so sánh đặc tính giửa AT89C51 và P16F877A:
33fxxx, 32fxxx, dsPIC, rfPIC, PIC giao tiếp Usb v v…….; tùy theo nhu cầu ứng
dụng của người sử dụng mà chúng ta có sự lựa chọn cho thích hợp Trong khuôn khổ
cuốn sách này tôi chọn Pic16f877a để giới thiệu vối các bạn vì nó là con Pic thuộc họ 14
bit 40 chân đủ mạnh cho các ứng dụng ở mức độ thông thường và tương đối phổ biến ở
thị trường Việt Nam Nếu các bạn nắm vửng cấu trúc và cách lập của Pic16f877a các
bạn có thể dể dàng tiếp cận với các họ Pic khác vì chúng có chung các cấu trúc và tập lệnh căn bản
AT89C51
Trang 12Số Port xuất nhập 4 Port(0,1,2,3), 32 I/O 5 Port (A, B, C, D, E), 33 I/O
Modul điều biến xung (CCP )
Độ phân giải: 10 bit
Modul biến đổi tương tự - số (ADC) Khơng cĩ 1
Độ phân giải: 10 bit, 8 kênh
Modul so sánh tuơng tư
(Compartor)ï
Modul giám sát hoạt động(WDT) Khơng cĩ 1
Cổng song song (Parallel) Khơng cĩ 1
Chuẩn giao tiếp SPI
Chuẩn giao tiếp I2C
Chế độ tiết kiệm năng lượng (Sleep
Mode)
Nạp trương trình theo chuẩn nối
Cống suất họat động tối đa của các cổng I/O:
Dịng ngõ ra cực đại khi ngõ ra ở trạng thái điện áp cao là 20 mA
Dịng ngõ ra cực đại khi ngõ ra ở trạng thái điện áp thấp là 25 mA
Dịng điện của ngõ ra đủ lớn để kích đèn Led trực tiếp mà khơng cần qua Buffer
Trang 13Điện áp làm việc:
Điện áp làm việc tối đa là 5.5V
Điện áp làm việc tối thiểu là 4.5V
Mạch Reset:
Pic sẽ bị reset nếu đưa chân số 1(MCLR) xuống GND
Nguyên lý mạch reset: khi mở nguồn tụ C18 sẽ nối chân 1 xuống Mass – Reset VĐK Khi điện áp đã ổn định điện trở R24 sẽ nối chân 1 lên cao thế 5V- đưa VĐK về trạng thái hoạt động Nút nhấn sẽ Reset mạch một cách bắt buộc Diod d1 dùng để xã dòng điệntừ
tụ c18 về nguồn mà không phải qua điện trở r24 khi tắt điện nguồn làm mạch reset ngay sau khi ta tắt điện
Thạch anh dao động:
VĐK Pic hoạt động ở 4 chế độ dao động :
RC: Chế độ tạo dao động bằng điện trở R- tụ điện C
LP: Chế độ tạo dao động bằng thạch anh công suất thấp, tần số giao đông từ:
Trang 14Khi lập trình các bạn phải khai báo chế độ dao động tương ứng với giá trị thạch anh mà các bạn sử dụng một cách chính xác nếu không chương trình sẽ không chạy Tụ lọc nhiễu xung thạch anh nằm trong khoảng từ 15-33pF
Phần thứ 1(Không bắt buộc): Phần chú thích Bất cứ một chương trình nào, cũng được
bắt đầu bằng việc giới thiệu về chương trình, tên chương trình, người thực hiện chương trình, lưu ý phần cứng, v v Nội dung của phần này phải nằm sau dấu //
//================================================= =======
// Ten chuong trinh : Chuong trình chop tat den led
// Nguoi thuc hien : X X X
// Ngay thuc hien : 19/06/2008
Trang 15
Phần thứ hai(Bắt buộc): Phần khởi tạo PIC Phần này là phần bắt buộc theo sau phần
ghi chú, bởi vì chương trình dịch cần phải hiểu bạn đang làm việc với con PIC nào, làm việc với nó như thế nào và thiết lập phần cứng cho nó ra sao
#include<16f877A.h>
#fuses HS,NOLVP,NOWDT,NOPUT, NOPROTECT
#use delay (clock=20000000)
• Từ khóa #fuses dùng để thiết lập cấu hình hoạt động cho Pic :
1 Khai tốc độ thạch anh: HS, XT, LP hay RC
2 Có sự dụng bộ giám sát hoạt động WDT hay không
3 Có bảo vệ code hay không
4 Timer 0 có sử dụng khi mở nguồng lên hay không
Phần còn lại là chương trình chính (Bắt buộc):
void main()
{
//Nội dung chương trình chính được viết tại đây
}
• Lưu ý: Trình biên dịch không dịch những nội dung nằm sau dấu // vì những nội
dung đó được hiểu là chú thích
Đến đây các bạn đã có đầy đủ những phương tiện và kiến thức cơ bản để bắt tay vào
phần thứ 2: làm các bài thực hành
Trang 16Phần 2: Các bài thực hành
Bài 1: Xuất Giá Trị
I _ Lý thuyết:
Pic 16f877a có 5 Port I/O bao gồm:
• Port A(RA0- RA5): có 6 I/O
• Port B(RB0- RB7): có 8 I/O
• Port C(RC0- RC7): có 8 I/O
• Port D(RD0- RD7): có 8 I/O
• Port E(RE0- RE2): có 3 I/O
Khác với AT89C51 hoạt động xuất nhập của từng Port được thực hiện chỉ bởi 1 thanh ghi là thanh ghi Port(P0, P1, P2, P3) thì Pic sử dụng 2 thanh ghi là thanh ghi Port(PortA,PortB,PortC…) và thanh ghi Tris (TrisA, TrisB, TrisC… )
Thanh ghi Tris được dùng để quy định từng chân riêng rẽ của Port hay cả Port là xuất hay nhập Sau đó dữ liệu sẽ được xuất hay được nhập thông qua việc ghi vào hay đọc ra từ thanh ghi Port
Ví dụ: Khi ta ghi vào thanh ghi Tris B giá trị 00001111 thì nghĩa làcác chân từ RB0-RB3
là nhập còn từ RB4-RB7 là xuất
Hệ đếm trong C:
Số nhị phân được viết dưới dạng: 0Bxxxxxxxx Ví dụ: 0b11111111
Số Hexa được viết dưới dạng: 0Xxx Ví dụ: 0XFF
Số Deca được viết dưới dạng: xxx Ví dụ: 255
Trang 17II _ Thực hành:
Bài 1 A:
Bây giờ chúng ta bắt đầu bài thực hành đầu tiên: Sử dụng Port B để bật tắt đèn Led:
Bước thứ 1: Viết chương trình
Bạn mở chương trình CCSC, vào File ->New -> Source file
Bạn đặt tên và lưu project vào 1 thư mục nào đó do bạn chỉ định.Ví dụ: baitap1.c
Sau đó bạn đánh đoạn mã sau vào
//================================================= ======= // Ten chuong trinh : Chuong trình xuat gia tri thay doi trang thai Port B
// Nguoi thuc hien : Phan Vinh Hieu
// Ngay thuc hien : 19/08/2008
// Phien ban : 1.0
// Mo ta –Chu thich : Dung PIC16F877A - thach anh 20MHz
//Port B được quy định là Port xuat va noi voi 8 led de kiem tra trang thai
Set_tris_B (0B 00000000);//Quy định trạng thái xuất nhập của Port
Lưu ý: Kết thúc lệnh phải có dấu ;
Output_B(0B 11111111);//Xuất giá trị ra Port B
}
Bây giờ, chúng ta cùng tìm hiểu ý nghĩa của từng giòng lệnh:
Tại phần khai bao phần cứng: #fuses HS,NOWDT,PUT
Trang 18- Khai báo HS: Sử dụng thạch anh tốc độ cao(20MHz)
- Khai báo NOWDT:Không sử dụng bộ định thời giám sát
- Khai báo PUT: Không sử dụng Timer0
Trong thân chương trình chính:
- Lệnh Set_Tris_B(0B 00000000) sẽ đưa giá trị 0B 00000000 vào thanh ghi TRIS_B nhằm quy định toàn bộ Port B là xuất
- Lệnh Output_B(0B 11111111) sẽ đưa giá trị 0B 11111111 vào thanh ghi
PortB đưa trạng thái ngõ ra của tất cả các chân của Port B lên cao (*Lưu ý : Tham khảo Help của CCSC phần Build in function để nắm rõ hơn về các tập lệnh.)
Sau khi hoàn tất, các bạn ấn nút save để lưu chương trình lại rồi nhấn Compile
(hoặc F9) để dịch ra tập tin Hex Lúc đó chương trình sẽ hiện ra bản thông báo sau :
Tên – đường dẩn của project được dịch
Thông báo xem có lỗi hay
không
Thông báo dung lượng Ram - Rom đã sài hết
Bước 2: Tiếp theo ta nạp chương trình cho Pic bằng phần mếm Win Pic 800
- Đầu tiên bạn mở tập tin WinPic800-356d-All nằm trong đĩa CD
- Click chuột phãi vào Icon
-Tạo một shortcut rồi chép ra desktop
Trang 19Click vào Shortcut này để mở chương trình nạp
Kiểm tra kết nối giữa kit nạp với máy tính
Đầu tiên bạn cần khai báo và thiết lập phần cứng cho mạch nạp: Vào Setting ->
Tại mục Selection Hardware bạn chọn loại kit nạp JMD Programmer Sau đó xác dịnh
địa chỉ cổng Com của máy rồi nhấn Apply edits để thoát
Sau khi set up xong, bạn cắm IC vào mạch nạp(Lưu ý: Chỉ cắm IC vào sau khi set up
phần cứng xong.).Bạn nhấn vào biểu tượng:
Tải file Hex cần nạp
Tiếp theo nhấn:
Trang 20Để nạp
Sau khi nạp bạn rút IC ra khỏi mạch và cắm IC vào mạch test
Bước 3: Cấm Buss nối giữa Port B với modul 8 đèn Led theo sơ đồ sau:
33 35 37 39
15 17 23 25
19 21 27 29
8 10
RB0/INT RB1 RB3 RB5 RB6/PGC
RC0/T1OSI/T1CLK RC1/CCP2/T1OSO RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD0/PSP0 RD2/PSP2 RD4/PSP4 RD6/PSP6 RE0/AN5/RD RE1/AN6/WR RE2/AN6/CS OSC2/CLKOUT
1 3 5 7
output_bit( PIN_B0, 0); Lệnh này điều khiểng trạng thái 1 chân của Port,
output_high(PIN_A0); Lệnh này điều khiểng trạng thái 1 chân của Port
Trang 22- Lệnh SET_TRIS_B(0B 11111111) sẽ đưa giá trị 0B
11111111 vào thanh ghi TRIS_B nhằm quy định toàn bộ Port B là nhập
- Lệnh SET_TRIS_D(0B 00000000) sẽ đưa giá trị 0B
00000000 vào thanh ghi TRIS_D nhằm quy định toàn bộ Port D là xuất
-
- Input_B() sẽ đọc trạng thái các chân của PortB
- Output_D(Input_B()); sẽ xuất các trạng thái đó ra các led của Port D
R8 1K
33 35 37 39
15 17 23 25
19 21 27 29
8 10
RB0/INT RB1 RB3 RB5 RB6/PGC
RC0/T1OSI/T1CLK RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK
RD0/PSP0 RD2/PSP2 RD4/PSP4 RD6/PSP6
RE0/AN5/RD RE1/AN6/WR RE2/AN6/CS
OSC2/CLKOUT
B4
5V
R8 1K
R6
330
R8 1K
1 3 5 7
LED1 LED2
33pF
R8 1K
JUMPER 8
2 4 6 8
1 3 5 7
LED7
Trang 23Bài 2: SỬ DỤNG HÀM DELAY VÀ LỆNH GOTO
I _ Lý thuyết:
a-hàm delay:
Khi lập trình bằng hợp ngử để điều khiển đèn Led chớp tắt ta phải viết 1 chương trình con có tên là Delay với mục đích là làm chậm hoạt động của VĐK đi 1 khoảng thời gian bằng cách tuần tự giảm giá trị của các thanh ghi Đối với C ta không còn phải làm công việc này nữa vì C hộ trợ cho ta 3 hàm Delay như sau:
- delay_cycles (time):Làm chậm chương trình đi (time) lần chu kỳ máy, giá trị của (time) thay đổi trong khoảng từ 0-255
- delay_ms (time): Làm chậm chương trình đi (time) mili giây, giá trị của (time) thay đổi trong khoảng từ 0- 65535
- delay_us (time): Làm chậm chương trình đi (time) micro giây, giá trị của (time) thay đổi trong khoảng từ 0- 65535
Vi dụ: Nếu bạn muốn chương trình chạy chậm đi 1 giây bạn sử dụng hàm Delay như sau:
delay_ms (1000);//1 giây bằng 1000 mili giây
a-Lệnh Goto:
Khi các bạn muốn chương trình của các bạn rẻ nhánh đến 1 vị trí, 1 đoạn chương tri2ng khác thỉ các bạn dùng lệnh nhảy, trong 89c51 ta dùng lệnh LJMP NHAN Còn trong PIC ta dùng lệnh GOTO NHAN
Trang 24#use delay(clock=20000000) // defind crystal = 20MHz main()
{ SET_TRIS_B (0b00000000);
Trang 26Bài 3: KHAI BÁO VÀ SỬ DỤNG CÁC BIẾN (VARIABLE)
biến có kiểu Interger 1 bit chứa các số 0-1
biến có kiểu Interger 8 bit chứa các số nguyên nằm trong khoảng từ 0-255
biến có kiểu Interger 16 bit chứa các số nguyên nằm trong khoảng từ 0-65535 biến có kiểu Interger 32 bit chứa các số nguyên nằm trong khoảng từ 0-