📄 ex7-7.asm
字号:
$INCLUDE (STC12C5A.INC) ;包含STC12C5A60S2寄存器定义文件
CCAPnL_Value EQU 28H ;fosc=20MHz时,高速脉冲输出= 125KHz
ORG 0000H
LJMP MAIN
ORG 003BH ;PCA中断入口地址
LJMP PCA_ISR
ORG 0060H
MAIN:
MOV SP, #70H ;设置堆栈指针
;PCA模块初始化
MOV CMOD, #00000010B ;CIDL = 0,PCA 计数器在空闲模式下继续工作
;PCA 计数器计数脉冲来源为系统时钟源fOSC/2
;ECF = 0,禁止PCA计数器计数溢出中断
MOV CCON, #00H ;清除PCA计数器计数溢出中断标志CF
;停止PCA计数器计数, CR=0;清除 中断标志, CCFn=0
MOV CH, #00H ;清0 PCA 计数器高8位
MOV CL, #00H ;清0 PCA 计数器低8位
;设置模块1为高速脉冲输出模式, 脉冲在P1.4引脚输出
MOV CCAPM1, #01001101B ;PCA模块1为高速脉冲输出模式,允许触发中断
MOV CCAP1L, #CCAPnL_Value ;给模块 1置初值
MOV CCAP1H, #0 ;给模块 1置初值, 此句不可少
;其它中断服务可能会使模块1高速脉冲输出的某个周期突然变得很大,因此,
;必须将PCA中断的优先级设置为唯一的最高级, 其它中断的优先级都要比它低。
MOV IPH, #01000000B ;PCA 中断的优先级设置为唯一的最高级
MOV IP, #01000000B
SETB EA ;开总中断
SETB CR ;将PCA 计数器打开
SJMP $ ;循环等待中断
PCA_ISR: ;PCA中断服务程序
PUSH ACC ;4 Clock
PUSH PSW ;4 Clock
CLR CCF1 ;1 Clock, 清PCA模块1中断标志
MOV A, #CCAPnL_Value ;2 Clock
ADD A, CCAP1L ;3 Clock
MOV CCAP1L, A ;3 Clock
CLR A ;1 Clock
ADDC A, CCAP1H ;3 Clock
MOV CCAP1H, A ;3 Clock
POP PSW ;3 Clock
POP ACC ;3 Clock
RETI ;4 Clock
;为了实现精确定时或者脉冲输出,中断服务程序的时间应该加以考虑。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -