📄 ex7-8.asm
字号:
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2寄存器定义文件
CH1_5MS_H EQU 03H ;PCA模块1 5ms定时常数高位
CH1_5MS_L EQU 00H ;PCA模块1 5ms定时常数低位
T0_1 EQU 0F6H ;T0重装数值1
T0_2 EQU 0ECH ;T0重装数值2
PWM_WIDTH EQU 0FFH ;数字越大脉宽越窄,占空比越小
PWM_PULSE_WIDTH EQU 0FFH ;数字越大脉宽越窄(占空比越小)
COUNTER EQU 30H ;声明一个计数器,用来计数中断的次数
LED_5MS EQU P1.6 ;5毫秒指示灯
LED_1S EQU P1.5 ;1秒钟指示灯
ORG 0000H
LJMP MAIN
ORG 003BH ;PCA中断入口地址
LJMP PCA_ISR
ORG 0060H
MAIN:
MOV SP, #70H ;设置堆栈指针
MOV COUNTER, #100 ;设置COUNTER计数器初值
;初始化PCA模块
MOV CMOD, #10000100B ;PCA 在空闲模式下停止 PCA 计数器工作
;PCA时钟源为定时器0的溢出,禁止PCA计数器溢出时中断
MOV CCON, #00H ;清0 PCA计数器溢出中断请求标志位CF
;CR = 0, 不允许 PCA 计数器计数,清0 PCA各模块中断请求标志位CCFn
MOV CL, #00H ;清0 PCA 计数器
MOV CH, #00H
;设置模块0为 8 位 PWM 输出模式, PWM无需中断支持。脉冲在P1.3引脚输出
MOV CCAPM0, #42H ;设置模块0为8位PWM输出模式
MOV PCA_PWM0, #00H ;清0 PWM 模式下的第9位
MOV CCAP0H, #PWM_PULSE_WIDTH ;设置脉冲宽度
;设置 PCA 模块1
MOV CCAP1L, #CH1_5mS_L ;给PCA模块1的CCAP1L置初值
MOV CCAP1H, #CH1_5mS_H ;给PCA模块1的CCAP1H置初值
MOV CCAPM1, #49H ;设置PCA模块1为16位软件定时器
;ECCF1=1, 允许PCA模块1中断
;当[CH,CL]=[CCAP1H,CCAP1L]时,产生中断请求,CCF1=1,请求中断
SETB EA ;开整个单片机所有中断共享的总中断控制位
SETB CR ;启动PCA计数器[CH,CL]计数
;初始化T0, 其溢出脉冲作PCA计数器(CH,CL)的时钟源
MOV TMOD, #02H ;设置定时器0 为自动重装工作模式
MOV TH0, #T0_1
MOV TL0, #T0_1
SETB TR0 ;启动定时器0
MAIN_LOOP:
MOV TH0, #T0_1 ;T0溢出率时间常数
MOV TL0, #T0_1
MOV A, #PWM_WIDTH ;装入脉冲宽度
MOV CCAP0H, A
LCALL DELAY
;T0溢出率变低后定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
MOV TH0, #T0_2 ;修改T0溢出率时间常数
MOV TL0, #T0_2
LCALL DELAY
;P1.3的LED较亮
MOV TH0, #T0_1 ;T0 溢出率高
MOV TL0, #T0_1
MOV A, #PWM_WIDTH
LCALL RL_A ;改变 PWM 占空比
LCALL RL_A
MOV CCAP0H, A ;数字越大,PWM占空比越小,P3.5的LED越亮
LCALL DELAY
;T0溢出率变低后定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
MOV TH0, #T0_2 ;T0溢出率低
MOV TL0, #T0_2
LCALL DELAY
MOV CCAP0H, A ;数字越大,PWM占空比越小,P3.5的LED越亮
LCALL DELAY
;连接P1.3的LED暗
MOV TH0, #T0_1 ;T0 溢出率高
MOV TL0, #T0_1
MOV A, #PWM_WIDTH
LCALL RL_A ;改变 PWM 占空比
LCALL RL_A
LCALL RL_A
LCALL RL_A
;T0溢出率变低后,定时器脉冲的LED闪烁速度变慢, 而PWM的LED亮度未改变
MOV TH0, #T0_2 ;T0 溢出率低
MOV TL0, #T0_2
LCALL DELAY
LJMP MAIN_LOOP ;循环
RL_A: ;循环右移子程序
CLR C
RRC A
RET
PCA_ISR: ;PCA中断服务程序
PUSH ACC
PUSH PSW
CPL LED_5MS ;PCA模块1每5ms中断一次,每次进中断将该灯状态取反
MOV A, #CH1_5MS_L ;给[CCAP1H,CCAP1L] 增加一个数值
ADD A, CCAP1L
MOV CCAP1L, A
MOV A, #CH1_5MS_H
ADDC A, CCAP1H
MOV CCAP1H, A
CLR CCF1 ;清PCA模块1中断标志
DJNZ COUNTER,PCA_EXIT ;检测是否中断了100 次(0.5秒)
MOV COUNTER,#100
CPL LED_1S ;在LED_1S输出脉冲宽度为 0.5 秒钟的方
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -