Mình viết 1 chương trình tạo PWM sử dụng 8051. Sử dụng timer0 tạo ra các khoảng ngắt cứ 100us 1 lần, còn timer1 thì đưa các giá trị từ TABLE vào TH1 và TL1 để tạo các giá trị thời gian T1 khác nhau từ 0 đến 100us. Cứ hết T1 thì setb cho P2.0 và CLR P2.1. Đồng thời cứ hết T0 thì lại setb P2.1 và clr P2.0, như vậy sẽ tạo ra các xung vuông độ rộng thay đổi trên P2.0 và P2.1. Tuy nhiên chương trình viết ko cho ra khoảng T1 mong muốn mặc dù đã mov giá trị vào TH1 và TL1 đúng công thức tính toán. Mọi người cho ý kiến nhé
Code:
#include <sfr51.inc>
ORG 0000H
LJMP MAIN ; Bo qua bang vector ngat
; Chuong trinh ISR cho timer0
ORG 000BH ; ISR cho timer0
SETB P2.0
CLR P2.1
RETI
;Chuong trinh chinh
ORG 0030H
MAIN: MOV TMOD,#12H ; Chon timer0 che do 2 va timer1 che do 1
MOV IE,#82H ; Cho phep ngat timer0
MOV TH0,#-92 ; Dat thoi gian cho timer0 la 100us
SETB TR0 ; Khoi dong timer0
AGAIN:
MOV DPTR,#TABLE ; Dua con tro DPTR den TABLE
MOV R0,#200
BACK:
MOV TH1,#0FFH
CLR A
MOVC A,@A+DPTR
MOV TL1,A
INC DPTR
ACALL DELAY
CLR P2.0
SETB P2.1
WAIT: JNB TF0,WAIT
DJNZ R0,BACK
SJMP AGAIN
DELAY:
SETB TR1
AGAIN2:
JNB TF1,AGAIN2
CLR TR1
CLR TF1
RET
TABLE: DB Cho nay dat cac gia tri can nap vao TL1 de lam cho do rong xung thay doi
END

Comment