📄 xishou.asm
字号:
/********************************************************************************
;** Copyright (c) 2004 SanDragon **
;********************************************************************************
;** Last Version : V0.9
;** Last Modify : 2004-07-31
;** ------------------------------
;** Title : 红外感应洗手器
;** Author :
;** Date : 2004-05-18
;** Purpose :
;** Sofeware : WICE2.97(ICE456)
;** Hardware : EM78P153S 内置RC振荡电路 4M
;** Note :
4V
整机 40ua
关闭发射接收 后 9ua
红外发射 20 ua
红外接收 5ua
接收处理 5ua
;** ------------------------------
;** Modify Log
;** Version - Time - Content
;********************************************************************************
;** PROGRAM START **
;********************************************************************************/
;==============================定义寄存器===========================================
;========Operational Register
INDI EQU 0x0 ; Indirect Register define
RTCC EQU 0x1 ; Timer/Counter Register define
PC EQU 0x2 ; Program counter
STAT EQU 0x3 ; EM78 status byte
; bits for STAT
C EQU 0
DC EQU 1
Z EQU 2
P EQU 3
T EQU 4
GO0 EQU 5
GP1 EQU 6
RST EQU 7
RSR EQU 0x4 ; RAM Select register define
P5 EQU 0x5 ; Port 5 I/O register
P6 EQU 0x6 ; Port 6 I/O register P63 is input only.
INTF EQU 0x0F ; Interrupt status register define
; bits for INTF
TCIF EQU 0
ICIF EQU 1
EXIF EQU 2
;========Special Purpose Register
IOC5 EQU 0X05
IOC6 EQU 0X06
IOCB EQU 0X0B
IOCC EQU 0X0C
IOCD EQU 0X0D
IOCE EQU 0X0E
IOCF EQU 0X0F
;========General Purpose Register
; bits of P5
LEDA EQU 0
LEDK EQU 1
OPENCOIL EQU 2
CLOSECOIL EQU 3
; bits of P6
ENRCV EQU 0
SENDDATA EQU 1
RCVDATA EQU 2
CHKWATER EQU 4
ANDL EQU 6 ;延时开关
ANSW EQU 7 ;手动开关
STACK_A EQU 0x10 ;Store the Value of A register when Interrupt
STACK_S EQU 0x11 ;Store STATUS register Value when Interrupt
P5OUT EQU 0x12
P6OUT EQU 0x13
FLAG EQU 0X14
;BIT OF FLAG
AUTO_F EQU 0 ;自动出水状态标志
SW_F EQU 1 ;手动出水状态标志
DELAY_F EQU 2 ;延时出水标志
REFLECT_F EQU 3 ;检测到反射信号标志
KEYPRS_F EQU 4 ;按键按下标志
TLIMITCLS EQU 5 ;限时关闭出水标志,防止重复出水
RCVWAVE_F EQU 6 ;接收到反射回的红外线标志
HVWATER_F EQU 7 ;存在水压标志
LP_CNT0 EQU 0x15
LP_CNT1 EQU 0x16
KEY_PTIMER EQU 0X17 ;按键按下计时器
KEY_CODE EQU 0X18 ;按键键值
KEY_TMP EQU 0X19 ;检测按键时临时值
RECVNUMBER EQU 0X19 ;接收脉冲计数器
WDTTIMES EQU 0X1C ;WDT唤醒次数计数
TIME180MS EQU 0X1D ;限时寄存器-0.18秒 最大限定为30s
TIME30S EQU 0X1E ;限时寄存器-0.5分
;==============================代码开始=============================================
;--------------------------------------------------------------------
;程序开始
ORG 0X000
JMP RESET
;JMP POWERON
NOP
NOP
NOP
NOP
NOP
NOP
NOP
ORG 0X008 ;Interrupt Vector
MOV STACK_A,A ;Save the value of A
SWAP STACK_A
SWAPA STAT ;Save the value of STATUS
MOV STACK_S,A
JBC INTF,TCIF ;Jump to INT_TCC, if TCC int occure.
JMP INT_TCC
JBC INTF,EXIF ;Jump to INT_EXT,if EXTERNAL int occure.
JMP INT_EXT
BC INTF,ICIF
JMP INT_RET
;--------------------------------------------------------------------
;(上电、看门狗溢出唤醒后)复位处理
RESET:
;T P DECRIPTION
;0 0 WDT wakeup from sleep
;0 1 wdt time out
;1 0 reset pin wakeup from sleep
;1 1 power on
;X X Low pulse triger on reset pin
JBS STAT,P
JMP WAKEUP
JBS STAT,T
JMP WAKEUP
JMP POWERON
;--------------------------------------------------------------------
;上电复位处理
POWERON:
WDTC
MOV A,@0X00 ;IOCE 关闭WDT P60 -> I/O
IOW IOCE
MOV A,@0 ;关闭电磁阀输出、LED输出
MOV P5OUT,A
MOV P5,A
MOV A,@0X00
IOW IOC5
MOV A,@0xFE ;关闭红外线输出、接收电路
MOV P6OUT,A
MOV P6,A
MOV A,@0XFC
IOW IOC6
CLR KEY_PTIMER
CLR WDTTIMES
CLR FLAG
CALL LIGHTON1S
JMP SLEEP ;进入睡眠程序
;--------------------------------------------------------------------
;看门狗唤醒处理
WAKEUP:
WDTC
MOV A,@0X00 ;IOCE 关闭WDT P60 -> I/O
IOW IOCE
;为了保证睡眠不浪费电,要求在程序执行中,在检测按钮和水位前打开内部上拉电阻,使用后及时关闭
;操作LED/电磁阀/接收电路/发射电路后,及时关闭这些电路(关闭状态如下:P5=0 P6.0=0 P6.1=1 )
MOV A,@0xFF ;IOCB =0(enable pull down ) - P62 P61 P60 - P52 P51 p50
IOW IOCB
MOV A,@0x00 ;IOCC =1(enable open drain) P67 P66 P65 P64 - p62 P61 P60
IOW IOCC
MOV A,@0x2F ;IOCD =0 (enable pull high) P67 P66 P65 P64 - p62 P61 P60
IOW IOCD
MOV A,@0 ;关闭电磁阀输出、LED输出
MOV P5OUT,A
MOV P5,A
MOV A,@0X00
IOW IOC5
MOV A,@0xFE ;关闭红外线输出、接收电路
MOV P6OUT,A
MOV P6,A
MOV A,@0XFC
IOW IOC6
NOP
NOP
CALL CHECKKEY ;检测按键
NOP
NOP
CALL TIMELIMITROCESS ;限时出水处理
NOP
NOP
JBC FLAG,SW_F ;手动和延时出水时不需要再发射红外线检测感应物,关闭接收电路后,直接进入睡眠状态
JMP SW_DLPROC
JBC FLAG,DELAY_F
JMP SW_DLPROC
JBS FLAG,HVWATER_F
JMP SLEEP ;无水时不再进行红外线探测
;处于自动感应状态
INC WDTTIMES ;每隔144ms*3=432mm 实测540ms
MOV A,WDTTIMES
XOR A,@3
JBS STAT,Z
JMP SLEEP
CLR WDTTIMES
NOP
NOP
CALL CHKINFRA ;检测红外线反射
NOP
NOP
/*
;test
JBC FLAG,REFLECT_F
JMP LIGHT_ON ;检测到反射
CALL LIGHTOFF
CALL DELAY1MS
CALL DELAY1MS
JMP SLEEP ; WAKEUP;
LIGHT_ON:
CALL LIGHTON
CALL DELAY1MS
CALL DELAY1MS
JMP SLEEP ; WAKEUP;
;
*/
JBC FLAG,REFLECT_F
JMP CHKREFAUTO_F ;检测到反射
;未检测到反射时处理
BC FLAG,TLIMITCLS
JBS FLAG,AUTO_F
JMP SLEEP ;在无反射又非出水条件下,直接返回到睡眠状态
JMP AUTOPROC ;在自动出水条件下,出现无反射就翻转自动出水标志和动作电磁阀
;检测到反射后处理
CHKREFAUTO_F:
JBC FLAG,TLIMITCLS
JMP SLEEP
;在有反射下,还需继续检测是否处于自动出水状态下
JBS FLAG,AUTO_F
JMP AUTOPROC ;在未自动出水条件下,出现反射就翻转自动出水标志和动作电磁阀
JMP SLEEP
;--------------------------------------------------------------------
;处于手动出水或延时出水时关闭接收电路的处理
SW_DLPROC:
BC P6OUT,ENRCV ;关闭接收电路
MOV A,P6OUT
MOV P6,A
JMP SLEEP
;--------------------------------------------------------------------
;自动出水处理
AUTOPROC:
MOV A,@0 ;设置1分钟限时
MOV TIME180MS,A
MOV A,@2
MOV TIME30S,A
JBC FLAG,AUTO_F ;切换手动出水标志
JMP AUTOTAB1
CALL LIGHTFLASH
CALL OPEN ;出水
BS FLAG,AUTO_F
JMP AUTOTAB2
AUTOTAB1:
;CALL LIGHTFLASH
CALL CLOSE ;停止出水
BC FLAG,AUTO_F
AUTOTAB2:
JMP SLEEP
;--------------------------------------------------------------------
;睡眠处理(悬空脚设为输出,关闭输入脚的上下拉电阻,使能看门狗复位)
SLEEP:
;JMP WAKEUP
;CALL LIGHTONDL
CLR RTCC
MOV A,@0X0B ;CONT 1:8-->WDT 18MS ×8= 144ms
/*MOV A,@0X0D ;CONT 1:32-->WDT 18MS ×32= 576ms*/
CONTW
WDTC
MOV A,@0X80 ;IOCE WDTE(=1 WDT) EIS(=0 P60) - - - - - -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -