?? xishou.asm
字號:
/********************************************************************************
;** Copyright (c) 2004 SanDragon **
;********************************************************************************
;** Last Version : V0.9
;** Last Modify : 2004-07-31
;** ------------------------------
;** Title : 紅外感應(yīng)洗手器
;** Author :
;** Date : 2004-05-18
;** Purpose :
;** Sofeware : WICE2.97(ICE456)
;** Hardware : EM78P153S 內(nèi)置RC振蕩電路 4M
;** Note :
4V
整機(jī) 40ua
關(guān)閉發(fā)射接收 后 9ua
紅外發(fā)射 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 ;延時開關(guān)
ANSW EQU 7 ;手動開關(guān)
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 ;自動出水狀態(tài)標(biāo)志
SW_F EQU 1 ;手動出水狀態(tài)標(biāo)志
DELAY_F EQU 2 ;延時出水標(biāo)志
REFLECT_F EQU 3 ;檢測到反射信號標(biāo)志
KEYPRS_F EQU 4 ;按鍵按下標(biāo)志
TLIMITCLS EQU 5 ;限時關(guān)閉出水標(biāo)志,防止重復(fù)出水
RCVWAVE_F EQU 6 ;接收到反射回的紅外線標(biāo)志
HVWATER_F EQU 7 ;存在水壓標(biāo)志
LP_CNT0 EQU 0x15
LP_CNT1 EQU 0x16
KEY_PTIMER EQU 0X17 ;按鍵按下計時器
KEY_CODE EQU 0X18 ;按鍵鍵值
KEY_TMP EQU 0X19 ;檢測按鍵時臨時值
RECVNUMBER EQU 0X19 ;接收脈沖計數(shù)器
WDTTIMES EQU 0X1C ;WDT喚醒次數(shù)計數(shù)
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
;--------------------------------------------------------------------
;(上電、看門狗溢出喚醒后)復(fù)位處理
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
;--------------------------------------------------------------------
;上電復(fù)位處理
POWERON:
WDTC
MOV A,@0X00 ;IOCE 關(guān)閉WDT P60 -> I/O
IOW IOCE
MOV A,@0 ;關(guān)閉電磁閥輸出、LED輸出
MOV P5OUT,A
MOV P5,A
MOV A,@0X00
IOW IOC5
MOV A,@0xFE ;關(guān)閉紅外線輸出、接收電路
MOV P6OUT,A
MOV P6,A
MOV A,@0XFC
IOW IOC6
CLR KEY_PTIMER
CLR WDTTIMES
CLR FLAG
CALL LIGHTON1S
JMP SLEEP ;進(jìn)入睡眠程序
;--------------------------------------------------------------------
;看門狗喚醒處理
WAKEUP:
WDTC
MOV A,@0X00 ;IOCE 關(guān)閉WDT P60 -> I/O
IOW IOCE
;為了保證睡眠不浪費電,要求在程序執(zhí)行中,在檢測按鈕和水位前打開內(nèi)部上拉電阻,使用后及時關(guān)閉
;操作LED/電磁閥/接收電路/發(fā)射電路后,及時關(guān)閉這些電路(關(guān)閉狀態(tài)如下: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 ;關(guān)閉電磁閥輸出、LED輸出
MOV P5OUT,A
MOV P5,A
MOV A,@0X00
IOW IOC5
MOV A,@0xFE ;關(guān)閉紅外線輸出、接收電路
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 ;手動和延時出水時不需要再發(fā)射紅外線檢測感應(yīng)物,關(guān)閉接收電路后,直接進(jìn)入睡眠狀態(tài)
JMP SW_DLPROC
JBC FLAG,DELAY_F
JMP SW_DLPROC
JBS FLAG,HVWATER_F
JMP SLEEP ;無水時不再進(jìn)行紅外線探測
;處于自動感應(yīng)狀態(tài)
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 ;在無反射又非出水條件下,直接返回到睡眠狀態(tài)
JMP AUTOPROC ;在自動出水條件下,出現(xiàn)無反射就翻轉(zhuǎn)自動出水標(biāo)志和動作電磁閥
;檢測到反射后處理
CHKREFAUTO_F:
JBC FLAG,TLIMITCLS
JMP SLEEP
;在有反射下,還需繼續(xù)檢測是否處于自動出水狀態(tài)下
JBS FLAG,AUTO_F
JMP AUTOPROC ;在未自動出水條件下,出現(xiàn)反射就翻轉(zhuǎn)自動出水標(biāo)志和動作電磁閥
JMP SLEEP
;--------------------------------------------------------------------
;處于手動出水或延時出水時關(guān)閉接收電路的處理
SW_DLPROC:
BC P6OUT,ENRCV ;關(guān)閉接收電路
MOV A,P6OUT
MOV P6,A
JMP SLEEP
;--------------------------------------------------------------------
;自動出水處理
AUTOPROC:
MOV A,@0 ;設(shè)置1分鐘限時
MOV TIME180MS,A
MOV A,@2
MOV TIME30S,A
JBC FLAG,AUTO_F ;切換手動出水標(biāo)志
JMP AUTOTAB1
CALL LIGHTFLASH
CALL OPEN ;出水
BS FLAG,AUTO_F
JMP AUTOTAB2
AUTOTAB1:
;CALL LIGHTFLASH
CALL CLOSE ;停止出水
BC FLAG,AUTO_F
AUTOTAB2:
JMP SLEEP
;--------------------------------------------------------------------
;睡眠處理(懸空腳設(shè)為輸出,關(guān)閉輸入腳的上下拉電阻,使能看門狗復(fù)位)
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) - - - - - -
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -