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ộ
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;
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)
Lnh assembly:
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,295
432unsigned long
-2,147,483,648 to 2,147,483,647
432long
0 to 65,535216unsigned int
-32,768 to +32,767216int
0 to 65,535216unsigned short
-32,768 to +32,767216short
-32,768 to +32,767
216enum
0 to 255 18unsigned char
-128 to +12718char
RangeBytesBitsType
8
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
15
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;
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)
{
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ập
trì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)
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,R7
MOV DPTR, #SQUARE
MOVC A,@A+DPTR
MOV 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ệnh
cho 8051 như thế nào? (dùng assembly
và C)
Just 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 ñọc
switch ta phải
ghi “1” ra bộ
chốt của chân
port ñang giao
tiế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.
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ự ra
serial port của 8051
Cấu trúc:
int printf ( const char * format, );
Chi tiết tham khảo tại:
/>tdio/printf/
21
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
41