PWM输出影响数码管
本帖最后由 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占空比值.
; 参数: : 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为不加热
JZF_INT0
CLR C
MOV A,FLAG_TEMP
SUBB A,#60;设定小于50度关闭输出
JCF_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
排除法,先单独测试数码管
国学芯用 发表于 2024-3-20 10:24
排除法,先单独测试数码管
只要不开PWM,数码管都是正常显示的 本帖最后由 STCAI-32位8051 于 2024-3-21 17:33 编辑
汇编太难了。。。
补充说明下,我把数码管的所有寄存器清零后,
开启PWM输出后,仍然有笔画闪烁输出,
但是我把数码管的电源关闭掉(LEDCTRL的B7=0)后,
闪烁的数码管笔端才没有闪烁点亮,
PWM对应的管脚为P1.0,
对应的闪烁笔段的COM口为P2.2,对应的SEG口为P0.0
你这还是不用 仿真器查你程序错在哪的问题 !
用 仿真器 深入进去,看你程序错在哪的手段:
单步运行,运行到光标处,运行到断点
仿真STC8,STC-USB Link1D支持STC32/STC8仿真及下载 !视频讲解 - 仿真/编译器/头文件 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区 (stcaimcu.com)
李鑫发 发表于 2024-3-20 13:45
汇编太难了。。。
北京化工大学,何宾教授亲自主讲,STC创始人主持授课,正统权威。从第24集到第30集专业讲解:汇编语言程序设计,可以跟着视频一起学习{:handshake:}
【新提醒】视频教学:《STC32位8051单片机原理及应用》,何宾教授主讲 - 视频教学,《单片机原理及应用》教学改革及实践研讨会,实战技术交流会,会务通知 - 国芯论坛-STC全球32位8051爱好者互助交流社区 - STC全球32位8051爱好者互助交流社区https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3355&extra=page%3D1
附件提供一份数码管显示同时PWMA端口输出PWM脉冲例子,这两个功能不会相互干扰。
演示效果:
参考程序:
STCAI-32位8051 发表于 2024-3-21 10:16
北京化工大学,何宾教授亲自主讲,STC创始人主持授课,正统权威。从第24集到第30集专业讲解:汇编语言程 ...
这两天抽空也要去看一下汇编了 神农鼎 发表于 2024-3-21 10:02
你这还是不用 仿真器查你程序错在哪的问题 !
用 仿真器 深入进去,看你程序错在哪的手段:
单步运行,运行 ...
仿真过,单步仿真几十个循环,都没有这个现象,怪就怪在这里,程序自己运行的时候就有{:5_271:}
页:
[1]
2