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

📄 自动垃圾桶的程序.asm

📁 用PIC16C54单片机开发的自动垃圾桶的源代码
💻 ASM
字号:

;;              General purpose registers
;;
IDA             EQU     0H      ; Indirect data addressing
RTCC            EQU     1H      ; Real time counter
PC              EQU     2H      ; Program counter
STATUS          EQU     3H      ; Status register
FSR             EQU     4H      ; File select register
PORTA           EQU     5H      ; I/O port A
PORTB           EQU     6H      ; I/O port B
;               EQU     7H      ;
;
MM              EQU     8H      ;
TRAN_SPACE_CNT  EQU     9H      ;
PW_358_CNT      EQU     0AH     ;
T_CNT           EQU     0BH     ;
MOTOR_BRK_CNT   EQU     0CH     ;
BTN_MEM         EQU     0DH
DLY_CNT0        EQU     0EH
DLY_CNT1        EQU     0FH
;
LED_CNT0        EQU     10H
LED_CNT1        EQU     11H
LED_MEM         EQU     12H
;
;;         --- <<  Status register defined  >> ---
;
CY              EQU     0H     ; Carry flag
DC              EQU     1H     ; D_carry flag
ZERO            EQU     2H     ; Zero flag
PD              EQU     3H     ; Power down
TO              EQU     4H     ; Timer_out
PA0             EQU     5H     ; Page preselect 0
PA1             EQU     6H     ; Page preselect 1
PA2             EQU     7H     ; General R/W bit
;
;;      ******  Port A bit & compiler definitions  ******
;
PW_358_2        EQU     0H      ;
MOTOR_STOP      EQU     1H      ;
AUTO_OPEN       EQU     2H      ;
AUTO_CLOSE      EQU     3H      ;
;
TRISA           EQU     B'0000'         ; Port A  tri-state value
;
;;      ******  Port B bit & compiler definitions  ******
;
HUMAL_OPEN_SW   EQU     0H      ;
LED_G_OPEN      EQU     1H      ;
LED_R_CLOSE     EQU     2H      ;
IR_TRANSMIT     EQU     3H      ;
IR_SG_DET       EQU     4H      ;
CHK_358_1_PW    EQU     5H      ;
CHK_358_1_FB    EQU     6H      ;
PW_358_1        EQU     7H      ;
;
TRISB           EQU     B'01010001'     ; Port B  tri-state value
;
;;  RTCC        EQU     HUMAL_CLOSE_SW
;
;;      ______    >>>  Chip reset vector  <<<    ______
;
PIC16C54        EQU     1FFH    ; For PIC16C54 reset vector
;
;;      **********************************************************
;
        ORG     0H
;;
IO_SETUP
        MOVLW   TRISA
        TRIS    PORTA
        MOVLW   TRISB
        TRIS    PORTB
        RETLW   0H
;;
DELAY_900MS
        MOVLW   90D             ;  90 * 10 ms = 900 ms
DELAY_VAL_SET
        MOVWF   DLY_CNT1        ;
DLY_LP_S
        MOVLW   68D
        MOVWF   DLY_CNT0
DLY_LP
        CLRWDT
        DECFSZ  DLY_CNT0
        GOTO    DLY_LP
        DECFSZ  DLY_CNT1
        GOTO    DLY_LP_S
        RETLW   0H
;;
LED_OFF_TMR_S
        MOVLW   3D
        MOVWF   LED_CNT1
        CLRF    LED_CNT0
        BCF     LED_MEM,0       ; LED off flag
        RETLW   0H
;;
LED_ON_TMR_S
        MOVLW   1D
        MOVWF   LED_CNT1
        MOVLW   0AH
        MOVWF   LED_CNT0
        BSF     LED_MEM,0       ; LED on flag
        RETLW   0H
;;
ACT_PROCESS
        CLRWDT                  ;
        BTFSS   RTCC,6
        RETLW   0H
        CLRF    RTCC            ; 5.12 ms
;;
        DECFSZ  TRAN_SPACE_CNT  ; 200 ms timer
        GOTO    ACT_PRO_1
;
        BSF     PORTB,PW_358_1  ; Turn on 1th 358
        BCF     PORTA,PW_358_2  ; Turn on 2th 358
        MOVLW   5D              ; 5.12 ms * 5 = 25.6 ms
        MOVWF   PW_358_CNT      ; 358 duty cycle
        BSF     MM,0            ;
