alanma 发表于 2024-3-10 20:54:41

STC8H4K64的PWM不能关闭输出?

本帖最后由 alanma 于 2024-3-10 21:02 编辑

代码如下,用定时器中断控制PWM(P2.0)间歇输出,但是不能关闭,不知道什么原因?那位老师指导下


;******************************************/

$include (/STC8H.INC)

;====================
STACK_POIRTER   EQU   0D0H    ;堆栈开始地址

;*************本地变量声明    **************/
PWM1_Flag       BIT   20H.0
PWM1_Duty_H   DATA    30H
PWM1_Duty_L   DATA    31H
INT_TIME BIT 20H.1

;*******************************************************************
;*******************************************************************
      ORG   0000H               ;reset
      LJMP    F_Main

      ORG   000BH               ;1Timer0 interrupt
      LJMP    F_Timer0_Interrupt

;******************** 主程序 **************************/
      ORG   0100H       ;reset
F_Main:
    ORL   P_SW2, #080H    ;扩展寄存器(XFR)访问使能

    MOV   P0M0,#07H                   ;设置P0.3为高阻输入,P0.0-0.2为推挽输出
    MOV   P0M1,#08H
    MOV   P1M0,#01H                  ;设置P1.0为推挽输出模式,P1.1,P1.3,P1.4,P1.6,P1.7为高阻输入
    MOV   P1M1,#0DAH
    MOV   P2M0,#07H                   ;设置P2.0~P2.2为推挽输出
    MOV   P2M1,#00H
    MOV   P3M0,#08H                  ;设置P3
    MOV   P3M1,#00H
    MOV   P4M0,#00H                  
    MOV   P4M1,#00H
      MOV   P5M0,#10H                  ;设置P5.4为推挽输出
    MOV   P5M1,#00H
    MOV   SP, #STACK_POIRTER
    MOV   PSW, #0
    USING   0       ;选择第0组R0~R7
   
    MOV   SP, #STACK_POIRTER
    MOV   PSW, #0
    USING   0       ;选择第0组R0~R7
                        
      CLR P3.6;测试用

;================= 用户初始化程序 ====================================
    CLR   PWM1_Flag

    MOV   PWM1_Duty_L, #0
    MOV   PWM1_Duty_H, #0

    CLR   TR0

      MOV TMOD,#00000001B       ;置T1为方式1,16位自动重载定时方式,置T0为方式1,16为不自动重载定时方式,         
       MOV TL1,#0C0H               ;T1定时20ms
      MOV TH1,#063H
      MOV TL0,#0E0H            ;定时10mS常数
      MOV TH0,#0B1H
      SETB ET0                                                                        
                SETB TR0
      SETB EA                   ;开中断
      
    LCALL   F_PWM_Init          ; PWM初始化

;=================== 主循环 ==================================
L_Main_Loop:

    LJMP    L_Main_Loop

;========================================================================
; 函数: F_PWM_Init
; 描述: PWM初始化程序.
; 参数: none
; 返回: none.
; 版本: V1.0, 2021-3-3
;========================================================================
F_PWM_Init:
    CLR   A                   ;写 CCMRx 前必须先清零 CCxE 关闭通道
    MOV   DPTR,#PWMA_CCER1
    MOVX    @DPTR,A

      
    MOV   A,#068H             ;设置 PWMx 模式1 输出
    MOV   DPTR,#PWMA_CCMR1
    MOVX    @DPTR,A

      
    MOV   A,#03H             ;配置通道输出使能和极性
    MOV   DPTR,#PWMA_CCER1
    MOVX    @DPTR,A

    MOV   A,#3                ;设置周期时间
    MOV   DPTR,#PWMA_ARRH
    MOVX    @DPTR,A
    MOV   A,#0FFH
    MOV   DPTR,#PWMA_ARRL
    MOVX    @DPTR,A

    MOV   A,#01H             ;使能 PWM1P 输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A
   
    MOV   A,#01H            ;高级 PWM 通道输出脚选择位, P2.0为01H,P1.0为00H
    MOV   DPTR,#PWMA_PS
    MOVX    @DPTR,A

   MOV   A,#080H             ;使能主输出
    MOV   DPTR,#PWMA_BKR
    MOVX    @DPTR,A

    MOV   DPTR,#PWMA_CR1
    MOVX    A,@DPTR
    ORL   A,#01H            ;开始计时
    MOVX    @DPTR,A      
   
    RET

;========================================================================
; 函数: F_UpdatePwm
; 描述: 更新PWM占空比值.
; 参数: : pwm占空比值.
; 返回: none.
; 版本: V1.0, 2021-3-3
;========================================================================
F_UpdatePwm:
    MOV   A, PWM1_Duty_H      ;设置占空比时间
    MOV   DPTR, #PWMA_CCR1H
    MOVX    @DPTR, A
    MOV   A, PWM1_Duty_L
    MOV   DPTR, #PWMA_CCR1L
    MOVX    @DPTR, A

    RET

;**************** 中断函数 ***************************************************
F_Timer0_Interrupt: ;Timer0 1ms中断函数
    PUSH    PSW   ;PSW入栈
    PUSH    ACC   ;ACC入栈
   
      CLR TR0
    MOV      TL0,#00H      ;T0定时10毫秒
    MOV      TH0,#00H
      
      CPL INT_TIME
      MOV C,INT_TIME
      JCF_INT2
      
    MOV   A,#0H             ;关闭PWM输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A            
      NOP
      NOP
      CLR P2.0                  ;输出脚拉低      
      
    JMP INT_END
      
      
F_INT2:
      
      MOV   A,#01H             ;使能 PWM1P 输出
    MOV   DPTR,#PWMA_ENO
    MOVX    @DPTR,A
    JMP INT_END

F_QuitTimer0:
    LCALL   F_UpdatePwm
      INT_END:
      SETB TR0
    POP   ACC   ;ACC出栈
    POP   PSW   ;PSW出栈
    RETI


;======================================================================

    END

页: [1]
查看完整版本: STC8H4K64的PWM不能关闭输出?