Tài liệu Vi xử lý - Chương 4: Các chức năng của họ vi điều khiển mcs-51: 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 c...
20 trang |
Chia sẻ: tranhong10 | Lượt xem: 5281 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Vi xử lý - Chương 4: Các chức năng của họ vi điều khiển mcs-51, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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ử fOSC = 12MHz.
Giải:
fOSC = 12MHz → chu kỳ máy s1f
12T
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
1T 33 μ==== − → tH = tL = 500μs
Tần số thạch anh:
fOSC = 12MHz → chu kỳ máy s1f
12T
OSC
M μ== → tH = tL = 500TM
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ử fOSC = 12MHz.
Giải:
Do khoảng thời gian tạo trễ là 100 μs = 100 TM < 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
tH tL
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ử fOSC = 6MHz).
Giải:
f = 10KHz → chu kỳ s100s10
10.10
1
f
1T 43 μ==== − → tH = tL = 50μs
Tần số thạch anh:
fOSC = 6MHz → chu kỳ máy s2
f
12T
OSC
M μ== → tH = tL = 25TM
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 = fM = fOSC /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 = fOSC / 64 (nếu bit SMOD = 0)
hay fOSC / 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
Y Y
NN
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
9
→ tốc độ tràn timer 1 (ftràn) = tốc độ baud x 32 (hay x16)
→ thời gian tràn timer 1 (Ttràn) = 1 / (tốc độ tràn timer 1)
tràn
M
M
tràn
f
f
T
T
1 timer cho nạp cần Số ==
Ví dụ: Viết 1 đoạn chương trình tạo tốc độ baud 2400 (với fOSC = 12MHz, SMOD = 0)
ftràn timer 1 = 2400 x 32 = 76800 Hz → Ttràn timer 1 = 1/76800 = 13,021μs
fOSC = 12MHz → TM = 1μs
→ Thời gian tràn timer 1 = 13,021/1 ≈ 13μs
→ sai số: (13,021 – 13)/13 = 0,16%
MOV TMOD,#00100000B ; khởi động timer 1 ở mode 2
MOV TH1,#-13 ; thời gian tràn là 13TM
SETB TR1
Ví dụ: Tạo tốc độ baud 9600 (với fOSC = 12MHz, SMOD = 0)
3≈=×== 3,255329600
12MHz/12
f
f
1 timer cho nạp cần Số
tràn
M
→ sai số: (3,255 – 3) / 3 = 8,5% : khá lớn.
Ví dụ: Tạo tốc độ baud 1200 (với fOSC = 12MHz, SMOD = 0)
2626,042
321200
12MHz/12
f
f
1 timer cho nạp cần Số
tràn
M ≈=×==
→ sai số: (26,042 – 26) / 26 = 0,16%
Bảng tóm tắt một số tốc độ baud
Tốc độ baud Tần số
thạch anh
SMOD Giá trị nạp
cho TH1
Tốc độ baud
thực tế
Sai số
9600 12,000MHz 1 -7 (F9H) 8923 7%
2400 12,000MHz 0 -13 (F3H) 2404 0,16%
1200 12,000MHz 0 -26 (E6H) 1202 0,16%
19200 11,059MHz 0 -3 (FDH) 19200 0
9600 11,059MHz 0 -3 (FDH) 9600 0
2400 11,059MHz 0 -12 (F4H) 2400 0
1200 11,059MHz 0 -24 (E8H) 1200 0
→ Cần truyền với tốc độ chính xác thì sử dụng thạch anh 11,059MHz.
5. Các ví dụ
Ví dụ 2.1: Viết chương trình phát 1 chuỗi mã ASCII kết thúc bằng ký tự null (có mã ASCII là
00H) ra port nối tiếp (không gởi ký tự null). Biết rằng chuỗi mã ASCII nằm trong RAM ngoài
bắt đầu tại địa chỉ 2000H. Giả sử truyền UART 8 bit, tốc độ baud 2400, fOSC = 12MHz.
Giải:
ORG 0
; khởi động port nối tiếp
MOV SCON,#01010010B ; port nối tiếp ở mode 1
MOV TMOD,#20H ; timer 1 ở mode 2
MOV TH1,#-13 ; tốc độ baud = 2400
SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
10
; phát chuỗi mã ASCII
MOV DPTR,#2000H ; trỏ đến địa chỉ RAM ngoài 2000H
LOOP:
MOVX A,@DPTR ; lấy nội dung ô nhớ RAM ngoài vào A
CJNE A,#00H,CONT ; kiểm tra xem có phải ký tự null không
SJMP EXIT ; nếu đúng, kết thúc chương trình
CONT: ; nếu không, phát ký tự đó
ACALL OUTCHAR ; gọi chương trình con OUTCHAR
INC DPTR ; tăng nội dung con trỏ
SJMP LOOP ; lặp lại việc phát ký tự
; chương trình con OUTCHAR phát 1 byte dữ liệu (1 ký tự)
OUTCHAR:
JNB TI,$ ; chờ cờ TI bằng 1 báo bộ đệm phát rỗng
CLR TI ; xóa cờ TI
MOV SBUF,A ; chuyển nội dung thanh ghi A ra SBUF
RET
EXIT:NOP ; thêm lệnh NOP do END không phải là lệnh của 8051
END
Ví dụ 2.2: Viết chương trình nhập 1 chuỗi mã ASCII từ port nối tiếp và cất vào RAM nội bắt
đầu từ địa chỉ 30H. Chuỗi mã ASCII kết thúc bằng ký tự CR (có mã ASCII là 13H). Cất cả ký tự
CR vào RAM nội và kết thúc chuỗi bằng cách thêm ký tự null. Giả sử truyền UART 8 bit, tốc
độ baud 2400, fOSC = 12MHz, bit SMOD = 0.
Giải:
ORG 0
; khởi động port nối tiếp
MOV SCON,#01010010B ; port nối tiếp ở mode 1
MOV TMOD,#20H ; timer 1 ở mode 2
MOV TH1,#-13 ; tốc độ baud = 2400
SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud
; nhập chuỗi mã ASCII
MOV R0,#30H ; trỏ đến ô nhớ RAM nội 30H
LOOP:
ACALL INCHAR ; nhập 1 byte từ port nối tiếp vào A
MOV @R0,A ; cất byte ký tự vào ô nhớ RAM nội
INC R0 ; tăng nội dung con trỏ
CJNE A,#13H,LOOP ; kiểm tra ký tự thu được có phải là CR không,
; nếu không thì lặp lại
MOV @R0,#0 ; nếu đúng, kết thúc và chèn thêm ký tự null
SJMP EXIT
INCHAR:
JNB RI,$
CLR RI
MOV A,SBUF
RET
EXIT:NOP
END
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
11
Ví dụ 2.3: Viết chương trình con gởi liên tục các ký tự chữ thường ra port nối tiếp.
Giải:
- Phần khởi động port nối tiếp được viết ở chương trình chính.
- Sử dụng chương trình con OUTCHAR đã trình bày ở trên để xuất 1 btye ra port nối
tiếp.
SEND:
MOV A,#‘a’ ; chuyển mã ASCII của ký tự ‘a’ vào thanh ghi A
LOOP:
ACALL OUTCHAR ; xuất ký tự từ thanh ghi A ra port nối tiếp
INC A ; tăng lên mã ASCII của ký tự kế
CJNE A,#‘z’+1,LOOP ; so sánh (A) với mã ASCII của ‘z’+1
RET ; nếu chưa bằng thì lặp lại, nếu bằng thì thoát
Ví dụ 2.4: Viết chương trình nhập các ký tự từ port nối tiếp rồi xuất ra port nối tiếp liên tục. Nếu
ký tự nhập vào là ký tự điều khiển (có mã ASCII từ 00H ÷ 1FH và 7FH) thì xuất ra ký tự ‘.’để
thay thế. Giả sử tốc độ baud = 1200, UART 8 bit, fOSC = 12MHz.
Giải:
ORG 0
; khởi động port nối tiếp
MOV SCON,#01010010B ; port nối tiếp ở mode 1
MOV TMOD,#20H ; timer 1 ở mode 2
MOV TH1,#-26 ; tốc độ baud = 1200
SETB TR1 ; cho phép timer 1 chạy để tạo xung clock tốc độ baud
; nhập ký tự và so sánh
LOOP:
ACALL INCHAR ; nhập ký tự từ port nối tiếp
CJNE A,#7FH,CONT ; so sánh với 7FH
SJMP CTRL ; nếu bằng, nhảy đến nhãn xuất CTRL
CONT: ; nếu không, so sánh tiếp
CJNE A,#20H,CONT1 ; ký tự có bằng 20H
CONT1:
JC CTRL ; nếu nhỏ hơn 20H thì nhảy đến nhãn CTRL
SJMP OUT ; nếu không, xuất ký tự ra port nối tiếp
CTRL:
MOV A,#‘.’ ; chuyển mã ASCII của ký tự ‘.’ vào thanh ghi A
OUT: ACALL OUTCHAR ; xuất ký tự ra port nối tiếp
SJMP LOOP ; lặp lại
INCHAR:
JNB RI,$
CLR RI
MOV A, SBUF
RET
OUTCHAR:
JNB TI,$
CLR TI
MOV SBUF,A
RET
END
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
12
III. INTERRUPT (NGẮT)
1. Giới thiệu
- Interrupt (Ngắt): là việc ngưng thực hiện chương trình hiện hành do sự tác động của
bên ngoài hay bên trong để nhảy tới thực hiện 1 chương trình khác, được gọi là chương trình
phục vụ ngắt ISR (Interrupt Service Routine). Khi thực hiện xong chương trình ISR, chương
trình trước đó được tiếp tục thực thi tại nơi bị tạm dừng.
- 8031/8051 có 5 nguồn ngắt:
+ 2 ngắt ngoài: ngắt ngoài 0: qua chân 0INT (P3.2)
ngắt ngoài 1: qua chân 1INT (P3.3)
+ 3 ngắt trong: ngắt timer 0
ngắt timer 1
ngắt port nối tiếp
2. Các thanh ghi liên quan đến ngắt
a. Thanh ghi cho phép ngắt IE (Interrupt Enable)
MSB LSB
EA - (ET2) ES ET1 EX1 ET0 EX0
- Được định địa chỉ bit.
- Chức năng từng bit:
EA: cho phép toàn bộ
ET2: cho phép ngắt timer 2 (nếu có)
ES: cho phép ngắt port nối tiếp
ET1: cho phép ngắt timer 1
EX1: cho phép ngắt ngoài 1
ET0: cho phép ngắt timer 0
EX0: cho phép ngắt ngoài 0
- Để cho phép 1 nguồn ngắt, cần phải có:
+ EA = 1
+ Bit cho phép ngắt tương ứng bằng 1.
Ví dụ: Khởi động thanh ghi IE cho phép ngắt timer 0 và ngắt ngoài 0
MOV IE, #10000011B
Hay:
SETB EA
SETB ET0
SETB EX0
b. Thanh ghi ưu tiên ngắt IP (Interrupt Priority)
MSB LSB
- - (PT2) PS PT1 PX1 PT0 PX0
- Được định địa chỉ bit.
- Bit = 1: mức ưu tiên cao
Bit = 0: mức ưu tiên thấp
Mặc nhiên sau khi reset, tất cả các ngắt ở mức ưu tiên thấp.
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
13
- Nếu 2 ngắt với mức ưu tiên khác nhau xuất hiện đồng thời, ngắt có mức ưu tiên cao sẽ
được phục vụ trước. Đồng thời, ngắt có mức ưu tiên cao cũng có thể tạm dừng chương trình phục
vụ ngắt của ngắt có mức ưu tiên thấp.
- Nếu các ngắt có cùng mức ưu tiên xuất hiện đồng thời, việc xác định ngắt nào được
phục vụ trước sẽ theo thứ tự: ngoài 0, timer 0, ngoài 1, timer 1, port nối tiếp, timer 2 (đối với
8032/8052).
c. Thanh ghi TCON
MSB LSB
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Timer
Interrupt
- Định địa chỉ bit.
- Chức năng các bit liên quan đến ngắt (interrupt):
+ IEx: cờ ngắt ngoài x (IEx = 1 → tạo ngắt ngoài x)
+ ITx: bit xác định loại tác động ngắt ngoài x
ITx = 0 : tác động mức 0
ITx = 1 : tác động cạnh xuống (thường dùng)
3. Các ngắt của 8031/8051
a. Các ngắt ngoài (ngoài 0 và ngoài 1):
- Khi có xung cạnh xuống ( ) (bit ITx = 1) hay mức 0 (bit ITx = 0) tác động vào chân
INTx (chân P3.2 hoặc P3.3) của 8051, cờ ngắt IEx tương ứng sẽ được đặt bằng 1 → vi điều
khiển thực hiện chương trình phục vụ ngắt của ngắt ngoài tương ứng.
- Khi một ngắt ngoài được tạo ra, cờ ngắt sẽ được tự động xóa bởi phần cứng khi vi điều
khiển chuyển đến chương trình phục vụ ngắt nếu ngắt thuộc loại tác động cạnh xuống. Còn nếu
ngắt thuộc loại tác động mức, nguyên nhân ngắt ngoài sẽ điều khiển mức của cờ thay vì phần
cứng.
b. Các ngắt timer (timer 0 và timer 1)
- Khi timer x tràn, cờ TFx được đặt lên 1→ vi điều khiển thực hiện chương trình phục vụ
ngắt của timer x.
- Cờ TFx được tự động xóa về 0 bởi phần cứng khi vi điều khiển chuyển đến chương
trình phục vụ ngắt.
c. Các ngắt port nối tiếp
- Khi TI = 1 (phát xong 1 byte) hay RI = 1 (thu xong 1 byte)→ vi điều khiển thực hiện
chương trình phục vụ ngắt của port nối tiếp.
- Cờ TI hay RI không được xóa tự động bởi phần cứng khi chuyển đến chương trình phục
vụ ngắt → người lập trình phải xóa cờ TI hay RI về 0 bằng phần mềm.
4. Thiết kế chương trình dùng các ngắt
* Vector ngắt (Interrupt vector): là địa chỉ bắt đầu của 1 chương trình phục vụ ngắt. Mỗi
loại ngắt khác nhau được dành riêng một vector ngắt. Khi một ngắt được chấp nhận, địa chỉ
vector ngắt tương ứng được nạp vào thanh ghi PC.
Bảng các vector ngắt:
Nguyên nhân ngắt Cờ Địa chỉ vector ngắt
Reset hệ thống RST 0000H
Ngắt ngoài 0 IE0 0003H
Ngắt timer 0 TF0 000BH
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
14
Ngắt ngoài 1 IE1 0013H
Ngắt timer 1 TF1 001BH
Ngắt port nối tiếp RI hoặc TI 0023H
Lưu ý: việc reset hệ thống cũng được xem như là một ngắt với địa chỉ vector tương ứng
là 0000H.
a. Chương trình phục vụ ngắt có kích thước nhỏ (≤ 8 byte)
Chương trình phục vụ ngắt có thể được viết ngay tại địa chỉ vector ngắt nếu nó có kích
thước không quá 8 byte. Khuôn mẫu chương trình sau có thể được sử dụng:
ORG 0000H ; điểm nhập sau khi reset
LJMP MAIN ; nhảy đến chương trình chính, bỏ qua vùng vector ngắt
ORG 0003H ; điểm nhập của trình phục vụ ngắt ngoài 0
EXT0_ISR:
RETI ; thoát khỏi trình phục vụ ngắt, quay về chương trình chính
ORG 000BH ; điểm nhập của trình phục vụ ngắt timer 0
T0_ISR:
RETI ; thoát khỏi trình phục vụ ngắt, quay về chương trình chính
ORG 0030H ; bắt đầu CT chính tại 0030H để tránh đè lên vùng vector ngắt
MAIN:
END ; kết thúc chương trình
b. Chương trình phục vụ ngắt có kích thước lớn (> 8 byte)
Nếu chương trình phục vụ ngắt có kích thước dài hơn 8 byte, cần phải di chuyển chương
trình này đến một nơi khác trong bộ nhớ chương trình hay có thể lấn qua vùng của ngắt khác
nếu ngắt đó không dùng. Thông thường, ISR được bắt đầu với một lệnh nhảy đến một vùng
khác của bộ nhớ chương trình, ở đó chương trình được trải rộng nếu cần. Khuôn mẫu chương
trình sau có thể được sử dụng:
ORG 0000H
LJMP MAIN ; nhảy đến chương trình chính
ORG 0003H ; điểm nhập của trình phục vụ ngắt ngoài 0
LJMP EXT0_ISR ; nhảy đến chương trình phục vụ ngắt ngoài 0
ORG 000BH ; điểm nhập của trình phục vụ ngắt timer 0
LJMP T0_ISR ; nhảy đến chương trình phục vụ ngắt timer 0
ORG 0030H ; bắt đầu chương trình chính tại 0030H
MAIN:
;SJMP $
; các chương trình con
Thường là các khởi động ban đầu, các
lệnh gọi chương trình con,
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
15
CTCON_1:
RET
CTCON_2:
RET
; các chương trình phục vụ ngắt
EXT0_ISR:
RETI
T0_ISR:
RETI
END
5. Các ví dụ
Ví dụ 3.1: Viết chương trình sử dụng ngắt timer 0 để tạo một sóng vuông đối xứng tần số 10KHz
trên chân P1.0. Giả sử fOSC = 12 MHz.
Giải:
- Sóng vuông f = 10KHz → T = 0,1ms = 100μs → tL = tH = 50μs → cho timer đếm 50μs
→ sử dụng timer 0, chế độ 2 (8 bit tự động nạp lại).
- Mỗi lần tràn, timer 0 tạo ra một ngắt (TF0 = 1). Chương trình phục vụ ngắt chỉ cần lấy
bù giá trị ở chân P1.0 (do đối xứng) → sử dụng chương trình phục vụ ngắt có kích thước nhỏ.
Chương trình:
ORG 0 ; điểm nhập khi reset
LJMP MAIN ; nhảy đến chương trình chính
ORG 000BH ; vector ngắt timer 0
T0_ISR: ; chương trình phục vụ ngắt timer 0
CPL P1.0 ; lấy bù chân P1.0
RETI ; trở về chương trình chính
ORG 0030H ; điểm nhập chương trình chính
MAIN: ; chương trình chính
MOV TMOD,#02H ; khởi động timer 0, chế độ 2
MOV TH0,#-50 ; cho timer 0 đếm 50μs
SETB TR0 ; cho phép timer 0 chạy
MOV IE,#82H ; cho phép ngắt timer 0
SJMP $ ; không làm gì, chỉ chờ ngắt
END
Ví dụ 3.2: Viết chương trình sử dụng các ngắt timer để tạo đồng thời 2 sóng vuông đối xứng có
tần số là 7KHz và 500Hz trên các chân P1.7 và P1.6. Giả sử fOSC = 12 MHz.
Giải:
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
16
- Hai sóng vuông có tần số khác nhau:
+ f1 = 7KHz → T1 ≈142μs → tL1 = tH1 = 71μs → dùng timer 0, chế độ 2 (8 bit tự
động nạp lại) tạo ngắt lấy bù giá trị trên chân P1.7.
+ f2 = 500Hz → T2 = 2ms = 2000μs → tL2 = tH2 = 1000μs → dùng timer 1, chế độ
1 (16 bit) tạo ngắt lấy bù giá trị trên chân P1.6.
- Sử dụng chương trình phục vụ ngắt kích thước lớn vì khi dùng timer 1 ở chế độ 1, trong
chương trình phục vụ ngắt phải nạp lại giá trị cho các thanh ghi TH1 và TL1 → chương trình sẽ
vượt quá 8 byte.
Chương trình:
ORG 0
LJMP MAIN
ORG 000BH ; vector ngắt timer 0
LJMP T0_ISR
ORG 001BH ; vector ngắt timer 1
LJMP T1_ISR
ORG 0030H
MAIN:
MOV TMOD,#12H ; khởi động timer 0 ở chế độ 2 và timer 1 ở chế độ 1
MOV TH0,#-71
MOV TH1,#HIGH(-1000)
MOV TL1,#LOW(-1000)
SETB TR0
SETB TR1
MOV IE,#8AH ; cho phép ngắt timer 0 và timer 1
SJMP $
T0_ISR: ; chương trình phục vụ ngắt timer 0
CPL P1.7
RETI
T1_ISR: ; chương trình phục vụ ngắt timer 1
CLR TR1
MOV TH1,#HIGH(-1000)
MOV TL1,#LOW(-1000)
SETB TR1
CPL P1.6
RETI
END
Ví dụ 3.3: Viết chương trình sử dụng ngắt để liên tục phát đi tập mã ASCII (bỏ qua các mã điều
khiển) đến 1 thiết bị đầu cuối nối với 8051 qua port nối tiếp. Giả sử truyền UART 8 bit, tốc độ
baud là 1200, bit SMOD = 1.
Giải:
- Có 128 mã ASCII 7-bit trong bảng mã ASCII. Các mã này bao gồm 95 mã đồ hoạ (từ
20H đến 7EH) và 33 mã điều khiển (từ 00H đến 1FH và 7FH). Ở đây ta chỉ xuất các mã đồ họa
(từ 20H đến 7EH).
- Sử dụng ngắt port nối tiếp để phát ký tự: khi có ngắt TI = 1 (báo bộ đệm phát đã rỗng)
→ vào chương trình phục vụ ngắt để gởi mã đồ họa tiếp theo ra bộ đệm phát. Trước khi gởi, cần
phải kiểm tra xem đã hết tập mã ASCII chưa, nếu hết thì phát lại từ đầu.
Chương trình:
ORG 0
LJMP MAIN
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
17
ORG 0023H
LJMP SP_ISR ; vector ngắt port nối tiếp
ORG 0030H
MAIN: ; chương trình chính
MOV TMOD,#20H ; khởi động timer 1, chế độ 2
MOV TH1,#-26 ; tốc độ baud của port nối tiếp là 1200
SETB TR1 ; cho timer 1 chạy để tạo xung clock tốc độ baud
MOV SCON,#42h ; port nối tiếp ở chế độ 1 (UART 8 bit, tốc độ thay đổi),
; cho TI = 1: buộc ngắt để gởi ký tự đầu tiên
MOV A,#20H ; ký tự đầu tiên là 20H
MOV IE,#90H ; cho phép ngắt port nối tiếp
SJMP $
SP_ISR: ; chương trình phục vụ ngắt port nối tiếp
CJNE A,#7FH,SKIP ; nếu chưa hết tập mã đồ họa ASCII thì phát ký tự kế
MOV A,#20H ; nếu hết thì phát lại từ mã đồ họa đầu tiên (20H)
SKIP:
MOV SBUF,A ; gởi ký tự đến bộ đệm phát
INC A ; tăng lên ký tự kế
CLR TI ; xóa cờ ngắt phát, chuẩn bị cho lần phát kế tiếp
RETI
END
Ví dụ 3.4: Điều khiển lò nung
Giả sử có một bộ cảm biến nhiệt được nối với chân INT0 (P3.2) và INT1 (P3.3) cung
cấp hai tín hiệu HOT và COLD như sau:
HOT = 0 nếu nhiệt độ > 210C
COLD= 0 nếu nhiệt độ < 190C
Lò được điều khiển bật/tắt thông qua chân P1.7 : P1.7 = 1 bật lò, P1.7 = 0 tắt lò.
Viết chương trình sử dụng các ngắt để điều khiển lò nung sao cho nhiệt độ lò được duy
trì ở 200C ± 10C.
Giải:
Chương trình sẽ bật lò (P1.7 = 1) khi nhiệt độ < 190C và tắt lò (P1.7 = 0) khi nhiệt độ
>210C. Khi nhiệt độ trong [190C, 210C], các ngõ vào HOT và COLD đều là 1. Khi nhiệt độ <
190C, HOT = 0 hay nhiệt độ > 210C, COLD= 0 → tạo xung cạnh xuống kích vào chân ngắt
ngoài INT0 hay INT1 . Như vậy trong chương trình phục vụ các ngắt ngoài này chỉ cần đặt hay
xóa bit P1.7.
8051
INT0 (P3.2)
P1.7
INT1(P3.3)
Bật/tắt lò
HOT
COLD
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
18
Chương trình:
ORG 0
LJMP MAIN
ORG 0003H
EXT0_ISR:
CLR P1.7 ; tắt lò
RETI
EXT1_ISR:
SETB P1.7 ; bật lò
RETI
ORG 0030H
MAIN:
MOV IE,#85H ; cho phép ngắt ngoài 0 và 1
SETB IT0 ; tác động cạnh xuống
SETB IT1
SETB P1.7 ; ban đầu, bật lò
JB P3.2,SKIP ; nếu nhiệt độ > 210C
CLR P1.7 ; thì tắt lò
SKIP:SJMP $ ; không làm gì
END
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
19
BÀI TẬP CHƯƠNG 4
Phần timer (Giả sử hệ thống dùng thạch anh 12MHz)
4.1. Viết chương trình dùng timer tạo trễ 200μs.
4.2. Viết chương trình dùng timer tạo trễ 50ms.
4.3. Viết chương trình dùng timer tạo một xung mức cao trên chân P1.7 trong 1s.
4.4. Viết chương trình dùng timer tạo sóng vuông đối xứng có tần số f = 500Hz trên chân
P1.0.
4.5. Viết chương trình dùng timer tạo sóng vuông đối xứng trên chân P1.0 có tần số f =
500Hz, duty cycle = 30% (thời gian mức cao = 30% thời gian của chu kì xung).
4.6. Giả sử có một hệ thống đếm số người đi vào một siêu thị như trong hình vẽ B4.6. Bộ
cảm biến sẽ tạo ra 1 xung (kích cạnh xuống) đưa vào chân T1 của 8051 (P3.5) khi có 1 người đi
vào siêu thị. Một bóng đèn được điều khiển bởi chân P1.7 sẽ sáng khi P1.7 = 1 và tắt nếu P1.7 =
0. Hãy viết chương trình dùng timer để đếm số người và bật đèn báo hiệu khi có người thứ
10.000 đi vào siêu thị.
4.7. Viết chương trình dùng timer 0 đo thời gian mức cao của xung đưa vào chân INT0 (P3.2)
của 8051. Thời gian đo được (tính bằng μs) được lưu vào ô nhớ 30H (byte thấp) và 31H (byte
cao).
Hình B4.6
Phần port nối tiếp
4.8. Viết một đoạn chương trình khởi động port nối tiếp để thu dữ liệu ở chế độ UART 8 bit,
tốc độ baud là 4800. Giả sử hệ thống dùng thạch anh 12MHz và bit SMOD = 0.
4.9. Viết chương trình nhập một chuỗi mã ASCII dài 80 byte từ port nối tiếp và cất vào RAM
ngoài bắt đầu từ địa chỉ 2000H. Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400,
fOSC=12MHz và bit SMOD = 0.
4.10. Viết chương trình gởi liên tiếp các ký tự hiển thị được trong tập mã ASCII (có mã từ 20H
đến 7EH) đến thiết bị gắn với port nối tiếp của 8051. Giả sử truyền ở chế độ UART 8 bit, tốc độ
baud là 1200, fOSC =12MHz và bit SMOD = 0.
4.11. Viết chương trình nhập các ký tự từ bàn phím vào port nối tiếp và xuất ra thiết bị gắn với
port nối tiếp, chuyển các ký tự thường thành ký tự hoa. Giả sử truyền ở chế độ UART 8 bit, tốc
độ baud là 1200, fOSC =12MHz và bit SMOD = 0.
4.12. Tương tự bài 11 nhưng chuyển các ký tự hoa thành ký tự thường.
4.13. Giả sử có một chuỗi mã ASCII 20 byte chứa trong RAM nội bắt đầu từ ô nhớ 30H. Hãy
viết chương trình phát chuỗi dữ liệu này ra port nối tiếp với điều kiện chỉ truyền các ký tự hoa.
Giả sử truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC = 8MHz và bit SMOD = 0.
8051
T1 P1.7
Bộ
cảm
biến
Đèn báo
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
20
Phần ngắt (interrupt)
4.14. Viết chương trình dùng ngắt tạo sóng vuông đối xứng có tần số f = 400Hz trên chân P1.7.
Giả sử hệ thống dùng thạch anh 12MHz.
4.15. Viết chương trình dùng ngắt để phát liên tiếp các ký tự hoa ra port nối tiếp. Giả sử
truyền ở chế độ UART 8 bit, tốc độ baud là 2400, fOSC = 12MHz và bit SMOD = 0.
4.16. Làm lại bài 4.9 của phần port nối tiếp nhưng dùng ngắt.
4.17. Làm lại bài 4.13 của phần port nối tiếp nhưng dùng ngắt.
4.18. Làm lại bài 4.6 của phần timer nhưng dùng ngắt, lúc này xung từ bộ cảm biến đưa vào
chân INT1 (P3.4) thay vì chân T1.
4.19. Viết chương trình dùng ngắt để phát liên tiếp các ký tự hiển thị được trong tập mã ASCII
(mã từ 20H đến 7EH) ra port nối tiếp, mỗi lần phát cách nhau 50ms. Giả sử truyền ở chế độ
UART 8 bit, tốc độ baud là 2400, fOSC = 12MHz và bit SMOD = 0.
4.20. Giả sử có một hệ thống đếm sản phẩm như hình B4.20. Cứ mỗi sản phẩm chạy qua bộ
cảm biến sẽ tạo ra một xung vuông (kích cạnh xuống) đưa vào chân INT0 (P3.2) của 8051. Hãy
viết chương trình dùng các ngắt để đếm số sản phẩm, mỗi khi đủ 100 sản phẩm thì xóa bộ đếm
và tạo một xung mức cao trên chân P1.7 trong thời gian 1 giây, sau đó lặp lại.
Hình B4.20
4.21. Giả sử có một hệ thống báo động như hình B4.21. Bộ cảm biến cửa mở sẽ tạo ra một
xung vuông (kích cạnh xuống) đưa vào chân INT0 (P3.2) của 8051. Hãy viết chương trình dùng
các ngắt để tạo ra âm hiệu có tần số 400Hz trên loa (nối với chân P1.7) trong thời gian 3 giây
nếu cửa bị mở. Giả sử hệ thống dùng thạch anh 12MHz.
Hình B4.21
8051
INT0 P1.7
Bộ
cảm
biến
8051
INT0 P1.7
Bộ
cảm
biến
cửa
mở
74LS04
Các file đính kèm theo tài liệu này:
- Ch4.pdf