/********************CCU_Capture.asm***************************
;程序功能:对一方波的每一次电平跳变进行捕获,并用捕获值计算方波
的脉冲宽度,占空比,周期或其他。
;************************************************************/
$NOMOD51
$INCLUDE(REG932.INC)
ICRAH_DAT1 DATA 41H ;第一次捕获值高字节
ICRAL_DAT1 DATA 42H ;第一次捕获值低字节
ICRAH_DAT2 DATA 43H ;第二次捕获值高字节
ICRAL_DAT2 DATA 44H ;第二次捕获值低字节
ICRAH_DAT3 DATA 45H ;第三次捕获值高字节
ICRAL_DAT3 DATA 46H ;第三次捕获值低字节
CAP_FLAG1 BIT 10H ;第一次捕获标志位
CAP_FLAG2 BIT 11H ;第二次捕获标志位
KEY BIT P0.0
ORG 0000H
AJMP MAIN
ORG 005BH
AJMP CCU_ISR
;---------------------------------------
;功能:主函数
;---------------------------------------
ORG 0080H
MAIN:
MOV P2M1,#40H ;端口设置
MOV P2M2,#40H
MOV ICRAL_DAT1,#00H
MOV ICRAH_DAT1,#00H
MOV ICRAL_DAT2,#00H
MOV ICRAH_DAT2,#00H
MOV ICRAL_DAT3,#00H
MOV ICRAH_DAT3,#00H
MAIN_LOOP:
JB KEY,$ ;等待按键
JNB KEY,$ ;等待按键松开
ACALL INI_CCU ;初始化CCU并设置中断
ACALL DISP ;将捕获的值输出显示
SJMP MAIN_LOOP
RET
;--------------------------------------
;功能:CCU初始化
;--------------------------------------
INI_CCU:
MOV TOR2H,#00H ;设置CCU重装高字节
MOV TOR2L,#00H ;设置CCU重装低字节
MOV TPCR2H,#00H ;设置CCU预分频控制器
MOV TPCR2L,#5
MOV CCCRA,#10H ;设置捕获比较A通道工作方式,为上升沿捕获
MOV TICR2,#81H ;设置CCU中断使能控制器
SETB ECCU ;开CCU中断
SETB EA ;开所有中断
MOV TCR20,#00000001B ;设置CCU工作方式,递增记数
RET
;--------------------------------------
;功能:CCU中断服务程序
;--------------------------------------
CCU_ISR:
CLR EA
MOV A,TISE2
ANL A,#07H
CJNE A,#07H,CAP ;判断是否是CCU定时器中断
ANL TIFR2,#7FH ;是则清TIFR2(中断标志位)为0
MOV A,TISE2
CAP: CJNE A,#06H,INTS_CEXT ;判断是否为输入捕获事件A的中断,不是则退出
JB CAP_FLAG1,CAP2 ;判断是第二次中断么,是则跳
;------------------
CAP1:
PUSH ACC
MOV A,ICRAL
MOV ICRAL_DAT1,A
MOV A,ICRAH
MOV ICRAH_DAT1,A
SETB CAP_FLAG1 ;第一次捕获中断完成
MOV CCCRA,#00H ;设置捕获比较A通道工作方式,为下降沿捕获
POP ACC
AJMP INTS_CEXT
;------------------
CAP2:
PUSH ACC
JB CAP_FLAG2,CAP3 ;判断是第三次中断么?是则跳到CAP3。
MOV A,ICRAL ;保存第二次捕获的值
MOV ICRAL_DAT2,A
MOV A,ICRAH
MOV ICRAH_DAT2,A
SETB CAP_FLAG2 ;第二次捕获中断完成
MOV CCCRA,#10H ;设置捕获比较A通道工作方式,为上升沿捕获
POP ACC
AJMP INTS_CEXT
;-------------------
CAP3:
MOV TCR20,#00H ;停止CCU定时器计数
PUSH ACC
MOV A,ICRAL ;保存第三次捕获的值
MOV ICRAL_DAT3,A
MOV A,ICRAH
MOV ICRAH_DAT3,A
CLR CAP_FLAG1 ;清除捕获完成位
CLR CAP_FLAG2
POP ACC
; AJMP INTS_CEXT
;--------------------
INTS_CEXT:
MOV TIFR2,#00H ;捕获中断标志位清0
SETB EA
RETI
;-------------------------------------
;功能:请在这里添加您的数据处理程序
;-------------------------------------
DISP:
;...... 这里请添加你自己的语句,例 高电平脉宽=(ICRAH_DAT2,ICRAL_DAT2)-(ICRAH_DAT1,ICRAL_DAT1)
;...... 对得到的数据进行处理,获取所需的值
;...... 并显示或者传送给上位机
RET
;-------------------------------------
END
;****************************************************************
上一篇:善用微处理器简化电源供应器设计
下一篇:基于P87C591单片机的信号采集节点的设计
推荐阅读最新更新时间:2024-03-16 15:59