十年专注单片机方案开发的方案公司金沙js5线路,分享PWM脉宽调制。金沙js5线路现提供服务产品涉及主控芯片:8位单片机、16位单片机、32位单片机及各类运算放大器等。
;************************************** ; 用片内PWM功能实现 ;************************************** ; PWM脉宽调制 ** ;平时RC0 RC1均位高电平,RC0为低电平则等变亮* ;RC1为低电平则灯变暗 ** ;加或减均写入EEPROM ** ;************************************** LIST P=16F877 include Y1 EQU 71H Y2 EQU 72H ORG 000H NOP GOTO START ;*******中断服务子程序******************** ORG 004H CALL DELAY MOVLW B'10000000' XORWF PORTC,F BCF PIR1,TMR2IF MOVF CCPR1L,W XORLW .0 BTFSC STATUS,Z GOTO UUU BTFSS PORTC,0 GOTO DECREMENT UUU MOVF CCPR1L,W XORLW .254 BTFSC STATUS,Z RETFIE BTFSS PORTC,1 GOTO INCREMENT RETFIE INCREMENT INCF CCPR1L,F COMF CCPR1L,W CALL WRITE RETFIE DECREMENT DECF CCPR1L,F CALL WRITE RETFIE ;*********主程序************************* START CALL DELAY CALL DELAY CALL DELAY CALL READ ;;;;;;;;;;;;;;;;; BSF STATUS,RP0 MOVLW B'01111011' MOVWF TRISC MOVWF PR2 BSF PIE1,TMR2IE BCF STATUS,RP0 BSF INTCON,PEIE BSF INTCON,GIE MOVLW B'00001100' MOVWF CCP1CON CLRF T2CON BSF T2CON,1 BSF T2CON,TMR2ON LOOP NOP GOTO
LOOP ;**************************************** DELAY MOVLW 03FH MOVWF Y1 M2 MOVLW 0FFH MOVWF Y2 M1 DECFSZ Y2 GOTO M1 DECFSZ Y1 GOTO M2 RETURN ;***************************************** ;EEPROM读写子程序 ;***************************************** WRITE BSF STATUS,RP0 BSF STATUS,RP1 BTFSC EECON1,WR GOTO $-1 BCF STATUS,RP0 MOVF 75H,W;;;;;;; MOVWF EEADR BCF STATUS,RP1 BCF STATUS,RP0 MOVF CCPR1L,W;;;;;; BSF STATUS,RP1 MOVWF EEDATA BSF STATUS,RP1 BSF STATUS,RP0 BCF EECON1,EEPGD ;写EEPROM BSF EECON1,WREN MOVLW 55H MOVWF EECON2 MOVLW 0AAH MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN BCF STATUS,RP1 BCF STATUS,RP0 RETURN ;**************************************** READ BCF STATUS,RP0 BSF STATUS,RP1 MOVF 75H,W;;;;;;;;;; MOVWF EEADR BSF STATUS,RP0 BCF EECON1,EEPGD ;读EEPROM BSF EECON1,RD BCF STATUS,RP0 MOVF EEDATA,W BCF STATUS,RP1 BCF STATUS,RP0 MOVWF CCPR1L RETURN ;**************************************** END
;********************************* ; 用TMR0实现PWM ;********************************* ; 用TMR0实现PWM试验程序 *** ;RC7输出PWM,RC0 RC1输入 *** ;********************************* LIST P=16F877 include Y1 EQU 20H Y2 EQU 21H QQ EQU 22H ORG 0000H NOP GOTO MAIN ORG 004H ;中断入口 ;*********中断服务程序*************** MOVF QQ,W ;如果QQ到255 XORLW .255 ;则跳至_GO,不 BTFSC STATUS,Z ;再加一操作 GOTO _GO BTFSC PORTC,0 ;脉宽增检测 GOTO _GO INCF QQ,F _GO MOVF QQ,W XORLW 01H ;如果QQ到1 BTFSC STATUS,Z ;则跳至FIE,不 GOTO FIE ;再减一操作 BTFSS PORTC,1 ;脉宽减检测 DECF QQ,F FIE ; BTFSS INTCON,T0IF ;检测是否是TMR0溢出 RETFIE ;否,则返回 BCF INTCON,T0IF ;是,马上清标志位 BSF PORTC,7 ;脉宽调整 MOVF QQ,W CALL DELAY ;RB1 一开一关, BCF PORTC,7 ;形成高电平占空比 RETFIE ;**********主程序******************* MAIN BSF STATUS,RP0 MOVLW
B'00000100' ;设TMR0为定时器 MOVWF OPTION_REG ;分频比为1:32 BCF TRISC,7 ;设RC7输出 BSF TRISC,1 ;设RC0输入 BSF TRISC,0 ;设RC1输入 BCF STATUS,RP0 BSF INTCON,GIE ;INTCON在4个体均能寻址 BSF INTCON,T0IE BCF INTCON,T0IF ;清标志位 MOVLW 00H MOVWF TMR0 ;启动TMR0 CLRF QQ ;清QQ LOOP NOP ;在此循环等TMR0溢出 GOTO LOOP ;则转到中断服务程序 ;*******高电平延时子程序**************
DELAY MOVWF Y1 M2 MOVLW 0AH MOVWF Y2 M1 DECFSZ Y2 GOTO M1 DECFSZ Y1
GOTO M2 RETURN ;*********************************** END