Gần đây trên diễn đàn thấy một số bạn cần tìm code về PWM để tham khảo, vì vậy mình post lên đây một đoạn code cơ bản về PWM để ai cần thì xem. Mặc dù là cơ bản nhưng chương trình đã chạy tốt (đối với thiết bị điện DC). Các câu lệnh mình đều chú thích rõ ràng. Chúc các bạn tìm thấy điều hữu ích cho mình.
Code:
;PHAN KHAI BAO CAC BIT NGO VAO PWM BIT P1.6 ;BIT DIEU KHIEN THIET BI UP BIT P3.4 ;TANG GIA TRI PWM DOWN BIT P3.5 ;GIAM GIA TRI PWM ;PHAN KHAI BAO BIEN LED PWM_VALUE EQU 31H ;KHAI BAO CAC VECTOR NGAT ORG 0000H LJMP SETUP ;KHOI DONG CHUONG TRINH KHI CAP NGUON ORG 000BH LJMP T0_ISR ;NGAT TIMER 0 DIEU RONG XUNG ORG 0030H SETUP: SETB EA ;CHO PHEP NGAT TOAN CUC SETB ET0 ;CHO PHEP NGAT TIMER 0 CLR PWM ;TAT THIET BI MOV TMOD,#11H MOV TH0,#HIGH(-200) ;\ ;TA 12MHZ => 200us x 100% = 20000us = 20ms MOV TL0,#LOW(-200) ;/ CHU KY DIEU XUNG MOV PWM_VALUE,#0 ;MAC DINH GIA TRI PWM = 0 MOV R7,#0 ;BIEN XAC DINH SO LAN NGAT TIMER SETB TR0 ;CHO PHEP TIMER HOAT DONG MAIN: JB UP,CHECK_DOWN ;NEU PHIM UP = '1' THI KIEM TRA PHIM DOWN LCALL DELAY200MS ;NEU PHIM UP = '0' THI CHO CHONG XUNG NAY INC PWM_VALUE ;TANG GIA TRI PWM MOV A,PWM_VALUE CJNE A,#101,EXIT_UP ;CHUA TOI NGUONG TREN THI THOAT THU TUC NHAN PHIM MOV PWM_VALUE,#100 ;DO DAY XUNG DAT 100% EXIT_UP: JMP MAIN CHECK_DOWN: JB DOWN,MAIN LCALL DELAY200MS DEC PWM_VALUE MOV A,PWM_VALUE CJNE A,#-1,EXIT_DOWN ;CHUA TOI NGUONG DUOI THI THOAT THU TUC NHAN PHIM MOV PWM_VALUE,#0 ;DO DAY XUNG BANG 0 EXIT_DOWN: JMP MAIN T0_ISR: ;NGAT TIMER DUNG DE DIEU RONG XUNG PUSH ACC MOV 7FH,C CLR TR0 MOV TH0,#HIGH(-200) MOV TL0,#LOW(-200) SETB TR0 MOV A,PWM_VALUE CJNE A,#0,EN_PWM ;DO DAY XUNG <> 0 THI CHO DIEU XUNG JMP EXIT_ISR ;DO DAY XUNG = 0 THI THOAT KHOI THU TUC NGAT EN_PWM: INC R7 ;TANG BIEN DEM NGAT MOV A,R7 CJNE A,PWM_VALUE,OFF_PULSE ;DU THOI GIAN DAY XUNG THI TAT THIET BI CLR PWM ;TAT THIET BI OFF_PULSE: CJNE A,#100,EXIT_ISR ;CHUA HET CHU KY DIEU XUNG THI THOAT NGAT SETB PWM ;TOI ROI THI MO THIET BI MOV R7,#0 ;RESET LAI BIEN DEM EXIT_ISR: MOV C,7FH POP ACC RETI DELAY50MS: MOV TH1,#HIGH(-50000) ; CHUONG TRINH CON TRE 50MS GIAY MOV TL1,#LOW(-50000) ; SU DUNG THACH ANH 12MHZ SETB TR1 JNB TF1,$ CLR TR1 CLR TF1 RET DELAY200MS: LCALL DELAY50MS LCALL DELAY50MS LCALL DELAY50MS LCALL DELAY50MS RET END
Comment