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

📄 mypjt.asm

📁 办公室及高档娱乐场所用的垃圾自动开门及关门。用红外感应头可感受到人手的动作
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 LIST P=16C54
 #include <p16C5x.inc>
;---------------------------------------------
;WORK_MODE define
;---------------------------------------------
#define AUTO_MODE 0x01
#define KEY_MODE  0x02
#define DUMMY_MODE 0x00

 ;--------------------------------------------
 ; motor_mode define
 ;--------------------------------------------
#define  MM_DUMMY      0x00
#define  MM_OPEN       0x01
#define  MM_CLOSE      0x02

;-----------------------------------------------
;控制motor  define
;-----------------------------------------------
#define  MM_OPEN_ROLL  0x20              ;;RB6=0,RB5=1
#define  MM_CLOSE_ROLL 0x40              ;;RB6=1,RB5=0
#define  MM_STOP       0x9F              ;;RB6=0,RB5=0
;-----------------------------------------------
;;按键键值定义
;-----------------------------------------------
#define OPEN_KEY  0x01
#define CLOSE_KEY 0x02
#define DUMMY_KEY 0x00
;-----------------------------------------------
; door_stu define
;-----------------------------------------------
#define DOOR_CLOSE_STU 0x00
#define DOOR_KEY_OPEN_STU  0x01
#define DOOR_AUTO_OPEN_STU  0x02
#define DOOR_CLOSING_STU 0x03
#define DOOR_OPENING_STU 0x04
;LED PORT DEFINE

 MAIN_OP_POWER EQU PORTB*8+0 ;RB0
 INFRARED_LED EQU PORTB*8+1  ;RB1
 LED_RED EQU PORTB*8+2     ;  RB2
 LED_GREEN EQU PORTB*8+3   ;RB3
 SUB_OP_POWER EQU PORTB*8+7  ;RB7








#define TM2S 0x0e  ;200
#define TM8S_L 0x9b
#define TM8S_H 0x02

#define TM500MS 0x01
#define TM4S 0x1c
;  bit define

   flag              equ 0x08
   INFRARED_F        equ flag*8+0    ;flag.0
   KEYREQ_F          equ flag*8+1    ;flag.1
   LOW_V_F           equ flag*8+2    ;flag.2
   RED_FRESH_F       equ flag*8+3    ;红灯闪烁标志
;---------------------------------------------
;1 byte variable define
;---------------------------------------------
  motor_mode        equ 0x09
  motor_mode_old    equ 0x0A
  motor_step        equ 0x0b
  door_stu          equ 0x0c
  delay_time_L      equ 0x0d
  delay_time_H      equ 0x0e
  keyvld            equ 0x0f
  keyvld_old        equ 0x10
;------------------------------------
; INFRARED CHECK
;------------------------------------
  HIGH_LEVEL_COUNT   EQU 0x11
  LOW_LEVEL_COUNT    EQU 0x12
;------------------------------------
  work_mode          equ 0x13
  fresh_red_time     equ 0x14
;------------------------------------
;;ram area: 0x1a-0x1f is temp varible
;------------------------------------
  temp_va1          equ 0x1a
  temp_va2          equ 0x1b
  temp_va3          equ 0x1c
  temp_va4          equ 0x1d
  temp_va5          equ 0x1e
  temp_va6          equ 0x1f

;--------------------------------------------------------------
;--------------------------------------------------------------
CPU_INIT:

         MOVLW 0FH
         TRIS  5      ;;  RA0,RA1,RA2,RA3 INPUT
         CLRW
         TRIS 6       ;;  全部输出
         MOVLW 0x09   ;;设置WDT 时间77ms
         OPTION
         BTFSS STATUS,3
         RETLW 00H    ;;从睡眠模式唤醒
;上电复位,先初始化
         MOVLW 0x82
         MOVWF PORTB
;RAM 清0
         MOVLW 0x08
         MOVWF FSR
