hướng dẫn lập trình 8051
Trang 1BKIT HARDWARE CLUB www.bkit4u.com 1
Mục lục
Giới thiệu kit thí nghiệm BK89IT 4
Mô hình lập trình C trong vi điều khiển 5
Bài 1 : Hướng dẫn cài đặt Keil C và Flash Magic 6
1.1 Cài đặt Keil C 6
1.2 Cài đặt Flash Magic 11
1.3 Cấu hình cho Flash Magic 16
Bài 2 : Truy xuất Port I/O 22
2.1 Tạo project trên Keil C 22
2.2 Viết chương trình đơn giản 32
2.2.1 Kết nối phần cứng 32
2.2.2 Viết chương trình 33
2.2.3 Nạp chương trình 34
2.2.4 Các lỗi xảy ra khi nạp chương trình 35
Bài 3 : Điều khiển đơn giản Led 7 đoạn 38
3.1 Kết nối phần cứng: 38
3.2 Viết chương trình 39
3.2.1 Hàm init_main() 39
3.2.2 Hàm main() 39
3.3 Một số lỗi lập trình quan trọng 41
Bài 4 : Ngắt Timer 42
4.1 Khai báo ngắt timer 42
4.2 Viết chương trình 43
4.2.1 Hàm init_timer1() 43
4.2.2 Hàm start_timer1() 43
4.2.3 Hàm timer1_isr() 43
4.2.4 Hàm delay_ms(unsigned int duration) 44
4.2.5 Hàm stop_timer1() 44
Bài 5 : Dùng ngắt timer viết ứng dụng LED RIVER 45
5.1 Kết nối phần cứng 45
5.2 Viết chương trình 45
Bài 6 : Chống rung cho phím 47
6.1 Nguyên lý chống rung 47
6.2 Kết nối phần cứng 48
6.3 Viết chương trình 49
6.3.1 Hàm initKey() 49
6.3.2 Hàm getKey() 49
Bài 7 : Quét led điều khiển Led 7 đoạn 51
7.1 Nguyên lý quét led 7 đoạn 51
7.2 Kết nối phần cứng 52
7.3 Viết chương trình 52
7.3.1 Hàm init_led7() 52
7.3.2 Hàm clear_led7() 53
7.3.3 Hàm set_position(unsigned int pos) 53
7.3.4 Hàm get_position() 53
Trang 27.3.5 Hàm put_Number(unsigned int num) 54
7.3.6 Hàm put_string(char strNum[]) 54
7.3.7 Hàm scan_led7 54
Bài 8 : Điều khiển Ma trận led 56
8.1 Nguyên lý điều khiển ma trận led 56
8.2 Kết nối phần cứng 56
8.3 Viết chương trình 56
8.3.1 Hàm init_led_matrix() 57
8.3.2 Hàm scan_led_matrix() 57
8.3.3 Hàm update_display_led_matrix() 57
Bài 9 : Chạy chữ trên Ma trận led 59
9.1 Nguyên lý chạy chữ trên ma trận led 59
9.2 Kết nối phần cứng 60
9.3 Viết chương trình 60
9.3.1 Hàm set_message(char strMsg[]) 60
9.3.2 Hàm main() 61
Bài 10 : Ngắt ngoài 62
10.1 Nguyên lý điều khiển ngắt ngoài 62
10.2 Kết nối phần cứng 62
10.3 Viết chương trình 62
10.3.1 Hàm init_ext_int0() 62
10.3.2 Hàm init_ext_int1() 62
10.3.3 Hàm ext0_isr() 63
10.3.4 Hàm ext1_isr() 63
Bài 11 : Điều khiển encoder 64
11.1 Nguyên lý điều khiển encoder 64
11.2 Kết nối phần cứng 65
11.3 Viết chương trình 65
Bài 12 : Giao tiếp UART 67
12.1 Nguyên lý giao tiếp UART 67
12.2 Giao tiếp UART với máy tính 68
12.3 Viết chương trình 69
12.3.1 Thanh ghi điều khiển truyền nhận nối tiếp 69
12.3.2 Dùng Timer1 tạo Baud rate 71
12.3.3 Chương trình truyền nhận UART trên 8051 71
12.4 Kiểm tra truyền nhận UART 74
12.5 Xây dựng chương trình trên PC 74
12.5.1 Load các cổng COM của PC lên ComboBox 78
12.5.2 Kết nối cổng với cổng COM 79
12.5.3 Gửi dữ liệu 80
12.5.4 Nhận dữ liệu 81
Bài 13 : Giao tiếp PS2 với bàn phím 85
13.1 Nguyên lý giao tiếp PS2 85
13.2 Kết nối phần cứng 86
13.3 Viết chương trình 87
Trang 3BKIT HARDWARE CLUB www.bkit4u.com 3
14.1 Khái niệm PWM 88
14.2 Lập trình PWM trên 89V51 89
Bài 15 : Giao tiếp LCD character 90
15.1 Chức năng các chân của LCD 90
15.2 Kết nối màn hình LCD 91
15.3 Các vùng nhớ của LCD 91
15.3.1 Display Data Ram (DDRAM) 91
15.3.2 Character Generator Ram (CGRAM) 91
15.3.3 Bộ nhớ CGROM 92
15.4 Các lệnh cơ bản của LCD 93
15.5 Kết nối LCD với vi điều khiển 94
15.6 Khởi tạo LCD 95
15.7 Kết nối phần cứng 97
15.8 Viết chương trình 98
15.8.1 Các hàm cơ bản 98
15.8.2 Khởi tạo LCD chế độ 4 bit 98
15.8.3 Xoá màn hình 99
15.8.4 Thiết lập vị trí con trỏ 99
15.8.5 In kí tự ra màn hình 100
Bài 16 : Giao tiếp I2C – DS1307 101
16.1 Các đặc điểm của DS1307 101
16.2 Nguyên lý hoạt động 101
16.3 Các tín hiệu Input và Output 102
16.4 RTC và sơ đồ địa chỉ Ram 103
16.5 Thông tin thời gian và lịch 103
16.6 Thanh ghi điều khiển (Control Register) 104
16.7 Bus dữ liệu nối tiếp 104
16.8 Giao thức I2C và RTC DS1307 105
16.8.1 Kết nối phần cứng 105
16.8.2 Start và Stop truyền dữ liệu 105
16.8.3 Truyền 1 byte dữ liệu 107
16.8.4 Giao tiếp với DS1307 108
Trang 4Giới thiệu kit thí nghiệm BK89IT
Các chức năng của board thí nghiệm BK89IT :
v 8 nút nhấn : nối với P3
v 8 led 7 đoạn : hỗ trợ quét led, P0 để gửi dữ liệu và P2 để chọn led
v Led ma trận 2 màu : P0 gửi dữ liệu mà đỏ, P2 gửi dữ liệu xanh, P1 để chọn cột hiển thị
v Giao tiếp với bàn phím PS2
v Giao tiếp COM
v 4 chân dùng để kết nối encoder
v Cấu hình bằng switch : Switch 1 cho Port 1, 2 cho Port 3, 3 cho led ma trận và 4 cho led 7 đoạn
v Cấp nguồn ngoài hoặc USB
v Mạch nạp onboard
Trang 5BKIT HARDWARE CLUB www.bkit4u.com 5
Mô hình lập trình C trong vi điều khiển
} void private_function() {
T2 = 0x00;
} void scan_led7() {
} void private_function() {
v File h : Khai các hàm và extern các biến toàn cục
v File c : Hiện thực các hàm được khai báo trong file h
Khi muốn sử dụng module này, ta chỉ cần include file h là có thể gọi được các hàm được khai báo trong file h
Trang 6Bài 1 : Hướng dẫn cài đặt Keil C và Flash Magic
Mục đích :
Cài đặt Keil C để soạn thảo chương trình
Cài đặt Flash Magic để nạp chương trình
Cấu hình cho Flash Magic
1.1 Cài đặt Keil C
Keil C là chương trình hỗ trợ khá đầy đủ để người dùng soạn thảo chương trình dành cho các vi điều khiển thuộc họ 8051 Để cài đặt bạn tiến hành theo các bước như sau:
Bước 1 : Click vào file c51v815.exe trong CD đi kèm, màn hình sau sẽ xuất hiện
Trang 7BKIT HARDWARE CLUB www.bkit4u.com 7
Bước 2 : Chọn Next, màn hình sau sẽ xuất hiện
Bước 3 : Click chọn I agree và chọn Next, màn hình sau sẽ xuất hiện
Trang 8Bước 4 : Bạn có thể để mặc định và chọn Next Tuy nhiên bạn có thể thay đổi
Destinatioin Folder, là thư mục chứa 1 số thư viện hỗ trợ trong việc lập trình trên Keil C Màn hình sau xuất hiện để bạn điền 1 số thông tin cá nhân
Trang 9BKIT HARDWARE CLUB www.bkit4u.com 9
Bước 5 : Chọn Next để bắt đầu cài đặt
Bước 6 : Khi cài đặt xong, màn hình sau xuất hiện và bạn nhấn Finish để hoàn tất
quá trình cài đặt
Trang 10Bước 7 : Trang web sau hiển thị để giới thiệu về KeilC phiên bản này
Các bước cấu hình cho Keil C để dịch chương trình ra file Hex sẽ được trình bày trong bài thực hành tiếp theo
Trang 11BKIT HARDWARE CLUB www.bkit4u.com 11
1.2 Cài đặt Flash Magic
Đây là chương trình dùng để nạp file Hex cho 89V51 Để cài đặt bạn làm theo các bước sau :
Bước 1 : Double click vào file FlashMagic.exe, màn hình sau sẽ xuất hiện
Bước 2 : Chọn Next
Trang 12Bước 3 : Click chọn I accept và chọn Next
Trang 13BKIT HARDWARE CLUB www.bkit4u.com 13
Bước 4 : Bạn có thể để mặc định và chọn Next, hoặc thay đổi đường dẫn của thư mực cài đặt nếu bạn muốn Khi click Next màn hình sau sẽ xuất hiện
Bước 5 : Để mặc định và chọn Next
Trang 14Bước 6 : Chọn Next
Trang 15BKIT HARDWARE CLUB www.bkit4u.com 15 Bước 7 : Chọn Install để cài đặt
Bước 8 : Khi cài đặt xong màn hình sau sẽ xuất hiện, bạn nhấn Finish để kết thúc cài đặt
Trang 161.3 Cấu hình cho Flash Magic
Bước 1 : Khởi động Flash Magic từ màn hình Desktop (hoặc vào Start\Program Files\Flash Magic và chọn Flash Magic), màn hình sau sẽ xuất hiện
Trang 17BKIT HARDWARE CLUB www.bkit4u.com 17
Bước 2 : Bạn chọn Baud Rate là 9600, Device là chip tương ứng mà bạn dùng Check chọn Verify after programming và Erase blocks used by Hex File
Trang 18Bước 3 : Chọn menu Option và chọn Advance Option, màn hình sau sẽ xuất hiện :
Trang 19BKIT HARDWARE CLUB www.bkit4u.com 19
Bước 4 : Chọn qua tab Hardware Config và check chọn Assert DTR and RTS
while COM Port open Nhấn OK để đóng cửa số này lại
Bước 5 : Xem cổng COM đang là cổng nào Bạn thu nhỏ Flash Magic lại, trên
màn hình Desktop, từ biểu tượng My Computer, click phải chuột và chọn Manage
Trang 20Bước 6 : Màn hình sau xuất hiện, bạn chọn Device Manager
Bước 7 : Cắm dây cổng COM nếu bạn đang dùng USB to COM, mở rộng Ports (COM &LPT), bạn sẽ biết được tên cổng COM đang dùng (trong ví dụ này là COM 9)
Trang 21BKIT HARDWARE CLUB www.bkit4u.com 21
Bước 9 : Kích hoạt lại Flash Magic và chọn cổng COM tương ứng
Trang 22Bài 2 : Truy xuất Port I/O
Mục đích:
Tạo project đơn giản trong Keil C và cấu hình cho Keil C
Điều khiển Port 1 và Port 3
Nạp chương trình bằng Flash Magic
Yêu cầu:
Viết chương trình để nhấn nút 1 đèn thứ 1 sáng, nút 2 đèn thứ 2 sáng,…
2.1 Tạo project trên Keil C
Bước 1 : Kích hoạt Keil uVision3, cửa sổ Keil C hiện ra
Bước 2 : Chọn Project và chọn New uVision Project…
Trang 23BKIT HARDWARE CLUB www.bkit4u.com 23
Bước 3 : Chọn đường dẫn và gõ tên project và khung File name, chọn Save, khung cửa số sau đây xuất hiện
Trang 24Bước 4 : Chọn chip tương ứng với board của bạn, trong board của chúng tôi sử
dụng 89V51RB2 Browse tới NXP, và chọn P89V51RB2
Trang 25BKIT HARDWARE CLUB www.bkit4u.com 25
Bước 5 : Sau khi nhấn OK, màn hình sau sẽ xuất hiện, bạn chọn No
Bước 6 : Project được tạo ra như sau:
Trang 26Bước 7 : Cấu hình để tạo ra file Hex, bạn chọn menu Project, chọn Option for Target
Trang 27BKIT HARDWARE CLUB www.bkit4u.com 27
Bước 8 : Màn hình sau xuất hiện
Trang 28Bước 9 : Chọn tab Output, và click chọn Click Hex File
Bước 10 : Chép thư file REG51F.H (nếu cài mặc định sẽ nằm trong thư mục
C:\Keil\C51\INC\Philips hoặc bạn có thể copy trong CD đi kèm) là file define các thanh ghi của 89V51 vào cùng cấp với file project
Trang 29BKIT HARDWARE CLUB www.bkit4u.com 29
Bước 11 : Bạn có thể chọn và nhấn Delete Source Group1 do Keil C tự tạo ra, và
tự tạo Group mới cho mình Chọn Target, click phải chuột và chọn New Group, 1 group mới được tạo ra, đổi tên thành Main cho gợi nhớ Trong tất cả các bài demo, group này sẽ chứa file main.c, là file chính để chạy chương trình
Trang 30Bước 11 : Tạo mới 1 file bằng cách chọn menu File rồi chọn New Chọn tiếp menu File rồi chọn Save, khung cửa sổ sau sẽ hiện lên, bạn nhập tên file vào và nhấn Save
Bước 12 : Click phải vào group Main, và chọn Add Files to Group Main
Trang 31BKIT HARDWARE CLUB www.bkit4u.com 31
Bước 13 : Chỉ đường dẫn đển file main.c mà bạn vừa tạo, nhấn Add rồi nhấn tiếp Close
Trang 32Bước 14 : Click vào dấu + của Main, bạn sẽ thấy file main.c đã được thêm vào project
2.2 Viết chương trình đơn giản
Keil C hỗ trợ compiler của C chuẩn, nên cấu trúc chương trình của nó hoàn toàn giống C chuẩn Bạn có thể tìm hiểu thêm về lập trình C để nâng cao khả năng tổ chức 1 chương trình C Tuy nhiên, đi theo trình tự của các bài thí nghiệm này, bạn cũng có thể nắm được 1 cấu trúc của chương trình C chuẩn viết cho 89V51
Yêu cầu của bài thí nghiệm này là với nút 1 được nhất, thì đèn led 1 sáng, nút 2 được nhấn thì đèn 2 sáng,…
2.2.1 Kết nối phần cứng
Gạt switch 1 lên ON để kích hoạt Port 1
Gạt switch 2 lên ON để kích hoạt Port 3
Các nút nhấn được nối với P3 (Port 3) của vi điều khiển theo trình tự nút 1 nối với P3.0, nút 2 nối với P3.1, v.v… Các nút nhấn tích cực 0
Trang 33BKIT HARDWARE CLUB www.bkit4u.com 33
Đây là kiểu kết nối phím đơn giản nhất, các giải pháp kết nối phím khác tốt hơn
sẽ được trình bày ở bài chống rung cho phím
Các đèn led được nối với P1 (Port 1) của vi điều khiển, đèn 1 nối với P1.0, đèn 2 nối với P1.1, v,v… Các đèn tích cực mức 1
2.2.2 Viết chương trình
Trong file main.c, bạn viết code như sau :
#include <REG51F.H>
void main() {
while(1) {
P1 = ~P3;
} }
Do P3 tích cực mức 0, nút 1 được nhấn giá trị của nó sẽ là 1111 1110 = 0xFE,
~P3 lúc đó sẽ là 0000 0001 = 0x01 P1 tích cực mức 1 nên P1 = 0x01 thì đèn 1 sẽ sáng
Chọn menu Project và chọn Build Target hoặc nhấn F7 để dịch chương trình Nếu
có lỗi, Keil C sẽ thông báo để bạn sửa, nếu không có lỗi file Hex sẽ được tạo ra cùng cấp với file project
Trang 342.2.3 Nạp chương trình
Bước 1 : Kết nối mạch nạp với board thông qua jack 4, với chân số 1 là VCC, chân 2 là GND, chân 3 là TX và chân 4 là RX
Bước 2 : Gắn nguồn cho kit thí nghiệm
Bước 3 : Khởi động Flash Magic
Bước 4 : Chọn menu ISP và chọn Erase Flash Pages để xoá code cũ trong 89V51RB2 Bạn cần phải làm bước này trước khi nạp chương trình cho các dòng 8051 không tự xoá Màn hình sau sẽ hiện lên :
Bạn dùng thêm tổ hợp phím Shift để có thể chọn được nhiều Pages, và nhấn Erase Khi màn hình sau hiện lên, bạn nhấn nút Reset trên board để tiếp tục (nên nhấn và giữ trong khoảng 2 giây)
Bước 5 : Khi cửa sổ sau hiện lên, nhấn OK để tiếp tục
Trang 35BKIT HARDWARE CLUB www.bkit4u.com 35
Bước 6 : Nhấn Browse để chọn đường dẫn tới file Hex cần nạp rồi nhấn Start
Bước 7 : Khi thấy Status là Finished, bạn có thể nhấn nút Reset trên board để bắt đầu chạy chương trình của bạn
2.2.4 Các lỗi xảy ra khi nạp chương trình
Dưới đây là 1 số lỗi phổ biến khi nạp chương trình Kinh nghiệm để tìm lỗi là kiểm tra qua hết các lỗi thông dụng dưới đây hoặc dựa vào các thông báo lỗi để phán đoán
Chưa cấu hình Flash Magic
Trang 36Để khắc phục lỗi này, bạn chọn vào menu Opition/ Advance Option , chọn qua tab Hardware Config và check chọn Assert DTR and RTS while COM Port open Nhấn
OK để đóng cửa số này lại
Chọn sai cổng COM
Chọn sai tốc độ Baud
Ở lỗi này, Flash Magic hiển thị thông báo yêu cầu bạn nhấn reset, nhưng khi nhấn reset thì thông báo trên xuất hiện, bạn chỉnh lại tốc độ Baud là 9600
Trang 37BKIT HARDWARE CLUB www.bkit4u.com 37
Để khắc phục lỗi này, trước khi nạp bạn nhấn đè nút Reset, mọi thao tác vẫn diễn
ra bình thường cho đến khi cửa sổ yêu cầu bạn nhấn nút Reset, bạn giữa thêm vài giây rồi thả ra Cách thứ 2 là rút nguồn của board ra, cho đến khi Flash Magic yêu cầu bạn nhấn Reset thì cắm nguồn vào
Nếu như đã kiểm tra qua hết các lỗi kia mà chương trình vẫn chưa nạp được, thì nguyên nhân có thể là bạn cắm ngược chiều mạch nạp, phần mềm Flash Magic bị lỗi, IC MAX 232 bị hư hoặc hư vi điều khiển
Trang 38Bài 3 : Điều khiển đơn giản Led 7 đoạn
Gạt switch 2 lên ON để kích hoạt Port 3 là các nút nhấn
Gạt switch 4 lên ON để kích hoạt Led 7 đoạn
Port 2 dùng để chọn led 7 đoạn nào sẽ được sáng và Port 0 là dữ liệu cho led 7 đoạn đó
Trang 39BKIT HARDWARE CLUB www.bkit4u.com 39
Với kết nối phần cứng như vậy, để hiện thị số 5 thì dữ liệu xuất ra sẽ là 0x6D
(0110 1101) Tương tự, giá trị cho các số từ 0 đến 9 sẽ là :
unsigned char led7_data[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
3.2 Viết chương trình
3.2.1 Hàm init_main()
Do đăc điểm của phần cứng, trong hàm main, bạn phải dùng thêm hàm init_main,
để gán các Port 0,1,2 với giá trị 0x00
void init_main() {
Trang 40//P0.4 : e P2.0 : Led 5 //P0.5 : f P2.0 : Led 6 //P0.6 : g P2.0 : Led 7 //P0.7 : dot P2.0 : Led 8 unsigned char led7_data[10] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
init_main();
while(1) {
if((P3 & 0x01) == 0) // P3 = 1111 1110 {
P0 = led7_data[0];
P2 = 0x01;
} else if((P3 & 0x02) == 0)// P3 = 1111 1101 {
P0 = led7_data[1];
P2 = 0x02;
} else if((P3 & 0x04) == 0)// P3 = 1111 1011 {
P0 = led7_data[2];
P2 = 0x04;
} else if((P3 & 0x08) == 0) // P3 = 1111 0111 {
P0 = led7_data[3];
P2 = 0x08;
} else if((P3 & 0x10) == 0) // P3 = 1110 1111 {
P0 = led7_data[4];
P2 = 0x10;
} else if((P3 & 0x20) == 0) // P3 = 1101 1111 {
P0 = led7_data[5];
P2 = 0x20;
} else if((P3 & 0x40) == 0) // P3 = 1011 1111 {