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

📄 pwm_pulse.asm

📁 对一方波的每一次电平跳变进行捕获
💻 ASM
字号:
/********************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	
;****************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -