You are on page 1of 119

DKS_GROUP -1-

M CL C
Bài 1: Gi i thi u v vi i u khi n 3
1.1.Tiêu chu n trong l a ch n m t b vi i u khi n 3
1.2.Vi i u khi n và vi x lí 3
1.3.S chân vi i u khi n 8051 3
1.4.M ch 8051 t i thi u 6
1.5.C u trúc s kh i c a vi i u khi n 7
1.6.Các thành viên khác c a h 8051 9
1.7.Ram n i và các thanh ghi SFR c a 8051 11
Bài 2.Ngôn ng l p trình cho vi i u khi n (Ph n 1) 12
2.1.C u trúc m t chư ng trình 12
2.2.Các lo i bi n trong C 13
2.3.Hàm trong C 15
2.4.Toán t c b n 15
2.5.C u trúc l nh r nhánh 15
2.6.B ti n x lý 16
Bài 2.Hư ng d n s d ng keil C (Ph n 2) 17
2.1.Kh i t o project 17
2.2.So n th o chư ng trình 36
2.3.D ch chư ng trình 41
2.4.Mô ph ng 45
Bài 3. i u khi n O(out) v i Led ơn 50
3.1.L p m ch 50
3.2.Nguyên lý ho t ng 51
3.3.L p trình 52
3.4.N p chư ng trình 60
3.5.K t qu 61
3.6. i u khi n Led t ng chi c 1 62
3.7. i u khi n Out 62
Bài 4. i u khi n led 7 thanh 67
4.1.L p m ch 67

DKS_GROUP -2-
4.2.Nguyên lý ho t ng 68
4.3.L p trình 69
4.4.N p chíp 75
4.5.K t qu 75
Bài 5. c bàn phím 78
5.1.L p m ch 78
5.2.Nguyên lý quét phím 79
5.3.L p trình 79
Bài 6. i u khi n LCD 16x2 94
6.1.L p m ch 94
6.2.Nguyên lý ho t ng c a LCD 97
6.3.L p trình 97
6.3.1. nh ngh a con tr 99
6.3.2.Cách s d ng 99
Bài7. i u ch r ng xung 100
7.1.L p m ch theo s 101
7.2.Nguyên lý ho t ng 110
Bài 8.Led ma tr n 114
8.1.L p m ch 114
8.2.Nguyên lý ho t ng 116
8.2.Code 117

DKS_GROUP -3-
Chú ý : ây hoàn toàn là ph n lí thuy t, mình ã rút g n t i a, do ó các b n nên c
h t. Chưa nên th c hành v i vì tôi s hư ng dân sau.
1.1 Tiêu chu n trong l a ch n m t b vi i u khi n
Là kh n ng s n sàng áp !ng v s lư"ng trong hi n t i và tư ng lai. i v i m t s
nhà thi t k i u này là quan trong h n c . Hi n nay, các b vi i u khi n 8 bit !ng
u là h 8051 có s lư ng l n nh t các nhà cung c p a d ng (nhi u ngu n). Nhà
cung c p có ngh a là nhà s n xu t bên c nh nhà sáng ch c a b vi i u khi n. Trong
trư#ng h"p 8051 thì nhà sáng ch c a nó là Intel, nhưng hi n nay có r t nhi u hãng
s n xu t nó (c$ng như trư c kia ã s n xu t).
Các hãng này bao g m: Intel, Atmel, Philips/signe-tics, AMD, Siemens, Matra
và Dallas, Semicndictior.
B ng a ch c a m t s hãng s n xu t các thành viên c a h 8051.
Hãng a ch% Website
Intel www.intel.com/design/mcs51
Antel www.atmel.com
Plips/ Signetis www.semiconductors.philips.com
Siemens www.sci.siemens.com
Dallas Semiconductor www.dalsemi.com
8051 là m t b x lý 8 bit có ngh a là CPU ch% có th làm vi c v i 8 bit d&
li u t i m t th#i i m. D& li u l n h n 8 bit ư"c chia ra thành các d& li u 8 bit
cho x lý. 8051 có t t c 4 c'ng vào - ra I/O m(i c'ng r ng 8 bit. Các nhà s n xu t ã
cho xu t xư)ng ch% v i 4K byte ROM trên chíp.
B ng các c tính c a 8051 u tiên.
*c tính S lư"ng
ROM trên chíp 4K byte
RAM 128 byte
B nh th#i 2
Các chân vào - ra 32
C'ng n i ti p 1
Ngu n ng t 6
1.2.Vi i u khi n và vi x lí:
Xin nh c n cái máy tính c a b n, con chíp Intel hay ADM c a b n là 1 b vi x lí,
nó không có RAM, ROM,c'ng IO và các thi t b ngo i vi on Chip. Còn vi i u khi n
ch!a 1 b vi x lí và RAM,ROM, c'ng IO, và có th có các thi t b ngo i vi.
1.3. Sơ chân vi i u khi n 8051:
Là IC óng v d ng DIP có 40 chân, m(i chân có m t kí hi u tên và có các ch!c n ng
như sau:
Chân 40: n i v i ngu n nuôI +5V.
Chân 20: n i v i t(Mass, GND).
Chân 29 (PSEN)(program store enable) là tín hi u i u khi n xu t ra c a 8051, nó
cho phép ch n b nh ngoài và ư"c n i chung v i chân c a OE (Outout Enable) c a
EPROM ngoài cho phép c các byte c a chư ng trình. Các xung tín hi u PSEN
h th p trong su t th#i gian thi hành l nh. Nh&ng mã nh phân c a chư ng trình ư"c

DKS_GROUP -4-
c t EPROM i qua bus d& li u và ư"c ch t vào thanh ghi l nh c a 8051 b)i mã
l nh.(chú ý vi c c ) ây là c các l nh (khác v i c d& li u), khi ó VXL ch% c
các bit opcode c a l nh và ưa chúng vào hàng "i l nh thông qua các Bus a ch% và
d& li u)
Chân 30 (ALE : Adress Latch Enable) là tín hi u i u khi n xu t ra c a 8051, nó cho
phép phân kênh bus a ch% và bus d& li u c a Port 0.
Chân 31 (EA : Eternal Acess) ư"c ưa xu ng th p cho phép ch n b nh mã ngoàI
i v i 8051.
i v i 8051 thì : EA = 5V : Ch n ROM n i. EA = 0V : Ch n ROM ngo i.
32 chân còn l i chia làm 4 c'ng vào ra:
Vào ra t!c là có th dùng chân ó c m!c logic (0;1 tư ng !ng v i 0V ; 5V)vào
hay xu t m!c logic ra(0;1)
P0 t chân 39 32 tư ng !ng là các chân P0_0 P0_7
P1 t chân 1 8 tư ng !ng là các chân P1_0 P1_7
P2 t chân 21 28 tư ng !ng là các chân P2_0 P2_7
P3 t chân 10 17 tư ng !ng là các chân P3_0 P3_7
U1
1 40
2 P1.0 VCC 39
3 P1.1 P0.0 38
4 P1.2 P0.1 37
5 P1.3
P1.4
P0.2
P0.3
36 P0 P1 P2 P3 Port's Bit
6 35
7 P1.5
P1.6
P0.4
P0.5
34 P0.0 P1.0 P2.0 P3.0 D0
8 33
9 P1.7
RESET
P0.6
P0.7
32 P0.1 P1.1 P2.1 P3.1 D1
10 31
11 RXD
TXD
EA/VP
ALE/P
30 P0.2 P1.2 P2.2 P3.2 D2
12 AT89C51 29
13
14
INT0
INT1
PSEN
P2.7
28
27
P0.3 P1.3 P2.3 P3.3 D3
15
16
T0
T1
P2.6
P2.5
26
25
P0.4 P1.4 P2.4 P3.4 D4
17
18
WR
RD
P2.4
P2.3
24
23
P0.5 P1.5 P2.5 P3.5 D5
19
20
X2
X1
P2.2
P2.1
22
21
P0.6 P1.6 P2.6 P3.6 D6
VSS P2.0
P0.7 P1.7 P2.7 P3.7 D7

Riêng c'ng 3 có 2 ch!c n ng ) m(i chân như trên hình v :


P3.0 – RxD : chân nh n d& li u n i ti p khi giao ti p RS232(C'ng COM ).
P3.1 _ TxD : phân truy n d& li u n i ti p khi giao ti p RS232.
P3.2 _ INTO : interrupt 0 , ng t ngoài 0.
P3.3 _ INT1: interrupt 1, ng t ngoài 1.
P3.4 _T0 : Timer0 , u vào timer0.
P3.5_T1 : Timer1, u vào timer 1.
P3.6_ WR: Write, i u khi n ghi d! li u.
P3.7 _RD: Read , i u khi n c d& li u.

Chân 18, 19 n i v i th ch anh t o thành m ch t o dao ng cho V K

DKS_GROUP -5-
T n s th ch anh thư#ng dùng trong các !ng d ng là : 11.0592Mhz(giao ti p v i c'ng
com máy tính) và 12Mhz T n s t i a 24Mhz. T n s càng l n V K x lí càng
nhanh.

Dao ng c a th ch anh
S1 S2 S3 S4 S5
S6

P1 P2

Riêng c'ng 3 có thêm ch!c n ng như dư i ây


P3.0 – RxD : chân nh n d& li u n i ti p khi giao ti p RS232(C'ng COM ).
P3.1 _ TxD : ph n truy n d& li u n i ti p khi giao ti p RS232.
P3.2 _ INTO : interrupt 0 , ng t ngoài 0.
P3.3 _ INT1: interrupt 1, ng t ngoài 1.
P3.4 _T0 : Timer0 , u vào timer0.
P3.5_T1 : Timer1, u vào timer 1.
P3.6_ WR: Write, i u khi n ghi d! li u.
P3.7 _RD: Read , i u khi n c d& li u.
Chân 18, 19 n i v i th ch anh t o thành m ch t o dao ng cho V K
T n s th ch anh thư#ng ư"c dùng trong các !ng d ng là : 11.0592Mhz(giao ti p
v i c'ng com máy tính) và 12Mhz
T n s t i a 24Mhz. T n s càng l n V K x lý càng nhanh.
5VDC

40
U3 10Kx9
VCC
39
P0.0 38 R4
P0.1 37
P0.2 36
P0.3 35 R7
P0.4 34
P0.5 33 R9
P0.6 32 + C3
P0.7 31
EA/VP 10uF/25V
9
RESET

R1
10K

C2
33p 19
18 X1
X2
12Mhz 20
C1 GND
33p
8051

DKS_GROUP -6-
M ch này chưa có kh i ngu n t o ngu n 5V các b n dùng con IC sau:

Sơ chân: U6
LM7805/TO
1 3
VIN VOUT

GND
2
Gi i thi u IC 'n áp 7805 : u vào > 7V u ra 5V 500mA. M ch 'n áp: c n cho
V K vì n u ngu n cho V K không 'n nh thì s treo V K, không ch y úng, ho*c
reset liên t c, th m chí là ch t chíp.
M ch ngu n

12VDC In U1
LM7805/TO
1 3 5VDC Out
VIN VOUT
GND

C1 + C3
C2 104 10uF/25V
104
2

1.4. M ch vi i u khi n cơ b n
5VDC
40

U1
VCC

+ C3

9 10uF/25V
RESET
R1
10K

C2
33p 18
X2

12Mhz
C1 19
33p 20 X1
VSS
8051

DKS_GROUP -7-
1.5. C u trúc vi i u khi n 89c51

EXTERNAL
INTERRUPTS
ETC

COUNTER
TIMER

INPUTS
INTERRUP ON - 0
T CHIP TIMER
1

CPU

OS BUS 4 I/O SERIAL


C CONTRO PORTS PORT

P P P P TXD RXD
ADDRESS/DAT
A
Chú ý:S kh i bên trong con 8051 có nh&ng tài nguy n . Interrupt, Ram, Timer,
Serial prort.
1.6.Các thành viên khác c a h 8051:
Có hai b vi i u khi n thành viên khác c a h 8051 là 8052 và 8031.
B vi i u khi n 8052: 8052 có t t c các *c tính chu n c a 8051 ngoài ra nó có
thêm 128 byte RAM và m t b nh th#i n&a. Hay nói cách khác là 8052 có 256 byte
RAM và 3 b nh th#i. Nó c$ng có 8K byte ROM. Trên chíp thay vì 4K byte như
8051.
B ng : So sánh các *c tính c a các thành viên h 8051.

c tính 8051 8052


ROM trên chip 4K byte 8K byte
RAM 128 byte 256 byte
B nh th i 2 3
C ng n i ti p 1 1
Ngu n ng t 6 8

Do v y t t c m i chư ng trình vi t cho 8051 u ch y trên 8052 nhưng i u


ngư"c l i là không úng. *c bi t : M t nhà s n xu t chính c a h 8051 khác n&a là
Philips Corporation. Hàng này có m t d i l a ch n d ng l n cho các b vi i u khi n

DKS_GROUP -8-
h 8051. Nhi u s n ph m c a hãng ã có kèm theo các *c tính như các b chuy n
'i ADC, DAC, chân PWM, c'ng I/0 m) r ng .
Update s n ph m 8051 m i t i các trang web c a các nhà s n xu t a ch% ã
có ) ph n gi i thi u. Ch y u:www.atmel.com
1.7.Ram n i và các thanh ghi

F0 F7 F6 F5 F4 F3 F2 F1 F0
C c thanh ghi SFR
cú a ch% E0 E7 E6 E5 E4 E3 E2 E1 E0 n+m gi&a 80H
và FFH các a ch% này
D0 D7 D6 6D 6C 6B 6A 69 68

B8 - - - BC BB BA B9 B8

B0 B7 B6 B5 B4 B3 B2 B1 B0

A8 AF AE AD AC AB AA A9 A8

A0 A7 A6 A5 A4 A3 A2 A1 A0

99 Không nh a ch t ng bít
98 9F 9E 9D 9C 9B 9A 99 98

90 97 96 95 94 93 92 91 90
8D Không nh a ch t ng bít
8C Không nh a ch t ng bít
8B Không nh a ch t ng bít
8A Không nh a ch t ng bít
89 Không nh a ch t ng bít
88 8F 8 8D 8C 8B 8A 89 88
E
87 Không nh a ch t ng bít

83 Không nh a ch t ng bít
82 Không nh a ch t ng bít
81 Không nh a ch t ng bít
80 87 86 8 84 83 82 81 80
5
THANH GHI CH!C N"NG "C BIÊT

DKS_GROUP -9-
) trên 80H, vì các a ch% t 00 n 7FH là a ch% c a b nh RAM bên trong
8051. Không ph i t t c m i a ch% t 80H n FFH u do SFR s d ng, nhưng
v trí ng n nh t 80H n FFH chưa dùnglà d& tr& và l p trình viên 8051 c$ng
không ư"c s d ng.
B ng : ch!c n ng c a thanh ghi ch!c n ng *c bi t SFR
SFR nh a ch% t ng bit( nh&ng thanh ghi c n nh i khi l p trình c b n C)
Thanh ghi / Ký hi u Ch#c n$ng
Bit
TMOD Ch n model cho b nh th i 1
7 GATE Bít i u khi n c ng. Khi ư%c set lên 1, b nh
th i ch ho t ng trong khi INT1 & m#c cao
6 C/T Bít ch n ch#c n$ng m ho c nh th i:
1= m s ki n
0= nh th i trong m t kho ng th i gian
5 M1 Bit ch n ch th# nh t
4 M0 Bit ch n ch th# 2
M1

0 0 0 Ch nh th i 13 bit
0 1 1 Ch nh th i 16 bit
1 0 2 Ch t ng n p l i 8
bit
1 1 3 Ch nh th i chia x'
3 GATE Bit i u khi n c ng cho b nh th i 0
2 C/T Bit ch n ch#c n$ng m / nh th i cho b nh
th i 0
1 M1 Bit ch n ch th# nh t cho b nh th i 0
0 M0 Bit ch n ch th# 2 cho b nh th i 0
TF1 TR1 TF1 TR0 IE1 IT1 IE0 IT0
Thanh ghi / Bit Ký hi u Ch#c n$ng
TCON i u khi n b inh th i
TCON.7 TF1 C tràn c a b nh th i 1. C này ư%c set b&i
ph n c#ng khi có tràn, ư%c xoá b&i ph n m m,
ho c b&i ph n c#ng khi b vi x lý tr( n trình
ph c v ng t
TCON.6 TR1 Bit i u khi n ho t ng c a b nh th i 1. Bit
này ư%c set ho c xoá b&i ph n m m i u
khi n b nh th i ho t ng hay ngưng
TCON.5 TF0 C tràn c a b nh th i 0
TCON.4 TR0 Bit i u khi n ho t ng c a b nh th i 0
TCON.3 IE1 C ng t bên ngoài 1 (kích kh&i c nh). C này
ư%c set b&i ph n c#ng khi có c nh âm (cu ng)
xu t hi n trên chân INT1, ư%c xoá b&i ph n
m m, ho c ph n c#ng khi CPU tr( n trình
ph c v ng t

DKS_GROUP - 10 -
TCON.2 IT1 C ng t bên ngoài 1 (kích kh&i c nh ho c m#c).
C này ư%c set ho c xoá b&i ph n m m khi x y
ra c nh âm ho c m#c th p t i chân ng t ngoài
TCON.1 IE0 C ng t bên ngoài 0 (kích kh&i c nh)
TCON.0 IT0 C ng t bên ngoài 0 ( kích kh&i c nh ho c m#c)
EA ET2 ES ET1 EX1 EX0 ET0
i u khi n các ngu n ng t
IE (0: không cho phép; 1: cho phép)
IE.7 EA Cho phép/ không cho phép toàn c c
IE.6 --- Không s d ng
IE.5 ET2 Cho phép ng t do b nh th i 2
IE.4 ES Cho phép ng t do port n i ti p
IE.3 ET1 Cho phép ng t cho b nh th i 1
IE.2 EX1 Cho phép ng t t bên ngoài (ng t ngoài 1)
IE.1 EX0 Cho phép ng t t bên ngoài (ng t ngoài 0)
IE.0 ET0 Cho phép ng t do b nh th i 0

CHÚ Ý
3 thanh ghi này c$ng r t c b n, nh tên thanh ghi, tên các bít trong thanh ghi,
ch!c n ng t ng thanh ghi và t ng bít trong thanh ghi.

1.8.Gi i thi u sơ qua các ngu n ng t:

Ng t do C a ch vector
Reset h th ng RST 0000H
Ng t ngoài 0 IE0 0003H
B nh th i 0 TF0 000BH
Ng t ngoài 1 IE1 0013H
B nh th i 1 TF1 001BH
Port n i ti p RI ho c TI 0023H
B nh th i 2 TF2 ho c EXF2 002BH

Timer

Main Program

ISR ISR ISR

* ** * ** * **
Main Main Main Main

$ % & %'

DKS_GROUP - 11 -
M t chư ng trình chính không có ng t thì ch y liên t c, còn chư ng trình có
ng t thì c! khi nào i u ki n ng t ư"c m bào thì con tr s nh y sang hàm ng t
th c hi n xong hàm ng t l i quay v úng ch( c$ và th c hi n ti p chư ng trình. Ta
có 1 ví d như sau: B n ang n c m , có ti ng i n tho i , b n t bát c m ra nghe
i n tho i , nghe xong l i quay v bưng bát c m lên n ti p. Thì quá trình n c m c a
b n là chư ng trình chính,có i n tho i g i n là i u ki n ng t, b n ra nghe i n
tho i là th c hi n chư ng trình ng t(Interrupt Service Rountine),quay v n c m ti p
là ti p t c th c hi n chư ng trình chính.
Ng t i v i ngư#i m i h c vi i u khi n là r t khó hi u, vì a s các tài li u u
không gi i thích ng t làm gì. Có nhi u lo i ng t khác nhau nhưng t t c u có
chung 1 *c i m, ng t dùng cho m c ích a nhi m. a t!c là nhi u, nhi m t!c là
nhi m v . Th c hi n nhi u nhi m v .Các b n nhìn vào ti n trình c a hàm main v i
chư ng trình có ng t :
Chư ng trình chính ang ch y, ng t x y ra, th c hi n hàm ng t r i quay l i chư ng
trình chính. Chư ng trình trong vi i u khi n khác v i ví d n c m nghe i n tho i
c a tôi ) ch( , th#i gian th c hi n hàm chính là r t l n,th#i gian th c hi n hàm ng t
là r t nh , cho nên th#i gian th c thi hàm ng t không nh hư)ng nhi u l m ên ch!c
n ng hàm chính. Như v y trong hàm ng t các b n làm 1 vi c, trong hàm chính các
b n làm 1 vi c
như v y coi như các b n làm ư"c 2 vi c( a nhi m) trong 1 quang th#i gian tư ng i
ng n cõ mS, ch! th c ra t i 1 th#i i m vi i u khi n ch% th c thi 1 l nh.
Ví d : B n th ngh xem làm th nào v a i u ch xung PWM i u ch%nh t c
ng c , v a c các c m bi n u vào mà t c ng c ph thu c u vào c m
bi n.

2.1.C u trúc m t chương trình:


// ính kèm các file
#include <file.h>
#include <file.c>
//Khai báo bi n toàn c c
unsigned char x,y;
int z;
long n=0;
//Khai báo và nh ngh a các hàm
void Hàm1(void)
{
…//Các câu l nh
}

void Hàm2(unsigned char x)


{
…//Các câu l nh
}

DKS_GROUP - 12 -
//Hàm chính b t bu c chư ng trình nào c$ng ph I có
void main(void)
{
…//Các câu l nh
}
Các câu l nh trong hàm chính có th có l#i g i các hàm ã khai báo ) trên
ho*c không
Khi có l#i g i hàm nào thì chư ng trình nh y n hàm ó th c hi n hàm ó xong con
tr l i quay v chư ng trình chính(hàm main) th c hi n ti p các hàm ho*c câu l nh.
Các câu l nh trong C k t thúc b+ng d u “;”
Các l#i gi I thích ư"c *t trong d u: M) u b+ng “/*” k t thúc b+ng “*/”
N u l#i gi I thích trên 1 dòng thì có th dùng d u: “//”
Khi l p trình nên gi I thích các câu l nh kh i l nh làm gì v sau khi chư ng trình
l n d, s a l(i.

2.2.Các lo i bi n trong C:

D ng bi n S Bit S Byte Mi n giá tr


char 8 1 -128 n +127
unsigned char 8 1 0 n 255
short 16 2 -32,768 n +32,767
unsigned short 16 2 0 n 65,535
int 16 2 -32,768 n +32,767
unsigned int 16 2 0 n 65,535
-2,147,483,648
long 32 4
n+2,147,483,647
unsigned long 32 4 0 n 4,294,697,295
Khai báo bi n
C u trúc : Ki u bi n Tên bi n
VD: unsigned char x;
Khi khai báo bi n có th gán luôn cho bi n giá tr ban u.
VD :
Thay vì: unsigned char x;
x=0;
Ta ch% c n : unsigned char x=0;
Có th khai báo nhi u bi n cùng m t ki u m t lúc
VD: unsigned int x,y,z;
Ngoài ra dùng cho vi i u khi n trình d ch chuyên d ng còn h( tr" các lo i bi n
sau:
D ng bi n S Bit S Byte Mi n giá tr
bit 1 0 0;1
sbit 1 0 0;1

DKS_GROUP - 13 -
sfr 8 1 0 n 255
sf16 16 2 0 n 65,535

VD:
Ngoài ra ,chúng ta có th nh ngh a bi n ki u bít hay ki u SFR (special function
register)
Bit Kiemtra;
Sfr P10=0x90;
VD:
Bit Kiemtra;
Sfr P10=0x90;
Các SFR không c n ph i h c thu c ch% c n bi t, và chúng ư"c khai báo trong thư
vi n
AT89X51.H và AT89X52.H
2.3.Hàm trong C:
Hàm trong C có c u trúc như sau
Có 2 lo i hàm
Hàm tr l i giá tr :
C u trúc: Ki u giá tr hàm tr l ii Tên hàm (Bi n truy n vào hàm)
{
// Các l nh x lý ) ây
}

VD : unsigned char Cong(unsigned char x, unsigned char y)


{
// Các l nh x lý ) ây
}
Hàm không tr l i giá tr
C u trúc: void Tên hàm (Bi n truy n vào hàm)
{
// Các câu l nh x lý ) ây
}

VD d : void Cong(unsigned char x, unsigned char y)


{
// Các câu l nh x lý ) ây
}

Hàm có th truy n vào bi n ho*c không


VD
Hàm không có bi n truy n vào:
unsigned char Tênhàm(void)
{
// Các câu l nh x lí ) ây
}
Hàm có bi n truy n vào:
void Tênhàm(unsigned char x)

DKS_GROUP - 14 -
{
// Các câu l nh x lí ) ây
}
S bi n truy n vào tùy ý(mi,n b nh ), ng n cách b)i d u “,”
Ví d :

Void TênHàm(unsigned char x, unsigned char y, unsigned char z)


{
// Các câu l nh x lí ) ây
}
Ngoài ra riêng cho vi i u khi n ph n ph m Keil C còn có m t lo i hàm ó là hàm
ng t:
C u trúc:
Void Tênhàm(void) interrupt ngu nng t using b ngthanhghi
{
}
Hàm ng t không ư"c phép tr l i giá tr hay truy n tham bi n vào hàm.
Tên hàm b t kì
Interrupt là t khóa ch% hàm ng t

Ngu n ng t t 0 t i 5 theo b ng vector ng t


Ng t do C a ch vector
Reset h th ng RST 0000H
Ng t ngoài 0 IE0 0003H
B nh th i 0 TF0 000BH
Ng t ngoài 1 IE1 0013H
B nh th i 1 TF1 001BH
Port n i ti p RI ho c TI 0023H
B nh th i 2 TF2 ho c EXF2 002BH
Không tính ng t reset h th ng b t u m t ng t ngoài 0
B ng thanh ghi trên ram ch n t 0 n 3
2.4.Các toán t cơ b n:
&(' ) * +
, * $+-. // $ '&0 à bi n y có th là bi n ho*c giá tr nhưng ph i phù h"p ki u
Phép c ng: +
Phép tr : -
Phép nhân: *
Phép chia: /
Các toán t logic*
B+ng : ==
And: &&
Or: ||
Not: !
D ch trái: <<
D ch ph i: >>
2.5.Các c u trúc l nh r) nhánh, ki m tra thư ng dùng:
Câu l nh r nhánh if:

DKS_GROUP - 15 -
C u trúc: if ( i uki n) { // Các câu l nh x lí }
Gi i thích: N u i uki n úng thì x lí các câu l nh bên trong còn sai thì nh y
qua
Câu l nh l a ch n switch:
C u trúc: switch(Bi n)
{
case giatr 1: { // Các câu l nh break; }
case giatr 2: { // Các câu l nh break; }
case giatr 3: { // Các câu l nh break; }

case giatr n: { // Các câu l nh break; }
}
Gi i thích : Tùy vào Bi n có giatr 1 thì th c hi n các câu l nh sau ó tư ng !ng r i
thoát kh i c u trúc nh# câu l nh break;
Bi n có giatr 2 thì th c hi n các câu l nh sau ó tư ng !ng r i
thoát
….
Bi n có giatr n thì th c hi n các câu l nh sau ó tư ng !ng r i
thoát
Câu l nh vòng l*p xác nh for:
C u trúc: for( n=m; n<l; n++) {// Các câu l nh x lí }
Gi I thích:
Trong ó m,l là giá tr (m>l), còn n là bi n
Th c hi n l*p các câu l nh (l-m) l n
Câu l nh vòng l*p không xác nh while:
C u trúc:
While( i u ki n)
{
//Các câu l nh
}
Gi I thích:
Th c hi n l*p các câu l nh khi i u ki n úng, n u câu l nh sai thi thoát kh i
vòng l*p
2.6. B ti n x lý:
#define : Dùng nh ngh a. Ví d :
#define dung 1
#define sai 0
có ngh a là dung có giá tr b+ng 1. Trong chư ng trình có th có o n code như sau:
bit kiemtra
if (bit==dung) { // Các câu l nh}
if (bit==sai) { // Các câu l nh}
Vi c này giúp l p trình d, s a l(i h n.

M t s web hay :
www.dientuvietnam.net www.atmel.com
www.svbkol.org www.keil.com
www.diendandientu.com www.iguanalabs.com

DKS_GROUP - 16 -
www.microchip.com
www.elechtro-tech-online.com
www.diendansv.hutech.edu.vn
www.ttvnol.com
www.8052.com
www.kmitl.ac.th
www.ftdichip.com

Bài 2 (Ti p)
Ph n 2: S d ng Keil C.

Sau khi cài t


1> Kh&i t o cho Project:

DKS_GROUP - 17 -
t o 1 project m i ch n Project New project như sau:

DKS_GROUP - 18 -
ư"c hình sau:

DKS_GROUP - 19 -
ánh tên và chuy n n thư m c b n lưu project. B n nên t o m(i m t thư m c cho 1 project.
R i ch n Save.

DKS_GROUP - 20 -
ư"c hình sau:

DKS_GROUP - 21 -
Trong này có 1 lo t các hãng i n t s n xu t 8051. B n l p trình cho con nào thì ch n con y
,kích chu t vào các d u + m) r ng các con IC c a các hãng. - ây ta l p trình cho
AT89C51 c a hãng Atmel nên ta ch n như sau:

DKS_GROUP - 22 -
Khi ch n chip thì ngay l p t!c cái b ng hi n ra 1 s tính n ng c a chíp các b n có th nhìn
th y. 8051 based Fully Static 24Mhz … . Nhap OK ư"c c a s' như sau:

DKS_GROUP - 23 -
Ch n No. Ch n Yes ch% làm cho file l p trình c a b n thêm n*ng . ư"c c a s' sau:

DKS_GROUP - 24 -
t o 1 file code các b n ch n File New ho*c n Ctrl+N. Như sau:

DKS_GROUP - 25 -
ư"c c a s' như sau:

DKS_GROUP - 26 -
Cho c a s' Text 1 to ra ư"c như sau:

DKS_GROUP - 27 -
Ti p theo b n ch n File Save As… ho*c Ctrl+S. nh file m*c dù chưa có gì. Như sau:

DKS_GROUP - 28 -
ư"c c a s' sau:

DKS_GROUP - 29 -
Các b n nh p tên vào text box file name. Chú ý tên gì c$ng ư"c nhưng không ư"c thi u uôi
m) r ng .C . Nh n Save. ư"c c a s' sau:

DKS_GROUP - 30 -
Trong ô bên trái màn hình, c a s' project workspace, các b n m) r ng cái target 1 ra ư"c như
sau:

DKS_GROUP - 31 -
Nh p chu t ph i vào thư m c Suorce Group1 ư"c hình như trên. Ch n Add files to Group
“Source Group1” add file vào project. ư"c như sau:

DKS_GROUP - 32 -
Ch n file .C mà các b n v a nh . C a tôi là Dieukhienled_IO . Nh n Add 1 l n r i n Close.
N u b n n Add 2 l n nó s thông báo là file ã add b n ch% vi c OK r i nh n Close. ư"c như
sau:

DKS_GROUP - 33 -
Bây gi# nhìn trong Source Group 1 ã th y file Dieukhienled_IO.C . Các b n nh p chu t ph i
vào vùng so n th o file Dieukhienled_IO.C như sau, thêm file thư vi n.Ch n Insert
‘#include <AT89X51.H>”

DKS_GROUP - 34 -
Các b n ã bi t file ó là gì n u các b n ã h c bài trư c kí theo yêu c u c a tôi. ư"c như
sau:

DKS_GROUP - 35 -
Ph n cu i cùng c a công vi c kh)i t o là các b n vi t l#i gi i thích cho d án c a mình .Ph n
này r t c n thi t vì nó ngư#i khác hi u mình làm gì tron project này và khi mình c n s d ng
l i code c l i mình còn bi t nó là cái gì.
Các b n t o l#i gi i thích theo m.u sau:

DKS_GROUP - 36 -
2> So n th o chương trình:
Các b n vi t chư ng trình c a bài 3 vào ây làm ví d . Khi vi t xong 1 dòng l nh nên
gi i thích dòng l nh ó làm gì. Như sau:

DKS_GROUP - 37 -
Các b n nên chia chư ng trình như tôi làm. V i 1 file nh thì nó h i rư#m rà. Nhưng v i 1 file
l n kho ng 1000 dòng code thì nó l i r t sáng s a. Các b n nên t o 1 file m.u r i nh vào 1 file
text ) âu ó m(i l n dùng ch% vi c copy r i paste qua ch! không nên m(i l n t o m t cái
như v y l i ph n tác d ng. Phía trên là ph n b ti n x lí và khai báo bi n. Ti p theo là vi t
hàm tr,.

DKS_GROUP - 38 -
Ti p theo là vi t hàm main. Như sau:

DKS_GROUP - 39 -
R i nh n Ctrl+S. Ho*c ch n File Save nh file v a so n th o.

Các b n nhìn vào code có th các b n ã hi u con AT89C51 nó làm gì n u các b n ã n m


v&ng các bài trư c. Còn n u không hi u thì tôi s gi i thích l i cho các b n.

DKS_GROUP - 40 -
ây là s nguyên lí c a 1 led. Project là 8 led(vì ph c v cho bài 3) nhưng tôi ch% gi i
thích 1 led là các b n hi u. M c ích là làm con led nh p nháy.
5VDC
R2

470

40
U1

VCC
D1
1
P1.0
+ C3
LED
9 10uF/25V
RESET
R1
10K

C2
33p 18
X2

12Mhz
C1 19
33p 20 X1
VSS
8051

Bi n Led1 ư"c khai báo (gán cho) ch n P0_1 c a vi i u khi n b+ng câu l nh sbit
Led1=P1^0; . Giá tr b t bat ư"c nh ngh a là 0.
Khi các b n gán : Led1=bat; trong hàm main thì chân P1_0 c a AT89C51 có m!c logic là 0V.
Theo s nguyên lí: 5V Tr) 470 Led1 P1_0 (0 V). Có chênh l ch áp có dòng
i n qua led Led sáng. Các b n có th tính tóan ch( này d, dàng là t i sao l i là tr) 470 Ôm.
i n áp m t ) led là Uak (0,6 n 0,7V) l y =0,6V. i n áp chân P1_0 là 0V. i n áp hai u
tr) : 5V -0,6V = 4,4V. Dòng qua tr) = dòng qua led = 4,4V/470 Ôm x p x% 10 mA. V i dòng
10mA n 15mA là led dòng sáng và sáng r t /p. N u dòng y u thì led m#, còn dòng
l n thì các b n bi t sao r i y.
Khi các b n gán: Led1= tat; t!c là chân P1_0 có giá tr 1 tư ng !ng i n áp c a nó là
5V . Hi u i n th gi&a hai u +5V và P1_0 là 0V . Nên không có dòng qua led Led
t t.Nhưng n u trong hàm main các b n vi t ch% có như sau:
While(1)
{
Led1=bat;
Led1=tat;
}
Khi ch y debug thì v.n th y led nh p nháy. Nhưng khi n p chư ng trình vào chíp l p vào m ch
thì led không nháy ho*c ch% sáng m# ho*c t t ngóm. Vì l nh Led1=bat; là l nh 1 chu kì máy ,
t n s th ch anh là 12 Mhz, 1 chu kì máy có th#i gian là 1uS. V a b t lên 1 uS r i l i t t ngay.
Led không áp !ng ư"c t n s cao v y nên không nh p nháy. Do ó c n t i hàm tr, . B t led
lên tr, 1 th#i gian khá lâu(0,5 gi y), r i t t led i khá lâu(0,5s) r i l i b t l i t o thành vòng l*p
s ư"c led nh p nháy.
Tác d ng c a câu l nh while(1) . i u ki n bên trong vòng while là 1 luôn luôn úng nên nó là
vòng l*p vô h n l n. N u không có vòng while(1) thì led c a các b n ch% sáng lên 1 l n r i t t

DKS_GROUP - 41 -
vì h t chư ng trình r i còn âu. Ph n này n u b n nào m i h c i n t th nào c$ng có câu h i
th c m c c! nh n tin ho*c g i mail.
3> D ch chương trình:
So n th o song nh n Ctrl +S nh . Nh xong các b n biên d ch chư ng trình b+ng cách n
phím F7 ho*c ch n Build target là bi u tư"ng ngay trên c a s' workspace như trên hình:

Các b n s th y như sau:

DKS_GROUP - 42 -
Trong c a s' Output Window ngay phía trên dòng ch& này có các dòng ch& Compiling …
Linking…
Program Size: data =17.0 code =96
… 0 error , 0 Warning .
Như v y là OK. N u không ư"c như v y nó s báo l(i và các b n ki m tra xem so n th o
úng chưa. Tôi ví d xóa 1 d u ; ) trong hàm main ) dòng : Led1=bat; , gi# b i thành Led1=
bat .R i d ch l i ( n F7) trình biên d ch s báo như sau:

DKS_GROUP - 43 -
Syntax error near tre. Sai cú pháp g n tr,. Các b n nh p úp trái chu t vào dòng thông báo này
con tr s ) ngay dòng dư i dòng có l(i thêm d u nhìn d u m$i tên màu xanh ) hình dư i ây,
gõ vào d u ; và d ch l i là OK.” Trong chư ng trình l n ôi khi con tr ch% n g n ch( có l(i
thôi và b n ph i t tìm ra l(i.”

DKS_GROUP - 44 -
Sau khi d ch l i ư"c hình sau:

DKS_GROUP - 45 -
4> Ch y mô ph(ng và s a l*i.
Trư c khi debug chúng ta kh)i t o như sau. Các ban vào Option for target 1.

DKS_GROUP - 46 -
ư"c b ng sau. Nh p t n s th ch anh là 12 Mhz úng v i t n s th ch anh.

DKS_GROUP - 47 -
Ch n OK.
debug các b n nh n t' h"p phím Ctrl + F5. Ho*c nh n vào icon có ch& D m u trong cái
kính lúp trên thanh công c . ư"c c a s' sau:

DKS_GROUP - 48 -
Trong menu Peripherals(các thi t b ngo i vi) ch n IO port , Port 1. ư"c như sau:

DKS_GROUP - 49 -
Các b n th y 1 c a s' nh Parallel Port 1 xu t hi n ó là cái mô ph ng cho c'ng 1 c a
AT89C51. D u tích tư ng ư ng chân ) m!c cao(5V) , không tích chân ) m!c th p (0V).
Trong menu peripherals còn các ngo i vi khác như timer , interrupt, serial. Các bài sau dùng
n các b n nh l y trong này.
ch y chư ng trình các b n nh p chu t ph i vào màn hình so n th o.
R i n F11. M(i l n n s ch y 1 l nh. Khi debug n u các b n ch# hàm delay lâu quá 1000 l n
l*p . Các b n nh n Ctrl + F11 b qua hàm.

DKS_GROUP - 50 -
Ho*c n F10 ch y t ng dòng l nh. Các b n s th y chân P1_0 thay 'i giá tr .
B ng bên trái , ô Project workspace bây gi# có các thanh ghi. Các b n có th th y chúng thay
'i. Nhưng các b n không c n quan tâm n các thanh ghi này. Vì mình h c ngôn ng& C mà.
N u h c asembly thì m i ph i s d ng chúng. C$ng m t y. Cái b n quan tâm nh t là cái sec.
Nó c$ng thay 'i. Vì th ch anh là 12Mhz, nên m(i chu kì máy là 10-6 giây. Các b n c n c! vào
y bi t l nh nào m t bao nhiêu chu kì máy, làm th#i gian th c thì c n l m y. Thoát kh i
debug l i n Ctrl+F5 ho*c n vào icon debug.

.
3.1.L p m ch :
-Kh i ngu n 5V các b n như l p m ch èn nháy.
-Các b n l p m ch theo s sau:
5VDC

1
R11
RESISTOR SIP 10
40

D1 2
3
4
5
6
7
8
9
10
U1
39
VCC

D2 P0.0 38
P0.1 37
D3 P0.2 36
1 P0.3 35
D4 P1.0 P0.4
2 34
3 P1.1 P0.5 33 + C3
D5 P1.2 P0.6
4 32 10uF/25V
5 P1.3 P0.7 31
D6 P1.4 EA
6
7 P1.5
D7 P1.6
8
P1.7 9
D8 RESET
R1
10K

C2
33p 18
X2

12Mhz
C1 19
33p 20 X1
VSS
8051

- Hư ng d.n l p m ch:
* Qui nh : n u linh ki n nào tôi không nh c n chi u thì các b n l p linh ki n chi u
nào c$ng ư"c.
Hàng d c ngoài là ngu n 5 V.
Hàng d c trong là GND.
Th! t chân các b n ph i nh không gi ng th! t s p x p tronh hình v m ch.
Cách m chân các b n con chip xuôi mà các b n nhìn dòng ch& AT89C51/52
xuôi, chân 1 là chân g n d u tròn và hình tam giác nh m u tr ng. m t trên xu ng
dư i trái qua ph i. S chân con IC th t s m úng th này. Khi l p m ch ph i
m chân.

DKS_GROUP - 51 -
Không nên l p ngu n 12V vào v i ch% khi n p chíp xong l p vào m ch m i l p
ngu n.
Khi mu n g0 chíp ra ph i rút ngu n ra r i m i g0 chíp.

U1
1 40
2 P1.0 VCC 39
3 P1.1 P0.0 38
4 P1.2 P0.1 37
5 P1.3 P0.2 36
6 P1.4 P0.3 35
7 P1.5 P0.4 34
8 P1.6 P0.5 33
9 P1.7 P0.6 32
10 RESET P0.7 31
11 RXD EA/VP 30
12 TXD AT89C51 ALE/P 29
13 INT0 PSEN 28
14 INT1 P2.7 27
15 T0 P2.6 26
16 T1 P2.5 25
17 WR P2.4 24
18 RD P2.3 23
19 X2 P2.2 22
20 X1 P2.1 21
VSS P2.0
* Chu n b board như sau:
L p 4 dây n i ng n n i các sông.
L p 1 dây n i n i hàng trên cùng v i hàng dư i cùng làm ngu n +5V.
L p 1 dây n i n i hàng g n trên cùng v i hàng g n dư i cùng làm GND.
L p chíp như hình.
* Bư c 1 l p m ch dao ng:
L p 1 con t 33pF t chân 19 xu ng chân 20.( ng h i t i sao).
L p 1 con t 33pF t chân 18 xu ng chân 20.
L y dây câu t chân 20 xu ng GND.
L p 1 con th ch anh 12M vào chân 18 và 19.
* Bư c 2 l p m ch reset.
L p 1 con tr) 10K(nâu en cam) t chân 9 xu ng GND.
L p 1 con t 10uF/50V c c dư ng lên +5V, c c âm vào chân 9.
* Bư c 3 l p tr) b ng.
chíp ch y v i ROM trong chân EA ph i lên +5V qua 1 i n tr).
C'ng 0 là c'ng có c c máng h) mu n th c hi n ư"c IO thì ph i có i n tr)
treo.(Th y cái này l xem l i bài 2). Nên l p 1 con tr) b ng 10 chân vào c'ng 0 và
chân EA.
Chân 1 c a tr) b ng ( Chân u tiên có n t tròn m u tr ng) vào chân 40. Chân 10 c a
tr) b ng vào chân 31.
N u không có tr) b ng các b n có th thay tr) b ng 10 chân b+ng 9 con tr) thư#ng vì
tr) b ng 10 chân chính là 9 con tr) u chung 1 u như trong s m ch phía trên.
* Bư c 4 l p led:
d, dàng khi l p m ch nên chúng ta l p led theo s như trên.
L p chân dài c a 1 led vào chân 1 vi i u khi n chân ng n vào GND.
Tư ng t l p 7 led còn l i vào chân 2 n chân 8.
* Bư c 5 câu 1 dây nh t chân 40 lên ngu n 5V.
3.2. Nguyên lí ho t ng:
Led n i t chân v k xu ng t v y n u chân vi i u khi n 5V thì led s sáng,
n u chân vi i u khi n 0V thì led s t i.
i n áp 5V vì sao led không cháy mà l i còn sáng y u?

