Tải bản đầy đủ (.pdf) (36 trang)

Bài giảng môn học VI điều KHIỂN

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (501.34 KB, 36 trang )

1

Bài Gỉang
Môn Học
VI ĐIỀU KHIỂN
TRƯỜNG ĐẠI HỌC KỸ THUẬT CÔNG NGHỆ TP HCM
KHOA ĐIỆN – ĐIỆN TỬ
Biên sọan : Th.S Trần Vĩnh An
Naêm 2008
2
Ký hiệu Đòa chỉ byte Đònh đòa chỉ bit Chức năng
TMOD 89h Không
Điều khiển chọn chế độ đònh thời / đếm
(Timer/Counter)
Bit Tên Timer Mô tả
7 GATE 1 Bit điều khiển (mở) cổng của Timer-1. Khi bit TR1 = 1 (trong TCON) và GATE =
1, Timer chỉ chạy khi chân INT1 = 1 (điều khiển cứng). Khi GATE=0, Timer chỉ
chạy khi TR1 = 1 (điều khiển mềm)
6 C / T 1 Bit chọn chế độ Counter/Timer (đếm sự kiện hay đònh thời) của Timer-1.
C/T = 1 : Đếm sự kiện (dùng xung clock nhận từ ngõ vào T1)
C/T = 0 : Đònh thời (dùng xung clock nội của hệ thống)
5 M1 x Bit-1 chọn chế độ của Timer-1 (Xem bảng dưới)
4 M0 x Bit-0 chọn chế độ của Timer-1 (Xem bảng dưới)
3 GATE 0 Bit điều khiển (mở) cổng của Timer-0. Khi bit TR0 = 1 (trong TCON) và GATE =
1, Timer chỉ chạy khi chân INT0 = 1 (điều khiển cứng). Khi GATE=0, Timer chỉ
chạy khi TR0 = 1 (điều khiển mềm)
2 C / T 0 Bit chọn chế độ Counter/Timer (đếm sự kiện hay đònh thời) của Timer-0.
C/T = 1 : Đếm sự kiện (dùng xung clock nhận từ ngõ vào T0)
C/T = 0 : Đònh thời (dùng xung clock nội của hệ thống)
1 M1 x Bit-1 chọn chế độ của Timer-0 (Xem bảng dưới)
0 M0 x Bit-0 chọn chế độ của Timer-0 (Xem bảng dưới)


M1 M0 CHẾ ĐỘ Mô tả
0 0 0
Chế độ đònh thời 13 bit (tương thích họ vi điều khiển 8048)
0 1 1
Chế độ đònh thời / đếm 16 bit
1 0 2
Chế độ đònh thời / đếm 8bit tự động nạp lại
1 1 3
Chế độ Timer tách ra :
Timer 0 : TL0 là Timer 8 bit được điều khiển bởi các bit của Timer 0.
TH0 tương tự nhưng được điều khiển bởi các bit của chế
độ Timer 1.
Timer 1 : Được ngừng lại.
Thanh ghi chế độ đònh thời TMOD
Bit 7 6 5 4 3 2 1 0
TMOD GATE C / T M1 M0 GATE C / T M1 M0
3
THANH GHI ĐIỀU KHIỂN TCON (Timer/Counter Control Register) :
Thanh ghi TCON chứa các bit trạng thái và các bit điều khiển của Timer-0 và Timer-1.
Thanh ghi TCON có đònh đòa chỉ bit.
-
4 bit cao (TF1, TR1, TF0, TR0) được dùng để điều khiển Timer hoạt động/hay ngưng (TR0,
TR1) hoặc để báo tràn (TF0, TF1)
-
4 bit thấp (IE1, IT1, IE0, IT0) không dùng để điều khiển mà được sử dụng để phát
hiện và khởi động các ngắt-ngoài.
Hoạt động của thanh ghi TCON được tóm tắt như sau :
Ký hiệu Đòa chỉ
byte
Đònh đòa chỉ

bit
Chức năng
TCON 88h Có
Điều khiển bộ đònh thời / đếm
Bit 7 6 5 4 3 2 1 0
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Bit Ký
hiệu
Đòa
chỉ bit
Mô tả
TCON.7 TF1
8FH
Cờ tràn Timer-1 được set bởi phần cứng ở sự tràn, được xóa bởi phần
mềm hoặc bởi phần cứng khi các vectơ xử lý đến thủ tục phục vụ ngắt
ISR
TCON.6 TR1
8EH
Bit điều khiển chạy Timer-1 được set hoặc xóa bởi phần mềm để chạy hoặc
ngưng chạy Timer.
TCON.5 TF0
8DH
Cờ tràn Timer 0(hoạt động tương tự TF1)
TCON.4 TR0
8CH
Bit điều khiển chạy Timer 0 (giống TR1)
TCON.3 IE1
8BH
Cờ ngắt ngoài 1 tác động cạnh xuống. Được set bỡi phần cứng khi phát
hiện có ngắt ngoài tác động cạnh xuống xuất hiện trên chân INT1; được

