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

📄 xishou.asm

📁 用ATMEGA16平台上的一个红外线检测程序, 可以用来设计洗手器
💻 ASM
📖 第 1 页 / 共 3 页
字号:
/********************************************************************************
;**                  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 + -