L P TRÌNH H TH NG NHÚNGBÙI QU C B OVi ñi u khi n 8051BM K Thu t .i n T - .H Bách Khoa TP.HCM21.Vi ñi u khi n 8051BM K Thu t .i n T - .H Bách Khoa TP.HCM3Ph n m mKEIL PROTEUSBM K Thu t .i n T - .H Bách Khoa TP.HCM42.C u trúc b nh pdf
Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.04 MB, 21 trang )
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ớ ñượ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
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ùng
chung 1 không gian nhớ cho
bộ 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ườ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:
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
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ớ
chng 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,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
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
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 ghi
bằ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ù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)
{
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.
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áo
bdata
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ậ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)
//mt vòng lp vô tn thc hin 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,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)
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
30
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ở.
16
BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM
31
Chống rung
Not pressed
Press
detected
delay
Read again
Confirmed
Press
detected
delay
Read again
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.
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ương
trì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ình
getkey_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ự 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
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:
/>1/c51_library.htm