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

📄 a7960.dt

📁 这是一款自动皂液器的控制程序
💻 DT
字号:
;客  户:奥利奇
;适用机型:A7980
;软体版本:02
;开发日期:2008-2-26 14:25
;版  权:美德斯电子有限公司所有
;修改内容:按键选择次数为1-4次(01版本为1-8次)
         ; 马达间隔工作时间为0.5秒(01版本为1秒) 
;技术核心:自动感应供皂器,采用先进的编码方式,低功耗芯片使本电路板功能相当完善,能满足各种场合使用
	 ; 马达每次工作时间为1秒
	 ; 低电压报警为4.2V
	 ; 马达工作时闪绿灯,低电压报警时闪红灯,每2秒闪一次,闪0.5秒          
;----------------------------------------------------------
R0			==	0X0
R1			==	0X1
PC			==	0x2
R3			==	0X3
R4			==	0X4
P5 			==	0x5
P6			==	0x6
iocb			==	0xb
IOCD			==	0XD
IOCE			==	0XE
time_ms			==	0x19
time_jian_ge		==	0x1d
key_time		==	0x1e
motor_count		==	0x1f
motor_count1		==	0x20
out_flag		==	0x21
;----------------------------------------------------------
;out_flag,0=按键指示灯的标志
;----------------------------------------------------------
led_count		==	0x22
time_led		==	0x23
low_led			==	0x24
key_count		==	0x25
error_count		==	0x26
clr_count		==	0x27
time_100ms		==	0x28
time_motor		==	0x29
time_check		==	0x2a
time_200ms		==	0x2b
key_flag		==	0x2c
;----------------------------------------------------------
;key_flag,0=发射的标志(0为发射,1为停止)
;key_flag,1=第一次检测有反射的标志
;key_flag,2=两次检测间隔200ms到了的标志
;key_flag,3=一直有反射的标志
;key_flag,4=马达输出的标志
;key_flag,5=电压低的标志
;key_flag,6=红灯亮的标志
;key_flag,7=
;----------------------------------------------------------
fashe_count		==	0x2d
a_buf			==	0x2e
r3_buf			==	0x2f
;----------------------------------------------------------
			ORG	0x000
RESET:			JMP	Main
			
			ORG	0X08
			jmp	int_153
;----------------------------------------------------------
;			RAM CLR
;----------------------------------------------------------
RAM_CLR:		MOV	A,@0X10
			MOV	r4,A
CLR_LOOP:		mov	a,@0x0
			mov	r0,a
			INC	r4
			MOV 	A,r4
			and	a,@0x2f
			xor	a,@0x2f	;判断是否到了3eh
			JBS	r3,2
			JMP	CLR_LOOP
			RET			
;==========================================================
;			Main Program
;==========================================================
Main:			disi
			clr	p5
			clr	p6
			mov	a,@0xc
			iow	p5
			mov	a,@0x5a
			iow	p6
			mov	a,@0xbf		
			iow	iocd		;p6.6有上拉
			;----------------------------------
			;以上为i/o设置
			;----------------------------------
			call	ram_clr			;清ram
			MOV	A,	@0X80
			iow	ioce			;开watchdog
			MOV	A,	@0X6
			MOV	R1,	A		;置计数器初值
			MOV	A, 	@0X01
			IOW	0X0F
			MOV	A,	@0X42		;8分频
			CONTW
			eni
			bs	p5,1
			bs	p6,5
			bs	p6,7			;开机亮一次红灯
			bs	key_flag,6
			;----------------------------------
			mov	a,@0x64
			mov	time_200ms,a		;每200ms发射一次
			mov	time_check,a		;两次检测间隔时间
			mov	a,@0x32
			mov	time_100ms,a		;马达工作时间
			mov	a,@0x12
			mov	time_motor,a		;马达工作时间1
			mov	a,@0x66
			mov	clr_count,a		;0x66次检测不到表示无反射
			mov	a,@0xa
			mov	error_count,a		;两次检测间隔之间再检测到10次表次解码错误
			mov	a,@0x1e
			mov	low_led,a		;低电压红灯闪的间隔时间
			mov	a,@0x3
			mov	time_led,a		;红灯亮的时间
			mov	a,@0x5
			mov	key_time,a		;按键指示间隔时间
			mov	a,@0x1
			mov	motor_count,a
			mov	motor_count1,a		;马达工作次数
			mov	led_count,a
			mov	a,@0x15
			mov	time_jian_ge,a
