|
本帖最后由 alanma 于 2024-3-20 10:33 编辑
有没有老师指导下?SET8H4K的P1.0的PWM输出,但是每次PWM输出的时候,数码管的共阳COM2(P2.2)会闪烁点亮,已经排除硬件短路等问题,原因一直没找到,PWM配置的是单独的输出,数码管为共阳的三位数码管,即使把数码管全部设置为没有输出,PWM输出的时候,数码管仍然会有部分笔画闪烁显示;PWM和数码管配置,以及PWM输出控制代码如下,
;========================================================================
; 函数: F_PWM_Init
; 描述: PWM初始化程序.
;========================================================================
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,#2EH ;设置PWM频率=SYSCLK/(PWMx_PSCR+1)X(PWMx_ARR+1)=2kHz (PWMx_PSCR=0
MOV DPTR,#PWMA_ARRH
MOVX @DPTR,A
MOV A,#0E0H
MOV DPTR,#PWMA_ARRL
MOVX @DPTR,A
MOV A,#00H ;使能 PWM1P 输出 ;初始化不输出PWM,=01输出
MOV DPTR,#PWMA_ENO
MOVX @DPTR,A
MOV A,#00H ;高级 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
MOV PWM1_Duty_L, #0FFH ;占空比50%
MOV PWM1_Duty_H, #15H ;数值越大,占空比越大,=20占空比70%,=14占空比44%,=17占空比50%
;========================================================================
; 函数: F_UpdatePwm
; 描述: 更新PWM占空比值.
; 参数: [PWMn_Duty_H PWMn_Duty_L]: pwm占空比值.
;========================================================================
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
;=======================
HEAT:
MOV A,TEMP_STATE ;判断加热状态,1为加热,0为不加热
JZ F_INT0
CLR C
MOV A,FLAG_TEMP
SUBB A,#60 ;设定小于50度关闭输出
JC F_INT0
CLR C
MOV A,FLAG_TEMP
SUBB A,TEMP_NUB
JNC F_INT1
INC TEMP_DOWN_DATA ;连续5次温度值高于设定值才关闭,补偿温度不足的问题
MOV A, TEMP_DOWN_DATA
CJNE A,#8,INT_END
MOV TEMP_DOWN_DATA ,#0H
F_INT0:
MOV A,#0H ;关闭PWM输出
MOV DPTR,#PWMA_ENO
MOVX @DPTR,A
NOP
NOP
CLR P1.0 ;输出脚拉低
RET
F_INT1:
MOV A,#01H ;使能 PWM1P 输出
MOV DPTR,#PWMA_ENO
MOVX @DPTR,A
INT_END:
RET
;======================================================
DSPLAY_Init:
MOV DPTR,#P2DR ;P2DR地址0FE2AH
MOV A,#07H
MOVX @DPTR,A ; 设置P2.0-2.2强电流输出
MOV DPTR,#COMEN ;
MOV A,#07H
MOVX @DPTR,A ; //允许3个CO
MOV DPTR,#SEGENL ;//允许0个SEG 低字节
MOV A,#0H
MOVX @DPTR,A
MOV DPTR,#SEGENH ;//允许8个SEG 高字节
MOV A,#0FFH
MOVX @DPTR,A
MOV DPTR,#LEDCTRL ;/B7=1: ON, B5 B4: 0共阴, 1共阳, 2共阴共阳, 3保留, B2 B1 B0: 0占空比100%, 1~7占空比7/8~1/8
MOV A,#011H
MOVX @DPTR,A
MOV DPTR,#LEDCKS //数码管COM扫描显示的主频时钟数 = 160*9*LEDCKS, 每个COM显示时间=1440*LEDCKS/fosc(MHz) us, COM扫描频率=fosc/(1440*LEDCKS *COM数).
MOV A,#08H //例如 fosc = 11.0592MHz, 8个COM, LEDCKS = 8, 则每个COM显示时间=1440*8/11.0592 = 1042 us, COM扫描频率=11059200/(1440*8*8)=120Hz.
MOVX @DPTR,A //已知扫描时间t(us)计算 LEDCKS = t*fosc(MHz)/1440, 比如fosc = 24MHz, 要求1个COM扫描1ms, 则 LEDCKS = 1000*24/1440 = 16.7, 取整数17.
RET
|
|