找回密码
 立即注册
查看: 95|回复: 0

STC8H4K64的PWM不能关闭输出?

[复制链接]

该用户从未签到

14

主题

33

回帖

202

积分

中级会员

积分
202
发表于 2024-3-10 20:54:41 | 显示全部楼层 |阅读模式
本帖最后由 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               ;1  Timer0 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占空比值.
; 参数: [PWMn_Duty_H PWMn_Duty_L]: 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
        JC  F_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

回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-2 07:10 , Processed in 0.050781 second(s), 28 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表