;----------------------------------------------------------
;			主程序
;----------------------------------------------------------
loop:			
			call	fashe
			call	key_check
			call	low_power
			wdtc
			jmp	loop
;----------------------------------------------------------
;			按键
;----------------------------------------------------------
key_check:
			jbc	key_flag,3
			ret				;有反射时禁止按键
			jbc	key_flag,7
			jmp	check_over		;按键闭合没有松开跳结束
			jbc	p6,6
			ret				;无键闭合结束
			inc	key_count
			jbs	key_count,4
			ret				;防抖
			clr	key_count
			bs	key_flag,7		;置有键闭合的标志
			
			bs	out_flag,0		;置需要按键指示的标志
			mov	a,@0x1e
			mov	low_led,a		;低压指示在完成按键指示后3秒再工作
			
			mov	a,motor_count1
			xor	a,@0x4			;按键选择是否达到4次
			jbc	r3,2
			jmp	check_high		;工作次数达到8次跳
			inc	motor_count1		;加1
			mov	a,motor_count1
			mov	motor_count,a		;用于马达工作计数
			mov	led_count,a		;用于按键指示计数
			jmp	check_over
check_high:
			mov	a,@0x1
			mov	motor_count,a
			mov	motor_count1,a
			mov	led_count,a		;超过4次重置1
check_over:
			jbc	p6,6			;按键是否松开
			bc	key_flag,7
			ret			
;----------------------------------------------------------
;			低电压检测
;----------------------------------------------------------
low_power:
			jbc	key_flag,3
			ret				;有反射时不检测
			jbc	key_flag,7
			ret				;有按键工作时不检测
			jbc	out_flag,0
			ret				;按键指示工作时不检测
			
			jbs	p6,4
			jmp	high
			bs	key_flag,5		;置电压低的标志
			ret
high:
			bc	key_flag,5		;清电压低的标志
			ret						
;----------------------------------------------------------
;			发射
;----------------------------------------------------------
fashe:
			jbc	key_flag,0
			ret
			bs	key_flag,0
			mov	a,@0x9a
			mov	fashe_count,a
fashe_loop:		
			bc	p6,0
			nop			;1
			nop			;2
			nop			;3
			nop			;4
			nop			;5
			nop			;6
			nop			;7
			nop			;8
			nop			;9
			nop			;10
			nop			;11
			nop			;12
			bs	p6,0
			nop			;1
			nop			;2
			nop			;3
			nop			;4
			nop			;5
			nop			;6
			nop			;7
			nop			;8
			nop			;9
			djz	fashe_count		
			jmp	fashe_loop
			ret																																												
;----------------------------------------------------------
;			中断2ms						
;----------------------------------------------------------									
int_153:		
			mov	a_buf,a
			swap	a_buf
			swapa	r3
			mov	r3_buf,a
			CLR	0X0F
			MOV	A,	@0x6
			add	a,r1		;置计数器初值
			
			;----------------------------------	
			djz	time_200ms
			jmp	int_0						
			bc	key_flag,0			;间隔200ms发射一次
			mov	a,@0x64
			mov	time_200ms,a	
			;----------------------------------		
int_0:								
			djz	time_100ms
			jmp	int_1
			mov	a,@0x32
			mov	time_100ms,a			;0.1s
			;---------------------------------
			jbs	key_flag,6
			jmp	int_low
			djz	time_led
			jmp	int_low
			bc	p6,7				;灭红灯
			bc	key_flag,6			;清灯亮的标志
			mov	a,@0x3
			mov	time_led,a			;重置时间,0.3s
			;----------------------------------
int_low:
			jbc	key_flag,3
			jmp	int_motor			;有反射时不做低电压指示
			jbc	key_flag,7
			jmp	int_key				;有按键按下时不做低电压指示
			jbc	out_flag,0
			jmp	int_key				;有按键指示时不做电压指示
			
			jbs	key_flag,5
			jmp	int_key				;没的低电压不指示
			djz	low_led
			jmp	int_key				;3秒计时
			bs	p6,7				;亮红灯
			bc	p5,0
			bs	key_flag,6			;置红灯亮的标志
			mov	a,@0x1e
			mov	low_led,a			;重置时间
