Tài liệu hướng dẫn thực tập Vi điều khiển MSC-51 - Bài 5: Lập trình điều khiển Timer - Interrupt

Bài thực hành nhằm giúp học viên:

- Nắm nguyên tắc hoạt động của Timer - Interrupt.

- Hiểu và viết được chương trình ứng dụng Timer – Interrupt vào trong điều

khiển quá trình.

pdf18 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: dkS00TYs | Lượt xem: 1827 | Lượt tải: 5download
Tóm tắt nội dung Tài liệu hướng dẫn thực tập Vi điều khiển MSC-51 - Bài 5: Lập trình điều khiển Timer - Interrupt, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
MOV B,#10 
DIV AB 
MOV DPTR,# LED7S 
MOVC A,@A+DPTR 
MOV P2,A ; xuất hàng chục của phút ra P2 
MOV P1,#03H ; P1 là PORT ñể chọn Led 7 ñoạn 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A ; xuất hàng ñơn vị của phút 
MOV P1, #02H 
MOV A,31H ; xuất giá trị của giây ra P2 
MOV B,#10 
DIV AB 
MOV DPTR,#LED7S 
MOVC A,@A+DPTR 
MOV P2,A ; xuất giá trị chục của giây 
MOV P1, #01H 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A ; giá trị ñơn vị của giây 
Bài 5: Timer -Interrupt 
 Trang V-11 
MOV P1, #00H 
CALL DELAY 
INC 31H ; tăng giây lên 1 
MOV A,31H 
CJNE A,#60,Lap ; ðủ 60s (1 phút) thì 
MOV 31H,#0 ; giây = 0 
INC 30H ; và tăng phút lên 1 
MOV A,30H 
CJNE A,#60,Lap ; ðủ 60 phút thì 
MOV 30H,#0 ; phút = 0 
JMP LAP 
LED7S: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 67H 
DELAY: 
PUSH 07 
MOV R7,#20 
SETB TR0 
DELAY1: ; Tạo trễ 50000 chu kỳ = 50000µs = 50ms 
MOV TH0,#HIGH(-50000) 
MOV TL0,#LOW(-50000) 
JNB TF0,$ ; Chờ ñến khi Timer tràn 
CLR TF0 
DJNZ R7,DELAY1 ; R7 = 20 -> lặp lại 20 lần -> tạo trễ 20*50ms 
CLR TR0 
POP 07 
RET 
END 
d. Yêu cầu: 
- Kết nối ngõ ra của vi ñiều khiển với module diều khiển LED – LED 7 
ñoạn. Quan sát kết quả LED 7 ñoạn và cho nhận xét. 
- Do trên là chương trình gợi ý, sinh viên hãy edit lại ñể sao cho có thể 
thực hiện ñược yêu cầu trên. 
- Nếu chương trình hiển thi phút giây chưa hoàn chỉnh, có thể thêm ñoạn 
code Delay10ms ñể trì hoãn thời gian lưu ảnh của mắt ngay tại mỗi khi 
Bài 5: Timer -Interrupt 
 Trang V-12 
xuất giá trị phút giây ra PORT2. Hãy sửa ñổi lại chương trình sao cho 
hiển thị phút giây dễ quan sát nhất. 
ðoạn code Delay10ms ñược gợi ý như sau: 
Delay10ms: 
PUSH 03 
PUSH 04 
MOV R3, #100 
L1: MOV R4, #75 
 DJNZ R4, $ 
 DJNZ R3, L1 
POP 03 
POP 04 
RET 
- Sửa lại chương trình sao cho có thể ñếm giấy và % của giây. 
- Sửa lại chương trình cho phép nếu có 2 SW ñược ñưa vào hệ thống ñể 
ñiều khiển ñếm thời gian tăng và ñếm ngược thời gian cụ thể như sau: 
Khi bắt ñầu chương trình, ñồng hồ sẽ hiển thị 0000. Nếu SW1 ñược ấn 
thì ñồng hồ sẽ ñếm thời gian tăng, còn nếu ấn SW2 thì ñồng hồ ñếm 
ngược thời gian. Chú ý trong lúc SW1 hoặc SW2 thì SW còn lại sẽ bị vô 
hiệu hoá 
2. ðiều khiển ngắt Timer 
Bài 1: Thực hiện chương trình dùng ngắt Timer 0 – chế ñộ 1 – 16 bit tạo xung vuông 
tần số f = xxHz tại P2.0 
a. Chương trình mẫu gợi ý 
ORG 0000H 
JMP MAIN 
ORG 000BH 
JMP TIMER0_ISR 
MAIN: 
MOV IE,#82H 
MOV TMOD,#02H 
MOV TH0,#(-50000) ; f = XXHz -> T = 1/f = YYms -> thời gian 
MOV TL0,#(-50000) ; trễ là ZZs -> giá trị ñếm của Timer là TTs 
SETB TR0 
HERE: 
Bài 5: Timer -Interrupt 
 Trang V-13 
JMP HERE 
;----------- 
TIMER0_ISR: 
CPL P2.0 
RETI 
END 
b. Yêu cầu: 
- Hãy xác ñịnh các giá trị XX, YY, ZZ và TT 
- Có thể thay ñổi lệnh JMP HERE bằng 1 lênh khác ñược không ? Nếu 
ñược thì cho biết lệnh ñó và cho chạy lại chương trình ñể kiểm tra. 
- Sửa ñổi chương trình ñể có thể tạo xung vuông ON/OFF 1 giây. 
- Viết chương trình dùng ngắt Timer 0 và Timer 1 ñồng thời tạo xung 
vuông tần số f = 20 KHz tại P2.3 và f = 100Hz tại P2.4 
- Thực hiện chương trình dùng ngắt Timer 0 và Timer 1 ñồng thời tạo 
xung vuông tần số f = 5 Hz tại P2.0 và f = 1 Hz tại P2.1. Hãy ñưa vào 
các giá trị XX, YYYY, ZZZZ, TTTT của chương trình gợi ý bên dưới ñể 
thực hiện ñược yêu cầu trên. 
ORG 0000h 
JMP main 
ORG 000Bh 
JMP TIMER0_ISR 
ORG 001Bh 
JMP Timer1_ISR 
MAIN: 
SETB EA 
SETB ET0 
SETB ET1 
MOV TMOD,#XXh 
MOV TH0,#(-YYYY) 
MOV TL0,#(-YYYY) 
SETB TR0 
MOV TH1,#HIGH(-ZZZZ) 
MOV TL1,#LOW(-ZZZZ) 
SETB TR1 
HERE: 
JMP HERE 
;----------- 
TIMER0_ISR: 
CPL P2.0 
RETI 
;----------- 
TIMER1_ISR: 
MOV TH1,#HIGH(-TTTT) 
MOV TL1,#LOW(-TTTT) 
CPL P2.1 
RETI 
;----------- 
END 
Bài 5: Timer -Interrupt 
 Trang V-14 
Bài 2: Chương trình mẫu gợi ý ñiều khiển phút dây dùng Interrupt Timer 
a. Chương trình mẫu gợi ý ñồng hồ hiển thị phút giây dùng ngắt Timer0 
ORG 0 
JMP Main 
ORG 0Bh 
JMP Timer0_ISR 
Main: 
SETB EA 
SETB ET0 
MOV TMOD,#01h 
MOV TH0,#HIGH(-50000) ; ðếm 50000 
MOV TL0,#LOW(-50000);chu kỳ =50 ms 
MOV R7,#20 ; 20 x 50ms = 1000ms = 1s 
SETB TR0 
MOV 31h,#0 ; Phút 
MOV 32h,#0 ; Giây 
CALL display 
here: 
JMP here 
;---------- 
Timer0_ISR: 
MOV TH0,#HIGH(-50000) 
MOV TL0,#LOW(-50000) 
DJNZ R7,exittimer0 
MOV R7,#20 
CALL IncTime ; Cứ mỗi 1s thì tăng thời 
gian 
CALL display ; và hiển thị ra Led 
exittimer0: 
RETI 
;--------- 
IncTime: 
INC 32h ; Tăng giây 
MOV A,32h 
CJNE A,#60,ExitIncTime ; Nếu Giây = 60 
MOV 32h,#0 ; thì Giây = 0 
INC 31h ; và tăng phút 
MOV A,31h 
CJNE A,#60,ExitIncTime ; Nếu Phút = 60 
MOV 31h,#0 ; thì Phút = 0 
ExitIncTime: 
RET 
;--------- 
Display: 
MOV A,31h ; Hiển thị 2 Led chỉ phút 
MOV B,#10 
DIV AB 
MOV DPTR,#MaLed7 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #03H 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #02H 
MOV A,32h ; Hiển thị 2 Led chỉ giây 
MOV B,#10 
DIV AB 
MOV DPTR,#MaLed7 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #01H 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A 
Bài 5: Timer -Interrupt 
 Trang V-15 
