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

📄 xishou.asm

📁 用ATMEGA16平台上的一个红外线检测程序, 可以用来设计洗手器
💻 ASM
📖 第 1 页 / 共 3 页
字号:
        IOW     IOCE

        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,@0xFF                 ;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,@0x0E                 ;关闭红外线输出、接收电路
        MOV     P6OUT,A
        MOV     P6,A
        MOV     A,@0X0C
        IOW     IOC6     

        NOP
        NOP
        SLEP                            ;之后等待看门狗溢出后复位
        NOP
        NOP
        JMP     RESET                   ;不会被执行到,抗干扰用
       ;JMP     WAKEUP                  


;************************************************************************************
;*****************************按钮检测驱动程序**************************************
;************************************************************************************
;====================================================================
;按键检测程序:  1.在本程序中启动接收电路,并利用本程序中的消抖动延时作为接收电路充电
;                 的必要时间以节约时间
;               2.连续几次读入按键口值到KEY_TMP,若KEY_TMP不为0就说明有按键按下
;               3.在按键按下情况下,置KEYPRS_F为1,KEY_TMP赋给KEY_CODE,KEY_PTIMER加1
;                 在无按键按下情况下,若KEYPRS_F为1就调用按键处理程序
;PS:在本程序中有条件的调用了按键处理程序
;====================================================================
CHECKKEY:
        
        ;检测按钮 (读入P6.7 P6.6的状态)
        CLR     KEY_TMP

        COMA    P6
        AND     A,@0XD0
        JBS     STAT,Z
        MOV     KEY_TMP,A
        NOP
        NOP
        NOP

        COMA    P6
        AND     A,@0XD0
        JBS     STAT,Z
        MOV     KEY_TMP,A
        NOP
        NOP
        NOP

        COMA    P6
        AND     A,@0XD0
        JBS     STAT,Z
        MOV     KEY_TMP,A
        NOP
        NOP
        NOP

        COMA    P6
        AND     A,@0XD0
        JBS     STAT,Z
        MOV     KEY_TMP,A
        NOP
        NOP
        NOP
        
        
        ;水压开关处理                   ;若是从有水到无水,从无水到有水都强制关闭一次水阀
        JBS     FLAG,HVWATER_F
        JMP     NO_HVWATER
HV_NOWATER:
        JBC     KEY_TMP,CHKWATER 
        JMP     KWATEROV
        BC      FLAG,HVWATER_F 
        CALL    CLOSE   
        JMP     KWATEROV
NO_HVWATER:
        JBS     KEY_TMP,CHKWATER 
        JMP     KWATEROV
        BS      FLAG,HVWATER_F 
        CALL    CLOSE  
KWATEROV:


        MOV     A,@0XC0
        AND     KEY_TMP,A
        ;判断是否有按键按下
        MOV     A,KEY_TMP
        XOR     A,@0
        JBS     STAT,Z
        JMP     KEYPRESSING             ;有按键按下

        

        JBS     FLAG,KEYPRS_F          ;如果是按键释放,
        RET
        BC      FLAG,KEYPRS_F           ;             a.清除KEYPRS_F
        JMP     KEYPROCESS              ;             b.调用按键处理程序
       

KEYPRESSING:
        MOV     A,KEY_PTIMER            ;如果按键按下,a.就对按键时长加1
        XOR     A,@255
        JBS     STAT,Z
        INC     KEY_PTIMER

        MOV     A,KEY_TMP               ;              b.更新KEY_CODE
        MOV     KEY_CODE,A

        BS      FLAG,KEYPRS_F           ;              c.设置KEYPRS_F
        RET


;====================================================================
;按键处理程序
;====================================================================
KEYPROCESS:
        MOV     A,KEY_PTIMER
        XOR     A,@0
        JBC     STAT,Z
        JMP     KEYPRSOV                ;若KEY_PTIMER=0,认为是干扰

        JBS     KEY_CODE,ANDL
        JMP     KEYPRS2
        ;对延时开关处理
        CALL    LIGHTFLASH                 ;延时指示灯闪烁一次
        BS      FLAG,DELAY_F            ;设置延时出水标志
        BC      FLAG,AUTO_F
        BC      FLAG,SW_F
        CALL    OPEN                    ;打开出水电磁阀


        ;若按键时长<1S,限时为5S
        MOV     A,KEY_PTIMER
        SUB     A,@4
        JBS     STAT,C
        JMP     KEYPRS1_1
        ;<1S
        MOV     A,@28                   ;设置5S限时
        MOV     TIME180MS,A
        MOV     A,@0
        MOV     TIME30S,A        
        JMP     KEYPRSOV

