⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex7-6.asm

📁 《增强型8051单片机实用开发技术》例程代码
💻 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 + -