MOV P1, #00H 
RET 
;--------- 
MaLed7: DB 3FH, 06H, 5BH, 4FH, 
66H, 6DH, 7DH, 07H, 7FH, 67H 
END 
b. Yêu cầu: 
- Chạy chương trình và quan sát kết quả trên Led 7 ñoạn, cho nhận xét. 
- Do ñây là chương trình mẫu gợi ý, sinh viên hay sửa ñổi lại chương trình 
sao cho có kết quả chính xác nhất. 
- Sửa ñổi chương trình sao cho hiển thị giờ phút (do hạn chế của phần 
cứng thiết kế của Board ET-LAB3A). 
3. ðiều khiển ngắt ngoài 
Bài 1: Viết chương trình ñếm sử dụng ngắt ngoài 0 như sau (mỗi lần có ngắt xảy ra thì 
tăng nội dung ô nhớ 30h lên 1 và xuất ra Led 7 ñoạn). Chú ý Phải kết nối pin P3.2 ứng 
với INT0 với Switch ñơn (còn INT1 ứng với pin P3.3) 
a. Chương trình mẫu gợi ý 
ORG 0000h 
JMP main 
ORG 03h 
JMP Int0_ISR 
main: 
SETB EA 
SETB EX0 
MOV 30h,#0 
CALL display 
here: 
JMP here 
;---------- 
Int0_ISR: 
INC 30h 
MOV A,30h 
CJNE A,#100,next 
MOV 30h,#0 
next: 
CALL display 
RETI 
;--------- 
display: 
MOV A,30h 
MOV B,#10 
DIV AB 
MOV DPTR,#MaLed7 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #00H 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #01H 
RET 
;--------- 
MaLed7: DB 3FH, 06H, 5BH, 4FH, 
66H, 6DH, 7DH, 07H, 7FH, 67H 
END
Bài 5: Timer -Interrupt 
 Trang V-17 
b. Yêu cầu: 
- Chạy chương trình và kiểm tra kết quả 
- Thêm vào lệnh cho phép ngắt bằng cạnh như sau (tại ñoạn in ñậm). Sau 
ñó So sánh trường hợp sử dụng ngắt bằng cạnh và bằng mức logic 
SETB EA 
SETB EX0 
SETB IT0 
- Sửa chương trình trên ñể cho phép ñếm từ 10 – 50. 
- Sửa chương trình lại sao cho ñáp ứng với ngắt ngoài 1 – INT1. 
Bài 2: Chương trình ñếm giây và ñiều chỉnh giá trị hiển thị bằng 2 công tắc (nhấn 
SW1 thì INC thì tăng giá trị hiển thị và nhấn SW2 thì DEC thì giảm giá trị hiển thị). 
Dùng 2 Switch ñơn ứng với hai ngõ vào của P3.2 - INT0 và P3.3- INT1. 
a. Chương trình mẫu gợi ý 
ORG 0 
JMP main 
ORG 03h 
JMP Int0_ISR 
ORG 0Bh 
JMP Timer0_ISR 
ORG 13h 
JMP Int1_ISR 
Main: 
SETB EA 
SETB EX0 
SETB EX1 
SETB ET0 
SETB IT0 
SETB IT1 
MOV TMOD,#01h 
MOV TH0,#HIGH(-50000) 
MOV TL0,#LOW(-50000) 
MOV R7,#20 
SETB TR0 
MOV 30h,#0 
CALL display 
here: 
JMP here 
;---------- 
Int0_ISR: 
INC 30h 
MOV A,30h 
CJNE A,#100,next 
MOV 30h,#0 
next: 
CALL display 
RETI 
;---------- 
Int1_ISR: 
DEC 30h 
MOV A,30h 
CJNE A,#255,next1 
MOV 30h,#99 
Next1: 
CALL display 
RETI 
;--------- 
Timer0_ISR: 
MOV TH0,#HIGH(-50000) 
MOV TL0,#LOW(-50000) 
DJNZ R7,exittimer0 
MOV R7,#20 
INC 30h 
MOV A,30h 
CJNE A,#100,next2 
MOV 30h,#0 
next2: 
CALL display 
exittimer0: 
RETI 
;--------- 
display: 
MOV A,30h 
MOV B,#10 
DIV AB 
MOV DPTR,#MaLed7 
Bài 5: Timer -Interrupt 
 Trang V-17 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #00H 