DKS_GROUP - 52 -
Vì vi i u khi n 8051 ch% có th cung c p dòng nh không 10mA ) 1 chân nên led
sáng y u. Còn n u mu n led sáng /p thì l p như sau t dư ng 5V Chân dài c a
led Chân ng n c a led Chân vi i u khi n. Cái này s nói sau.
* Bư c 5 l p ngu n:
L p 1 dây t chân 40 lên hàng ngu n 5V.
3.3. L p trình :
Trư c h t i u khi n 1 led. i u khi n 1 led thì các b n ch% vi c gán chân n i v i
led ó b+ng 0 ho*c 1, thì i n áp ) chân ó s là 0V ho*c 5V, tùy vào i n áp èn s
sáng ho*c t i.
Code như sau:
/* ====================================================
Mo ta:
Dieu khien den led.
Phan cung:
8 led noi tu +5V qua dien tro han dong vao 8 chan cong 1.
Thach anh:
12 Mhz
Tac gia:
Nguyen Huy Thanh.
Thoi gian:
Bat dau: 1h03 16/7/2005
Hoan thanh: 1h07 16/7/2005
=====================================================*/

/******************Bo tien xu li*******************************/


#include <AT89X51.H>// Dinh kem file thu vien
#define bat 1 // Dinh nghia gia tri bat den led
#define tat 0// Dinh nghia gia tri tat den led

/************************************************************/

/*******************Khai bao bien toan cuc**********************/


sbit Led1=P1^0; //Khai bao bien Led1 kieu bit chan P1_0
sbit Led2=P1^1; // ...
sbit Led3=P1^2;
sbit Led4=P1^3;
sbit Led5=P1^4;
sbit Led6=P1^5;
sbit Led7=P1^6;
sbit Led8=P1^7;//Khai bao bien Led8 kieu bit chan P1_7
/***********************************************************/

/********************Khai bao ham****************************/

/*----------------Ham tre-------------------------------
Ham tao thoi gian tre.
Dau vao: 1 bien thoi gian.

DKS_GROUP - 53 -
Dau ra:khong
------------------------------------------------------*/
void tre(long time)
{
long n;// Khai bao bien cuc bo
for(n=0; n<time; n++)//Lap time lan
{
; // Khong lam gi nop
}
}

/***********************************************************/

/*******************Ham chinh**************************/
void main(void)
{
while(1)// Lap vo han
{
Led1= bat;// Bat led 1
tre(1000);// Tre 1 khoang thoi gian
Led1= tat;// Tat led 1
tre(1000);// Tre 1 khoang thoi gian
}

/************************************************************/
Nên t gõ ch! không nên copy paste.
* CHÚ Ý: Code này khác code trong bài 3 s d ng Keil C y nhé. Ch( #define bat 1
và #define tat 0. Vì led l p ki u khác mà.

DKS_GROUP - 54 -
DKS_GROUP - 55 -
DKS_GROUP - 56 -
* có th n p chư ng trình vào chíp thì f i t o ra file .hex. t o ra file .hex làm
như sau . Vào Option for target ch( ch%nh t n s th ch anh.

DKS_GROUP - 57 -
ư"c hình sau:

DKS_GROUP - 58 -
Kích vào tab Output. ư"c hình sau:

DKS_GROUP - 59 -
Tích vào check : Create Hex File. Nh p OK. Nh n fím F7 biên d ch l i . Khi ó dư i c a
s' output window ư"c ch& Creating hex file…

DKS_GROUP - 60 -
Creating hex file from “Dieukhienled_IO” như ngay trên hình.
3.4.N p chíp:
C m u c'ng COM vào c'ng COM máy tính.
C m ngu n vào m ch n p.
Cho chíp vào socket 40 chân màu xanh. R t chú ý ph i cho úng chi u chíp không là
h ng. Chi u chíp gi ng chi u con chíp có s n trong m ch(Chíp MASTER).
M) ph n m m EZDL4 lên. Th y có ch& identifing target chip …. Nháy. G t c n nh)
) socket 40 chân k/p chíp cho ti p xúc.

