Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
1
CHƯƠNG 4: CÁC CHỨC NĂNG CỦA HỌ VI ĐIỀU KHIỂN
MCS-51
I. TIMER
1. Giới thiệu
- Một bộ đònh thời (timer) là một chuỗi các Flip Flop (FF) với mỗi FF là một mạch chia
2. Chuỗi này nhận một tín hiệu ngõ vào làm xung clock kích cho tầng đầu tiên, ngõ ra của tầng
đầu lại trở thành nguồn xung clock cho tầng kế tiếp. Ngõ ra của tầng cuối cùng làm xung clock
cho một FF báo tràn timer hay còn gọi là cờ tràn (overflow flag). Cờ tràn này sẽ được kiểm tra
bởi phần mềm hay tạo ra một ngắt (interrupt). Hình 4.1 minh họa một timer đơn giản 3-bit.
- Giá trò nhò phân trong các FF của timer được dùng để tính số xung clock (số chu kì) của
tín hiệu ngõ vào từ khi timer bắt đầu đếm.
Hình 4.1
- 8051/8031 có 2 timer 16 bit:
+ Timer 0: số đếm chứa trong thanh ghi TH0 (byte cao) và TL0 (byte thấp)
+ Timer 1: số đếm chứa trong thanh ghi TH1 (byte cao) và TL1 (byte thấp)
Ngoài ra, các chip 8032/8052 còn có thêm timer 2.
- Các timer chỉ đếm lên (0000H ÷ FFFFH). Khi số đếm tràn từ FFFFH xuống 0000H, cờ
tràn sẽ được đặt lên 1.
2. Các thanh ghi của timer:
a. Thanh ghi chế độ đònh thời (TMOD):
MSB LSB
Gate
T/C
M1 M0 Gate
T/C
M1 M0
Timer 1
Timer 0
- Không được đònh đòa chỉ bit.
- Được dùng để đònh chế độ hoạt động cho các timer.
- Chức năng từng bit:
+ M1, M0: chọn chế độ hoạt động.
M1 M0 Chế độ (Mode)
0 0 0
0 1 1
1 0 2
1 1 3
+
T/C
: bit chọn chức năng đếm hoặc đònh thời cho timer.
+ Gate: bit điều khiển cổng cho bộ đònh thời.
D/Q
Q
D/Q
Q
D/Q
Q
D /Q
Q
Flag
Clock
LSB MSB
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
2
b. Thanh ghi điều khiển đònh thời (TCON):
MSB LSB
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer
Interrupt
- Chứa các bit điều khiển và trạng thái của timer 0 và 1 ở 4 bit cao, 4 bit thấp được dùng
cho chức năng ngắt (interrupt).
- Được đònh đòa chỉ bit.
- Chức năng từng bit:
+ TFx: cờ tràn của timer x (x là 0 hay 1)
+ TRx = 0: không cho phép timer chạy.
TRx = 1: cho phép timer chạy.
3. Điều khiển các bộ đònh thời
Hình 4.2
-
T/C
(Counter/Timer):
+
T/C
= 0: timer nhận xung clock từ bộ dao động nội (sau khi qua bộ chia 12).
→ Ứng dụng: thường dùng cho việc đònh thời một khoảng thời gian (mỗi số đếm
tương ứng với 1 chu kỳ máy).
+
T/C
= 1: timer nhận xung clock từ chân Tx (P3.4 đối với timer 0 và P3.5 đối
với timer 1).
→ Ứng dụng: thường dùng để đếm sự kiện bên ngoài. Mỗi sự kiện tạo ra một
xung kích vào chân Tx (tích cực cạnh xuống). Số các sự kiện được xác đònh trong phần
mềm bằng cách đọc các thanh ghi đònh thời (THx/TLx), giá trò 16-bit trong các thanh ghi
này tăng theo mỗi sự kiện.
- Gate:
+ Gate = 0: việc điều khiển timer x chỉ phụ thuộc vào TRx.
TRx = 0: không cho phép timer x chạy.
TRx = 1: cho phép timer x chạy.
÷12
On-chip
Osc.
T/C
TRx
Gate
0: trên
1: dưới
0: trên
1: dưới
TLx THx TFx
Tx
INTx
8051
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
3
+ Gate = 1: việc điều khiển timer x phụ thuộc vào TRx và
xINT
.
TRx = 1 và
xINT
= 1: cho phép timer chạy.
→ Ứng dụng: thường dùng để đo độ rộng xung (thời gian xung ở mức cao) đưa
vào ở chân
xINT
. Độ rộng xung tương ứng với số đếm trong THx/TLx.
4. Các chế độ đònh thời
a. Chế độ 0
- Xác lập M1M0 = 00
- Là chế độ đònh thời 13-bit tương thích với bộ vi điều khiển 8048 trước đó. Chế độ này
thường ít dùng.
b. Chế độ 1
- Xác lập M1M0 = 01
- Là chế độ đònh thời 16-bit: số đếm 16-bit chứa trong cặp thanh ghi THx/TLx → khoảng
đếm tối đa là 65536 chu kì máy.
- Giá trò bắt đầu đếm được nạp vào THx và TLx. Khi timer tràn, để nạp lại giá trò bắt
đầu đếm cần phải dừng timer.
Ví dụ 1.1: Viết 1 đoạn chương trình khởi động timer 0 ở chế độ 1 và dùng timer 0 để tạo ra 1
xung mức cao rộng 1ms ở chân P1.0. Giả sử dùng thạch anh 12MHz.
Giải:
MOV TMOD,#00000001B ; khởi động timer 0 ở chế độ 1
CLR P1.0 ; xóa P1.0
MOV TH0,#HIGH(-1000) ; nạp byte cao của -1000 (FCH) vào TH0
MOV TL0,#LOW(-1000) ; nạp byte thấp của -1000 (18H) vào TL0
SETB TR0 ; cho timer 0 chạy
SETB P1.0 ; đặt P1.0 lên mức cao
JNB TF0,$ ; chờ cho đến khi timer tràn (TF0 = 1)
CLR P1.0 ; xóa P1.0
CLR TF0 ; xóa cờ tràn TF0 để dùng cho các lần sau
Ví dụ 1.2: Viết chương trình con tạo trễ 200ms dùng timer 1. Giả sử f
OSC
= 12MHz.
Giải:
f
OSC
= 12MHz → chu kỳ máy
s1
f
12
T
OSC
M
μ==
Nếu dùng timer 1 ở chế độ 1 thì thời gian đònh thời tối đa là 65536
μ
s < 200.000
μ
s =
200ms
→
phải dùng thêm vòng lặp ngoài. Để đơn giản, mỗi vòng lặp sẽ delay 50.000
μ
s
→
số
lần lặp là 4.
Chương trình:
DELAY_200MS:
MOV TMOD,#10H
MOV R7,#4
LOOP:
MOV TH1,#HIGH(-50000)
MOV TL1,#LOW(-50000)
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
DJNZ R7, LOOP
RET
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
4
Ví dụ 1.3: Viết chương trình dùng timer tạo sóng vuông đối xứng có tần số 1KHz trên chân
P1.0.
Giải:
f = 1KHz
→
chu kỳ
s1000s10
10
1
f
1
T
3
3
μ====
−
→
t
H
= t
L
= 500
μ
s
Tần số thạch anh:
f
OSC
= 12MHz
→
chu kỳ máy
s1
f
12
T
OSC
M
μ==
→
t
H
= t
L
= 500T
M
Chương trình: (sử dụng timer 0)
ORG 0
MOV TMOD,#01H
LOOP:
MOV TH0,#HIGH(-500)
MOV TL0,#LOW(-500)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
CPL P1.0
SJMP LOOP
END
c. Chế độ 2
- Xác lập M1M0 = 10
- Là chế độ đònh thời 8 bit tự động nạp lại.
+ TLx: bộ đếm 8 bit
→
khoảng đếm tối đa là 256 chu kì máy.
+ THx: lưu giá trò bắt đầu đếm được cài đặt.
- Mỗi khi timer tràn từ FFH xuống 00H, không chỉ cờ tràn được đặt lên 1 mà giá trò lưu
trong THx còn được tự động nạp vào cho TLx (không cần dừng timer) và việc đếm sẽ tiếp tục
từ giá trò này cho đến khi xảy ra lần tràn kế tiếp rồi lặp lại…
Ví dụ 1.4: Viết chương trình con delay 100
μ
s dùng timer. Giả sử f
OSC
= 12MHz.
Giải:
Do khoảng thời gian tạo trễ là 100
μ
s = 100 T
M
< 256
→
có thể dùng timer ở chế độ 2.
Chương trình:
DELAY_100US:
MOV TMOD,#02H ; khởi động timer 0 ở chế độ 2
MOV TH0,#-100 ; nạp giá trò bắt đầu đếm –100 vào TH0
MOV TL0,TH0
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
t
H
t
L
T
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
5
Lưu ý: thông thường lệnh khởi động chế độ timer được đặt trong chương trình chính.
Ví dụ 1.5: Viết chương trình dùng timer 1 để tạo sóng vuông đối xứng, tần số f = 10KHz tại
chân P1.7 (giả sử f
OSC
= 6MHz).
Giải:
f = 10KHz
→
chu kỳ
s100s10
10.10
1
f
1
T
4
3
μ====
−
→
t
H
= t
L
= 50
μ
s
Tần số thạch anh:
f
OSC
= 6MHz
→
chu kỳ máy
s2
f
12
T
OSC
M
μ==
→
t
H
= t
L
= 25T
M
Chương trình:
ORG 0
MOV TMOD,#20H
MOV TH1,#-25
SETB TR1
LOOP:
JNB TF1,$
CPL P1.7
CLR TF1
SJMP LOOP
END
4. Chế độ 3
- Xác lập M1M0 = 11
- Là chế độ tách timer: timer 0 16-bit được chia thành 2 timer 8-bit riêng lẽ TL0 và TH0
với cờ tràn tương ứng là TF0 và TF1 (TF1 lúc này không còn là cờ tràn của timer 1 nữa).
- Timer 1 không hoạt động ở chế độ 3 nhưng có thể được dùng trong các chế độ khác
(không sử dụng cờ tràn TF1).
Chú ý: Các kỹ thuật thường được dùng để tạo các khoảng thời gian đònh thời khác nhau
Khoảng thời gian (chu kỳ máy) Kỹ thuật
≈
10 Điều chỉnh phần mềm
256 Bộ đònh thời 8 bit tự động nạp lại
65536 Bộ đònh thời 16 bit
Không giới hạn Bộ đònh thời 16 bit + các vòng lặp
II. PORT NỐI TIẾP
1. Giới thiệu
- Chức năng cơ bản của port nối tiếp là chuyển đổi dữ liệu từ song song thành nối tiếp
khi phát và từ nối tiếp thành song song khi thu.
- Truy xuất port nối tiếp thông qua 2 chân:
+ RxD (P3.0): chân thu của port nối tiếp.
+ TxD (P3.1): chân phát của port nối tiếp.
- Có khả năng hoạt động song công (full duplex), tức là thu và phát đồng thời. Ngoài ra
port nối tiếp còn có chức năng đệm dữ liệu khi thu cho phép một ký tự được nhận và lưu giữ
trong bộ đệm thu trong khi ký tự tiếp theo được nhận vào. Nếu vi điều khiển đọc ký tự thứ nhất
trước khi ký tự thứ hai được thu đầy đủ, dữ liệu sẽ không bò mất.
- Các thanh ghi liên quan đến port nối tiếp:
+ SCON: chứa các bit trạng thái và các bit điều khiển port nối tiếp.
+ SBUF: là bộ đệm của port nối tiếp. Thực tế, port nối tiếp gồm 2 bộ đệm riêng
cho phát và thu.
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
6
- Tần số hoạt động của port nối tiếp, hay còn gọi là tốc độ baud (baud rate), có thể cố
đònh hoặc thay đổi. Khi dùng tốc độ baud thay đổi, timer 1 được lập trình để cung cấp xung
clock tốc độ baud phù hợp.
Hình 4.3
2. Thanh ghi điều khiển port nối tiếp SCON
MSB LSB
SM0 SM1 SM2 REN TB8 RB8 TI RI
- Đòa chỉ 99H.
- Đònh đòa chỉ bit.
- Chức năng các bit:
+ SM0, SM1: chọn chế độ hoạt động của port nối tiếp
SM0 SM1 Chế độ (Mode) Mô tả
0 0 0 Thanh ghi dòch
0 1 1 UART 8 bit tốc độ thay đổi
1 0 2 UART 9 bit tốc độ cố đònh
1 1 3 UART 9 bit tốc độ thay đổi
+ SM2: chọn chế độ hoạt động của port nối tiếp.
SM2 = 1: cho phép truyền thông đa xử lý ở các chế độ 2 và 3; bit RI sẽ
không được tích cực nếu bit thứ 9 nhận được là 0.
+ REN: bit cho phép thu.
REN = 1: cho phép thu.
REN = 0: không cho phép thu.
+ TB8: bit phát thứ 9 (ở chế độ 2 và 3), có thể đặt và xóa bằng phần mềm.
+ RB8: bit thu thứ 9 (ở chế độ 2 và 3), có thể đặt và xóa bằng phần mềm.
SBUF Q
(write-only)
CLK
D
Thanh ghi dòch
CLK
SBUF
(read-only)
TXD
(P3.1)
RXD
(P3.0)
Xung clock
tốc độ baud
(thu)
Xung clock
tốc độ baud
(phát)
Bus nội 8051
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
7
+ TI: cờ ngắt phát. Cờ này được đặt lên 1 bằng phần cứng khi phát xong 1 ký tự
(để báo bộ đệm phát đã rỗng), được xóa bằng phần mềm.
+ RI: cờ ngắt thu. Cờ này được đặt lên 1 bằng phần cứng khi thu xong 1 ký tự (để
báo bộ đệm thu đã đầy), được xóa bằng phần mềm.
3. Các chế độ hoạt động của port nối tiếp
a. Chế độ 0 (thanh ghi dòch 8 bit)
- Xác lập SM0 SM1 = 0 0
- Dữ liệu nối tiếp được thu/phát thông qua chân RxD.
- Chân TxD phát xung clock để dòch bit.
- Khi thu/phát dữ liệu 8 bit, bit LSB được thu/phát trước tiên.
- Tốc độ baud cố đònh và bằng 1/12 tốc độ dao động trên chip (f = f
M
= f
OSC
/12).
Một ứng dụng khả thi của chế độ 0 là mở rộng thêm các ngõ ra cho 8051. Một vi mạch
thanh ghi dòch nối tiếp-song song có thể được nối với các chân TxD và RxD của 8051 để cung
cấp thêm 8 đường xuất. Các thanh ghi dòch khác có thể ghép cascade với thanh ghi dòch đầu tiên
để mở rộng thêm nữa.
Hình 4.4
b. Chế độ 1 (UART 8 bit tốc độ baud thay đổi)
- Xác lập SM0 SM1 = 0 1
- Port nối tiếp hoạt động như một bộ thu/phát bất đồng bộ (universal asynchronous
receiver/transmitter) UART 8 bit có tốc độ baud thay đổi được.
- Truyền 10 bit:
1 bit Start + 8 bit data + 1 bit Stop
(luôn mức 0) (bit LSB trước) (luôn mức 1)
- Tốc độ baud = (tốc độ tràn của timer 1) / 32 (nếu bit SMOD = 0)
= (tốc độ tràn của timer 1) /16 ( nếu bit SMOD = 1)
* Khi phát:
- Trước tiên, dữ liệu được ghi vào SBUF (phát).
- Dữ liệu được dòch bit để xuất ra trên đường TxD sẽ bắt đầu bằng bit Start , tiếp theo là
8 bit dữ liệu với LSB phát trước và cuối cùng là bit Stop. Bit Start và Stop do phần cứng tự động
chèn vào. Thời gian của mỗi bit là nghòch đảo của tốc độ baud.
- Cờ ngắt TI sẽ được tự động đặt bằng 1 bởi phần cứng ngay khi bit Stop xuất hiện trên
đường TxD (tức là đã phát xong 1 ký tự dữ liệu) để báo bộ đệm phát đã rỗng.
* Khi thu:
- Việc thu được khởi động bởi sự chuyển trạng thái từ 1 xuống 0 trên đường RxD (bắt
đầu bit Start).
- Khi 1 bit Start hợp lệ được phát hiện, bit Start được bỏ qua và 8 bit dữ liệu được nhận
tuần tự vào thanh ghi dòch bit của port nối tiếp. Sau khi thu xong cả 8 bit, các điều sau sẽ xảy ra:
+ Bit thứ 9 (bit Stop) được đưa đến bit RB8 trong SCON.
8051
TXD (P3.1)
RXD (P3.0)
CLOCK
Data
Thanh ghi dòch
8 ngõ ra mở rộng
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
8
+ 8 bit data được nạp vào SBUF (thu).
+ Cờ ngắt thu RI được đặt lên 1 bởi phần cứng.
Tuy nhiên các điều trên chỉ xảy ra nếu tồn tại các điều kiện sau:
+ REN = 1
+ RI = 0 (báo bộ đệm thu chưa đầy).
+ SM2 = 0 hoặc SM2 = 1 và bit Stop nhận được bằng 1.
c. Chế độ 2 (UART 9 bit, tốc độ baud cố đònh)
- Xác lập SM0 SM1 = 1 0
- Port nối tiếp hoạt động ở chế độ UART 9 bit có tốc độ baud cố đònh.
- Truyền 11 bit:
1 bit Start + 8 bit data + bit data thứ 9 + 1 bit Stop
(luôn mức 0) (bit LSB trước) (lập trình được) (luôn mức 1)
- Tốc độ baud = f
OSC
/ 64 (nếu bit SMOD = 0)
hay f
OSC
/ 32 (nếu bit SMOD = 1)
- Khi phát, bit data thứ 9 là bit bất kỳ đặt ở TB8 trong thanh ghi SCON.
- Khi thu, bit data thứ 9 nhận được sẽ đặt vào RB8 trong thanh ghi SCON.
d. Chế độ 3 (UART 9 bit, tốc độ baud thay đổi được)
- Xác lập SM0 SM1 = 1 0
- Port nối tiếp hoạt động ở chế độ UART 9 bit có tốc độ baud thay đổi được, tương tự như
chế độ 2 nhưng tốc độ baud được lập trình và được cung cấp bởi timer 1.
- Tốc độ baud = (tốc độ tràn của timer 1) / 32 (nếu bit SMOD = 0)
= (tốc độ tràn của timer 1) / 16 (nếu bit SMOD = 1)
* Giải thuật chương trình con thu và phát một byte:
* Chương trình:
INCHAR: ; CT con thu 1 byte OUTCHAR: ; CT con phát 1 byte
JNB RI,$ JNB TI,$
CLR RI CLR TI
MOV A,SBUF MOV SBUF,A
RET RET
4. Tốc độ baud cho port nối tiếp
Ở chế độ 1 và 3, tốc độ baud cho port nối tiếp được lập trình bởi timer 1:
Tốc độ baud = (tốc độ tràn timer 1) / 32 (SMOD = 0)
/ 16 (SMOD = 1)
INCHAR
RI = 1 ?
Xóa cờ RI
Đọc SBUF
RET
OUTCHAR
TI = 1 ?
Xóa cờ TI
Ghi ra SBUF
RET
YY
NN