- 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.
20 trang |
Chia sẻ: thienmai908 | Lượt xem: 1386 | Lượt tải: 0
Nội dung tài liệu Bài giảng 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
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:
Thường là các khởi động ban đầu, các
lệnh gọi chương trình con, … … …
;SJMP $
; các chương trình con
CTCON_1:
… …
RET
14
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
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:
- 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.
15
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
+ 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
ORG 0023H
LJMP SP_ISR ; vector ngắt port nối tiếp
ORG 0030H
16
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
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ò.
8051
INT0 (P3.2)
P1.7
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.
Chương trình:
ORG 0
LJMP MAIN
INT1 (P3.3)
HOT
Bật/tắt lò
COLD
17
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
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
18
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
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
8051
T1 P1.7
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.
Phần ngắt (interrupt)
Bộ
cảm
biến
Đèn báo
19
Bài giảng VI XỬ LÝ Chương 4: Các chức năng của họ MCS-51
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.
8051
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
INT0 P1.7
Bộ
cảm
biến
8051
INT0 P1.7
Bộ
cảm
biến
cửa
mở
74LS04
20
Các file đính kèm theo tài liệu này:
- Ch4.pdf