DKS_GROUP - 61 -
Trên EZDL4 s th y ch& AT89C51 ho*c AT89C52 tùy các b n dùng lo i chíp
nào.
Kích vào Send. Ch n ư#ng d.n n thư m c lưu project c a b n ch n file :
Dieukhienled_IO.hex . Nh n OK. Ch# m ch báo ch& Complete thì g t n.y trên socket
l y chíp ra c m vào m ch.
3.5. K t qu :
C m ngu n vào m ch . Chú ý không c m ngư"c âm dư ng.
N u m ch không ch y rút ngu n ra ki m tra các ch( sau:
1) Ki m tra m ch dao ng xem t úng giá tr không, l p úng s không,
l p có l ng không.
2) Ki m tra xem t ) m ch reset chân 9 l p úng c c không, có l ng không.
Dùng ng h o chân 9 n u 0V ho*c x p x% 0V là OK.
3) Tr) b ng l p úng chi u chưa, chân 1 vào chân 40. Dùng ng h o chân
31(EA) xem có b+ng 5V không , n u 5V thì OK.
4) Ki m tra chân 20 n i GND chưa, chân 40 n i +5V chưa dùng ng h
o i n áp.
5) Ki m tra xem l p úng chi u led chưa.
6) Các b n có th l p l ng chíp ho*c do ch t lư"ng board l y tay tì m nh con
chíp xu ng board .
N u v.n không ch y thì liên l c v i tôi.
3.6. i u khi n 8 led t ng chi c 1:
Các b n có th s a l i hàm main như sau:
void main(void)
{
while(1)// Lap vo han
{
Led1= bat;// Bat led 1
tre(1000);// Tre 1 khoang thoi gian
Led1= tat;// Tat led 1
tre(1000);// Tre 1 khoang thoi gian
Led2= bat;// Bat led 2
tre(1000);// Tre 1 khoang thoi gian
Led2= tat;// Tat led 2
tre(1000);// Tre 1 khoang thoi gian
Led3= bat;// Bat led 3
tre(1000);// Tre 1 khoang thoi gian
Led3= tat;// Tat led 3
tre(1000);// Tre 1 khoang thoi gian
Led4= bat;// Bat led 4
tre(1000);// Tre 1 khoang thoi gian
Led4= tat;// Tat led 4
tre(1000);// Tre 1 khoang thoi gian
Led5= bat;// Bat led 5
tre(1000);// Tre 1 khoang thoi gian
Led5= tat;// Tat led 5
tre(1000);// Tre 1 khoang thoi gian
Led6= bat;// Bat led 6
tre(1000);// Tre 1 khoang thoi gian

DKS_GROUP - 62 -
Led6= tat;// Tat led 6
tre(1000);// Tre 1 khoang thoi gian
Led7= bat;// Bat led 7
tre(1000);// Tre 1 khoang thoi gian
Led7= tat;// Tat led 7
tre(1000);// Tre 1 khoang thoi gian
Led8= bat;// Bat led 8
tre(1000);// Tre 1 khoang thoi gian
Led8= tat;// Tat led 8
tre(1000);// Tre 1 khoang thoi gian
}

}
i u khi n 8 led.
V i chư ng trình này các b n có th cho th! t các led t t b t khác nhau có các
ki u nháy khác nhau.
3.7. i u khi n out c c ng:
N u các b n nhàm chán v i vi c i u khi n t ng chân 1 vi t code r t t n công
các b n có th xu t giá tr ra c c'ng.
Trư c h t các b n c n n m các i u như sau:
- 1 c'ng có 8 bit t' h"p 8bit có 28 = 256 tr ng thái. Khi các b n ưa ra c'ng 1
giá tr a(th p phân) t 0 n 255 thì s a s ư"c 'i ra h nh phân r i ưa ra
các bit( chân) c a c'ng. Ví d :
N u có l nh: P1=1; vì 1(10) = 0000 0001(2) nên chân P1_0(bit 0) s b+ng 1(5V)
còn l i các t P1_1(bit 1) n P1_7(bit 7) s b+ng 0(0V).
P1=10; vì 10(10) = 0000 1001(2) thì s có P1_0 và P1_3 b+ng 1(5V) còn
l i các chân khác s là 0(0V).
- Các b n có th ưa ra c'ng 1 giá tr s hex t 0 n ff tư ng !ng t 0 n 255.
Các s c s) trong h hex.
(HEX)0 1 2 3 4 5 6 7 8 9 A B C D E F
(10) 10 11 12 13 14 15
Cách ' s hex ra s th p phân: có s hex : N(16)=abf1 'i ra h s 10
N(10)=1.160 + 15.161+ 11.162+ 10.163= B m máy tính h nhé.
'i s nh phân sang hex: G p 4 s nh phân thành 1 s hex
Ví d : 0010 0001(2) = 21(16) 4 s u có bit 1 = 1 nên 1x21= 2
4 s sau có bit 0 =1 nên 1x20=1.
“Các b n th y v t v v i ph n này dù b n có hi u hay không hi u 1 lát n&a s bi t
cách làm li n.”
Cách ưa ra như sau:
Ví d l nh P1=1; tư ng ư ng v i P1=0x01;
P1=10; tư ng ư ng v i P1=0x0A;
Chư ng trình xu t ra c c'ng tư ng ư ng v i chư ng trình i u khi n 8 led t ng cái
1 như sau:

void main(void)
{
while(1)// Lap vo han
{

DKS_GROUP - 63 -
P1=0x01;// Bat led 1
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 1
tre(1000);// Tre 1 khoang thoi gian
P1=0x02;// Bat led 2
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 2
tre(1000);// Tre 1 khoang thoi gian
P1=0x04;// Bat led 3
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 3
tre(1000);// Tre 1 khoang thoi gian
P1=0x08;// Bat led 4
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 4
tre(1000);// Tre 1 khoang thoi gian
P1=0x10;// Bat led 5
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 5
tre(1000);// Tre 1 khoang thoi gian
P1=0x20;// Bat led 6
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 6
tre(1000);// Tre 1 khoang thoi gian
P1=0x40;// Bat led 7
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 7
tre(1000);// Tre 1 khoang thoi gian
P1=0x80;// Bat led 8
tre(1000);// Tre 1 khoang thoi gian
P1=0x00;// Tat led 8
tre(1000);// Tre 1 khoang thoi gian
}

Như v y gõ code v.n m i tay l m t ư"c m c ích 8 èn nháy liên ti p các b n


có th làm như sau:
/******************Ham chinh****************************/
void main(void)
{
unsigned char n; // Khai bao them bien n cho vong for
while(1)// Lap vo han
{
P1=0x01;// Bat led 1
for(n=0 ; n<8;n++)// Lap 8 lan
{
P1=P1<<1; // Dich bit xang trai

DKS_GROUP - 64 -
tre(1000);
}
}

/***********************************************************/

Debug quan sát s thay 'i c a c'ng 1 th y ư"c l"i h i c a phép d ch bit xang
trái.
hi u thao tác xu t ra c'ng , chân, các các b n làm cho mình 1 ví d n&a như sau:
/***********************Ham chinh*******************************/
void main(void)
{
unsigned char n; // Khai bao them bien n cho vong for
while(1)// Lap vo han
{
P1=0x01;// Bat led 1
for(n=0 ; n<256;n++)// Lap 8 lan
{
P1=n; // Dich bit xang trai
tre(5000);
}
}

/****************************************************************/
Debug th y s thay 'i các c'ng.
3.8. Kinh nghi m :
* chuy n 'i gi&a các h sô nhanh các b n dùng cái calculator có ngay
trong window. Ch n Start All programs Accessories Calculator.
Trong Calculator các b n ch n menu View Ch n scienctific. Cách chuy n 'i t
khám phá nhé.
* tính ra s hex nhanh nh t .
Tôi ví d mu n ưa chân P3.5 và chân P3.2 xu ng 0(0V) còn các chân còn l i ta làm
như sau:
C! cho P3= 100 ; hay 1 giá tr b t kì .Vì code d ch không l(i cú pháp m i debug ư"c
nên ph i cho giá tr b t kì vào. D ch chư ng trình r i nh n Debug. Ra ư"c như sau:

DKS_GROUP - 65 -
Các b n th y trong c a s' mô ph ng c'ng 3 có ghi giá tr c a c'ng 3 là : 0xFF tư ng
!ng t t c 8 bit là 1111 1111. Gi# các b n b d u tích trên chân 3.5 và 3.2 i . m t
trái qua ph i nhé.

DKS_GROUP - 66 -
Th y c'ng 3 có giá tr là 0xDB. Như v y các b n 0 m t công nh m 'i s nh phân ra s hex.
N u không dùng cách này là như trên các b n ph i ngh trong u ra ư"c dãy s 1101
1011 r i 'i qua s HEX k t qu s là 0xDB nhưng m t l m.

DKS_GROUP - 67 -
4.1 L p m ch :

109 8 7 6 109 8 7 6
D11 f g V+a b D10 f g V-a b

A A

F B F B

G G

E C E C

D DOT D DOT
LED CATOT Chung LED CATOT Chung
e d V+c dot e d V-c dot
1 2 3 4 5 1 2 3 4 5

Có hai lo i led 7 thanh: An t chung và Cat t chung. Hình trên là s chân


c a hai lo i led. Nó có c u t o như sau:

7 6 4 2 1 10 9 5 A B C D E F G DP
7 6 4 2 1 10 9 5

D13A
Anot chung D12A
Catot chung

83
83

Ch% là 8 con led u chung 1 u: An t ho*c Cat t.


M ch l p s d ng led An t chung như sau:

DKS_GROUP - 68 -
5VDC

40
U3
B 21

VCC
22 P2.0
23 P2.1 R3
24 P2.2 10K
C P2.3
25
26 P2.4 31
D P2.5 EA/VP
27 + C3
P2.6
E 10uF/25V
9
RESET
F
R1
G 10K

C2
33p
18
X2
12Mhz
C1 19
33p 20 X1
VSS
8051

- L p m ch: M ch bài trư c( i u khi n led n) nguyên,ch% l p thêm vào.


+ Bư c1: L p 7 i n vào 7 chân c'ng P2 t P2.0 n P2.7( T chân 21 Chân
27) c a vi i u khi n. Chú ý m bit c a c'ng 2 t dư i lên trên.
+ Bư c2: L p led 7 thanh 5 chân phía trên sông, 5 chân phía dư i sông(Gi ng l p
AT89C51).
+ Bư c 3: Dùng dây i n câu t các chân theo s . Chân i u khi n thanh A
vào i n tr) n i vào P2.0 và c! th n chân i u khi n thanh G vào i n tr) n i
vào P2.7. B qua chân i u khi n d u ch m(Dot chân 5 c a led 7 thanh).
+ Bư c 4: Dùng dây câu chân 3(ho*c chân 8, ho*c c hai chân 3 và 8) lên +5V.
L p m ch nên dây câu khác màu và rõ ràng tránh nh m l.n.
- Test led:
Cho ngu n vào( D nhiên led n bài trư c v.n nh p nháy).
Rút 1 u i n tr) n i v i chân P2.0 c a V K c m xuông t th y led 7
thanh sáng èn A,c m l i i n tr) v v trí c$. Tư ng t test 6 thanh còn
l i. Thanh nào không sáng thì ki m tra l i xem c m dây ti p xúc chưa. V.n
không sáng thì led ã h ng thay led khác vào.
4.2. Nguyên lí ho t ng:
Khi c m ngu n vào m ch t t c các chân c a các c'ng IO c a V K là 5V(
N u c'ng 0 không l p i n tr) treo thì s là 0V). Nhìn s m ch không có chênh
l ch i n áp nên không có èn nào sáng. Chúng ta mu n sáng thanh nào ch% vi c ưa
ra i n áp 0V ) chân vi i u khi n n i v i thanh ó.
Thanh hi n Thanh t t Giá tr (P2)
hi n th s 1: B,C các thanh còn l i 1111 1001
hi n th s 2: A,B,D,E,G các thanh còn l i 1010 0100
….
hi n th s 8: T t c các thanh không thanh nào 1000 0000

DKS_GROUP - 69 -
gfe dcba
Bít th! 8 P2.7 không
dùng.
Ngoài ra led 7 thanh còn có th hi n th 1 s ch&
ê hi n th ch& B: Gi ng sô 8
Hi n th ch& A: A,B,C,E,F,G D 1000 1000
4.3.L p trình :
Cách 1: L p trình d, hi u không c n ph i tính toán nhưng ph i vi t và copy,
past và s a nhìu.
Code như sau:
#include <AT89X52.H>
/* Khai bao cac bien bit gan voi chan vi dieu khien*/
sbit ThanhA = P2^0;
sbit ThanhB = P2^1;
sbit ThanhC = P3^5;
sbit ThanhD = P3^4;
sbit ThanhE = P3^3;
sbit ThanhF = P2^2;
sbit ThanhG = P2^3;
/* Khai bao bien */
long n;// Cho vong for

/* Khai bao ham */

/* Ham tre */
void delay(long time)
{
for(n=0; n<time; n++)
{
;
}
}

DKS_GROUP - 70 -
/* Ham tat tat ca cac thanh */ ThanhE =1;
void tat(void) ThanhF =1;
{ ThanhG =0;
ThanhA =1; }
ThanhB =1;
ThanhC =1; void so4(void)
ThanhD =1; {
ThanhE =1; tat();
ThanhF =1; ThanhA =1;
ThanhG =1; ThanhB =0;
} ThanhC =0;
ThanhD =1;
/* Cac ham hien thi chu va so */ ThanhE =1;
ThanhF =0;
void so1(void) ThanhG =0;
{ }
tat();
ThanhA =1; void so5(void)
ThanhB =0; {
ThanhC =0; tat();
ThanhD =1; ThanhA =0;
ThanhE =1; ThanhB =1;
ThanhF =1; ThanhC =0;
ThanhG =1; ThanhD =0;
} ThanhE =1;
ThanhF =0;
void so2(void) ThanhG =0;
{ }
tat();
ThanhA =0; void so6(void)
ThanhB =0; {
ThanhC =1; tat();
ThanhD =0; ThanhA =0;
ThanhE =0; ThanhB =1;
ThanhF =1; ThanhC =0;
ThanhG =0; ThanhD =0;
} ThanhE =0;
void so3(void) ThanhF =0;
{ ThanhG =0;
tat(); }
ThanhA =0;
ThanhB =0; void so7(void)
ThanhC =0; {
ThanhD =0; tat();

DKS_GROUP - 71 -
ThanhA =0;
ThanhB =0; void chuB(void)
ThanhC =0; {
ThanhD =1; tat();
ThanhE =1; ThanhA =0;
ThanhF =1; ThanhB =0;
ThanhG =1; ThanhC =0;
} ThanhD =0;
ThanhE =0;
void so8(void) ThanhF =0;
{ ThanhG =0;
tat(); }
ThanhA =0;
ThanhB =0; void chuC(void)
ThanhC =0; {
ThanhD =0; tat();
ThanhE =0; ThanhA =0;
ThanhF =0; ThanhB =1;
ThanhG =0; ThanhC =1;
} ThanhD =0;
ThanhE =0;
void so9(void) ThanhF =0;
{ ThanhG =1;
tat(); }
ThanhA =0;
ThanhB =0; void chuD(void)
ThanhC =0; {
ThanhD =0; tat();
ThanhE =1; ThanhA =0;
ThanhF =0; ThanhB =0;
ThanhG =0; ThanhC =0;
} ThanhD =0;
ThanhE =0;
void chuA(void) ThanhF =0;
{ ThanhG =1;
tat(); }
ThanhA =0;
ThanhB =0; void chuE(void)
ThanhC =0; {
ThanhD =1; tat();
ThanhE =0; ThanhA =0;
ThanhF =0; ThanhB =1;
ThanhG =0; ThanhC =1;
} ThanhD =0;

DKS_GROUP - 72 -
ThanhE =0; ThanhB =1;
ThanhF =0; ThanhC =1;
ThanhG =0; ThanhD =1;
} ThanhE =0;
ThanhF =0;
void chuF(void) ThanhG =1;
{ }
tat();
ThanhA =0; void chuL(void)
ThanhB =1; {
ThanhC =1; tat();
ThanhD =1; ThanhA =1;
ThanhE =0; ThanhB =1;
ThanhF =0; ThanhC =1;
ThanhG =0; ThanhD =0;
} ThanhE =0;
void chuG(void) ThanhF =0;
{ ThanhG =1;
tat(); }
ThanhA =0;
ThanhB =1; void chuO(void)
ThanhC =0; {
ThanhD =0; tat();
ThanhE =0; ThanhA =0;
ThanhF =0; ThanhB =0;
ThanhG =1; ThanhC =0;
} ThanhD =0;
ThanhE =0;
void chuH(void) ThanhF =0;
{ ThanhG =1;
tat(); }
ThanhA =1;
ThanhB =0; void chuP(void)
ThanhC =0; {
ThanhD =1; tat();
ThanhE =0; ThanhA =0;
ThanhF =0; ThanhB =0;
ThanhG =0; ThanhC =1;
} ThanhD =1;
ThanhE =0;
void chuI(void) ThanhF =0;
{ ThanhG =0;
tat(); }
ThanhA =1;