xóa bỡi phần cứng khi ngắt được xử lý.
TCON.2 IT1
8AH
Bit điều khiển chọn loại ngắt 1 ngoài. Được set/xóa để xác đònh ngắt ngoài
thuộc loại tác động cạnh xuống hay tác động mức thấp.
TCON.1 IE0
89H
Cờ ngắt ngoài 0 tác động cạnh xuống. Được set bỡi phần cứng khi phát
hiện có ngắt ngoài tác động cạnh xuống xuất hiện trên chân INT0; được
xóa bỡi phần cứng khi ngắt được xử lý.
TCON IT0
88H
Bit điều khiển chọn loại ngắt 0 ngoài. Được set/xóa để xác đònh ngắt ngoài
thuộc loại tác động cạnh xuống hay tác động mức thấp.
Tóm tắt thanh ghi điều khiển đònh thời / đếm TCON
4
TLx (8 bit) TFx
Xung
Clock
Cho bộ
đònh
thời
THx (8 bit)
TLx (8
bit)
THx (8
bit)
TFx
Xung
Clock

Cho bộ
đònh
thời
TLx (5
bit)
THx (8
bit)
TFx
Xung
Clock
Cho bộ
đònh
thời
Xung Clock
i
CÁC CHẾ ĐỘ ĐỊNH THỜI VÀ CỜ TRÀN :
1. Chế độ Timer-13 bit (Mode 0) :
Cờ tràn
Hình Chế độ 0
2. Chế độ Timer 16-bit (Mode 1) :
Cờ tràn
Hình : Chế độ 1
Chế độ 1 là Chế độ Timer 16-bit, tương tư như Cheat độ 0 ngoại trừ Timer này hoạt
động như một Timer đầy đủ 16 bit, xung clock được dùng với sự kết hợp các thanh ghi
cao và thấp (TLx,THx). Khi xung clock được nhận vào, bộ đếm Timer tăng lên 0000H,
0001H,0002H, . . ., và một sự tràn sẽ xuất hiện khi có sự chuyển trên bộ đếm Timer
từ FFFFH sang 0000H và sẽ set cờ tràn Timer (bit TFx trong thanh ghi TCON), sau đó Timer
đếm tiếp.
Bit có trọng số lớn nhất (MSB) của giá trò trong thanh ghi Timer là bit 7 của THx và bit có trọng
số thấp nhất (LSB) là bit 0 của TLx.

LSB
MSB
B0 B1 B2 B3 B4 B5 B6 B7 B0 B1 B2 B3 B4 B5 B6 B7
Thanh ghi TLx (8bit) Thanh ghi THx (8bit)
Bit LSB đổi trạng thái ở tần số clock vào được chia 2
16
= 65.536.
Các thanh ghi Timer TLx và Thx có thể được đọc hoặc ghi tại bất kỳ thời điểm nào bởi
phần mềm.
3. Chế độ tự động nạp 8- bit (Mode 2)
Cờ tràn
Nạp lại
Hình : Chế độ 2
5
Chế độ 2 là chế độ tự động nạp 8-bit, byte thấp TLx của Timer
hoạt động như một Timer 8-bit trong khi byte cao THx của Timer giữ giá trò
nạp lại (Reload). Khi bộ đếm tràn từ FFH sang 00H, không chỉ cờ tràn
được set mà giá trò trong THx cũng được nạp vào TLx : Bộ đếm được tiếp
tục từ giá trò này lên đến sự chuyển trạng thái từ FFH sang 00H kế tiếp
và cứ thế tiếp tục. Chế độ này khá tiện lợi do bỡi việc tràn bộ đònh
thời xảy ra ở những khoảng thời gian xác đònh và tuần hoàn một khi
các thanh ghi TMOD và THx đã được khởi động
TL1 (8
bit)
TH1 (8
bit)
TL0 (8
bit)
TH0 (8
bit)

