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

📄 xishou.asm

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

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

        ;进行最后一组探测
        CALL    SENDONEWAVE             ;发射一组红外波  
        JBC     FLAG, RCVWAVE_F         
        BS      FLAG,REFLECT_F          ;收到全部反射信号时,设置检测到物体标志 

CHKINFRAOV:   
        BC      P6OUT,ENRCV             ;关闭接收电路
        MOV     A,P6OUT
        MOV     P6,A   
        RET
;====================================================================
;发射一个红外探测脉冲,并检测返回脉冲(若有返回脉冲,RECVNUMBER计数值加1)
;====================================================================
SENDONEWAVE:
        BC      FLAG, RCVWAVE_F           
        CALL    DELAY45US               ;等待接收电路输出稳态(1.接收电路刚通电2.前一次发射后)
        CALL    DELAY45US 
               
        JBS     P6,RCVDATA              
        RET                             ;在发射前,若收到反射信号,则是干扰退出
          
        BC      P6OUT,SENDDATA          ;开始发送
        MOV     A,P6OUT
        MOV     P6,A                    

        CALL    DELAY45US               
        JBS     P6,RCVDATA              ;第一次检测是否收到反射信号(适用与强反射信号)
        BS      FLAG, RCVWAVE_F       
                    
        CALL    DELAY10US               
        JBS     P6,RCVDATA              ;第二次检测是否收到反射信号(适用与中等反射信号)
        BS      FLAG, RCVWAVE_F    
        
        CALL    DELAY10US               
        JBS     P6,RCVDATA              ;第三次检测是否收到反射信号(适用与中等反射信号)
        BS      FLAG, RCVWAVE_F   
        
        CALL    DELAY10US               
        JBS     P6,RCVDATA              ;第四次检测是否收到反射信号(适用与中等反射信号)
        BS      FLAG, RCVWAVE_F    

        BS      P6OUT,SENDDATA
        MOV     A,P6OUT
        MOV     P6,A                    ;停止发送
                  
        CALL    DELAY10US       
        JBS     P6,RCVDATA              ;第三次检测是否收到反射信号(适用与弱反射信号)
        BS      FLAG, RCVWAVE_F  

        RET

;************************************************************************************
;*****************************电磁阀驱动程序*****************************************
;************************************************************************************

;====================================================================
;开启脉冲阀 在睡眠前后均保持为输出状态
;====================================================================
OPEN:   
                     
        BS      P5OUT,OPENCOIL
        BC      P5OUT,CLOSECOIL
        MOV     A,P5OUT
        MOV     P5,A
        CALL    DELAY50MS 
        BC      P5OUT,OPENCOIL
        MOV     A,P5OUT
        MOV     P5,A
        RET
;====================================================================
;关闭脉冲阀
;====================================================================
CLOSE:   

        BC      P5OUT,OPENCOIL
        BS      P5OUT,CLOSECOIL
        MOV     A,P5OUT
        MOV     P5,A
        CALL    DELAY50MS
        BS      P5OUT,CLOSECOIL
        MOV     A,P5OUT
        MOV     P5,A
        RET

;************************************************************************************
;*****************************指示灯驱动程序*****************************************
;************************************************************************************
;====================================================================
;指示灯 点亮
;====================================================================
LIGHTON: 
        BS      P5OUT,LEDA
        BC      P5OUT,LEDK
        MOV     A,P5OUT
        MOV     P5,A
        RET                                               
;====================================================================
;低水压指示灯 点亮
;====================================================================
LIGHTONYELLOW:
        BC      P5OUT,LEDA
        BS      P5OUT,LEDK
        MOV     A,P5OUT
        MOV     P5,A
        RET
        
;====================================================================
;指示灯 熄灭
;====================================================================
LIGHTOFF:   
        BC      P5OUT,LEDA
        BC      P5OUT,LEDK
        MOV     A,P5OUT
        MOV     P5,A
        RET
;====================================================================
;指示灯 长亮1秒
;====================================================================
LIGHTON1S:    
        CALL    LIGHTON
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    DELAY50MS
        CALL    LIGHTOFF
        CALL    DELAY50MS
        RET


