Post on 22-Jul-2015
1
BÙI QUỐC BẢO
LẬP TRÌNH HỆ THỐNG NHÚNG
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 2
Vi ñiều khiển 8051
2
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 3
Vi ñiều khiển 8051
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 4
Phần mềm
� KEIL
� PROTEUS
3
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 5
Cấu trúc bộ nhớ của 8051
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 6
4
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 7
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ớ ñượctruy 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 ñịnhvùng nhớ cho các biến ñó.
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 8
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ùngchung 1 không gian nhớ chobộ nhớ chương trình và dữliệu.
5
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 9
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 10
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ườngdùng và biến tạm
� VD: khai báo một biến integer:� idata unsigned int temp;
6
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 11
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ớnhoặ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 12
� 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)
7
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 13
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 14
Các kiêủ thông dụng
0 to 4,294,697,295432unsigned long
-2,147,483,648 to 2,147,483,647432long
0 to 65,535216unsigned int
-32,768 to +32,767216int
0 to 65,535216unsigned short
-32,768 to +32,767216short
-32,768 to +32,767216enum
0 to 255 18unsigned char
-128 to +12718char
RangeBytesBitsType
8
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 15
Kiêủ float và double
� Trong C51, kiểu float và double giốngnhau, gồm 4 byte theo chuẩn EEE-754
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 16
Các kiểu ñặc biệt của C51
0 to 65,535 216sf16
0 to 25518sfr
0 or 11sbit
0 or 11bit
RangeBytesBitsType
9
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 17
Thanh ghi
� Keil cho phép khai báo các thanh ghibằng từ khóa sfr
� VD:� sfr P0 = 0x80; //khai báo thanh ghi P0 ở
//ñịa chỉ 80H
� P0 = 0x0F;
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 18
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ùngkhai báo sbit
� sbit name = sfr-name ^ bit-position;
� sbit name = sfr-address ^ bit-position; sbit name = sbit-address;
10
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 19
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 20
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ênngoài hàm.
11
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 21
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áobdata
� bdata char temp _at_ 0x2F;
� bit flag = temp ^0;
� void main(void)
� {
flag = 1;
}
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 22
� Lưu ý:
� Các khai báo code, idata, xdata, bdata,
sfr, sbit là ñặc biệt cho trường hợp lậptrình 8051.
12
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 23
� 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 24
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 l2p vô t4n th5c hi�n task1 và task2
{
Task1();
Task2();
}
}
13
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 25
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 26
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
14
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 27
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,R7MOV DPTR, #SQUAREMOVC A,@A+DPTRMOV R7,A
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 28
15
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 29
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ệnhcho 8051 như thế nào? (dùng assembly và C)
� Xây dựng bảng mã 7 ñoạn cho LED (chocá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 30
Giao tiếp switch
� Switch là 1 trong những phương phápgiao tiếp chính của hệ thống nhúng
� Các contact cơ khí sẽ bị “rung” khi ñónghoặc mở.
16
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 31
Chống rung
Not pressedPress
detected
delay
Read againConfirmed
Press detected
delay
Read againJust a bounce
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 32
Giao tiếp switch
Với 8051, trước khi ñọcswitch ta phảighi “1” ra bộchốt của chânport ñang giaotiếp switch
17
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 33
� 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 34
Giao tiếp keypad
18
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 35
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 36
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ươngtrình getkey() trả về cùng 1 giá trị, thì ñólà giá trị trả về của getkey_Debound().
19
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 37
Giao tiếp keypad
� Vẽ lưu ñồ cho chương trìnhgetkey_Debound()
� Viết code C
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 38
20
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 39
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 40
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ự raserial 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/cstdio/printf/