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

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

 

pdf20 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 929 | Lượt tải: 0download
Tóm tắt nội dung 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, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
û 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 

File đính kèm:

  • pdfbai_giang_vi_xu_ly_chuong_4_cac_chuc_nang_cua_ho_vi_dieu_khi.pdf