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