int_key:		
			jbs	out_flag,0			;是否需要按键指示
			jmp	int_motor
			djz	key_time			;计时
			jmp	int_motor
			mov	a,@0x5				;重置时间
			mov	key_time,a			;间隔0.5s
			bs	key_flag,6			;置红灯亮的标志
			bc	p5,0
			bs	p6,7				;按键指示亮红灯
			djz	led_count			;按键次数计数
			jmp	int_motor
			bc	out_flag,0			;完了清需要指示的标志
				
int_motor:		
			jbs	key_flag,3
			jmp	int_motor1			;没有反射时不做再次工作的计数
			djz	time_jian_ge
			jmp	int_motor1			;间隔计时
			mov	a,@0x15
			mov	time_jian_ge,a			;重置时间
			mov	a,motor_count
			and	a,@0xff
			jbc	r3,2
			jmp	int_motor1			;马达工作次数是否为0
			dec	motor_count
			
			bs	p6,2				;马达输出
			bs	key_flag,4			;置马达输出的标志
			
			bs	p5,0
			bc	p6,7				;亮灯
			
int_motor1:	
			jbs	key_flag,4			;马达输出
			jmp	int_1
			djz	time_motor			;计时
			jmp	int_1
			mov	a,@0x12
			mov	time_motor,a			;重置马达工作时间
			bc	key_flag,4			;清马达工作的标志
			bc	p6,2				;关闭马达
			bc	p5,0				;关闭马达工作指示灯
			;----------------------------------
int_1:								;第二次解码
			jbc	key_flag,3
			jmp	int_3				;马达一直工作不做第二次检测
			jbs	key_flag,1
			jmp	int_3				;第一次没有检测到或没有检测跳第一次检测处
			jbs	key_flag,2
			jmp	int_4				;没有到第二次检测的时间跳
			jbc	p5,3				;第二次检测
			jmp	int_5				;没有检测到跳
			bc	key_flag,1
			bs	key_flag,3			;一直有反射的标志
			
			bs	p6,2				;马达输出
			bs	key_flag,4			;置马达输出的标志
			
			bc	out_flag,0			;马达输出时清除按键指示
			mov	a,motor_count1
			mov	motor_count,a			;重置马达工作次数
			dec	motor_count
			mov	a,@0x16
			mov	time_jian_ge,a			;第一次时间要长一点
			bs	p5,0
			bc	p6,7
			jmp	int_6	
int_3:								;第一次解码
			jbc	p5,3				;第一次检测
			jmp	int_5
			bs	key_flag,1			;第一次检测到的标志
			mov	a,@0x66
			mov	clr_count,a
			mov	a,@0xa
			mov	error_count,a
int_4:								;两次间隔计时
			jbs	key_flag,1			
			jmp	int_6				;第一次无反射跳	
			djz	time_check
			jmp	int_6				;时间没有到跳
			bs	key_flag,2
			mov	a,@0x64
			mov	time_check,a
			jmp	int_6			
int_5:			
			djz	clr_count
			jmp	int_6
			bc	p6,2				;无反射,关闭马达
			bc	p5,0
			
			bc	key_flag,1			;清检测到第一次的标志
			bc	key_flag,2			;清第二次时间到的标志
			bc	key_flag,3			;清一直有反的标志
			bc	key_flag,4			;清马达输出的标志
			mov	a,@0x66
			mov	clr_count,a			;无反射计数器重置
			mov	a,@0x64
			mov	time_check,a			;间隔检测重置
			mov	a,@0x32
			mov	time_100ms,a		
			mov	a,@0x12
			mov	time_motor,a			;马达工作时间重置
int_6:			
			jbs	key_flag,1
			jmp	int_7
			jbc	key_flag,2
			jmp	int_7
			jbc	p5,3				;除错检测
			jmp	int_7
			djz	error_count
			jmp	int_7
			
			bc	key_flag,1
			bc	key_flag,2
			bc	key_flag,3
			bc	key_flag,4
			mov	a,@0x66
			mov	clr_count,a
			mov	a,@0x64
			mov	time_check,a
			mov	a,@0x32
			mov	time_100ms,a
			mov	a,@0x12
			mov	time_motor,a
			mov	a,@0xa
			mov	error_count,a
int_7:																													
int_over:		
			swapa	r3_buf
			mov	r3,a
			swapa	a_buf
			reti
			end		

⌨️ 快捷键说明

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