;====================================================================
;指示灯 闪烁一下
;====================================================================
LIGHTFLASH:  
        
        JBC     FLAG,HVWATER_F 
        CALL    LIGHTON   
        JBS     FLAG,HVWATER_F          
        CALL    LIGHTONYELLOW                 ;无水时闪烁黄灯
        CALL    DELAY1MS
        CALL    DELAY1MS
        CALL    DELAY1MS 
        CALL    DELAY1MS
        CALL    DELAY1MS
        CALL    DELAY1MS  
        CALL    DELAY1MS
        CALL    DELAY1MS
        CALL    DELAY1MS
        CALL    LIGHTOFF
        CALL    DELAY1MS
        CALL    DELAY1MS
        CALL    DELAY1MS
        RET

;************************************************************************************
;*****************************延时驱动程序*******************************************
;************************************************************************************
/*   
;====================================================================
;基本延时:45uS(455KHz 1 Cycle, 2 Clock)
;====================================================================
DELAY45US: 
        MOV     A, @22   
        MOV     LP_CNT1, A
D10_LP:
        NOP
        NOP
        NOP
        DJZ     LP_CNT1
        JMP     D10_LP
        RET

;====================================================================
;基本延时:100uS(455KHz 1 Cycle, 2 Clock)
;====================================================================
P0_DLY: 
        MOV     A, @46
        MOV     LP_CNT1, A
P0_LP:
        NOP
        NOP
        NOP
        DJZ     LP_CNT1
        JMP     P0_LP
        DJZ     LP_CNT0
        JMP     P0_DLY
        RET


;====================================================================
;1ms延时程序
;====================================================================
DELAY1MS:
        MOV     A, @10
        MOV     LP_CNT0, A
        CALL    P0_DLY
        RET

;====================================================================
;50MS延时程序
;====================================================================
DELAY50MS:
        MOV     A, @50
        MOV     LP_CNT0, A
        CALL    P0_DLY
        RET
*/     
;====================================================================
;10US延时程序(4MHz 1 Cycle, 2 Clock)
;====================================================================
DELAY10US:
        NOP
        MOV     A, @3
        MOV     LP_CNT1, A
D10P0_LP:
        NOP
        NOP
        NOP
        DJZ     LP_CNT1
        JMP     D45P0_LP
        RET    
;====================================================================
;60US延时程序(4MHz 1 Cycle, 2 Clock)
;====================================================================
DELAY45US:
        NOP
        MOV     A, @20
        MOV     LP_CNT1, A
D45P0_LP:
        NOP
        NOP
        NOP
        DJZ     LP_CNT1
        JMP     D45P0_LP
        RET

;====================================================================
;0.25MS延时程序(4MHz 1 Cycle, 2 Clock)
;====================================================================
P0_DLY:                        ;4MHz 1 Cycle, 2 Clock下延时0.125mS
        ;WDTC
        NOP
        NOP
        MOV     A, @50
        MOV     LP_CNT1, A
P0_LP:
        NOP
        ;WDTC
        NOP
        NOP
        DJZ     LP_CNT1
        JMP     P0_LP
        DJZ     LP_CNT0
        JMP     P0_DLY
        RET

;====================================================================
;1ms延时程序
;====================================================================
DELAY1MS:
        MOV     A, @8
        MOV     LP_CNT0, A
        CALL    P0_DLY
        RET

;====================================================================
;50MS延时程序
;====================================================================
DELAY50MS:
        MOV     A, @200
        MOV     LP_CNT0, A
        CALL    P0_DLY
        MOV     A, @200
        MOV     LP_CNT0, A
        CALL    P0_DLY
        RET   
        
;************************************************************************************
;*****************************中断驱动程序*******************************************
;************************************************************************************

;====================================================================
;外部中断程序
;====================================================================
INT_EXT:
        BC      INTF,EXIF       ;Clear TCC interrupt flag
        JMP     INT_RET
;--------------------------------------------------------------------
;====================================================================
;TCC中断程序
;====================================================================
INT_TCC:    
        BC      INTF,TCIF       ;Clear TCC interrupt flag 
        MOV     A,@0
        MOV     RTCC,A
        ;TCC Period :  Ftcc=Fosc/2/(Prescaler*(256-RTCC)+D)
        JMP     INT_RET
;--------------------------------------------------------------------
;中断返回
INT_RET:
        SWAPA   STACK_S         ;Restore the SAVED value of STATUS
        MOV     STAT,A
        SWAPA   STACK_A         ;Restore the SAVED value of A
        RETI

⌨️ 快捷键说明

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