DKS_GROUP - 73 -
void chuR(void) void chuU(void)
{ {
tat(); tat();
ThanhA =0; ThanhA =1;
ThanhB =0; ThanhB =0;
ThanhC =0; ThanhC =0;
ThanhD =1; ThanhD =0;
ThanhE =0; ThanhE =0;
ThanhF =0; ThanhF =0;
ThanhG =0; ThanhG =1;
} }

void chuS(void) void chuY(void)


{ {
tat(); tat();
ThanhA =0; ThanhA =1;
ThanhB =1; ThanhB =0;
ThanhC =0; ThanhC =0;
ThanhD =0; ThanhD =0;
ThanhE =1; ThanhE =1;
ThanhF =0; ThanhF =0;
ThanhG =0; ThanhG =0;
} }

DKS_GROUP - 74 -
/* Ham chinh */
void main(void)
{
while(1)
{
so0();
delay(20000);
so1();
delay(20000);
so2();
delay(20000);
so3();
delay(20000);
so4();
delay(20000);
so5();
delay(20000);
so6();
delay(20000);
so7();
delay(20000);
so8();
delay(20000);
so9();
delay(20000);
chuA();
delay(20000);
chuB();
delay(20000);
chuC();
delay(20000);
chuD();
delay(20000);
chuE();
delay(20000);
chuF();
delay(20000);
chuG();
delay(20000);
chuH();
delay(20000);
chuI();
delay(20000);
chuL();

DKS_GROUP - 75 -
delay(20000);
chuO();
delay(20000);
chuP();
delay(20000);
chuR();
delay(20000);
chuS();
delay(20000);
chuU();
delay(20000);
chuY();
delay(20000);
}
}
Cách 2: Các b n vi t 1 chư ng trình n gi n r i dùng công c Debug xem s hex r i
vi t vào r t ng n g n.
Ví d :
Hàm hi n th s 1:
void so1(void)
{
tat();
P2=0xF5;
}
Các b n debug cho hi n th c'ng P2 lên. d u tích ) các èn t t(1) , b d u tích ) các
èn c n b t(0). R i c giá tr hex như tôi hư ng d.n ) bài trư c.
4.4.N p chíp:
ã hư ng d.n. N u các b n g*p ph i v n c a m ch n p. Thư#ng là:
+ Treo chip Master: Rút ngu n m ch n p ra, "i chút r i c m l i.
+ Không nh n c'ng COM. Các b n nh p chu t ph i vào Mycomputer, ch n
Properties Device manage. Nh n vào Scan for hardware change máy tính nh n
l i c'ng COM. R i kh)i ng l i máy.
+ Lý do khác các b n th ki m tra ph n c!ng m ch n p.
+ V.n không ư"c tôi ch u.
T bài sau s không có ph n này.
4.5.K t qu :
Nhìn vào hàm main các b n th y chư ng trình s hi n th s 1 ) led 7 thanh, tr, 1
kho ng th#i gian, r i nh y sang s 2 n sô 9 , r i n ch&. N u các b n không có hàm
tr, thì led s hi n th ra sao?
Led s hi n s 8. Vì t t c 8 led ư"c b t t t quá nhanh (ch% c n >24 Hz) do hi n tư"ng
lưu nh m t các b n s nhìn th y t t c các led sáng ch! không hi n s .
4.6.Kinh nghi m :
Sau khi ã th c hi n theo các rút g n như vi t hàm s 1 ) trên các b n áp d ng
c u trúc l nh switch case vi t l i chư ng trình thì chư ng trình s r t g n.

DKS_GROUP - 76 -
void Hienthiled(unsigned char x) // Co 1 bien dau vao de xac dinh xem la hien thi so nao
{
switch(x)
{
case 1: { tat(); P2=0xF5; break;} // So 1
case 2: { tat(); P2=0xFF; break;}// So 2

case 9: { tat(); P2=0xFF; break;}// So 9
case 10: { tat(); P2=0xFF; break;}// Chu A
….
case 20: { tat(); P2=0xFF; break; }// Chu Y
}
}
Các giá tr ) trên ch% là ví d các b n ã rút g n và t copy vào. V i hàm hi n th led các
b n ã vi t hi n các s và các ch& gi# hàm main ch% c n như sau:
void main (void)
{
while(1)
{
for(n=0; n<20; n++)
{
Hienthiled(n);
delay(20000);
}
}
}

DKS_GROUP - 77 -
Ph n 1: c 1 phím.
Nhi m v :
m s l n phím b m gi i h n t 0 n 9 hi n th ra led 7 thanh.
5.1.L p m ch như sau:

5VDC

109 8 7 6
D11 f g V+a b D12

40
U1 LED
A 21

VCC
22 P2.0
F B 23 P2.1
24 P2.2
G 25 P2.3 R29
26 P2.4 1K
27 P2.5 + C3
E C P2.6
9 10uF/25V
D DOT RESET
LED ANOT Chung R1
e d V+c dot 10K
1 2 3 4 5

SW1

C2 1 1 2
33p 18 P1.0
X2 2
P1.1 C4
12Mhz
C1 19
33p 20 X1
VSS CAP NP
8051

- M ch bài 5 led 7 thanh gi& nguyên.


L p m ch: quá n gi n.
Bư c 1: L p 1 nút b m ) âu ó trên m ch.
Bư c 2: Dùng dây câu 1 chân nút b m v i P1.0( Thay th led bài 4).
Bư c 3: Dùng dây câu 1 chân nút b m xu ng t.
Bư c 4: L p 1 t 104 gi&a 2 chân nút b m.
Bư c 5: L p tr) vào chân P1.0 và led t +5V vào u tr) còn l i(Chú ý úng
chi u led.
- Test nút b m: C m ngu n vào, nh n nút èn sáng. Nh nút èn t t.

DKS_GROUP - 78 -
5.2.Nguyên lí ho t ng:
- Ph n nút b m: (khi không có t 104) ban u chân P1.0 ) m!c cao +5V, n u
b m nút 2 u nút b m thông v i nhau. Chân P1.0 thông v i GND. Led sáng do có chênh
áp. Chân P1.0 thông t.
N u có t 104 t i n ư"c n p i n, khi b m nút t i n s phóng i n t c c
dư ng sang c c âm làm chân P1.0 thông v i GND nhưng lâu v 0 V h n 1 chút( tr,
c!ng).
- Khi b m nút theo nguyên lí thi b m 1 cái là xu ng 0 li n, nhưng do ti p i m
c khí c a nút b m nên khi b m nút nó s có 1 s xung i n ch! không ph i là
b m cái là nó xu ng 0 luôn. T 104 gi m nhi,u ó. T 104 c$ng có th b
i không l p vì ta có th kh nhi,u b+ng ph n m m.
5.3.L p trình:
Code bài 5 gi& nguyên: so n thêm m t s hàm như sau hàm c phím b m.
Hàm c s l n n phím

DKS_GROUP - 79 -
DKS_GROUP - 80 -
Hàm hi n th s tư ng !ng.

DKS_GROUP - 81 -
Hàm main ư"c s a l i như sau:

DKS_GROUP - 82 -
ây là code các hàm b' sung:
unsigned char i=0;// Khai bao them bien toan cuc de dem so lan an nut
unsigned char Doccongtac(void)// Ham tra lai gia tri unsigned char
{

if( P1_0 ==0)// Neu nut duoc bam


{
delay(300);// Tre 1 khoang thoi gian qua xung nhieu
while(P1_0 ==0) // Cho toi khi nha tay khoi nut bam
{
;//Khong lam gi
}
i++;// Nha ty thi tang i
if( i ==10) i=0;// Quay vong gia tri cua i
}
return i;
}

void hienthisolannhanphim(unsigned char solan)


{
switch(solan)// Tuy vao so lan
{
case 0: { so0(); break; }// Neu so lan =0 hien so 0 thoat khoi switch
case 1: { so1(); break; }// Neu so lan =1 hien so 1 thoat khoi switch
case 2: { so2(); break; }// ....
case 3: { so3(); break; }
case 4: { so4(); break; }
case 5: { so5(); break; }
case 6: { so6(); break; }
case 7: { so7(); break; }
case 8: { so8(); break; }
case 9: { so9(); break; }// Neu so lan =9 hien so 9 thoat khoi switch
}
}

void main(void)
{
while(1)
{
Doccongtac(); // Goi ham doc so lan nhan phim
hienthisolannhanphim(i);// Hien thi so lan nhan phim, bien i la bien toan cuc
}
}

DKS_GROUP - 83 -
5.4) Kinh nghi m:
- Xem các giá tr c a bi n trong Debug.
Sau khi vi t xong chư ng trình và biên d ch chư ng trình các b n vào công c Debug c a
Keil C. ư"c màn hình sau: Ch n View Watch& Call Stack Window.

ư"c như sau:

DKS_GROUP - 84 -
DKS_GROUP - 85 -
Trong khung phía dư i chính là Watch& Call Stack Window. Chuy n sang tab watch#1,
nh p chu t vào ch& F2 to edit,nh n F2 và gõ vào tên bi n c n quan sát.

Ph n 1 k t thúc.

