LẬP TRÌNH HỆ THỐNG NHÚNG BÙI QUỐC BẢO Vi ñiều khiển 8051 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 2 1
Vi ñiều khiển 8051 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 3 Phần mềm KEIL PROTEUS BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 4 2
Cấu trúc bộ nhớ của 8051 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 5 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 6 3
Cấu trúc bộ nhớ của 8051 8051 có 3 vùng nhớ riêng biệt (bộ nhớ chương trình, bộ nhớ dữ liệu trong, bộ nhớ dữ liệu ngoài). Mỗi vùng nhớ ñược truy cập bằng các câu lệnh khác nhau. Khi khai báo các biến, ta phải xác ñịnh vùng nhớ cho các biến ñó. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 7 Cấu trúc bộ nhớ của ARM7 LPC2000 Các vi xử lý có kiến trúc Von- Newman (VD: ARM) dùng chung 1 không gian nhớ cho bộ nhớ chương trình và dữ liệu. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 8 4
Không gian bộ nhớ chương trình ðược gọi là code space Chứa chương trình và các hằng số VD: khai báo hằng số chứa bình phương các số từ 0 ñến 3: code char square[4] = {0,1,4,9}; Lệnh assembly: MOVC A, @A+DPTR BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 9 Không gian bộ nhớ dữ liệu nội Vùng nhớ nội truy xuất trực tiếp (00H-7FH) ñược ký hiệu là data Lệnh assembly: MOV A, 7FH Vùng nhớ nội truy xuất gián tiếp (00H-FFH), ñược ký hiệu idata Lệnh assembly: MOV R0, #80H MOV A, @R0 Hai vùng nhớ này dùng ñể chứa các biến thường dùng và biến tạm VD: khai báo một biến integer: idata unsigned int temp; BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 10 5
Không gian bộ nhớ dữ liệu ngoài ðược gọi là external data space (xdata) L nh assembly: MOV DPTR, #2000H MOVX A,@DPTR Chứa các biến ít dùng, các khối dữ liệu lớn hoặc ngoại vi theo kiểu memory-mapped VD: xdata unsigned int[1000] ADC_value; BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 11 VD: Viết hàm có prototype như sau: unsigned int checksum (unsigned int start, unsigned int end) ñể tính checksum của vùng nhớ ch ng trình từ ñịa chỉ start ñến end (code) BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 12 6
unsigned int checksum (unsigned int start, unsigned int end) { unsigned int code *codeptr, *codeend; unsigned int data checksum = 0; codeptr = (unsigned int code *)start; codeend = (unsigned int code *)end; while (codeptr <= codeend) { checksum = checksum + (unsigned int data)*codeptr; codeptr++; /* go to the next address */ } return (checksum); } BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 13 Các kiêủ thông dụng Type Bits Bytes Range char 8 1-128 to +127 unsigned char 8 1 0 to 255 enum 16 2-32,768 to +32,767 short 16 2-32,768 to +32,767 unsigned short 16 2 0 to 65,535 int 16 2-32,768 to +32,767 unsigned int 16 2 0 to 65,535 long 32 4-2,147,483,648 to 2,147,483,647 unsigned long 32 4 0 to 4,294,697,295 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 14 7
Kiêủ float và double Trong C51, kiểu float và double giống nhau, gồm 4 byte theo chuẩn EEE-754 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 15 Các kiểu ñặc biệt của C51 Type Bits Bytes Range bit 1 0 or 1 sbit 1 0 or 1 sfr 8 1 0 to 255 sf16 16 2 0 to 65,535 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 16 8
Thanh ghi Keil cho phép khai báo các thanh ghi bằng từ khóa sfr VD: sfr P0 = 0x80; P0 = 0x0F; //khai báo thanh ghi P0 ở //ñịa chỉ 80H BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 17 Tác ñộng ñến bit trong SFR 8051 có các lệnh tác ñộng ñến bit. ðể tác ñộng ñến bit trong thanh ghi ta dùng khai báo sbit sbit name = sfr-name ^ bit-position; sbit name = sfr-address ^ bit-position; sbit name = sbit-address; BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 18 9
Tác ñộng ñến bit trong SFR sfr PSW = 0xD0; sbit CY = PSW^7; sbit CY = 0xD0^7; sbit CY = 0xD7; BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 19 Tác ñộng ñến bit trong SFR sfr char P0 = 0x80; sbit SW = P0^0; void main(void) { while(1) { SW =!SW; } } ðịa chỉ của các biến sfr, sfr16, sbit phải nằm bên ngoài hàm. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 20 10
Vùng nhớ ñược ñịnh ñịa chỉ bit 8051 có vùng nhớ ñược ñịnh ñịa chỉ bit. ðể tác ñộng ñến vùng nhớ này ta dùng khai báo bdata bdata bit flag = temp ^0; void main(void) { } flag = 1; char temp _at_ 0x2F; BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 21 Lưu ý: Các khai báo code, idata, xdata, bdata, sfr, sbit là ñặc biệt cho trường hợp lập trình 8051. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 22 11
VD: Viết chương trình cho 8051 tạo hàm như sau: P1.0 = P1.1 AND P1.2 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 23 Cấu trúc vòng lặp vô tận (endless loop) void main(void) { } Task1_init(); Task2_init(); While(1) //m t vòng l p vô t n th c hi n task1 và task2 { Task1(); Task2(); } BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 24 12
Endless loop Ưu ñiểm: ðơn giản. Dễ thực hiện, sửa lỗi và bảo trì Không cần sử dụng nhiều tài nguyên hệ thống (VD: timer) Dễ dàng thay ñổi ñể chạy với các vi xử lý khác (portable) BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 25 Endless loop Nhược ñiểm: Không phù hợp với các ứng dụng ñòi hỏi thời gian chính xác (VD: ñồng hồ số). Tiêu tốn năng lượng vì CPU hoạt ñộng ở chế ñộ bình thường trong toàn bộ thời gian BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 26 13
Look-up table unsigned char code square[]={0,1,4,9,16,25,36,49,64,81}; unsigned char cal_square(unsigned char num) { return square[num]; } Assembly: MOV A,R7 MOV DPTR, #SQUARE MOVC A,@A+DPTR MOV R7,A BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 27 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 28 14
Question ðịa chỉ của LED 7 ñoạn là bao nhiêu? ðể làm LED hiển thị số 8, ta dùng lệnh cho 8051 như thế nào? (dùng assembly và C) Xây dựng bảng mã 7 ñoạn cho LED (cho các số lớn hơn 9 tắt tất cả ñoạn LED). Viết chương trình C ñọc giá trị từ 4 SW và hiển thị lên LCD. (Dùng bảng tra ñể lấy mã 7 ñoạn). BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 29 Giao tiếp switch Switch là 1 trong những phương pháp giao tiếp chính của hệ thống nhúng Các contact cơ khí sẽ bị rung khi ñóng hoặc mở. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 30 15
Chống rung delay delay Not pressed Press detected Read again Confirmed Press detected Read again Just a bounce BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 31 Giao tiếp switch Với 8051, trước khi ñọc switch ta phải ghi 1 ra bộ chốt của chân port ñang giao tiếp switch BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 32 16
Viết chương trình C ñọc giá trị switch (có chống rung) và xuất ra LED. BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 33 Giao tiếp keypad BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 34 17
Giao tiếp keypad Chương trình getkey(): Giá trị trả về: mã phím (0-15) hoặc 255 nếu không có phím nhấn. Vẽ lưu ñồ Viết code C BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 35 Giao tiếp keypad Chương trình getkey_debound() Giá trị trả về: mã phím (0-15) hoặc 255 nếu không có phím nhấn. Cách thực hiện: Nếu trong 20 lần liên tiếp gọi chương trình getkey() trả về cùng 1 giá trị, thì ñó là giá trị trả về của getkey_debound(). BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 36 18
Giao tiếp keypad Vẽ lưu ñồ cho chương trình getkey_debound() Viết code C BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 37 BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 38 19
Giao tiếp keypad Viết chương trình getcalkey_debound(): Giá trị trả về là 1 trong các ký tự: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, C, =, +, -, x, / hoặc N nếu không có phím ñược nhấn BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 39 Hàm printf() Hàm printf() rất có ích trong quá trình viết và debug chương trình. Mặc ñịnh, hàm printf xuất 1 chuỗi ký tự ra serial port của 8051 Cấu trúc: int printf ( const char * format,... ); Chi tiết tham khảo tại: http://www.cplusplus.com/reference/clibrary/cs tdio/printf/ BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 40 20
Thư viện của Keil C Keil C hỗ trợ rất nhiều thư viện như thư viện xuất nhập (stdio), toán (math), Các thư viện và hàm của Keil C có thể tham khảo tại: http://www.keil.com/support/man/docs/c5 1/c51_library.htm BM Kỹ Thuật ðiện Tử - ðh Bách Khoa TP.HCM 41 21