专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

红外反射自动冲水程序

作者:佚名   来源:本站原创   点击数:  更新时间:2009年12月26日   【字体:

;二、 工作模式:
;1、间隙工作,即:每5秒电路工作一次,发16mS红外线脉冲,同时对接收电路供电,
;    延时5mS等待接收电路工作稳定,询问接收到反射信号,如没有,返回延时5秒继续。
;    如有反射信号便改为1秒询问1次,连续5次收到反射信号便认为是有人在,
;    反之,认为是有人走过,有人在时,就开始询问反射信号没有了吗?
;    连续2次没有接收到反射信号,便认为此没人在用,开始冲水。
;2、感应后立即冲水,直到检测到人离去时,停止冲水,如果感应时间超过15秒,
;    启动长流水模式,长流水在启动3分钟后自动结束。
;3、 2秒钟预冲水,即每隔15分钟预冲水一次,15分钟内无人使用过,不冲水,
;    使能在使用人多时,不再每人使用前都预冲水,达到节水目地。
;4、感应距离5~80CM可调
;5、 以上工作模式可通过电路板跳线手动选择。
;pb,0接收;pb,1发射;pb,2输出
;
;
;
       LIST    P=12C508 ,F=INHX8M
  INCLUDE "P16C5X.INC"
;***********************
PSW     EQU     03H     ;状态寄存器
;PA      EQU     05H      ;PA口
PB      EQU     06H     ;PB口
FSR EQU 04H
RTCC    EQU     01H     ;定时计数器
TEMP    EQU     09H
COUNT1  EQU     0AH
COUNT2  EQU     0BH
COUNT3  EQU     0CH
COUNT4  EQU     0DH
COUNT5  EQU     0EH
KEY_DEL EQU 0FH
DJ_DEL EQU 10H
R0 EQU 11H
R1 EQU 12H ;1S的发射间隔定时
R2 EQU 13H ;发射次数计数器
R3 EQU 14H
FLAG EQU 1FH

;**********
  ORG     0
  GOTO    START     ;开始
;***********************
;  ORG     000H
DISP    CLRWDT
  INCF    COUNT1,1
  MOVLW   0FH  ;15X16.32MS
  SUBWF   COUNT1,0
  BTFSS   PSW,0
  GOTO    DISP_OUT
  CLRF    COUNT1
;****定时3S
 MOVFW R1
 SKPZ
 DECF R1,1 
;***
DISP_1
 INCF    COUNT2,1  ;1秒到
  MOVLW   3CH ;3C
  SUBWF   COUNT2,0
  BTFSS   PSW,0
  GOTO    DISP_OUT
  CLRF    COUNT2
  INCF    COUNT3,1  ;1分到
  MOVLW   3CH        ;3C
  SUBWF   COUNT3,0
  BTFSS   PSW,0
  GOTO    DISP_OUT
  CLRF    COUNT3   ;60分钟到
  NOP
 INCF COUNT4,1
 NOP
DISP_OUT
 RETLW   0

;****************************
START  
 CLRWDT
  MOVLW    08H   ;清F8-F1F的内容为0
  MOVWF    4     ;F8送F4=@R
QL      CLRF     0   
  INCF     4,1 
  CLRWDT        ;清WDT
  MOVFW    4    ;
  ANDLW    1FH 
  SKPZ    
  GOTO     QL  
  CLRF     4   
;*********************
  MOVLW   B'11101001'  ;PB口为输出口
  TRIS    PB
  MOVLW   B'11111001'
 MOVWF   PB
; MOVLW   0FFH
;  TRIS    PA        ;定义PA口方向,为输键盘口
;  MOVLW   0
;  MOVWF   PA
;**************************
MAIN
  CLRWDT
  MOVLW   01H
  MOVWF   1
  MOVLW   0C5H
  OPTION       ;64分频
DSK
  CLRWDT   
  BTFSS    1,0
  GOTO     DSK
 NOP
WAIT    CLRWDT
 BTFSC    1,0   ;
  GOTO     WAIT  ;1/128秒检查
  MOVFW    1 
  SKPZ  ;结果全0跳下   
  GOTO     DZJC      
  GOTO     HSZCL       ;整分处理16.32MS
;******************
DZJC    CLRWDT
  CALL KEYREM
  GOTO    DSK
;*******************
HSZCL   CLRWDT
  CALL    DISP
; CALL CL_OUT
  GOTO    MAIN
;********************
;*******************发射接收子程序
KEYREM    
 MOVFW R1 ;一秒定时是否到
 SKPZ 
 GOTO KEYREM_OUT
KEYREM_1
 MOVLW D'100'
 MOVWF R1 ;定时5MS,可以借R1用
;***开始发射40khz
KEYREM_2
 BSF PB,1
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
 NOP
; NOP
; NOP
; NOP
 NOP
 NOP
 NOP
 NOP
 BCF PB,1
  NOP
; NOP
; NOP
; NOP
 NOP
 NOP
 NOP
 NOP
 MOVFW R1
 SKPNZ 
 GOTO KEYREM_3
 DECF R1,1
 GOTO KEYREM_2
KEYREM_3
 MOVLW 1
 MOVWF R1 ;重装1S定时时间
 BSF PB,1 ;继续40KHZ的发射
;****发射标志是否开
 BTFSS FLAG,2 ;是进入还是离开状态 
 GOTO KCL_1   ;进入测试有没有进入状态
;***** 测试有没有人离开状态
 NOP
 BTFSS PB,0
 GOTO KEYREM_OUT ;有反射,继续保持
 NOP
 INCF R2,1  ;发射次数记数
 MOVLW 3
 SUBWF R2,0
 BTFSS PSW,0
 GOTO KEYREM_OUT ;次数未到,还得继续测
 CLRF R2
 BCF PB,2  ;是没人,关输出
 BCF FLAG,2 ;置无人标志
 GOTO KEYREM_OUT
;***
KCL_1
 NOP  ;测试有没有人进入状态
 BTFSC PB,0
 GOTO KEYREM_OUT ;无反射,继续保持
 NOP
 INCF R2,1  ;发射次数记数
 MOVLW 3
 SUBWF R2,0
 BTFSS PSW,0
 GOTO KEYREM_OUT ;次数未到,还得继续测
 CLRF R2
 BSF PB,2  ;是有人,开输出
 BSF FLAG,2 ;置有人标志
 GOTO KEYREM_OUT
;**************
KEYREM_OUT
 NOP
 BCF PB,1
 NOP
 RETLW 0


;**********
  END

 

关闭窗口

相关文章