DKS_GROUP - 86 -
Chúng ta quan sát bi n I, nên gõ I vào và ư"c hình như trên. Các b n nh n F11 ch y
mô ph ng. M(i l n n phím, cho chân P1.0 xu ng 0 r i lên 1, tư ng ư ng v i n phím
và nh phím I s t ng 1 như sau: (Khi n phím ph i ch# hàm delay(300) và hàm
while(P1_0 ==0) xong I m i t ng vì mình l p trình th mà.

Giá tr c a I hi n th theo s hex.

DKS_GROUP - 87 -
Ph n 2: c ma tr n phím.
Nhi m v :
Quét bàn phím 16 phím b m(4x4), xem phím nào ư"c b m, các phím ư"c ánh
s t 0 n 15 r i hi n th giá tr ra led 7 thanh.
6.1. L p m ch theo sơ sau:
5V

R26 R27 R28 R25


10Kx8 R R R
5VDC

5V

A
40

U3 PHIM 1 PHIM 2 PHIM 3 PHIM 4


B 21
P2.0
VCC

22 1 2 1 2 1 2 1 2
23 P2.1 R3
P2.2 R21
C 24 10K + C3
25 P2.3
P2.4 10uF/25V
HANG 1
D 26 31
27 P2.5 EA/VP PHIM 5 PHIM 6 PHIM 7 PHIM 8
P2.6 R
E
9 1 2 1 2 1 2 1 2
RESET
F
R1
R22
G 10K

P3.0
PHIM 9 PHIM 10 PHIM 11 PHIM 12 HANG 2
10
LED 7 THANH P3.0
P3.1
11 P3.1 1 2 1 2 1 2 1 2
R
12 P3.2 5V
P3.2 13 P3.3 P3.0
P3.3 P3.4 P3.1 R23
C2 14
33p P3.4
P3.5
15 P3.5
P3.6
P3.2
P3.3
PHIM 13 PHIM 14 PHIM 15 PHIM 16 HANG 3
18 16
X2 P3.6 17 P3.7 P3.4 1 2 1 2 1 2 1 2
12Mhz P3.7 P3.5 R
C1 19 P3.6
33p 20 X1 P3.7
VSS
8051 R24
HANG 4
R
COT 1

COT 2
COT 3
COT 4

- L p m ch:m ch bài led 7 thanh gi& nguyên và v i bàn phím các b n hàn ư"c ch% c n
câu vào c'ng 3 úng th! t chân và câu chân 5V lên +5V.

DKS_GROUP - 88 -
6.2 Nguyên lí quét phím:
- Vì sao m ch phím u theo ma tr n. N u c t 16 nút b m bình thư#ng ph i
dùng 16 chân vi i u khi n. N u u theo d ng ma tr n thì ch% m t 8 chân ta c$ng có th
c ư"c 16 phím b m.
- Có 2 cách quét phím theo c t và theo hàng, tôi ch n cách quét theo hàng, quét
theo c t các b n có th làm tư ng t .
- Bư c 1 : Ta ưa chân P3.0 n i v i Hàng 1 xu ng 0V.R i ta ki m tra giá tr logic
c a các chân P3.4,P3.5,P3.6,P3.7.N u phím 1 ư"c b m thì C t 1_ P3.4 s có giá tr b+ng
0. N u phím 2 ư"c b m thì C t 2_ P3.5 s có giá tr b+ng 0. N u phím 3 ư"c b m thì
C t 3_ P3.6 s có giá tr b+ng 0. N u phím 4 ư"c b m thì C t 4_ P3.7 s có giá tr b+ng
0. Ta c n c! vào ó xác nh xem phím nào ư"c b m.
- Bư c 2 : Ta ưa chân P3.1 n i v i Hàng 2 xu ng 0V.R i ta ki m tra giá tr logic
c a các chân P3.4,P3.5,P3.6,P3.7.N u phím 5 ư"c b m thì C t 1_ P3.4 s có giá tr b+ng
0. N u phím 6 ư"c b m thì C t 2_ P3.5 s có giá tr b+ng 0. N u phím 7 ư"c b m thì
C t 3_ P3.6 s có giá tr b+ng 0. N u phím 8 ư"c b m thì C t 4_ P3.7 s có giá tr b+ng
0. Ta c n c! vào ó xác nh xem phím nào ư"c b m.
- Bư c 3 : Ta ưa chân P3.2 n i v i Hàng 3 xu ng 0V.R i ta ki m tra giá tr logic
c a các chân P3.4,P3.5,P3.6,P3.7.N u phím 9 ư"c b m thì C t 1_ P3.4 s có giá tr b+ng
0. N u phím 10 ư"c b m thì C t 2_ P3.5 s có giá tr b+ng 0. N u phím 11 ư"c b m thì
C t 3_ P3.6 s có giá tr b+ng 0. N u phím 12 ư"c b m thì C t 4_ P3.7 s có giá tr b+ng
0. Ta c n c! vào ó xác nh xem phím nào ư"c b m.
- Bư c 4 : Ta ưa chân P3.3 n i v i Hàng 1 xu ng 0V.R i ta ki m tra giá tr logic
c a các chân P3.4,P3.5,P3.6,P3.7.N u phím 13 ư"c b m thì C t 1_ P3.4 s có giá tr
b+ng 0. N u phím 14 ư"c b m thì C t 2_ P3.5 s có giá tr b+ng 0. N u phím 15 ư"c
b m thì C t 3_ P3.6 s có giá tr b+ng 0. N u phím 16 ư"c b m thì C t 4_ P3.7 s có giá
tr b+ng 0. Ta c n c! vào ó xác nh xem phím nào ư"c b m.
Ta s dùng câu l nh if ki m tra.
6.3. L p trình:
- T o 1 project m i, copy ph n hi n th các sô 0…9 các ch& A…Y c a bài tr! c. R i b'
sung các hàm sau. Hàm hi n th phím n.
void phim_duoc_an(unsigned char phim)
{
switch(phim)// Tuy vao so lan
{
case 0: { so0(); break; }// Neu so lan =0 hien so 0 thoat khoi switch
case 1: { so1(); break; }// Neu so lan =1 hien so 1 thoat khoi switch
case 2: { so2(); break; }// ....
case 3: { so3(); break; }
case 4: { so4(); break; }
case 5: { so5(); break; }
case 6: { so6(); break; }
case 7: { so7(); break; }
case 8: { so8(); break; }
case 9: { so9(); break; }// Neu so lan =9 hien so 9 thoat khoi switch

DKS_GROUP - 89 -
}
}
Hàm quét phím:
/*Khai bao 1 mang 4 phan tu nhu sau: quetphim[4]={P0=0xFE,0xFD,0xFB,0xF7}
De dua 0 ra lan luot cac hang phim, khi do neu nut nao duoc an thi chan vi dieu khien se
xuong 0.Chu y fai kiem tra phim khoang 100 lan.*/
unsigned char quetphim[4]={0xFE,0xFD,0xFB,0xF7};
// Dinh nghia so lan quet phim
#define solanquetphim 100 // Cac ban co the thay doi gia tri nay cho phu hop
unsigned char quetbanphim(void)
{
unsigned char giatribanphim;// Bien de luu gia tri phim an tu 0 den 15 ma hoa 16 phim
unsigned char x,y;
//Quet 4 hang phim
for(x=0; x<4;x++)
{
P3=quetphim[x];// Dua lan luot cac hang xuong 0
for(y=0;y<solanquetphim;y++)// Kiem tra solanquetphim lan
{
if(P3_4==0) giatribanphim=0+4*x;// Gia tri phim tuong ung
if(P3_5==0) giatribanphim=1+4*x;// Tuy thuoc vao hang x
if(P3_6==0) giatribanphim=2+4*x;// La may ma gia tri cua
if(P3_7==0) giatribanphim=3+4*x;// gia tri ban phim tuong ung.
}
}
return(giatribanphim);
}
Hàm Main.
void main(void)
{
unsigned char i;
while(1)
{
i=quetbanphim();
phim_duoc_an(i);
}
}
Thêm câu l nh #define vào u chư ng trình:

DKS_GROUP - 90 -
Vi t hàm phím ư"c n:

DKS_GROUP - 91 -
Vi t hàm quét bàn phím và hàm main.

DKS_GROUP - 92 -
DKS_GROUP - 93 -
5.4. Kinh nghi m:
- Các b n ch y Debug xem s thay 'i giá tr c a bi n giá tr bàn phím.
- Các b n m i dùng 10 phím t 0…9 . Bài t p cho các b n là dùng phím 16
ch n mode: nh n phím 16 thì thay 'i ch hi n s thành hi n ch& và phím 1 tư ng
ư ng ch& A,phím 2 tư ng ư ng ch& B và c! như v y.
- Các b n th thay 'i giá tr #define solanquetphim 100 xem sao.
- ng lo l ng v các warning. Các warning nó c nh báo là b n có khai báo 1 s
hàm mà b n không dùng n. Như hàm delay(); hàm ch& A, vv.

Nhi m v : i u khi n hi n th LCD 16x2 dòng ch& “www.EmbestDKS.com”


ch y trên màn hình LCD.
Có 16 chân như sau:
Chân Ký hi u I/O Mô t
1 VSS - t
2 VCC - Dư ng ngu n 5v
3 VEE - C p ngu n i u khi n ph n
4 RS I RS = 0 ch n thanh ghi l nh. RS = 1 ch n
thanh d& li u
5 R/W I R/W = 1 c d& li u. R/W = 0 ghi
6 E I/O Cho phép
7 DB0 I/O Các bít d& li u
8 DB1 I/O Các bít d& li u
9 DB2 I/O Các bít d& li u
10 DB3 I/O Các bít d& li u
11 DB4 I/O Các bít d& li u
12 DB5 I/O Các bít d& li u
13 DB6 I/O Các bít d& li u
14 DB7 I/O Các bít d& li u
Chân 15 và chân 16: ghi là A và K. Nó là an t và kat t c a 1 con led dùng sáng LCD
trong bóng t i. Chúng ta không s d ng. N u các b n mu n dùng thì n i chân A qua 1
i n tr) t 1K n 5K lên dư ng 5V, chân K xu ng t èn s sáng.
6.1.L p m ch theo sơ sau:

DKS_GROUP - 94 -
VCC
5V

LCD16x02

1
R1 10K
C6
J1

5V LCD
104

10
9
8
7
6
5
4
3
2
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
U1
40

EN
Rw
RS
1 39
P1.0 P0.0/AD0
VCC

2 38
3 P1.1 P0.1/AD1 37 5V
4 P1.2 P0.2/AD2 36
5 P1.3 P0.3/AD3 35
6 P1.4 P0.4/AD4 34
+ C3 7 P1.5 P0.5/AD5 33
CAPACITOR POL 8 P1.6 P0.6/AD6 32
9 P1.7 P0.7/AD7 31
10 RST EA/VPP 30 R2
11 P3.0/RXD ALE/PROG 29
P3.1/TXD PSEN 5K
12 28 D7
R3 13 P3.2/INT0 P2.7/A15 27 D6
10K 14 P3.3/INT1 P2.6/A14 26 D5
15 P3.4/T0 P2.5/A13 25 D4
16 P3.5/T1 P2.4/A12 24 D3
17 P3.6/WR P2.3/A11 23 D2
18 P3.7/RD P2.2/A10 22 D1
19 XTAL2 P2.1/A9 21 D0
XTAL1 P2.0/A8
GND

Y1
20

12Mhz AT89C51

C2 C1
33p 33p

Rw RS
EN
DKS_GROUP - 95 -
- Hư ng d.n: C m luôn 8 bit d& li u c a LCD t D0 n D7 vào c'ng 2 c a 8051 mà
không c n câu dây. th a 6 chân ra ngoài là: EN,RW,RS,Ve, Vcc, GND ra ngoài. R i
dùng dây câu chân 1 xu ng GND, chân 2 lên +5V, chân 3 vào chân gi&a c a bi n tr)
tinh 5K, 2 chân còn l i c a bi n tr) tinh 1 chân lên +5V,1 chân xu ng 0V.
6.2.Nguyên lý ho t ng c a LCD:
- Chân VCC, VSS và VEE: Các chân VCC, VSS và VEE: C p dư ng ngu n - 5v và t
tư ng !ng thì VEE ư"c dùng i u khi n tư ng ph n c a LCD.
- Chân ch n thanh ghi RS (Register Select): Có hai thanh ghi trong LCD, chân
RS(Register Select) ư"c dùng ch n thanh ghi, như sau: N u RS = 0 thì thanh ghi mà
l nh ư"c ch n cho phép ngư#i dùng g i m t l nh ch1ng h n như xoá màn hình, ưa
con tr v u dòng v.v… N u RS = 1 thì thanh ghi d& li u ư"c ch n cho phép ngư#i
dùng g i d& li u c n hi n th trên LCD.
- Chân c/ ghi (R/W): u vào c/ ghi cho phép ngư#i dùng ghi thông tin lên
LCD khi R/W = 0 ho*c c thông tin t nó khi R/W = 1.
- Chân cho phép E (Enable): Chân cho phép E ư"c s d ng b)i LCD ch t d&
li u c a nó. Khi d& li u ư"c c p n chân d& li u thì m t xung m!c cao xu ng th p ph i
ư"c áp n chân này LCD ch t d& li u trên các chân d& liêu. Xung này ph i r ng t i
thi u là 450ns.
- Chân D0 - D7: ây là 8 chân d& li u 8 bít, ư"c dùng g i thông tin lên LCD
ho*c c n i dung c a các thanh ghi trong LCD. hi n th các ch& cái và các con s ,
chúng ta g i các mã ASCII c a các ch& cái t A n Z, a n f và các con s t 0 - 9 n
các chân này khi b t RS = 1.
C$ng có các mã l nh mà có th ư"c g i n LCD xoá màn hình ho*c ưa con
tr v u dòng ho*c nh p nháy con tr .
- Chú ý:Chúng ta c$ng s d ng RS = 0 ki m tra bít c# b n xem LCD có s n
sàng nhân thông tin. C# b n là bít D7 và có th ư"c c khi R/W = 1 và RS = 0 như
sau:
N u R/W = 1, RS = 0 khi D7 = 1 (c# b n 1) thì LCD b n b)i các công vi c bên
trong và s không nh n b t k2 thông tin m i nào. Khi D7 = 0 thì LCD s n sàng nh n
thông tin m i. Lưu ý chúng ta nên ki m tra c# b n trư c khi ghi b t k2 d& li u nào lên
LCD.
1 Sau ây là b ng mã l nh c a LCD:

Mã (Hex) L nh n thanh ghi c a LCD


1 Xoá màn hình hi n th
2 Tr) v u dòng
4 Gi m con tr (d ch con tr sang trái)
6 T ng con tr (d ch con tr sang ph i)
5 D ch hi n th sang ph i
7 D ch hi n th sang trái
8 T t con tr , t t hi n th
A T t hi n th , b t con tr
C B t hi n th , t t con tr

DKS_GROUP - 96 -
E B t hi n th , nh p nháy con tr
F T t con tr , nh p nháy con tr
10 D ch v trí con tr sang trái
14 D ch v trí con tr sang ph i
18 D ch toàn b hi n th sang trái
1C D ch toàn b hi n th sang ph i
80 ép con tr v u dòng th! nh t
C0 ép con tr v u dòng th! hai
38 Hai dòng và ma tr n 5 × 7

- i u khi n LCD qua các bư c sau:


Bư c 0 : Chu n b ph n c!ng. Dùng tu c vít hay cái gì b n có xoay bi n tr) 5 K
i u ch%nh tư ng ph n c a LCD. Xoay cho n khi các ô vuông(các i m nh) c a
LCD hi n lên thì xoay ngư"c bi n tr) l i 1 chút.
Bư c 1 : Kh)i t o cho LCD.
Bư c 2 : Gán các giá tr cho các bit i u khi n các chân RS,RW,EN cho phù h"p
v i các ch : Hi n th kí t lên LCD hay Th c hi n 1 l nh c a LCD.
Bư c 3: Xu t byte d& li u ra c'ng i u khi n 8 bit d& li u c a LCD.
Bư c 4: Ki m tra c# b n xem LCD s n sàng nh n d& li u m i chưa.
Bư c 5: Quay vòng l i bư c 1.
6.3.L p trình:
- có th l p trình cho LCD ta thêm vào thư vi n string.h c a trình biên d ch
b+ng câu l nh:
#include <string.h>
- Khai báo các chân c a LCD g n v i các c'ng:
/*
RS chon thanh ghi
=0 ghi lenh
=1 ghi du lieu
RW doc ghi
=0 ghi
=1 doc
E cho fep chot du lieu
xung cao xuong thap toi thieu 450 ns.
Bit co ban D7
khi RS=0 RW=1 neu D7=1 LCD ban
D7=0 LCD san sang.
*/
sfr LCDdata = 0xA0;// Cong 2 , 8 bit du lieu P0 co dia chi 0x80, P1 0x90 , P2 0xA0
sbit BF = 0xA7; // Co ban bit 7
sbit RS = P3^5;
sbit RW = P3^4;
sbit EN = P3^3;

DKS_GROUP - 97 -
- Vi t 1 s hàm i u khi n LCD như sau:
* Hàm ki m tra LCD có b n hay không:
void wait(void)
{
long n = 0;
EN=1;// Dua chan cho fep len cao
RS=0;// Chon thanh ghi lenh
RW=1;// Doc tu LCD
LCDdata=0xFF;// Gia tri 0xFF
while(BF){n++; if(n>100) break;}// Kiem tra co ban
// Neu ban dem n den 100 roi thoat khoi while
EN=0;// Dua xung cao xuong thap de chot
RW=0;// Doc tu LCD
}
* Hàm i u khi n LCD th c hi n 1 l nh:
void LCDcontrol(unsigned char x)
{
EN=1;// Dua chan cho fep len cao
RS=0;// Chon thanh ghi lenh
RW=0;// Ghi len LCD
LCDdata=x;// Gia tri x
EN=0;// Xung cao xuong thap
wait();// Doi LCD san sang
}
Hàm có 1 bi n u vào là các giá tr trong b ng mã l nh c a LCD.
* Hàm kh)i t o LCD:
void LCDinit(void)
{
LCDcontrol(0x30);//Che do 8 bit.
LCDcontrol(0x30);
LCDcontrol(0x30);
LCDcontrol(0x38);// 2 dong va ma tran 5x7
LCDcontrol(0x0C);// Bat con tro
LCDcontrol(0x06);// Tang con tro xang fai
LCDcontrol(0x01);// Xoa man hinh
}
* Hàm l nh cho LCD hi n th 1 kí t :
void LCDwrite(unsigned char c)
{
EN=1;// Cho fep muc cao
RS=1;// Ghi du lieu
RW=0;// Ghi len LCD
LCDdata=c;// Gia tri C
EN=0;// Xung cao xuong thap

DKS_GROUP - 98 -
wait();// Cho
}
Hàm có 1 bi n u vào là mã c a kí t trong b ng ASCII.
* Hàm l nh cho LCD hi n th 1 xâu kí t ( dòng ch&):
void LCDputs(unsigned char *s,unsigned char row)
{
unsigned char len;
if(row==1) LCDcontrol(0x80);// Ep con tro ve dau dong 1
else LCDcontrol(0xC0);// Ep con tro ve dau dong 2
len=strlen(s);// Lay do dai bien duoc tro boi con tro
while(len!=0)// Khi do dai van con
{
LCDwrite(*s);// Ghi ra LCD gia tri duoc tro boi con tro
s++;// Tang con tro
len--;// Tru do dai
}
}
Hàm có hai bi n u vào là : xâu kí t c n hi n th và dòng c n hi n th xâu ó(1 ho*c 2).
*s là con tr , tr t i bi n s
6.3.1. nh ngh a con tr
B nh c a V K các b n tư)ng tư"ng như 1 cái t nhi u ng n. Khi khai báo 1
bi n, ví d bi n ki u unsigned char i; thì v k lưu bi n I vào 1 ng n trong t _ 1 ô nh
trong b nh , d nhiên xác nh các ng n t ngư#i ta ánh s cho t ng ng n, còn v k
c p cho các ô nh trong b nh 1 a ch% xác nh ô nh ó.Ví d ti p: I có giá tr là
100, thì n i dung c a ô nh lưu bi n I là 100,i=100, còn con tr tr n I có giá tr là a
ch% c a ô nh ch!a bi n I ó.
6.3.2. Cách s d ng con tr :
khai báo con tr có thêm d u * trư c tên bi n. *I là bi n ki u con tr , tr t i
bi n i(unsigned char). I mang giá tr t 0 n 255, *I mang i ch% c a ô nh ch!a i.
* Hàm hi n th 1 s integer:
void LCDwritei(int d)
{
unsigned char i,j,k,l;
i=d%10;// Chia lay phan du, duoc chu so hang don vi
d=d/10;// Chia lay phan nguyen, duoc nhung chu so da bo hang don vi
j=d%10;// Duoc chu so hang chuc
d=d/10;// Nhung chu so da bo hang don vi va hang chuc
k=d%10;// Duoc hang tram
l=d/10;// Duoc hang nghin
LCDwrite(48+l);// Hien thi ki tu trong bang ascii
LCDwrite(48+k);// Trong bang ascii so 0 co co so thu tu la 48
LCDwrite(48+j);
LCDwrite(48+i);

DKS_GROUP - 99 -
}
Hàm có 1 bi n u vào là s int l n n hàng nghìn c n hi n th .
* Hàm tr,:
void delay(long time)
{
long n;
for(n=0;n<time;n++) ;
}
* Hàm main:
void main(void)
{
char x;
LCDinit();
LCDputs("8052 MCU",1);
delay(30000);
while(1)
{
for(x=0;x<16;x++)// Dich 16 lan.
{
LCDputs("8052 MCU",1);
LCDcontrol(0x18);// Dich hien thi sang trai.
delay(5000);// Tre
}
}
}

DKS_GROUP - 100 -
Nhi m v :
T o ra xung có r ng thay 'i, 10 c p, t n s 1Khz, i u khi n t c ng
c (10 c p t c ).
7.1. L p m ch theo sơ sau:
12V
5VDC

40
U1

VCC
2C

R2
3B 21 10K
C828 P2.0
31 + C3
EA
1E
1