;
        BCF     MM,2
        MOVLW   39D             ; 5.12 ms * 39 = 199.68 ms
        MOVWF   TRAN_SPACE_CNT
;;
ACT_PRO_1
        BTFSC   MM,0            ;
        DECFSZ  PW_358_CNT
        GOTO    ACT_PRO_2
        BCF     PORTB,PW_358_1  ; Turn off 1th 358
        BSF     PORTA,PW_358_2  ; Turn off 2th 358
        BCF     MM,0
        MOVLW   5D              ; 5.12 ms * 5 = 25.6 ms
        MOVWF   PW_358_CNT      ; 358 duty cycle
;;
ACT_PRO_2
        BTFSC   MM,3
        DECFSZ  T_CNT
        GOTO    LED_PRO_ACT
        BCF     MM,3
        BTFSC   BTN_MEM,1               ; Humal open flag
        GOTO    LED_PRO_ACT
;
        BCF     PORTB,IR_TRANSMIT       ; Turn on IR transmit 40 us
        NOP                             ; 80 us
        BSF     PORTB,IR_TRANSMIT       ; Turn off IR transmit
;
        BTFSC   PORTB,IR_SG_DET
        BSF     MM,4            ; IR signal receiver flag
;;
LED_PRO_ACT
        BTFSC   LED_MEM,6       ; LED flash enable flag
        DECFSZ  LED_CNT0
        GOTO    SKIP_RETURN
        DECFSZ  LED_CNT1
        GOTO    SKIP_RETURN
;
        MOVLW   4H              ; RED LED flash flag
        BTFSS   LED_MEM,7
        MOVLW   2H              ; GREEN LED flash flag
        XORWF   PORTB
        BTFSS   LED_MEM,0
        GOTO    LED_FLH_ON_T
        CALL    LED_OFF_TMR_S
        GOTO    SKIP_RETURN
;
LED_FLH_ON_T
        CALL    LED_ON_TMR_S
;;
SKIP_RETURN
        BTFSC   PORTB,HUMAL_OPEN_SW
        BCF     BTN_MEM,0
        RETLW   0H
;
;;      ***************************************
;;      ***           Init. reset           ***
;;      ***************************************
;
INIT_RESET
        CALL    IO_SETUP
        MOVLW   1H
        MOVWF   PORTA
        MOVLW   59H
        MOVWF   PORTB
        MOVLW   40H
        MOVWF   LED_MEM
;;
CLOSE_ACTION
        BSF     PORTB,LED_R_CLOSE       ; Turn on close LED
        BSF     PORTA,AUTO_CLOSE
        MOVLW   1EH
        CALL    DELAY_VAL_SET
        BCF     PORTA,AUTO_CLOSE
;
        BSF     PORTA,MOTOR_STOP        ; Motor brake
        CALL    DELAY_900MS
        BCF     PORTA,MOTOR_STOP
;       CALL    DELAY_900MS
        BCF     PORTB,LED_R_CLOSE       ; Turn off close LED
        BSF     LED_MEM,7               ; RED LED flash flag
;;
        MOVLW   0H                      ; RTCC prescaler 1:2
        OPTION
        MOVLW   39D
        MOVWF   TRAN_SPACE_CNT
        CALL    LED_OFF_TMR_S
        CLRF    MM
        CLRF    BTN_MEM
;
;;      ***************************************
;
MAIN_PROG_LOOP
        CALL    ACT_PROCESS
        BTFSS   PORTB,HUMAL_OPEN_SW
        GOTO    BTN_OPEN_D_OK
        BTFSC   MM,4
        GOTO    IR_SG_RECE_OK
;
        BTFSS   PORTB,CHK_358_1_FB
        GOTO    MAIN_PROG_LOOP          ;
        BTFSC   MM,2
        GOTO    MAIN_PROG_LOOP          ;
        BSF     MM,2
        MOVLW   2H                      ; Detect IR freeback signal after 10 ms
        MOVWF   T_CNT                   ;
        BSF     MM,3                    ; 10 ms counter flag
        GOTO    MAIN_PROG_LOOP          ;
