1. 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. 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. 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. 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. 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. 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 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. 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 25518unsigned char
-128 to +12718char
RangeBytesBitsType
8. 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,535216sf16
0 to 25518sfr
0 or 11sbit
0 or 11bit
RangeBytesBitsType
9. 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. 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. 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. 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 l p vô t n th c hi n task1 và task2
{
Task1();
Task2();
}
}
13. 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. 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. 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. 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. 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. 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. 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. 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:
http://www.cplusplus.com/reference/clibrary/cs
tdio/printf/
21. 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:
http://www.keil.com/support/man/docs/c5
1/c51_library.htm