9 10uF/25V
+ RESET
DC Motor R1
10K
A
-
SW1
2

C2 1 1 2
33p 18 P1.0
X2 2
P1.1
12Mhz SW2
C1 19
33p 20 X1 1 2
VSS
8051

- Hư ng d.n: Chân c a C828 là ECB, n u c m xuôi transitor nhìn vào m*t có ch&, tính t
bên trái sang.
7.2.L p trình:
- Cách t o xung có r ng thay 'i b+ng V K.
+ Cách 1: Như các b n i u khi n nh p nháy 1 con led, ó là t o ra 1 xung ) 1
chân c a vi i u khi n, nhưng xung ó có r ng c nh, t n s l n, cách b n có th
i u ch%nh l i hàm delay t n s c a nó úng 1 Khz. Tuy nhiên vì là dùng hàm delay
nên trong th#i gian có xung lên 1(5V) và th#i gian không có xung(0V) vi i u khi n
không làm gì c , h n n&a t o xung b+ng vi c delay mà các b n có nhu c u c n 2 b phát

DKS_GROUP - 101 -
xung ) 2 kênh, có cùng t n s mà khác r ng xung thì tr) nên r t khó kh n. Cho nên
chúng ta dùng b nh th#i Timer c a vi i u khi n trong trư#ng h"p này r t ti n.
+ Cách 2: Dùng ng t Timer c a b vi i u khi n.

Trư c h t nh c l i v ng t c a vi i u khi n:
+ Ng t là gì ? tr l#i câu h i này tôi xin trích an v ng t trong bài 2 ví d cho
ng t timer:

Timer

Main Program

ISR ISR ISR

* ** * ** * **
Main Main Main Main

Program excution with interrupt.

M t chư ng trình chính không có ng t thì ch y liên t c, còn chư ng trình có ng t


thì c! khi nào i u ki n ng t ư"c m bào thì con tr s nh y sang hàm ng t th c hi n
xong hàm ng t l i quay v úng ch( c$ th c hi n ti p chư ng trình chính. Tôi có 1 ví d
như sau: B n ang n c m , có ti ng i n tho i , b n t bát c m ra nghe i n tho i ,
nghe xong l i quay v bưng bát c m lên n ti p. Thì quá trình n c m c a b n là chư ng
trình chính,có i n tho i g i n là i u ki n ng t, b n ra nghe i n tho i là th c hi n
chư ng trình ng t(Interrupt Service Rountine),quay v n c m ti p là ti p t c th c hi n
chư ng trình chính.
Ng t i v i ngư#i m i h c vi i u khi n là r t khó hi u, vì a s các tài li u u
không gi i thích ng t làm gì. Có nhi u lo i ng t khác nhau nhưng t t c u có chung
1 *c i m, ng t dùng cho m c ích a nhi m. a t!c là nhi u, nhi m t!c là nhi m v .
Th c hi n nhi u nhi m v .
Các b n nhìn vào ti n trình c a hàm main v i chư ng trình có ng t :
Chư ng trình chính ang ch y, ng t x y ra, th c hi n hàm ng t r i quay l i chư ng trình
chính. Chư ng trình trong vi i u khi n khác v i ví d n c m nghe i n tho i c a tôi )
ch(, th#i gian th c hi n hàm chính là r t l n,th#i gian th c hi n hàm ng t là r t nh , cho
nên th#i gian th c hi n hàm ng t không nh hư)ng gì n th#i gian th c hi n hàm chính
Như v y trong hàm ng t các b n làm 1 vi c, trong hàm chính c c b n làm 1 vi c

DKS_GROUP - 102 -
như v y coi như các b n làm ư"c 2 vi c( a nhi m) trong 1 quãng th#i gian tư ng i
ng n c0 mS, ch! th c ra t i 1 th#i i m vi i u khi n ch% th c thi 1 l nh.
Ví d : B n th ngh xem làm th nào v a i u ch xung PWM i u ch%nh t c
ng c , v a c các c m bi n u vào mà t c ng c ph thu c u vào c m bi n.
V y ng t là 1 i u ki n nào ó x y ra ng.u nhiên mà vi i u khi n có th bi t do
ph n c!ng c a vi i u khi n, r i ta c n c! vào ó l p tr0nh.
* Ví d : V i ng t b nh th#i timer, hay b m counter là khi tràn b m thì
ph n c!ng c a vi i u khi n s b o có ng t x y ra và nh y n chư ng trình ph c v
ng t( ISR_ Interrupt Sevice Rountine) 1 cách t ng.
V i ng t ngoài, chân P3.2 ch1ng h n, n u ta khai báo trư c chân s d ng chân
P3.2 s d ng cho ng t ngoài ch! không ph i s d ng cho m c ích IO thi c! khi cú 1
xung xu t hi n t m ch ngo i vi truy n vào chõn P3.2 thì ph n c!ng c a vi i u khi n
nh n ra và chuy n t i chư ng trình ph c v ng t.
V i ng t n i ti p thì c! khi có kí t truy n t máy tính xu ng vi i u khi n thì s
có hi n tư"ng ng t x y ra.
- Hàm ng t:
C u trúc:
Void Tênhàm(void) interrupt ngu nng t using b ngthanhghi
{
// Chuong trinh phuc vu ngat o day
}
Ch2 ý v hàm ng t:
+ Hàm ng t không ư"c phép tr l i giá tr hay truy n bi n vào hàm.
+ Tên hàm b t kì.
+ interrupt là t khóa phân bi t hàm ng t v i hàm thư#ng.
+ Ngu n ng t t 0 t i 5 theo b ng vector ng t.
+ B ng thanh ghi trên ram ch n t 0 n 3.
T y theo b n vi t hàm ng t cho ngu n nào b n ch n ngu n ng t t b ng sau:

Ng t do C a ch vector
Reset h th ng RST 0000H
Ng t ngoài 0 IE0 0003H
B nh th i 0 TF0 000BH
Ng t ngoài 1 IE1 0013H
B nh th i 1 TF1 001BH
Port n i ti p RI ho c TI 0023H
B nh th i 2 TF2 ho c EXF2 002BH
Riêng ng t Reset không tính, b t u m t 0 và t ng t ngoài 0. Ví d : tôi c n vi t hàm
ng t cho b nh th#i timer 1 hàm ng t s là.
void timer1_isr(void) interrupt 3 using 0
{
// Lenh can thuc hien.
}

DKS_GROUP - 103 -
- V using 0: Có 4 b ng thanh ghi b n có th ch n cho chư ng trình ph c v ng t, cái này
c$ng không quan tr ng. Trong hàm ng t các b n có th b i t using 0, khi ó vi i u
khi n s t s p x p là dùng b ng thanh ghi nào.
- Hàm ng t khác hàm bình thư#ng ch( nào. Hàm bình thư#ng ví d hàm delay, c! khi
b n g i nó thì nó s ư"c th c hi n, có ngh a là nó có v trí c nh trong ti n trình hàm
main, có ngh a là b n bi t nó x y ra khi nào. Còn hàm ng t thì không có ti n trình c
nh, i u ki n ng t có th x y ra b t kì lúc nào trong ti n trình hàm main và c! khi nào
có i u ki n ng t thì hàm ng t s ư"c g i t ng.
- s d ng ng t ta ph i làm các công vi c sau:
1) Kh)i t o ng t: dùng ng t nào thì cho phép ng t ó ho t ng b+ng cách gán giá
tr tư ng !ng cho thanh ghi cho phép ng t IE( Interrupt Enable):
EA ET2 ES ET1 EX1 EX0 ET0
i u khi n các ngu n ng t
IE (0: không cho phép; 1: cho phép)
IE.7 EA Cho phép/ không cho phép toàn c c
IE.6 --- Không s d ng
IE.5 ET2 Cho phép ng t do b nh th#i 2
IE.4 ES Cho phép ng t do port n i ti p
IE.3 ET1 Cho phép ng t cho b nh th#i 1
IE.2 EX1 Cho phép ng t t bên ngoài (ng t ngoài 1)
IE.1 EX0 Cho phép ng t t bên ngoài (ng t ngoài 0)
IE.0 ET0 Cho phép ng t do b nh th#i 0
IE là thanh ghi có th x lí t ng bít. Ví d : b n mu n cho phép ng t timer 1 b n dùng
l nh: ET1=1; Không cho phép n&a b n dùng l nh : ET1=0; Ho*c b n có th dùng l nh
IE= 0x08; thì bit 3 c a thanh ghi IE t!c(IE) s lên 1. Nhưng cách th! nh t ti n h n.
2) C u hình cho ng t: Trong 1 ng t nó l i có nhi u ch ví d : v i ng t timer.
B n ph i c u hình cho nó ch y ) ch nào, ch timer hay counter, ch 16 bit, hay
8 bit,… b+ng cách gán các giá tr tư ng !ng cho thanh ghi TMOD( Timer MODe).

DKS_GROUP - 104 -
TMOD Ch n model cho b nh th i 1
7 GATE Ch n model cho b nh th i 1
6 C/T Bít ch n ch#c n$ng m ho c nh th i:
5 M1 Bit ch n ch th# nh t
4 M0 Bit ch n ch th# 2
M1 M0 Ch Ch#c n$ng

0 0 0 Ch nh th i 13 bit
0 1 1 Ch nh th i 16 bit
1 0 2 Ch t ng n p l i 8
bit
1 1 3 Ch nh th i chia x'
3 GATE Bit i u khi n c ng cho b nh th i 0
2 C/T Bit ch n ch#c n$ng m / nh th i cho b nh
th i 0
1 M1 Bit ch n ch th# nh t cho b nh th i 0
0 M0 Bit ch n ch th# 2 cho b nh th i 0
Ví d tôi c u hình cho b nh th#i 1 ch timer,v i b m 8 bit t ng n p l i(auto
reload) dùng l nh sau: TMOD=0x20.
Các b n ng lo vì vi c ph i nh b ng thanh ghi này, các b n không ph i nh nói tr ng
ra như v y, chuy n sang ph n l p trình các b n s ư"c hư ng d.n làm th nào không
ph i nh , nhưng ch% l p trình v i C m i làm ư"c còn l p trình Asem thì b t bu c ph i
nh .
3)B t u chư ng trình có ng t:
-Trư c khi b t u cho ch y chư ng trình ta ph i cho phép ng t toàn c c ư"c
x y ra b+ng cách gán EA(Enable All interrupt) b+ng 1, thì ng t m i x y ra.
-Thư#ng thì ngay vào u chư ng trình(hàm main) trư c vòng while(1) chúng ta
*t công vi c kh)i t o, c u hình và cho phép ki m tra ng t. Ví d v i b nh th)i timer
ta gán các giá tr phù h"p cho thanh ghi TCON( Timer CONtrol).
2 i u khi n b inh th#i
TCON.7 TF1 C# tràn c a b nh th#i 1. C# này ư"c set b)i
ph n c!ng khi có tràn, ư"c xoá b)i ph n m m,
ho*c b)i ph n c!ng khi b vi x lý tr n trình
ph c v ng t
TCON.6 TR1 Bit i u khi n ho t ng c a b nh th#i 1. Bit
này ư"c set ho*c xoá b)i ph n m m i u khi n
b nh th#i ho t ng hay ngưng
TCON.5 TF0 C tràn c a b nh th#i 0
TCON.4 TR0 Bit i u khi n ho t ng c a b nh th#i 0
TCON.3 IE1 C ng t bên ngoài 1 (kích kh)i c nh). C# này ư"c
set b)i ph n c!ng khi có c nh âm (cu ng) xu t hi n

DKS_GROUP - 105 -
trên chân INT1, ư"c xoá b)i ph n m m, ho*c
ph n c!ng khi CPU tr n trình ph c v ng t
TCON.2 IT1 C# ng t bên ngoài 1 (kích kh)i c nh ho*c m!c). C#
này ư"c set ho*c xoá b)i ph n m m khi x y ra
c nh âm ho*c m!c th p t i chân ng t ngoài
TCON.1 IE0 C# ng t bên ngoài 0 (kích kh)i c nh)
TCON.0 IT0 C# ng t bên ngoài 0 ( kích kh)i c nh ho*c m!c)
Ví d ch y b nh th#i timer 1 ta dùng câu l nh: TR1=0;
TR1(Timer Run 1). Còn b n nào thích khó thì:TCON=0xxx;
Còn các lo i ng t khác quá trình tư ng t , ây là khóa h c c b n ch% làm vi c v i ng t
timer, trong khóa nâng cao s có các ng t còn l i, tuy nhiên làm vi c ư"c v i ng t timer
thì các ng t khác các b n c$ng có th làm tư ng t , các b n làm n ng t nào thì dùng tài
li u tra b ng thanh ghi c a ng t ó. Tài li u tôi s g i cùng bài này.
- Quay tr) l i bài h c:
Sau khi kh)i t o song và cho ng t timer 1 ch y thì i u gì x y ra?
Khi b t u cho timer 1 ch y thì b m c a timer s m dao ng c a th ch anh, c! 12
dao ng c a th ch anh(1 chu kì máy), b m c a timer 1 TL1(Timer Low1) s t ng
1,có th n nói timer 1 m s chu kì máy. i v i ch 8 bít.
TL1 là 1 thanh ghi 8 bít, là b mc ab nh th#i rõ r i. Nó m ư"c t 0, n 255.
N u nó m n 256 thì b m tràn, TL1 quay vòng l i b+ng 0, và c# ng t TF1(Timer
Flag 1) t ng ư"c gán lên 1(b+ng ph n c!ng c a vi i u khi n) như 1 công t c t ng
b t, và ng t x y ra.
Còn v i ch 16 bít, b mc ab nh th#i còn 1 thanh ghi 8 bít n&a là
TH1(Timer high 1), n u c u hình cho timer 1 ho t ng ) ch 16 bit thì khi TL1 tràn
nó s m sang TH1(TH1 s t ng 1). Như v y ta có th m: 216 chu kì máy( 2 thanh ghi
8+8=16 bít).
Chú ý là khi b m tràn ng t s x y ra. N u ta c n m 256 chu kì máy thì khi kh)i t o
ta cho TL1=0; , còn n u không mu n m 256 chu kì mày mà ta ch% c n m 100 thôi
ng t ã x y ra r i thì ta f i làm như sau: 256-100 = 156; và khi kh)i t o ta gán :
TL1=155; vì m t 155 n 255 là 100 l n thì ng t x y ra.

V i yêu c u c a bài. T o xung t n s 1Khz Chu kì = 1/103 = 0,001 giây= 1 mili


giây=1000 uS= 1000 chu kì máy. V i 10 c p t c , t!c là b n ph i t o ra ư"c xung
10%, 20%, 30%, 40%, …, 90%, 100%. 1 xung như sau:

5V
0V

T : Chu kì
1000 miro giây.
Kho ng th#i gian xung kéo dài 5V là T1. Xung 10% t!c là T1/ T= 10%=1/10. Xung 20%
T2/T=2/10…PWM(Thay 'i r ng xung)
Bây gi# tôi m i xin nói v ph n 2.

DKS_GROUP - 106 -
7.3) Nguyên lí ho t ng:
- Xung PWM: ưa ra m) transitor, xung v i r ng l n h n transitor s m) lâu
h n ng c s quay nhanh h n,d nhiên không tuy n tính. Không có xung ng c s
không quay, có xung 100% ng c s quay max.Tuy nhiên xung ph i l n h n 1 m!c
nào ó thì m i kh)i ng cho ng c . Các *c tính này các b n tham kh o trong giáo
trình v máy i n, khí c i n, n u các b n c n thông s chính xác.
có th thay 'i 10 c p t c v i chu kì 1000uS, ta kh)i t o cho ng t timer: 100 uS
ng t 1 l n. Trong hàm ng t ki m tra xem ta c n c p xung bao nhiêu % thì ta s gán giá tr
cho nó. C th như sau:
* Hàm kh)i t o ng t.
Dùng ng t timer 0, 100 uS ng t 1 l n, dùng ch 2 8 bit t ng n p l i c a
timer (vì mình ch% c n m n 100).TL0 n p b+ng 156. i v i ch 2 khi tràn b m
TL0 s quay vòng giá tr b+ng 0, nhưng sau ó nó l i ư"c n p giá tr lưu trong TH0(giá
tr n p l i), do ó ta ch% c n gán giá tr choTL0 và TH0 trong hàm kh)i t o, còn ) các ch
khác 16 bit, 2 timer counter 8 bit, khi tràn b m TL0 không ư"c n p l i mà ta ph i
t gán l i giá tr cho nó trong hàm ng t.
void khoitaotimer0(void)// Ham khoi tao
{
EA=0;// Cam ngat toan cuc
TMOD=0x02;// Timer 0 che do 2 8 bit auto reload
TH0=0x9B;// Gia tri nap lai 155 doi ra so hex
TL0=0x9B;// Gia tri khoi tao 155 doi ra so hex
ET0=1;// Cho phep ngat timer 0
EA=1;// Cho phep ngat toan cuc
TR0=1;// Chay timer 0 bat dau dem so chu ki may
}