TF0
Xung Clock
cho bộ
đònh thời
Xung Clock
cho bộ
đònh thời
Xung Clock
cho bộ
đònh thời
TF1
Cờ
tràn
Cờ
tràn
4. Chế độ tách Timer (Mode 3) :
Hình : Chế độ 3
Chế độ 3 là chế độ tách Timer và là sự khác biệt cho mỗi
Timer.
Timer-0 ở chế độ 3 được chia là 2 timer 8-bit. TL0 và TH0 hoạt
động như những Timer-8bit riêng lẻ với các cờ tràn tương ứng : TL0 gắn
với cờ tràn TF0, TH0 gắn với cờ tràn TF1.
Timer-1 bò dừng lại ở chế độ 3, nhưng có thể được khởi động
bởi việc ngắt nó vào một trong các chế độ khác (Do khuyết điểm là
cờ tràn TF1 của Timer-1 không bò ảnh hưởng vì cờ này đã được dùng
bỡi TH0). Khi Timer-0 ở chế độ-3, thì Timer-1 có thể hoạt động hoặc
ngưng bằng cách chuyển Timer-1 ra khỏi chế độ-3 hoặc vào chế độ-3.
Timer-1 có thể được sử dụng bỡi port nối tiếp (lúc này Timer-1 làm
nhiệm vụ của bộ tạo xung clock tốc độ baud) hoặc sử dụng theo một
cách nào đó nhưng không yêu cầu ngắt (vì Timer-1 không còn nối đến

TF1.
6
Ví dụ 1 : Tạo xung 250 KHz
Viết chương trình tạo dạng xung tuần hoàn trên chân P1.0 có tần
số cao có thể có được. Tần số và chu kỳ nhiệm vụ của xung là
bao nhiêu ?
Giải : Các khoảng thời gian rất ngắn (tức tần số cao) có thể
được lập trình mà không cần sử dụng đến các bộ Timer như sau :
ORG 8100h
Loop : SETB P1.0 ; 1 chu kỳ máy = 1µ s
CLR P1.0 ; 1 chu kỳ máy = 1µ s
SJMP Loop ; 2 chu kỳ máy = 2µ s
END
4µ s
v.v…
SETB
P1.0
SJMP Loop
CLR
P1.0
SETB
P1.0
1 chu kỳ
máy =
1µ s
Chân
P1.0
Chương trình trên tạo ra dạng xung trên chân P1.0, xung có chu
kỳ 4
µ

s : thời gian mức cao là 1
µ
s và thời gian mức thấp là
3
µ
s. Tần số của xung là : 1MHz /4 = 1000KHz/4 = 250 KHz và chu
kỳ nhiệm vụ là ¼ = 25%.
Bắt
đầu
lệnh
SETB
Kết
thúc
SETB,
bắt
đầu
CLR
Kết
thúc
CLR,
bắt
đầu
SJMP
Kết
thúc
SJMP,
bắt
đầu
SETB
7

Ví dụ 2 : Tạo sóng vuông 10 KHz
Viết chương trình tạo dạng sóng vuông 10KHz trên chân P1.0
bằng cách sử dụng bộ đònh thời 0
Giải :
Do fOSC = 12MHz nên chu kỳ máy = 1 μs.
Sóng vuông f = 10KHz yêu cầu chu kỳ máy T = 1/f = 1/10KHz =
1/10000Hz = 0.1ms =100
µ
s với thời gian mức cao là : 50
µ
s và thời gian
mức thấp là : 50
µ
s. Do khoảng thời gian này < 256
µ
s nên Chế độ 2
(chế độ tự nạp lại 8-bit) được sử dụng. Do Timer-0 đếm lên, nên một
tràn xảy ra sau mỗi 50
µ
s yêu cầu một giá trò số đếm nhỏ hơn
00h một lượng +50 phải được nạp và nạp lại cho TL0, nghóa là
giá trò nạp cho TH0 là : -50. Chương trình theo yêu cầu như sau :
ORG 8100h
MOV TMOD, #02h ; Timer-0 : Mode-2 (chế độ tự nạp lại
8-bit)
MOV TH0, #-50 ; TH0 chứa giá trò -50 (Do
Timer-0 đếm lên) SETB TRO ; Khởi động bộ
đònh thời, cho phép Timer-0 chạy
Loop : JNB TF0, Loop ; Nếu Timer-0 chưa tràn thì chờ
tràn

CLR TF0 ; Xóa cờ tràn
CPL P1.0 ; Đảo trạng thái bit P1.0 để tạo
xung vuông
SJMP Loop
END
0100000002h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
8
Ví du 3ï : Tạo sóng vuông 1KHz
Viết chương trình tạo sóng vuông 1KHz trên chân P1.0 sử dụng
bộ đònh thời 0.
Giải : Sóng vuông f = 1KHz yêu cầu chu kỳ T = 1/f = 1/1KHz =

1/1000Hz = 1000
µ
s với thời gian mức cao là : 500
µ
s và thời gian
mức thấp là : 500
µ
s. Do khoảng thời gian này > 256
µ
s nên không
thể sử dụng Chế độ-2 (chế độ tự nạp lại 8-bit) được, mà phải sử
dụng Chế độ-1 (chế độ đònh thời 16-bit). Sự khác nhau trong phần
mềm của 2 chế độ này là : ở Chế độ-1, do không có giá trò nạp
lại, nên các thanh ghi đònh thời TL0, TH0 phải được khởi động lại sau
mỗi lần tràn :
ORG 8100h
MOV TMOD, #01h
Batdau : MOV TH0, #0FEh ; Byte cao của -500
MOV TL0, #0Ch ; Byte thấp của -500
; Hoặc dùng cặp lệnh giả HIGH, LOW như sau :
; MOV TH0, #High(-500)
; MOV TL0, #Low(-500)
SETB TR0 ; Khởi động bộ đònh thời, cho
Timer-0 chạy
Wait : JNB TF0, Wait ; Nếu Timer chưa tràn
thì Chờ tràn
CLR TF0 ; Xóa cờ tràn
CPL P1.0 ; Đảo bit ngõ P1.0 để tạo
xung vuông
CLR TR0 ; Ngừng bộ đònh thời

SJMP Batdau ; lặp lại và nạp lại giá trò
cho TH0-TL0
END
1000000001h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
9
Vớ du 4ù : Taùo 2 soựng vuoõng 1KHz vaứ 10KHz
Vit chng trỡnh to : xung vuụng tn s f = 10KHz ti P1.0 dựng timer 0 v
xung vuụng tn s f = 1 KHz ti P1.1 dựng timer 1.
Giaỷi :
Phõn tớch cho cỏc thanh ghi ging nh cỏc phn vớ d nờu trờn, nhng lu ý rng quỏ trỡnh
kim tra timer trn s khỏc: thc hin kim tra timer 0, nu cha trn thỡ kim tra timer 1 v kim tra