KEYPRS1_1:
        ;若按键时长2~3S,限时为15S
        MOV     A,KEY_PTIMER
        SUB     A,@17
        JBS     STAT,C
        JMP     KEYPRS1_2
        ;<3S
        MOV     A,@83                   ;设置15S限时
        MOV     TIME180MS,A
        MOV     A,@0
        MOV     TIME30S,A        
        JMP     KEYPRSOV
KEYPRS1_2:
        ;若按键时长4~8S,限时为2分钟
        MOV     A,KEY_PTIMER
        SUB     A,@44
        JBS     STAT,C
        JMP     KEYPRS1_3
        ;<8S
        MOV     A,@0                    ;设置2分钟限时
        MOV     TIME180MS,A
        MOV     A,@4
        MOV     TIME30S,A        
        JMP     KEYPRSOV

KEYPRS1_3:
        ;若按键时长>9SS,限时为20分钟
        MOV     A,KEY_PTIMER
        SUB     A,@44
        JBC     STAT,C
        JMP     KEYPRSOV
        ;>9S
        MOV     A,@0                    ;设置20分钟限时
        MOV     TIME180MS,A
        MOV     A,@40
        MOV     TIME30S,A
        JMP     KEYPRSOV





KEYPRS2:
        JBS     KEY_CODE,ANSW
        JMP     KEYPRSOV
        ;对手动开关处理
        
        CALL    LIGHTFLASH                 ;手动指示灯闪烁一次
        BC      FLAG,AUTO_F
        BC      FLAG,DELAY_F

        JBS     FLAG,SW_F
        JMP     KEYPRS2_SWON
        ;手动关水
        BC      FLAG,SW_F               ;清除手动出水标志
        CALL    CLOSE                   ;打开关水电磁阀
        MOV     A,@0                    ;清除限时
        MOV     TIME180MS,A
        MOV     A,@0
        MOV     TIME30S,A       
        JMP     KEYPRSOV

        ;手动出水
KEYPRS2_SWON:
        BS      FLAG,SW_F               ;设置手动出水标志
        CALL  OPEN                      ;打开出水电磁阀
        MOV     A,@0                    ;设置2分钟限时
        MOV     TIME180MS,A
        MOV     A,@4
        MOV     TIME30S,A  
        
        ;若按键时长超过9秒种,限时改为20分钟
        MOV   A,KEY_PTIMER
        SUB    A,@44
        JBC     STAT,C
        JMP     KEYPRSOV
        ;超过9S
        MOV     A,@0                    ;设置20分钟限时
        MOV     TIME180MS,A
        MOV     A,@40
        MOV     TIME30S,A  

        JMP     KEYPRSOV

KEYPRSOV:
        CLR     KEY_PTIMER
        CLR     KEY_CODE
        RET



;====================================================================
;限时处理程序
;====================================================================
TIMELIMITROCESS:        
        ;每次调用,计时器减去1个单位

        MOV     A,TIME180MS
        XOR     A,@0
        JBS     STAT,Z
        JMP     DECTIME180MS

        MOV     A,TIME30S
        XOR     A,@0
        JBS     STAT,Z
        JMP     DECTIME30S

        ;当计时器减到0时,关闭出水电磁阀
        JBC     FLAG,DELAY_F
        JMP     TLPRSOV
        JBC     FLAG,AUTO_F
        JMP     TLPRSOV
        JBC     FLAG,SW_F
        JMP     TLPRSOV
        RET
TLPRSOV:
        JBC     FLAG,AUTO_F
        BS      FLAG,TLIMITCLS          ;对于自动感应出水,在限时到后设置TLIMITCLS,
                                        ;以方便在还有感应物的条件下强制关闭电磁阀
        BC      FLAG,DELAY_F
        BC      FLAG,AUTO_F
        BC      FLAG,SW_F
        CALL    CLOSE
        RET

DECTIME180MS:
        DEC     TIME180MS
        RET
DECTIME30S:
        DEC     TIME30S
        MOV     A,@165
        MOV     TIME180MS,A
        RET    

;************************************************************************************
;*****************************红外线反射检测驱动程序*********************************
;************************************************************************************

;====================================================================
;检测反射物程序
;    检测的思路:以2个脉冲为1组检测单位,若收到不是2个就退出;
;    否则就加发1组去检测,等连续N组一致后即设置REFLECT_F标志
;    在执行程序中用消抖动程序来保证不频繁切换电磁阀
;====================================================================
CHKINFRA:
        BS      P6OUT,ENRCV            ;启动接收电路
        MOV     A,P6OUT
        MOV     P6,A       
                                  
        CALL    DELAY1MS   
        CALL    DELAY1MS  

        ;初始化接收变量
        BC      FLAG,REFLECT_F          ;清除检测到标志

        ;进行第一组探测 
        CALL    SENDONEWAVE             ;发射一组红外波
        JBS     FLAG, RCVWAVE_F         ;本次收到反射信号时,才允许进行下一次检测

⌨️ 快捷键说明

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