RAM_CLEAR:
         CLRF INDF
         INCF FSR

         MOVLW 0x1f
         ANDWF FSR,w
         XORLW 0x1f
         BTFSS STATUS,Z
         GOTO RAM_CLEAR
         MOVLW 0x01
         MOVWF fresh_red_time

         RETLW 00H
;------------------------------------------------------------
;------------------------------------------------------------
 ORG  1FFH
 GOTO START
 ORG 20H
 START:
         CALL CPU_INIT
;------------------------------------------------------------
;------------------------------------------------------------
MAIN_LOOP:
KEY_HD:
          CLRWDT
TEST_DOOR_CLOSE:
         MOVF door_stu,w
         XORLW DOOR_CLOSE_STU
         BTFSS STATUS,Z
         GOTO TEST_DOOR_OPEN
         GOTO  NEXT_STEP1          ;在关门状态下可以去扫描按键
TEST_DOOR_OPEN:
         MOVF door_stu,w
         XORLW DOOR_KEY_OPEN_STU    ;是否为按键开门状态?
         BTFSC STATUS,Z             ;不是,进入红外处理
NEXT_STEP1:
         CALL KEY_SCAN             ;只有在按键开门状态下可以扫描按键
;------------------------------------------------------------
;------------------------------------------------------------
INFRA_HD:

         BTFSC flag,KEYREQ_F
         GOTO  NEXT_STEP2              ;有按键,不处理红外扫描
                                      ;没有按键时
         MOVF  door_stu,w             ;判别门的状态
         XORLW DOOR_CLOSE_STU        ;关着状态?
         BTFSC STATUS,Z
         GOTO  INFRA_LABEL1               ;是关着
;原则上在关门的状态下处理红外才有效
;         MOVF door_stu,w              ; 不在关状态,再判是否是红外打开状态
;         XORLW DOOR_AUTO_OPEN_STU
;         BTFSS STATUS,Z
         GOTO  NEXT_STEP2               ;不是,返回
INFRA_LABEL1:
         CALL INFRARED_SCAN
;---------------------------------------------------------
;---------------------------------------------------------
NEXT_STEP2:
KEY_PRC:
        BTFSS flag,KEYREQ_F
        GOTO NEXT_STEP3               ;没按键,执行红外处理
        BCF flag,KEYREQ_F             ;
        MOVLW KEY_MODE               ;保存工作模式
        MOVWF work_mode
        MOVF keyvld,w
        XORLW CLOSE_KEY
        BTFSC STATUS,Z
        GOTO  CLOSE_KEY_HD                   ;关门键
        MOVLW MM_OPEN                        ;开门键
        GOTO LABEL6
CLOSE_KEY_HD:
        MOVF door_stu,w
        XORLW DOOR_KEY_OPEN_STU
        BTFSS STATUS,Z
        GOTO NEXT_STEP3
        MOVLW MM_CLOSE
        GOTO LABEL6

LABEL6
        MOVWF motor_mode
;-------------------------------------------------------
;-------------------------------------------------------

NEXT_STEP3:
INFRARED_PRC:
        BTFSS flag,INFRARED_F
        GOTO NEXT_STEP4              ;没感应,下一步
;有感应时
        BCF flag,INFRARED_F          ;清标志
        MOVLW AUTO_MODE              ;保存工作模式
        MOVWF work_mode
;        MOVF door_stu,w              ;检测门状态
 ;       XORLW DOOR_CLOSE_STU
;        BTFSC STATUS,Z
;        GOTO LABEL7                  ;门关着
                                     ;不在门关着状态,再判是否是自动开状态
;        MOVF door_stu,w
;        XORLW DOOR_AUTO_OPEN_STU
;        BTFSC STATUS,Z
;        GOTO NEXT_STEP4              ;是自动开态
;        MOVLW MM_CLOSE
;        GOTO LABEL8
LABEL7:
        MOVLW MM_OPEN
LABEL8:
        MOVWF motor_mode
;------------------------------------------------------
;------------------------------------------------------
NEXT_STEP4:
MOTOR_HD:

         CALL MOTOR_PRC
NEXT_STEP5:
         CALL LED_PRC

         GOTO MAIN_LOOP


;------------------------------------------------------
;------------------------------------------------------
INFRARED_SCAN:
         BSF PORTB,MAIN_OP_POWER   ;OPEN MAIN_OP_POWER
         BCF PORTB,SUB_OP_POWER    ;OPEN SUB_OP_POWER
         MOVLW 0x6                 ;共发5次红外光
         MOVWF temp_va5
CHECK:
         CLRWDT
;         CALL DELAY_10MS
         CALL DELAY_1MS
         CALL DELAY_1MS
         CALL DELAY_1MS
         CALL DELAY_1MS
         BCF PORTB,INFRARED_LED    ;发红外光
         NOP
         NOP
         NOP
         BSF PORTB,INFRARED_LED    ;停发
;         CALL DELAY_1MS
         CALL DELAY_1MS           ;延迟1MS后,检测有没有接收红外光
         MOVLW 0x0a
         MOVWF temp_va6
NEXT:
         MOVF PORTA,W
         MOVWF temp_va1
         BTFSC temp_va1,0
         INCF HIGH_LEVEL_COUNT    ;有收到
         DECFSZ temp_va6
         GOTO NEXT
         DECFSZ temp_va5          ;没有,5次发完没?
         GOTO CHECK               ;5次没发完,继续发
 ;检测一下电源电压是否正常
;         MOVF PORTA,W
;         MOVWF temp_va1
 ;        BTFSC temp_va1,1
         BTFSC PORTA,1
         GOTO VOLATAGE
         BCF flag,LOW_V_F         ;清除欠压标志
         GOTO  POWER_OFF
VOLATAGE:
         BSF flag,LOW_V_F         ;置位欠压标志
 ;        5次已发完,关闭相应的电源
POWER_OFF
         BCF PORTB,MAIN_OP_POWER   ;CLOSE MAIN_OP_POWER
         BSF PORTB,SUB_OP_POWER    ;CLOSE SUB_OP_POWER
 ;5次已发完,判别有没有检测到人

         MOVLW 0x30               ;暂定接收到10次为有感应
         SUBWF HIGH_LEVEL_COUNT,W
         BTFSC STATUS,C
         GOTO  LABEL3
         BCF   flag,INFRARED_F
         CLRF HIGH_LEVEL_COUNT
         RETLW 00H
 LABEL3:
         BSF flag,INFRARED_F
         CLRF HIGH_LEVEL_COUNT
         RETLW 00H


;---------------------------------------------------------------
;---------------------------------------------------------------         MOVF door_stu,w

 ;------------------------------------------------------
 ;------------------------------------------------------
  LED_PRC:
          BTFSC flag,LOW_V_F
          GOTO  RED_LED_ON         ;欠压了,红灯报警
          MOVF motor_mode,w
          XORLW MM_OPEN
          BTFSC STATUS,Z
          GOTO  GREEN_LED_ON
          MOVF motor_mode,w
          XORLW MM_DUMMY
          BTFSS STATUS,Z
          RETLW 00H
          GOTO  FLASH_RED_LED     ;待机时红灯闪烁
  GREEN_LED_ON:
          BCF PORTB,LED_RED
          BSF PORTB,LED_GREEN
          GOTO  RET_LED_PRC
  RED_LED_ON:
          BCF PORTB,LED_GREEN
          BSF PORTB,LED_RED
          GOTO RET_LED_PRC
 FLASH_RED_LED:
          BCF PORTB,LED_GREEN
          DECFSZ fresh_red_time
          GOTO ENTER_SLEEP
          BTFSS flag,RED_FRESH_F
          GOTO FRESH_ON
          GOTO FRESH_OFF
     FRESH_ON:
          MOVLW TM500MS
          MOVWF fresh_red_time
          BSF PORTB,LED_RED
          BSF flag,RED_FRESH_F
          GOTO ENTER_SLEEP
     FRESH_OFF:
          MOVLW TM4S
          MOVWF fresh_red_time
          BCF  PORTB,LED_RED
          BCF flag,RED_FRESH_F

     ENTER_SLEEP:

⌨️ 快捷键说明

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