tng t cho timer 1.
MOV TMOD, #12h ; Timer-1 : Mode-1, Timer-0 : Mode-2
MOV TH1, #High(-500) ; P1.1 = Timer-1 = 1000à s
MOV TL1, #Low(-500) ; Xung vuụng = 500à s + 500à s
MOV TH0, #(-50) ; P1.0 = Timer-0 = 100à s
MOV TL0, #(-50) ; Xung vuụng = 50à s + 50à s
SETB TR0
SETB TR1
KtrT0: JNB TF0, KtrT1
CLR TF0
CPL P1.0
KtrT1: JNB TF1, KtrT0
CLR TF1
CPL P1.1
MOV TH1, #High(-500)
MOV TL1, #Low(-500)
SJMP KtrT0
END
Lu ý, xung vuụng to bng cỏch nh trờn cú th khụng chớnh xỏc khi 2 timer trn cựng lỳc.
0100100012h
M
0
M
1
C/
T
GA
TE
M
0

M
1
C/
T
GA
TE
TM
OD
01234567Bit
Timer-0
= 100à s
Timer-1
= 1000à s
Khi cú c TF0 thỡ
: Kim tra c TF1
10
Ví dụ 5 : Tạo sóng vuông 1Hz
Viết chương trình tạo xung vng tần số f = 1Hz tại P1.2 dùng timer 1
Giải :
f = 1 Hz → T = 1/f = 1 s = 1.000.000 μs → một chu kỳ sóng vng chiếm khoảng
thời gian 500.000 chu kỳ máy → thời gian trì hỗn cần thiết là 500.000 chu kỳ máy.
Giá trị đếm là 500.000, vượt q khả năng của timer (tối đa chỉ đếm được 65.536
chu kỳ) nên phải thực hiện tạo vòng lặp đếm nhiều lần cho đến khi đạt đến giá trị
500.000 (có thể đếm mỗi lần 50.000 và thực hiện vòng lặp 10 lần).
Chương trình thực hiện như sau:
MOV TMOD,#10h ; Mode-1
Batdau:
MOV R7,#10 ; Lặp 10 lần
Lap:
MOV TH1, #High(-50000)

MOV TL1, #Low(-50000)
SETB TR1
KtrT1:
JNB TF1,KtrT1
CLR TF1
CLR TR0
DJNZ R7,Lap ; Giảm R7 đi 1 và Nếu R7 ≠ 0 thì lặp lại
CPL P1.2 ; Đảo bit để tạo xung
SJMP Batdau
END
0000100010h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit

11
Ví dụ 6 : Giao tiếp với mạch còi (Buzzer) và công tắc SW
Một còi được nối với chân P1.7 và một công tắc chống dội SW được nối đến
chân P1.6. Viết chương trình đọc mức logic cung cấp bỡi công tắc SW và hụ còi
trong thời gian 1sec sau mỗi lần phát hiện sự chuyển trạng thái từ 1 xuống 0 ở
chân P1.6.
Giải :
TrămLần EQU 100
Count EQU 10000 ; 100 x 10000µ s = 1sec
ORG 8100h
MOV TMOD, #01h ; Timer-0 : Mode-1
Loop : JNB P1.6, Loop ; chờ logic 1 ở ngõ vào SW : P1.6
Wait : JB P1.6, Wait ; chờ logic 0 ở ngõ vào SW : P1.6
SETB P1.7 ; cho còi hụ ở chân P1.7
CALL Delay1s ; kéo dài 1sec
CLR P1.7 ; tắt còi
SJMP Loop
;
Delay1s: MOV R7, #TrămLần
Lap : MOV TH0, #HIGH Count
MOV TL0, #LOW Count
SETB TR0
Wait2: JNB TF0, Wait2
CLR TF0
CLR TR0
DJNZ R7, Lap
RET
END
1000000001h
M

0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
12
Vớ duù 7 : Vit chng trỡnh con to thi gian trỡ hoón 1sec dựng timer 0.
Giaỷi :
Do chng trỡnh yờu cu to thi gian trỡ hoón nờn s chu k m l 1.000.000à s
Chng trỡnh nh sau:
MOV TMOD,#01h ; Timer-0 : Mode-1 (16bit)
; Chng trỡnh chớnh
;
;
Delay1s:
MOV R7,#20 ; Lp 20 ln
Lap:

MOV TH0, #High(-50000) ; Mi ln trỡ hoón 50.000 s
MOV TL0, #Low(-50000)
SETB TR0
Lap1:
JNB TF0, Lap1
CLR TF0
CLR TR0
DJNZ R7, Lap ; Lp 20 ln thỡ thoỏt
RET
END
Lu ý rng : khi vit chng trỡnh trỡ hoón nh trờn thỡ chng trỡnh ca AT89C51
xem nh dng li, khụng lm gỡ c (cú th gii quyt bng cỏch s dng ngt).
1000000001h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM

OD
01234567Bit
13
Ví duï 8 : Xét sơ đồ kết nối Dãy Led đơn như sau : P0.0 →LED0, ….,
P0.7→LED7.
Viết chương trình điều khiển Led sáng từ trái sang phải, mỗi lần 1 Led.
Giaûi : Các Led nối với Port 0 của AT89C51 (P0 khi dùng như các cổng nhập / xuất thì cần phải có
điện trở kéo lên nguồn) nên muốn Led sáng (LED tác động ở mức thấp) thì phải gởi dữ liệu ra P0.
Theo sơ đồ mạch, Led sang khi các bit tương ứng tại P0 là 0.
Yêu cầu điều khiển Led sang từ trái sang phải (lần lượt từ P0.0 đến P0.7) nên dữ liệu gởi ra là:
- Lần 1: 1111 1110b (0FEh) – sáng 1 Led trái - Lần 2: 1111 1101b (0FDh) - Lần 3: 1111 1011b (0FBh)
- Lần 4: 1111 0111b (0F7h) - Lần 5: 1110 1111b (0EFh) - Lần 6: 1101 1111b (0DFh)
- Lần 7: 1011 1111b (0BFh) - Lần 8: 0111 1111b (7Fh) - Lần 9: quay lại như lần 1
MOV DPTR, #MaLed ; DPTR chứa vị trí bảng mã Led
Main:
MOV R7, #0 ; Phần tử đầu tiên của bảng mã
Loop:
MOV A, R7
MOVC A, @A+DPTR ; Đọc bảng mã
MOV P0, A ; Chuyển vào P0 để sáng Led
CALL Delay ; Chờ để mắt người có thể thấy
INC R7 ; Chuyển qua trạng thái kế
CJNE R7,#8, Loop ; Đã hết bảng mã thì lặp lại
SJMP main
MaLed: DB 0FEh, 0FDh, 0FBh, 0F7h, 0EFh, 0DFh, 0BFh, 7Fh
Delay:
MOV TMOD,#01h ; Timer-0 : Mode-1 (16bit)
MOV TH0,#HIGH(-50000) ; Chờ 50 ms = 50.000µ s
MOV TL0,#LOW(-50000)
SETB TR0

JNB TF0,$
CLR TF0
CLR TR0
RET
END
1000000001h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
14
Ví dụ 9 : Viết chương trình điều khiển 8 LED đơn sáng lần lượt
Sáng từ Led 8 → Led 1
Giải :
ORG 0000H

MOV TMOD, #01 ; Timer 0 : Mode 1
Lap:MOV R0,# 0
LEDke: MOV A, R0
MOV DPTR, #bangled
MOVC A, @A + DPTR
MOV P1, A
CALL Delay
INC R0
CJNE R0, #8,LEDke
JMP lap
Delay: ; TẠO TRỄ 1 ms DÙNG TIMER 0
MOV TH0, #High (-1000)
MOV TL0, #Low (-1000)
SETB TR0
JNB TF0,$ ; chờ cờ nếu TF0 = 1
; thì dừng lại
CLR TF0 ; xóa cờ TF0
RET
Bangled: DB 01h, 02h, 04h, 08h, 10h, 20h, 80h
END
R 2 4 2 2 0
D 2 L E D 7
D 8 L E D 1
R 2 1 2 2 0
R 1 9 2 2 0
D 3 L E D 6
J P 8
L E D
1
2

3
4
5
6
7
8
R 2 5 2 2 0
D 5 L E D 4R 2 2 2 2 0
D 6 L E D 3
D 7 L E D 2
R 2 0 2 2 0
R 2 3 2 2 0
D 4 L E D 5
D 1 L E D 8R 1 8 2 2 0
P1

89C51
Chương trình delay có
thể viết bằng cách
giảm giá trò của 1
thanh ghi nào đó.
DELAY:
MOV R7,#4
D2: MOV
R6,#250
D1: MOV
R5,#250
DJNZ R5,$
DJNZ R6,D1
DJNZ R7,D2

RET
15
Vớ duù 10 : Xột s kt ni LED 7-an Anode chung. Port P0 ni n cỏc an, chõn
P1.0 LED1, P1.1LED0. Cỏc LED tớch cc mc 1. Vit chng trỡnh hin th s 0 ra Led1 v
s 1 ra Led2.
Giaỷi :Theo s kt ni, chõn g ca Led ni vi P0.6, chõn a ni vi P0.0 nờn bng mó Led
l bng 4.2, d liu cho s 0 v 1 ln lt l 0C0h v 0F9h. Phng phỏp s dng l phng phỏp
quột nờn cn phi cú thi gian trỡ hoón gia 2 ln quột, thi gian ny c thc hin thụng qua timer
(thi gian trỡ hoón khong 200 s). Chng trỡnh thc hin nh sau:
MOV P1,#0 ; Xoỏ P1 tt Led
Main:
MOV P0, #0C0h ; Mó s 0 gi ra port0 cho cỏc cathode
SETB P1.0 ; Sỏng Led1
CALL Delay200à s ; Thi gian trỡ hoón thy Led1 sỏng
CLR P1.0 ; Tt Led1
MOV P0, #0F9h ; Mó s 1 gi ra port0 cho cỏc cathode
SETB P1.1 ; Sỏng Led2
CALL Delay200 à s ; Thi gian trỡ hoón thy Led2 sỏng
CLR P1.1 ; Tt Led2
SJMP main
;
Delay200à s:
MOV TMOD, #01h
MOV TH0, #(-200)
MOV TL0, #(-200)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET

END
1000000001h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
16
Bảng mã cho Led Anode chung (a là LSB, dp là MSB):
Số dp g f e d c b a Mã hex
0 1 1 0 0 0 0 0 0 0C0h
1 1 1 1 1 1 0 0 1 0F9h
2 1 0 1 0 0 1 0 0 0A4h
3 1 0 1 1 0 0 0 0 0B0h
4 1 0 0 1 1 0 0 1 99h
5 1 0 0 1 0 0 1 0 92h

6 1 0 0 0 0 0 1 0 82h
7 1 1 1 1 1 0 0 0 0F8h
8 1 0 0 0 0 0 0 0 80h
9 1 0 0 1 0 0 0 0 90h
17
Ví duï 10B : Viết lại chương trình hiển thị số “0” ra Led1 và số “1” ra Led2 như trên nhưng
sử dụng ngắt của Timer
Giaûi : Đối với chương trình trong ví dụ kế trên, khi đang thực hiện quét led thì
chương trình không làm gì cả trong khi đó, các ứng dụng thực tế thường xử lý các công
việc khác đồng thời với quá trình quét. Vấn đề này có thể giải quyết bằng cách sử dụng
ngắt của timer: mỗi khi timer tràn thì thực hiện hiển thị trên 1 Led. Chương trình như
sau:
Led1 EQU 30h ; Địa chỉ chứa dữ liệu của Led1
Led2 EQU 31h ; Địa chỉ chứa dữ liệu của Led2
Led_Pos EQU 32h ; Vị trí Led hiện hành
ORG 0000h
LJMP main
ORG 000Bh ; Địa chỉ ISR của timer 0
LJMP Timer0_ISR
Main:
SETB EA ; Cho phép ngắt tại timer 0
SETB ET0
MOV Led1,#0C0h ; Số 0
MOV Led2,#0F9h ; Số 1
MOV Led_Pos,#01h ; Vị trí sáng đầu tiên là Led1
MOV R0,#Led1 ; Dữ liệu gởi ra đầu tiên là ở Led1
MOV TMOD,#01h
MOV TH0,#(-200)
MOV TL0,#(-200)
SETB TR0

SJMP $ ; Không làm gì cả, trong thực tế
; có thể thêm chương trình vào
1000000001h
M
0
M
1
C/
T
GA
TE
M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
18
;
Timer0_ISR:
MOV A,Led_Pos ; Xác định vị trí Led hiện hành
MOV P1,A ; Sáng Led hiện hành
RL A ; Dịch trái để chuyển qua Led kế
MOV Led_Pos,A ; trong qua trình tràn tiếp theo
MOV A,@R0 ; Đọc dữ liệu hiện hành

MOV P0,A
INC R0 ; Chuyển qua dữ liệu kế
CJNE R0,#Led_Pos,exitTimer0 ; Nếu đã quét hết toàn bộ
MOV Led_Pos,#01h ; Led thì bắt đầu lại từ Led1
MOV R0,#Led1
exitTimer0:
RETI
END
19
Ví duï 11 : Viết chương trình hiển thị nội dung trong ô nhớ 30h ra 2 Led trong đó
Led1 chứa số hàng chục và Led2 chứa số hàng đơn vị (giả sử giá trị trong ô nhớ
30h tối đa là 99).
Giaûi : Để xuất nội dung trong ô nhớ 30h ra Led 7 đoạn cần thực hiện :
- Chuyển nội dung trong ô nhớ 30h thành số hàng chục và hàng đơn vị (thực hiện
chia cho 10).
- Chuyển giá trị số thành mã Led 7 đoạn (bằng cách tra bảng).
Chương trình thực hiện như sau:
Led1 EQU 30h ; Địa chỉ chứa dữ liệu của Led1
Led2 EQU 31h ; Địa chỉ chứa dữ liệu của Led2
Led_Pos EQU 32h ; Vị trí Led hiện hành
ORG 0000h
LJMP main
ORG 000Bh ; Địa chỉ ISR của timer 0
LJMP Timer0_ISR
Main:
SETB EA ; Cho phép ngắt tại timer 0
SETB ET0
MOV Led_Pos,#01h ; Vị trí sáng đầu tiên là Led1
MOV R0,#Led1 ; Dữ liệu gởi ra đầu tiên là ở Led1
MOV TMOD,#01h

MOV TH0,#(-200)
MOV TL0,#(-200)
SETB TR0
20
Begin:
MOV A,30h
CALL Chuyenma
SJMP Begin
;
Chuyenma:
MOV B,#10 ; Chia cho 10: A chứa số hàng chục,
DIV AB ; B chứa số hàng đơn vị
CALL BCDtoLed7 ; Chuyển sang mã Led 7 đoạn
MOV Led1,A ; Đưa vào ô nhớ 31h (Led1)
MOV A,B ; Chuyển sang mã Led 7 đoạn của
CALL BCDtoLed7 ; số hàng đơn vị
MOV Led2,A
RET
;
BCDtoLed7:
MOV DPTR,#MaLed7
MOVC A,@A+DPTR
RET
MaLed7: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h
;
Timer0_ISR:
PUSH ACC
MOV A,Led_Pos ; Xác định vị trí Led hiện hành
MOV P1,A ; Sáng Led hiện hành
RL A ; Dịch trái để chuyển qua Led kế

MOV Led_Pos,A ; trong qua trình tràn tiếp theo
MOV A,@R0 ; Đọc dữ liệu hiện hành
MOV P0,A
INC R0 ; Chuyển qua dữ liệu kế
CJNE R0,#Led_Pos,exitTimer0 ; Nếu đã quét hết toàn bộ
MOV Led_Pos,#01h ; Led thì bắt đầu lại từ Led1
MOV R0,#Led1
exitTimer0:
POP ACC
RETI
END
21
Ví duï 12 : Xét sơ đồ kết nối ma trận Led (5x7) như sau : Port P0 → Hàng và Port
P1→ Cột).
Viết chương trình sáng số “0” trên ma trận Led.
Giaûi :
main:
MOV R0,#0
lap: MOV A,R0
MOV DPTR,#cot
MOVC A,@A+DPTR ; Xuất cột
MOV P1,A
MOV A,R0
MOV DPTR,#hang
MOVC A,@A+DPTR
MOV P0,A ; Xuất hàng
CALL delay ; Tạo thời gian trì hoãn để thấy
INC R0 ; Chuyển sang cột kế
CJNE R0,#5,lap ; Nếu quét đủ 5 cột thì lặp lại
SJMP main

;
delay:
MOV TMOD,#01h
MOV TL0,#LOW(-500)
MOV TH0,#HIGH(-500)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
;
cot: DB 01h,02h,04h,08h,10h
hang: DB 41h,3Eh,3Eh,3Eh,41h
END
22
Ví duï 13 : Xét sơ đồ kết nối động cơ.Viết chương trình điều khiển động cơ quay thuận mỗi
lần một bước với tốc độ 50 vòng/phút (giả sử động cơ có góc quay là 7.2
0
/bước).
P2.0→Cuộn 1-2, P2.1→Cuộn 2-3, P2.2→Cuộn 4-5, P2.3→Cuộn 5-6
Giaûi : Góc quay 7.2
0
/bước → 1 vòng quay cần 360
0
/7.2
0
= 50 bước → 50 vòng quay cần
thực hiện 2500 bước. Tốc độ 50 vòng / phút → 1 phút (3600s) thực hiện 2500 bước → mỗi bước cần
3600/2500 = 1,44sec = 1.440.000 μs. Thứ tự kích xung cho như bảng.
main:

MOV R0,#0
MOV DPTR,#thuan1buoc
begin: MOV A,R0
MOVC A,@A+DPTR
MOV P2,A ; Xuất ra P2 để điều khiển động cơ
CALL Delay144
INC R0
CJNE R0,#4,begin
SJMP main
Delay144:
MOV TMOD,#01h
MOV R7,#40
Delay1: MOV TH0, #High(-36000) ; Thời gian chờ = 40 * 36,000
MOV TL0, #Low(-36000) ; = 1,440,000μs = 1.44s
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R7,Delay1
RET
thuan1buoc: DB 08h,04h,02h,01h
END
M
0
M
1
C/
T
GA
TE

M
0
M
1
C/
T
GA
TE
TM
OD
01234567Bit
23
Điều khiển động cơ bước
Động cơ bước là động cơ cho phép dịch chuyển mỗi lần một bước hay nửa bước tuỳ theo
xung điều khiển. Góc quay của mỗi bước tuỳ theo loại động cơ, thường là 1.8
0
/bước hay 7.2
0
/bước.
Động cơ bước gồm 4 cuộn dây: 1-2, 2-3, 4-5 và 5-6 như sơ đồ đã vẽ trong phần lý thuyết :
Xung điều khiển động cơ như sau:
Bảng điều khiển một bước
Ngược Thuận
1 2 3 4 1 2 3 4
1 0 0 0 1 0 0 0
0 1 0 0 = 04h 0 0 0 1 = 01h
0 0 1 0 = 02h 0 0 1 0 = 02h
0 0 0 1 = 01h 0 1 0 0 = 04h
1 0 0 0 = 08h 1 0 0 0 = 08h
Bảng điều khiển nửa bước

Ngược Thuận
1 2 3 4 1 2 3 4
1 0 0 1 1 0 0 1
1 0 0 0 = 08h 0 0 0 1 = 01h
1 1 0 0 = 0Ch 0 0 1 1 = 03h
0 1 0 0 = 04h 0 0 1 0 = 02h
0 1 1 0 = 06h 0 1 1 0 = 06h
0 0 1 0 = 02h 0 1 0 0 = 04h
0 0 1 1 = 03h 1 1 0 0 = 0Ch
0 0 0 1 = 01h 1 0 0 0 = 08h
1 0 0 1 = 09h 1 0 0 1 = 09h
24
89C51
RAM, ROM
8255A PPI
A1,A0
PORT A
PORT B
PORT C
Giải

Led 7
đoạn
Điều
khiển
động cơ
Led, Relay, loa
A
d
d

r
e
s
s

B
u
s
D
a
t
a

