📄 ex7-6.asm
字号:
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2寄存器定义文件
;定义常量
;pulse_width_MAX = pulse_width_MIN 时, 输出脉冲宽度不变。
pulse_width_MAX EQU 0F0H ;PWM 脉宽最大值, 占空比 = 93.75%
pulse_width_MIN EQU 10H ;PWM 脉宽最小值, 占空比 = 6.25%
step EQU 38H ;PWM 脉宽变化步长
;定义变量
pulse_width EQU 30H
ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP, #70H
MOV CMOD, #80H ;PCA 在空闲模式下停止 PCA 计数器工作
;PCA 时钟模式为fOSC/12,禁止 PCA 计数器溢出中断
MOV CCON, #00H ;禁止PCA计数器工作,清除中断标志、计数器溢出标志
MOV CL, #00H ;清0计数器
MOV CH, #00H
;设置模块0为8位PWM输出模式,脉冲在P1.3引脚输出
MOV CCAPM0, #42H
MOV PCA_PWM0, #00H
; MOV PCA_PWM0, #03H ;释放本行注释, PWM 输出就一直是 0, 无脉冲。
SETB CR ;将PCA 计数器打开
MAIN_LOOP:
LCALL PWMOUT
LJMP MAIN_LOOP
;------------------------------------------------------------
PWMOUT: ;可以使用示波器观察P1.3的波形
;如果P1.3连接一个LED,则连接到P1.3的LED逐渐变亮
MOV A, #pulse_width_MIN ;为输出脉冲宽度设置初值
MOV pulse_width, A ;pulse_width数字越大脉宽越窄,LED越亮
PWM_LOOP1:
MOV A, pulse_width ;判是否到达最大值
CLR C
SUBB A, #pulse_width_MAX
JNC PWM_A ;到达最大值就转到逐渐变暗
MOV A, pulse_width ;设置脉冲宽度。数字越大,脉宽越窄,LED越亮
MOV CCAP0H, A ;核心语句
MOV CCAP1H, A ;核心语句
MOV A, pulse_width ;计算下一次输出脉冲宽度数值
ADD A, #step
MOV pulse_width, A
LCALL DELAY ;在一段时间内保持输出脉冲宽度不变
LJMP PWM_LOOP1
PWM_A:
;如果P1.3连接一个LED,连接到P1.3的LED逐渐变暗
MOV A, #pulse_width_MAX ;为输出脉冲宽度设置初值
MOV pulse_width, A ;pulse_width 数字越大脉宽越窄,LED越亮
PWM_LOOP2:
MOV A, pulse_width ;判是否到达最小值
CLR C
SUBB A, #pulse_width_MIN
JC PWM_B ;到达最小值就返回。
JZ PWM_B ;到达最小值就返回。
MOV A, pulse_width ;设置脉冲宽度。数字越大、脉宽越窄,LED 越亮
MOV CCAP0H, A ;核心语句
MOV CCAP1H, A ;核心语句
MOV A, pulse_width ;计算下一次输出脉冲宽度数值
CLR C
SUBB A, #step
MOV pulse_width, A
LCALL DELAY ;在一段时间内保持输出脉冲宽度不变
LJMP PWM_LOOP2
PWM_B:
RET
DELAY: ;延时子程序
CLR A
MOV R1, A
MOV R2, A
MOV R3, #80H
DELAY_LOOP:
NOP
NOP
NOP
DJNZ R1, DELAY_LOOP
DJNZ R2, DELAY_LOOP
DJNZ R3, DELAY_LOOP
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -