Chào các bạn mình có 1 đoạn chương trình viết bằng asm hiển thị tốc độ động cơ bước xem nó chạy bao nhiêu vòng trên phút như sau:
ORG 0000H
LJMP MAIN
MAIN:
MOV TMOD,#11H ;khai báo sử dụng T1 và T0
MOV IE,#10010101B ;cho phép ngắt ngoài 0, ngắt ngoài 1, và ngắt Serial
;===================
; CHO T0 ĐẾM 1 PHÚT
;===================
LAP: MOV R0,#200
MOV R1,#6
LOOP: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R0,LOOP
MOV R0,#200
DJNZ R1,LOOP
;================================================= ==
; NHẢY ĐẾN NGẮT SERIAL CHO HIỂN THỊ RA LED 7 ĐỌAN
;================================================= ==
SETB RI
SETB TI
LJMP LAP ;cho T0 đếm tiếp
;====================
; CHO Đ/CƠ BƯỚC CHẠY
;====================
MOV 20H,#0 ;giá trị dùng để đếm số vòng của đ/cơ
LOOP3: MOV R2,#50
MOV R4,#4
LOOP1: MOV A,#00000001B
LOOP2: MOV P1,A
LCALL DELAY
RL A
DJNZ R4,LOOP2
DJNZ R2,LOOP1
INC 20H ;đ/cơ bước quay được 1 vòng thì tăng 20H lên 1
MOV A,20H
LJMP LOOP3 ;cho đ/cơ bước quay tiếp
.....
END
Trong đoạn chương trình này mình sử dụng ngắt serial vì T0 được lặp nhiều lần nên việc sử dụng cờ TF0 để ngắt T0 là ko được. Còn T1 đã được dùng để delay giữa các lần kích đ/cơ. Nhưng xem ra chương trình vẫn chưa ổn. Vì khi xem lại thì thấy rằng tốc độ đ/cơ sẽ ko được hiển thị liên tục mà cứ 1 phút mới hiển thị 1 lần. Nên chương trình sẽ hiển thị 1 phút quay được bao nhiêu vòng, chứ ko phải bao nhiêu vòng trên phút. Các bạn xem rồi góp ý dùm mình với!!!
ORG 0000H
LJMP MAIN
MAIN:
MOV TMOD,#11H ;khai báo sử dụng T1 và T0
MOV IE,#10010101B ;cho phép ngắt ngoài 0, ngắt ngoài 1, và ngắt Serial
;===================
; CHO T0 ĐẾM 1 PHÚT
;===================
LAP: MOV R0,#200
MOV R1,#6
LOOP: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R0,LOOP
MOV R0,#200
DJNZ R1,LOOP
;================================================= ==
; NHẢY ĐẾN NGẮT SERIAL CHO HIỂN THỊ RA LED 7 ĐỌAN
;================================================= ==
SETB RI
SETB TI
LJMP LAP ;cho T0 đếm tiếp
;====================
; CHO Đ/CƠ BƯỚC CHẠY
;====================
MOV 20H,#0 ;giá trị dùng để đếm số vòng của đ/cơ
LOOP3: MOV R2,#50
MOV R4,#4
LOOP1: MOV A,#00000001B
LOOP2: MOV P1,A
LCALL DELAY
RL A
DJNZ R4,LOOP2
DJNZ R2,LOOP1
INC 20H ;đ/cơ bước quay được 1 vòng thì tăng 20H lên 1
MOV A,20H
LJMP LOOP3 ;cho đ/cơ bước quay tiếp
.....
END
Trong đoạn chương trình này mình sử dụng ngắt serial vì T0 được lặp nhiều lần nên việc sử dụng cờ TF0 để ngắt T0 là ko được. Còn T1 đã được dùng để delay giữa các lần kích đ/cơ. Nhưng xem ra chương trình vẫn chưa ổn. Vì khi xem lại thì thấy rằng tốc độ đ/cơ sẽ ko được hiển thị liên tục mà cứ 1 phút mới hiển thị 1 lần. Nên chương trình sẽ hiển thị 1 phút quay được bao nhiêu vòng, chứ ko phải bao nhiêu vòng trên phút. Các bạn xem rồi góp ý dùm mình với!!!
Comment