B
u
s
Sơ đồ khối hệ thống
25
P 2 . 0
C 3
1 0 u
D 5
+ 5 V
A 1
X 1
1 2 M H z
D 1
P 2 . 4
D 4
D 0

D 3
W R
P 1 . 4
D 0
D 2
A 5
P 2 . 1
U 1 2
7 4 L S 2 4 5
2
3
4
5
6
7
8
9
1 9
1
1 8
1 7
1 6
1 5
1 4
1 3
1 2
1 1
A 1
A 2
A 3

A 4
A 5
A 6
A 7
A 8
G
D I R
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
U 2
7 4 A L S 5 7 3
2
3
4
5
6
7
8
9
1 1
1
1 9
1 8
1 7

1 6
1 5
1 4
1 3
1 2
D 1
D 2
D 3
D 4
D 5
D 6
D 7
D 8
C
O C
Q 1
Q 2
Q 3
Q 4
Q 5
Q 6
Q 7
Q 8
P 0 . 2
P 0 . 4
A 8
P 2 . 6
A 3
D 1
R S T

P 2 . 6
R D
P 0 . 5
P 1 . 2
P 1 . 5
P 0 . 3
A 1 0
P 1 . 6
R X D
A 1 1
A 6
P 0 . 1
R D
D 7
P 0 . 7
A 1 5
P 2 . 2
P 0 . 4
P 1 . 3
A 9
I N T 0
A D D R E S S B U S
D 6
T X D
D 5
P 2 . 5
P 0 . 2
P 0 . 6
A 2
T 1

P 2 . 2
C 2
3 3 p
P 2 . 4
A 0
P 2 . 0
D 3
D 6
R U N
P R O G R A M M E R
A 7
S W 1
R E S E T S W
U 1 9
7 4 L S 2 4 5
2
3
4
5
6
7
8
9
1 9
1
1 8
1 7
1 6
1 5
1 4

1 3
1 2
1 1
A 1
A 2
A 3
A 4
A 5
A 6
A 7
A 8
G
D I R
B 1
B 2
B 3
B 4
B 5
B 6
B 7
B 8
P 1 . 0
P 1 . 7
C 1
3 3 p
P 2 . 7
R 3
8 . 2 K
P 0 . 5
I N T E R N A L

E X T E R N A L
A 1 2
D A T A B U S
P 0 . 0
P 0 . 7
P 2 . 5
P 0 . 1
P 2 . 1
P 0 . 0
A 1 4
P 2 . 7
D 4
R 2
1 0 0
P S E N
+ 5 V
A 1 3
P 2 . 3
U 2 4
8 0 C 5 1
3 1
1 9
1 8
9
1 2
1 3
1 4
1 5
1
2

3
4
5
6
7
8
3 9
3 8
3 7
3 6
3 5
3 4
3 3
3 2
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
1 7
1 6
2 9
3 0
1 1
1 0
E A / V P
X 1

X 2
R E S E T
I N T 0
I N T 1
T 0
T 1
P 1 . 0
P 1 . 1
P 1 . 2
P 1 . 3
P 1 . 4
P 1 . 5
P 1 . 6
P 1 . 7
P 0 . 0
P 0 . 1
P 0 . 2
P 0 . 3
P 0 . 4
P 0 . 5
P 0 . 6
P 0 . 7
P 2 . 0
P 2 . 1
P 2 . 2
P 2 . 3
P 2 . 4
P 2 . 5
P 2 . 6
P 2 . 7

R D
W R
P S E N
A L E / P
T X D
R X D
A 4
P 1 . 1
+ 5 V
P 2 . 3
T 0
S W 2
D 7
I N T 1
P 0 . 3
D 2
P 0 . 6
S W 3
Sơ đồ mạch của khối xử lý trung tâm
A D D R E S S B U S
A 1 3
C S 8
U 5
7 4 L S 1 3 8
1
2
3
6
4
5

1 5
1 4
1 3
1 2
1 1
1 0
9
7
A
B
C
G 1
G 2 A
G 2 B
Y 0
Y 1
Y 2
Y 3
Y 4
Y 5
Y 6
Y 7
C S 6
C S 5
A L E
C S 2
A 1 4
C S 1
C S 3
C S 7

A 1 5
C S 4
A15 A14 A13…… A3 A2 A1 A0
Đòa chỉ 000xxxxxxxxx = 0000h – 1FFFh
: CS1
001xxxxxxxxx = 2000h – 3FFFh
: CS2
010xxxxxxxxx = 4000h – 5FFFh
: CS3
011xxxxxxxxx = 6000h – 7FFFh
: CS4
100xxxxxxxxx = 8000h – 9FFFh : CS5
101xxxxxxxxx = A000h – BFFFh
: CS6
110xxxxxxxxx = C000h – DFFFh
: CS7
111xxxxxxxxx = E000h –
FFFFh : CS8
Chọn chế độ bộ
nhớ nội/ngòai
Reset hệ
thống
Thực thi chương
trình
Nạp chương trình từ
PC cho RAM ngòai
2 IC đệm 74LS245 : ngắt hệ 89C51
ra khỏi bus khi đang thực hiện đổ
chương trình từ PC vào RAM
74ALS573 (U2): thực hiện

chốt đòa chỉ cho hệ thống
thông qua chân ALE

×