;
;;      **********************************************************
;
BTN_OPEN_D_OK
        BTFSC   BTN_MEM,0
        GOTO    BTN_DETECT_PASS
        BSF     BTN_MEM,0
;
IR_SG_RECE_OK
        BCF     PORTA,MOTOR_STOP
        BCF     LED_MEM,6               ; LED flash disable
        CLRF    MM
        BSF     PORTB,LED_G_OPEN        ; Turn on open LED
;
        BSF     PORTB,PW_358_1          ; Turn on 1th 358 power
        BCF     PORTA,PW_358_2          ; Turn on 2th 358 power
;
        BSF     PORTA,AUTO_OPEN
        CALL    DELAY_900MS
        BCF     PORTA,AUTO_OPEN
        NOP
        BSF     PORTA,MOTOR_STOP        ; Motor brake
        CALL    DELAY_900MS
        BCF     PORTA,MOTOR_STOP        ; Motor brake
;
BTN_DETECT_PASS
        BTFSS   BTN_MEM,0
        GOTO    RESET_OPEN_CNT
        BCF     PORTB,LED_G_OPEN
;
        BSF     BTN_MEM,1
        BCF     PORTB,PW_358_1          ; Turn off 1th 358 power
        BSF     PORTA,PW_358_2          ; Turn off 2th 358 power
        BSF     LED_MEM,6               ; LED flash enable
        BCF     LED_MEM,7               ; Green LED enable
        CALL    LED_OFF_TMR_S
        GOTO    MAIN_PROG_LOOP          ;
;;
RESET_OPEN_CNT
        MOVLW   128D                    ; 3 seconds
        MOVWF   MOTOR_BRK_CNT
;
DEC_3S_LP
        MOVLW   2H
        CALL    DELAY_VAL_SET
        BTFSS   PORTB,HUMAL_OPEN_SW
        GOTO    BTN_OPEN_D_OK
;;
IR_T_D
        BCF     PORTB,IR_TRANSMIT       ; 40 us
        NOP                             ; 40 us + 40 us = 80 us
        BSF     PORTB,IR_TRANSMIT       ; Turn off IR transmit
        BTFSC   PORTB,IR_SG_DET
        GOTO    RESET_OPEN_CNT
        DECFSZ  MOTOR_BRK_CNT
        GOTO    DEC_3S_LP
;
OPEN_DET_LP
        MOVLW   2H
        CALL    DELAY_VAL_SET
        BCF     PORTB,IR_TRANSMIT       ; 40 us
        NOP                             ; 40 us + 40 us = 80 us
        BSF     PORTB,IR_TRANSMIT       ; Turn off IR transmit
;
        BTFSC   PORTB,IR_SG_DET
        GOTO    OPEN_DET_LP
        BCF     PORTB,LED_G_OPEN        ; Turn off open LED
;;
        BSF     PORTB,LED_R_CLOSE       ; Turn on close LED
        BSF     PORTA,AUTO_CLOSE
        MOVLW   1EH
        CALL    DELAY_VAL_SET
        BCF     PORTA,AUTO_CLOSE
        BCF     PORTB,LED_R_CLOSE       ; Turn on close LED
;
        MOVLW   48D
        MOVWF   MOTOR_BRK_CNT
;;
CLOSE_DET_LP
        BSF     PORTA,MOTOR_STOP        ; Motor brake
        MOVLW   2H
        CALL    DELAY_VAL_SET
        BCF     PORTB,IR_TRANSMIT       ; 40 us
        NOP                             ; 40 us + 40 us = 80 us
        BSF     PORTB,IR_TRANSMIT       ; Turn off IR transmit
;
        BTFSC   PORTB,IR_SG_DET
        GOTO    IR_SG_RECE_OK
        DECFSZ  MOTOR_BRK_CNT
        GOTO    CLOSE_DET_LP
        BCF     PORTA,MOTOR_STOP
;
        BCF     PORTB,PW_358_1          ; Turn off 1th 358 power
        BSF     PORTA,PW_358_2          ; Turn off 2th 358 power
        BSF     LED_MEM,6               ; LED flash enable
        CALL    LED_OFF_TMR_S
        GOTO    MAIN_PROG_LOOP          ;
;
;;      ___  Reset vector for power on & reset  ___
;
        ORG     PIC16C54
        GOTO    INIT_RESET

⌨️ 快捷键说明

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