DKS_GROUP - 107 -
DKS_GROUP - 108 -
* Hàm ng t:
unsigned char dem=0;// Khai bao bien dem de dem tu 1 den 10
unsigned char phantramxung;// Bien chua phan tram xung(0...10)

void timer0(void) interrupt 1 //Ngat timer 0


{
TR0=0;// Dung chay timer 0
TF0=0;// Xoa co, o che do co tu duoc xoa,che do khac can toi cu viet vao day
dem++;
if(dem<phantramxung) P2_0=1;// Neu bien dem < phan tram xung thi dua gia tri 1 ra
chan, xung 5V
else P2_0=0;// Neu dem = phan tram xung
if(dem==10) dem=0;// Neu dem du 10 thi gan lai bang 0 de bat dau chu ki moi
TR0=1;// Cho chay timer
}
có th thay 'i r ng xung thì ta lưu r ng xung vào 1 bi n, vì hàm ng t không
cho truy n bi n vào ta khai báo bi n ó là bi n toàn c c có th gán giá tr ) m i hàm.
100 uS ng t 1 l n xác nh chu kì 1000 uS ta c n m t 1 n 10 ta khai báo bi n
m.
void timer0(void) interrupt 1 //Ngat timer 0
{
TR0=0;// Dung chay timer 0
TF0=0;// Xoa co, o che do co tu duoc xoa,che do khac can toi cu viet vao day
TH0=0xAB;
TL0=0xAB;
….
TR0=1;// Cho chay timer
}
C u trúc hàm ng t timer nào c$ng ph i theo, do ch 2t ng n p l i nên kô c n gán
giá tr cho TH0 và TL0.
V bi n dem s m t 1 n 10 n u b+ng 10 k t thúc 1 chu kì 10*100 =1000 uS, ta gán
l i nó b+ng 0 sang chu kì m i.
if(dem<phantramxung) P2_0=1;// Neu bien dem < phan tram xung thi dua gia tri 1 ra
chan, xung 5V
else P2_0=0;// Neu dem = phan tram xung
Câu l nh này ki m tra n u m nh h n phantramxung thì s ưa ra c'ng giá tr 1, b+ng
ho*c l n h n s ưa ra giá tr 0. Khi vào chư ng trình chính ta ch% vi c thay 'i giá tr
bi n phantramxung thì r ng xung s thay 'i.
* Hàm main:
void main(void)
{
khoitaotimer0();
while(1)
{

DKS_GROUP - 109 -
phantramxung=9;
delaylong(20000);
phantramxung=4;
delaylong(20000);
}
}

Gi s khi các b n gán phantramxung=4; Thì c! m(i 100uS ng t x y ra 1 l n, và ki m tra


bi n m. L n u dem=1 <4 nên giá tr P2_0 = 1 m!c cao, l n th! 2 , 200 uS, dem =2<4
P2_0 = 1 m!c cao, l n th! 3, 300uS, dem=3<4, P2_0=1 m!c cao, l n th! 4, 400uS, dem
=4 <4 sai, P2_0=0, b t u xu(ng m!c th p, có xung t cao xuông th p, dem = 5<4 sai ,

DKS_GROUP - 110 -
P2_0=0 m!c th p, …, dem =10 <4 sai P2_0 m!c th p 1000 uS , 400uS cao, 600uS
th p quay vòng dem=0, ng t l n th! 11, dem=1 < 4 , P2_0=1 m!c cao, có xung th p lên
cao….
PWM 2 chân P2_0 và P3_5, các b n khai báo thêm 1 bi n phantramxung2 và ưa
thêm dòng l nh sau vào hàm ng t.

if(dem<phantramxung) P3_5=1;// Neu bien dem < phan tram xung thi dua gia tri 1 ra
chan, xung 5V
else P3_5=0;// Neu dem = phan tram xung

Chú ý: Th c ra 1 chu kí như ta v a làm không chính xác 100% là 1Khz, vì ta chưa tính
n dài c a hàm ng t,m(i l n ng t 100uS, 10 l n là 1000uS ã , còn th#i gian th c
hi n hàm ng t n&a, như v y là chu kì c a ta l n h n 1000uS, t n s( s <1Khz, nhưng
th c s sai s ó không áng k . N u các b n mu n chính xác tôi c$ng chi u lòng các
b n. Các b n ch y debug, th ch anh úng 12Mhz, quan sat dòng sec xem hàm ng t
di,n ra trong bao nhiêu chu kì máy, khi n p giá tr cho TL0 và TH0 các b n l y 155 tr i
giá tr ó ư"c gía tr a gán vào, như v y a+th#i gian th c hi n hàm ng t úng 100uS.

DKS_GROUP - 111 -
DKS_GROUP - 112 -
Ch% vào list mode: Ch n ch , r i quan sát giá tr ) TMOD r i quay l i i n vào
chư ng trình.
Chú ý: Vô cùng quan tr ng các b n ch% ư"c ch y v i ng c lo i nh , n u ng c lo i
to ph i có m ch i u khi n riêng không là s cháy chip. N u không có m ch i u khi n
các b n có th làm, có th mư"n c a tôi, không thì ch u khó ch y mô ph ng.

DKS_GROUP - 113 -
Nhi m v :
i u khi n Led ma tr n 8x8. Hi n th dòng ch& ch y “MTC”
Chu n b :
Led ma tr n 8x8

8 7 6 5 4 3 2 1

LED MATRIX 1

8x8

9 10 11 12 13 14 15 16

Sơ chân led ma tr n 8x8:


Chân C t Hàng Chân C t Hàng
1 4 9 8
2 2 10 5
3 7 11 3
4 6 12 5
5 1 13 8
6 4 14 7
7 3 15 2
8 6 16 6

8.1. L p m ch theo sơ sau:

DKS_GROUP - 114 -
VCC

1 R3

10K

H ang6
H ang3

H ang1

H ang2
H ang4
C o t4

C o t6
C o t7
U1
9
8
7
6
5
4
3
2

Cot1 39 21 Hang1
Cot2 38 P0.0/AD0 P2.0/A8 22 Hang2 8 7 6 5 4 3 2 1
Cot3 37 P0.1/AD1 P2.1/A9 23 Hang3
Cot4 36 P0.2/AD2 P2.2/A10 24 Hang4
Cot5 35 P0.3/AD3 P2.3/A11 25 Hang5
Cot6 34 P0.4/AD4 P2.4/A12 26 Hang6
Cot7 33 P0.5/AD5 P2.5/A13 27 Hang7
Cot8 32 P0.6/AD6 P2.6/A14 28 Hang8
P0.7/AD7 P2.7/A15
1 10
2 P1.0 P3.0/RXD 11 LED MATRIX 1
3 P1.1 P3.1/TXD 12
4 P1.2 P3.2/INT0 13 8x8
5 P1.3 P3.3/INT1 14
6 P1.4 P3.4/T0 15
7 P1.5 P3.5/T1 16
8 P1.6 P3.6/WR 17
P1.7 P3.7/RD
19 30
Y1 18 X1 ALE 29 9 10 11 12 13 14 15 16
X2 PSEN
31 C o t5
C o t3

C o t8
H ang8

H ang5

H ang7
9 EA

C o t2
C o t1
C1 C2 RST
GND

33p 12M 33p 40


VCC
20

8051

+ C3 R2
10K
10uF

DKS_GROUP - 115 -
3 2 %-4 5 & 6 7( *
D2 D3 D4 D5 D6 D7 D8 D8

Hang 1 LED LED LED LED LED LED LED LED

D2 D3 D4 D5 D6 D7 D8 D8

LED LED LED LED LED LED LED LED


Hang 2
D2 D3 D4 D5 D6 D7 D8 D8

LED LED LED LED LED LED LED LED


Hang 3
D2 D3 D4 D5 D6 D7 D8 D8

Hang 4 LED LED LED LED LED LED LED LED


D2 D3 D4 D5 D6 D7 D8 D8

Hang 5 LED LED LED LED LED LED LED LED


D2 D3 D4 D5 D6 D7 D8 D8

LED LED LED LED LED LED LED LED


Hang 6
D2 D3 D4 D5 D6 D7 D8 D8

Hang 7 LED LED LED LED LED LED LED LED


D2 D3 D4 D5 D6 D7 D8 D8

LED LED LED LED LED LED LED LED


Cot1

Cot2

Cot3

Cot4

Cot5

Cot6

Cot7

Cot8
Hang 8

Mu n cho led sáng, c p i n dư ng 5V vào hàng, 0V vào c t, dòng 10mA n 15 mA.


Ví d : mu n èn led ) v trí 5x4 sáng, ta ưa i n áp c t 4(P0_3) xu ng 0V, i n áp hàng
5(P2_5) lên 5V.
Hi n th ch&: th ng kê các i m sáng thành ch& r i cho các hàng c t i n áp tư ng !ng.
Có th dùng công c debug l y giá tr c'ng tư ng !ng v i các led sáng.
Gi ng như quét bàn phím, ưa i n áp 0V ra t ng c t n i v i c'ng 0. Như v y s có 8 giá
tr : 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F ph I ưa vào 1 m ng 8 ph n t ,
r i sau ó ưa vào 1 vòng for t ng d n 1 bi n t ng ph n t m ng cot[8].
V i m(i l n 1 chân c'ng 0 xu ng 0V ta dùng c'ng 2 ưa ra 1 giá tr 8 bít i u khi n
trong 1 c t nh!ng èn nào sáng. Ví d mu n hàng 1 và hàng 3 sáng thì hàng 1 và 3 có giá
tr 5V còn các hàng khác 0V, ta ư"c giá tr 8 bít sau: 0x05 ( 1010 000).
T i m(i th#i i m ch% có m t s èn trên 1 c t sáng, nhưng do ta quét 8 c t v i t n s
nhanh, vì m t có hi n tư"ng lưu nh nên ta th y trong 1 th#i i m ta th y toàn b kí t .
V i 8 c t l n lư"t b+ng 0V ta ph I ưa ra tư ng !ng 8 giá tr 8 bit ra c'ng 2, do ó ta f I
lưu 8 giá tr ó vào 1 m ng 8 kí t _ kytu1[8], ta s vi t các ký t trên 7 c t. m(i kí t
s cách nhau 1 c t không sáng. Ta khai báo m ng kytu1[9] có 9 ph n t và ph n t u
tiên có giá tr y ra c'ng 2 là 0x00 t t toàn b c t ó.

DKS_GROUP - 116 -
Quá trình i u khi n hi n th như sau:
C t 1, hàng 1, c t 2 hàng 2, …, c t 8 , hàng 8.
làm ch& ch y:
Thêm 1 bi n vào i u khi n th! t hi n th hàng.
Hi n 1 ch& trên led như trên ã ưa ra:
C t 1, hàng 1, c t 2 hàng 2, …, c t 8 , hàng 8.
Mu n ch& ó d ch chuy n sang tráI ta hi n th như sau:
C t 1, hàng 2, c t 2 hàng 3, …, c t 7, hàng 8,c t 8 , hàng 1 ký t sau.
C t 1, hàng 3, c t 2 hàng 4, …, c t 7 hàng 1 ký t sau,c t 8 , hàng 2 ký t sau.
8.3) Code:
#include <REGX51.H>
/* Cot tu P0.0 den P0.7
Hang tu P2.0 den P2.7
De quet dua muc logic 0 lan luot ra cong 0
*/
/* Ham tre */
void delay(long time)
{
long n;
for(n=0; n<time; n++)
{
;
}
}
unsigned char kytu1[9];// Mang 9 phan tu chua gia tri cac hang day ra cong 2
unsigned char k=0;// Bien xac dinh cac ky tu
/* Ham nap gia tri hien thi cac ky tu vao mang kytu1
co 8 gia tri dua ra va 1 gia tri khong bat den nao de cac ky tu cach nhau 1 cot */
void mahoa(unsigned char x)
{
switch(x)
{
// Dau trang
case 0: { kytu1[0]=0x00; kytu1[1]=0x00; kytu1[2]=0x00; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
// Chu M
case 1: { kytu1[0]=0x00; kytu1[1]=0xFF; kytu1[2]=0x02; kytu1[3]=0x04;
kytu1[4]=0x08; kytu1[5]=0x04; kytu1[6]=0x02; kytu1[7]=0xFF; kytu1[8]=0x00;
break;
}
// Chu T
case 2: { kytu1[0]=0x00; kytu1[1]=0x01; kytu1[2]=0x01; kytu1[3]=0x01;

DKS_GROUP - 117 -
kytu1[4]=0xFF; kytu1[5]=0x01; kytu1[6]=0x01; kytu1[7]=0x01; kytu1[8]=0x00;
break;
}
// Chu C
case 3: { kytu1[0]=0x00; kytu1[1]=0x7E; kytu1[2]=0x81; kytu1[3]=0x81;
kytu1[4]=0x81; kytu1[5]=0x81; kytu1[6]=0x42; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
// Dau trang
case 4: { kytu1[0]=0x00; kytu1[1]=0x00; kytu1[2]=0x00; kytu1[3]=0x00;
kytu1[4]=0x00; kytu1[5]=0x00; kytu1[6]=0x00; kytu1[7]=0x00; kytu1[8]=0x00;
break; }
}
}
/* Ham quet led ma tran_ vua hien thi vua dich ky tu dan sang trai*/
void hienthi(void)
{
unsigned char n,m,lap;
unsigned char cot[8]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; // Cac
phan tu
quet cot
for(m=0; m<8 ; m++)// Dich hien thi
{
for(lap=0; lap<10; lap ++) // Lap hien thi
{
for(n=0; n<8 ; n++)// Quet cot
{
if((n+m)<9 )// Neu n+m < 9 hien thi ky tu 1
{
mahoa(k); // Nap cac gia tri ma hoa ky tu dua ra cac hang (Cong 2)
P0=cot[n]; // Day gia tri 0V ra cong 0 (cac cot)
P2=kytu1[n+m];// Day cac gia tri cac hang (ma hoa ky tu) ra cong 2(cac hang)
delay(45);// Tre du de led sang
}
if((n+m) > 7)// Neu n+m >7 hien thi ky tu 2
{
mahoa(k+1);// Nap gia tri ma hoa ky tu tiep de dua ra cac hang(Cong 2)
P0=cot[n];// Day gia tri logic 0V ra cong 0(cac cot)
P2=kytu1[n+m-8];// Day cac gia tri cac hang (ma hoa ky tu) ra cong 2(cac hang)
delay(45);// Tre du de led sang

DKS_GROUP - 118 -
}
P0=0xFF;// Day cac cot len cao
P2=0x00;// Dua cac hang xuong thap de tat toan bo cac led.
}
}
}
}
void main(void)
{
while(1)// Vong lap vo han.
{
hienthi(); // Hien thi 2 ky tu dau tien dau trang va chu M
k=k+1; // Tang k de hien thi chu M va chu T lan tiep
if(k==4) k=0;// Quay vong hien thi
}
}
Chú ý:
M ch led sáng u tuy nhiên sáng y u, do l p trên board chúng ta
không l p các linh ki n khuyêch i dòng v_ 'n dòng led sáng /p, u.
Khi l_m m ch các b n thêm các linh ki n khuyêch i ho*c 'n dòng èn
sáng u nh− ULN2003 ho*c ULN 2803 −a giá tr logic ra h_ng, dùng
transitor ho*c dùng luôn ULN quét c t.

DKS_GROUP - 119 -

You might also like