MOV A,B 
MOVC A,@A+DPTR 
MOV P2,A 
MOV P1, #01H 
RET 
;--------- 
MaLed7: DB 3FH, 06H, 5BH, 4FH, 
66H, 6DH, 7DH, 07H, 7FH, 67H 
END
b. Yêu cầu: 
- Chạy chương trình và kiểm tra kết quả khi ấn SW1 và SW2. Chú ý khi 
ấn SW1 tương ứng với INT0 ñược tác ñộng, còn khi ấn SW2 thì tương 
ứng INT1 ñược ấn 
- Sửa chương trình ñể khi nhấn INC thì tăng 2 ñơn vị và nhấn DEC thì 
giảm 5 ñơn vị. 
4. ðiều khiển ngắt PORT nối tiếp 
Viết chương trình cho phép vi ñiều khiển nhận các ký tự số trên bàn phím máy tính, 
xuất các ký tự này ra LED 7 ñoạn. 
a. Chương trình mẫu gợi ý 
; Chương trình viết cho thạch anh tần số 11.0592Mhz, tốc ñộ 19200bps, SMOD=1 
ORG 0000H 
MAIN: 
 MOV DPTR, #LED7S; load dia chi cua bang chua cac ma led 7 doan 
 MOV SCON,#52H 
 MOV TMOD,#20H 
 MOV TH1,#-3 
; Com Smod Hoat Dong Cua Toc Do Baud 
MOV A, PCON ;chu y de truyen dung toc 19200bps, 
SETB ACC.7 ; SMOD =1, thanh anh 11.0592m 
MOV PCON, A 
NHAN: SETB TR1 
 JNB RI,$ 
 CLR RI 
Bài 5: Timer -Interrupt 
 Trang V-18 
 MOV A, SBUF 
 MOV SBUF, A 
 SUBB A, #31H 
 CALL LED7 
 JMP NHAN 
LED7: 
MOVC A, @A+DPTR 
MOV P1, A 
RET 
LED7S: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 67H 
END 
b. Yêu cầu: 
- Thiết lập kết nối có cùng tốc ñộ baud giữa máy tính sao cho giống như 
tốc ñộ baud của AT89xxx. Cho chạy chương trình và kiểm tra kết quả có 
truyền và kết nối ñược hay không ? Vì sao ? 
- Chương trình gới ý mẫu trên viết cho thạch anh tần số 11.0952Mhz. Sinh 
viên sửa lại tốc ñộ baud ñể nạp lại cho thanh ghi TH1 bằng cách xem lại 
tần số thạch anh dùng trong board ET-LAB3A và xem lại công thức tính 
toán trong bài học. Sao ñó cho chạy chương trình ñể kiểm tra có nhận 
ñược hay không ? 
- Sửa lai chương trình sao cho có thể truyền các mã Ascii của các ký tự ra 
LED 7 ñoạn. 
- Sửa lại chương trình có thể truyền các ký tự từ A từ vi ñiều khiển về máy 
tính. 
- Sửa lại chương trình ñể có thể truyền các ký tự số từ 0 ñến 9 từ máy tính 
xuống vi ñiều khiển và xuất ra LED 7 ñoạn dùng SMOD =0, tốc ñộ baud 
là 9200 với tần số thạch anh hiện có của Board thí nghiệm ET-LAB3A 
-----------Hết----------- 

File đính kèm:

  • pdfTài liệu hướng dẫn thực tập Vi điều khiển MSC-51 - Bài 5 Lập trình điều khiển Timer - Interrupt.pdf