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

📄 m_master.asm

📁 合泰单片机汇编程序,摩托车防盗器主机程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:
    CALL  DELAY124
    
TX_NEXT:
    SZ    [TX_DATA1].7;0
    JMP   TXX   ;CALL   TX1
    CALL   TX0
TXX1:
    RLC   [TX_DATA3]
    RLC   [TX_DATA2]
    RLC   [TX_DATA1]
    SDZ   CNT_Bits ;TX_CNT
    JMP   TX_NEXT
 ;---------------------------- 
    MOV   A,SAVE_DATA1
    MOV   [TX_DATA1],A
    MOV   A,SAVE_DATA2
    MOV   [TX_DATA2],A    ;恢复回传码
    MOV   A,SAVE_DATA3
    MOV   [TX_DATA3],A
 ;----------------------------
    RET

TXX:
    CALL  TX1
    JMP   TXX1
;--------------------
TX0:
      SET   PB.5;PA.7      ;0
      CALL  DELAY4
      CLR   PB.5;PA.7
      CALL  DELAY12
      RET
TX1:
      SET   PB.5;PA.7      ;1
      CALL  DELAY12
      CLR   PB.5;PA.7
      CALL  DELAY4
      RET
;----------------------
 
;======================================================
 ;中断子程序
;======================================================
SEVER:
      ;/CLR   WDT
      MOV   BUF,A
      MOV   A,STATUS
      MOV   BUF_STATUS,A
      CLR   WDT
     
      CLR   [INTC].TF
      CLR   [TMR]
      SET   [TMRC].TON
  ;--------------------------------- ;自动设防中断体
      SNZ   INT_Auto
      JMP   NO_Auto
      INC   CNT_Auto4s;COUNT_4s       ;4s
      SZ    CNT_Auto4s;COUNT_4s
      JMP   EXIT_INT
      INC   CNT_Auto;COUNT_30s ;Auto
      MOV   A,CNT_Auto;COUNT_30s ;Auto
      XOR   A,CNT_Auto10s;CNT10s_30s ;3D           ;12s
      SZ    ACC
      JMP   EXIT_INT
      CLR   F_Auto
      CLR   INT_Auto       ;退出自动设防中断体
      SnZ   F_guard        ;在设防下,熄火或Lockoff时,不再进入自动设防
      SET   F_KEY_Auto ;4      ;进入自动声光设防
      CLR   [TMRC].TON
      SNZ   F_START        
      JMP   EXIT_INT
      SET   [TMRC].TON     ;已启动后解除时,进入自动设防后再进入3分熄火等待
  ;----------------------------------
      
NO_Auto:     
      SZ    Un_Light
      JMP   INT1_1
      SET   F_run           ;n.串联
      ;SZ    Relay_Stop      ;Relay stop 释放,延时,防止自身振动连续响应
      ;JMP   Free_run
   ;---------------------------------;第2次振动,and the lock on 
    CLR   F_START
      INC   COUNT_240ms
      MOV   A,COUNT_240ms
      XOR   A,20D     ;240ms
      SNZ    Z;ACC
      JMP   INT1_1
      CLR   COUNT_240ms
      SZ    Open_Light    ;  SZ  Light
      JMP   INT1_2
      ;SnZ   Un_Light
      SET   Light
      SET   Open_Light    ;开灯标记
      JMP   INT1_1
INT1_2:
      ;SNZ   Un_Light
      CLR   Light
      CLR   Open_Light
 ;-------------------------------------     
        
INT1_1:
      SZ    F_Rob             ;防抢报警不计时,不停止的报警
      JMP   EXIT_INT
      SZ    Relay_Stop      ;Relay stop 释放,延时,防止自身振动连续响应
      JMP   Free_run
     ;---------------------------
      INC   COUNT_4s          ;16.384ms*256=4 s
      SZ    COUNT_4s
      JMP   EXIT_INT
    ;SZ    F_START
    ;JMP   Time_STA
    ;CLR   F_START
    ;CLR   Vdd_sta             ;恢复引擎
    ;CLR   Flameout                                            
;Time_STA:
      INC   COUNT_30s
     ;-------------------------------------
      mov   a,count_30s
      xor   a,2d
      sz    z
      jmp   alr
      mov   a,count_30s       ;隔 8s 发一次,3 次发完
      xor   a,4d
      sz    z
      jmp   alr
      mov   a,count_30s
      xor   a,6d
      sz    z
      jmp   alr
 ch_over:
     ;--------------------------------------
      MOV   A,COUNT_30s
      XOR   A,CNT10s_30s;COUNT_First ;7D       ;30s   十秒或者三十秒
      SZ    ACC
      JMP   EXIT_INT
      SET   F_run;CLR   F_run   ;关闭继电器的那一刻,不扫描振动
      CLR   Bugle      ;关
      CLR   Light
      CLR   F_first    ;CLOSE  Vib 

      ;CLR   F_ROB
     ;;CLR   F_START
    ;/CLR   Vdd_sta             ;恢复引擎
    ;;;;;;;;;;;;;SnZ    LockOn         ;3秒内未插入钥匙,则熄火
    ;/CLR   Flameout   
    SET   Relay_Stop      ;Relay stop 释放,延时,防止自身振动连续响应
    SET   Un_Light        ;关闭后再等待完全停止,此时不在进入闪灯,只进下面的延时
    SNZ    F_guard
    JMP    Free_run  
    CLR   Vdd_sta             ;恢复引擎
    ;;;;;;;;;;;;;SnZ    LockOn         ;3秒内未插入钥匙,则熄火
    CLR   Flameout   

;------------ 等待继电器完全停止,再扫描LockOn ,vib  ---
Free_run:
      INC   COUNT_30s
      MOV   A,114d;30D;50D;15D         ;240MS
      ADD   A,CNT10s_30s
      XOR   A,COUNT_30s
      SZ    ACC
      JMP   EXIT_INT
      CLR   F_run
      ;/CLR   F_START
    CLR   Relay_Stop      ;Relay stop 释放,延时,防止自身振动连续响应
    CLR   Un_Light
;--------------------------------------------------
   ;--------------------------
    ;清除所有再次发射
    clr   come_lockon
    clr   come_vib
   ;--------------------------
   ;-----设防时上面已关过,这重复关或解除下是只在这里关,让安全的退出再进入自动设防-------
    CLR   Vdd_sta             ;恢复引擎
    ;;;;;;;;;;;;;SnZ    LockOn         ;3秒内未插入钥匙,则熄火
    CLR   Flameout   
   ;-----------------------------------------------------------
    ;/SnZ   Lockon
    ;SET   TurnOn_Lock
    CLR   F_START

      CLR   [TMRC].TON

 
EXIT_INT:
      MOV   A,BUF_STATUS
      MOV   STATUS,A
      MOV   A,BUF
      RETI
alr:
      sz    come_lockon       ;再次发射
      set   Tx_ComeLock
      sz    come_vib
      set   Tx_ComeVib
      jmp   ch_over
      

;=======================================================
;搜寻键
;=======================================================
KEY_BY_KEY:
     CLR    WDT
     MOV     A,[Data3]
	 AND     A,0F0H
     MOV     [KEY_Cancel],A
     XOR     A,[CHKData3]
     SNZ      Z;[STATUS].Z
     JMP     NEXT

     MOV     A,[Data2]
     XOR     A,[CHKData2]
     SNZ      Z;[STATUS].Z
     JMP     NEXT

     MOV     A,[Data1]
     XOR     A,[CHKData1]
     SNZ      Z;[STATUS].Z
     JMP     NEXT
     JMP     KEY_COMP
 
NEXT:
     MOV    A,[KEY_Cancel]

     XOR    A,[CHKData6]
     SNZ     Z;[STATUS].Z
     JMP    EXIT_KEY;JMP     GU;JMP    START
 
     MOV    A,[Data2]
     XOR    A,[CHKData5]
     SNZ     Z;[STATUS].Z
     JMP    EXIT_KEY;JMP    GU;JMP    START
     
     MOV    A,[Data1]
     XOR    A,[CHKData4]
     SNZ     Z;[STATUS].Z
     JMP    EXIT_KEY;JMP    GU;JMP    START          ;Error_Romote

KEY_COMP:
    ;---------------------------------
     MOV     A,[DATA3]
     MOV     [TX_Data3],A
     MOV     A,[DATA2]       ;回传 Remote code 
     MOV     [TX_Data2],A
     MOV     A,[DATA1]
     MOV     [TX_Data1],A
     call    WriteRemote     ;保护 Remote code 以免复位清0过后不能正确回传正在使用的遥控器码
    ;---------------------------------
     MOV     A,[Data3]       ;判断按键
     AND     A,0FH
     MOV     [KEY_Only],A
     XOR     A,01H;02H
     SZ      Z;[STATUS].Z
     SET     F_KEY1;JMP     KEY1

     MOV    A,[KEY_Only]
     XOR    A,02H;01H
     SZ      Z;[STATUS].Z
     SET    F_KEY2;JMP    KEY2 
     
     MOV    A,[KEY_Only]
     XOR    A,04H
     SZ      Z;[STATUS].Z
     SET    F_KEY3;JMP    KEY3
     
     MOV    A,[KEY_Only]  
     XOR    A,08H
     SZ      Z;[STATUS].Z
     SET    F_KEY4;JMP    KEY4 

     MOV    A,[KEY_Only]  
     XOR    A,03H
     SZ      Z;[STATUS].Z
     SET    F_KEY5;JMP    KEY5  

     MOV    A,[KEY_Only]  
     XOR    A,05H
     SZ      Z;[STATUS].Z
     SET    F_KEY6;JMP    KEY6

     ;MOV    A,[KEY_Only]  
     ;XOR    A,06H
     ;SZ      Z;[STATUS].Z
     ;SET    F_KEY7;JMP    KEY7

     ;MOV    A,[KEY_Only]  
     ;XOR    A,07H
     ;SZ      Z;[STATUS].Z
     ;SET    F_KEY8;JMP    KEY8    
    
EXIT_KEY:
     NOP 
     RET           

;=======================================================
;进入学习
;=======================================================
 
Learn:

     MOV     A,8D             ;2s
     MOV    COUNT4,A
LOOP2:
     MOV     A,200D
     MOV    COUNT3,A
LOOP1:
	 MOV     A,250D            ; 2mS计时 
 	 MOV    COUNT2,A
LOOP0:
     CLR    WDT
	 SZ     learn_key                ; 输入高?
	     JMP  EXIT_Learn ;JMP      MAIN        ; 否,退出循环
	 SDZ     COUNT2             ; 是, 2mS倒计时
	     JMP      LOOP0
     SDZ     COUNT3
         JMP      LOOP1
     SDZ     COUNT4
         JMP      LOOP2           
	

     SET     Bugle             ;提示,允许学习,
     SET     Light
     CALL    DELAY240ms;CALL    Dly250mS
     CLR     Bugle
     CLR     Light
     MOV     A,220D;           ;5s内学习有效
     MOV     COUNT2,A
RE1: MOV     A,200D
     MOV     COUNT3,A
RE:	 CLR     WDT
     CALL    RECEIVE
     snz     c;SZ     [F_Receive].Right
     JMP     WRIGHT              ;加时间限制,5S内有效
     SDZ     COUNT3
     JMP     RE
     SDZ     COUNT2
     JMP     RE1 
     SET     Bugle          ;5秒后若学习不成功# 闪,叫一声
     SET     Light
     CALL    DELAY240ms;CALL    Dly250ms
     CLR     Bugle
     CLR     Light    
     JMP     EXIT_Learn ;JMP     MAIN
     
WRIGHT:
    CLR     WDT
	mov 	A,[Data3]
	mov	[temp0],A
	mov 	A,0fh
	andm	A,[temp0]

	mov a,[temp0]
	xor a,02h
	SZ    Z;sz 	[Status].z
	JMP   Startlearn ;jmp 	Time08s
	mov 	A,[temp0]	
	xor a,04h;03h;01h
	SZ    Z;sz [Status].z
	JMP   Startlearn ;jmp 	Time4s

	JMP    EXIT_Learn ;JMP    MAIN     ;jmp nokey

        
StartLearn:				
	sz F_SaveKeyArea ;[Flag5].SaveKeyArea          
	jmp Area2Save			
	mov A,[Data1]
	mov [CHKData1],A
	mov A,[Data2]
	mov [CHKData2],A
	mov A,0f0h
	and A,[Data3]
	mov [CHKData3],A
	set F_SaveKeyArea ;[Flag5].SaveKeyArea 
	jmp SaveOver
      
Area2Save: 
	mov A,[Data1]
	mov [CHKData4],A
	mov A,[Data2]
	mov [CHKData5],A
	mov A,0f0h
	and A,[Data3]
	mov [CHKData6],A
	clr F_SaveKeyArea ;[Flag5].SaveKeyArea 
 
SaveOver:

     CLR    WDT              
     CALL    WRITEBYTE
     SET     Bugle          ;学习成功,闪,叫两下
     SET     Light
     CALL    DELAY240ms;CALL    Dly250ms
     CLR     Bugle
     CLR     Light
     ;CALL    DELAY240ms;CALL    Dly250ms
     CALL    DELAY240ms
     SET     Bugle
     SET     Light
     CALL    DELAY240ms;CALL    Dly250ms
     CLR     Bugle
     CLR     Light
EXIT_Learn: 

            RET
;-----------------------

DELAY_Auto:
    MOV   A,80d;120d;20D
    MOV   COUNT2,A
Dau1:
    MOV   A,236d;237D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;原来是237D
    MOV   COUNT3,A
Dau2:

    JMP   $+1
    JMP   $+1
    CLR   WDT

    SDZ   COUNT3
    JMP   Dau2
    SDZ   COUNT2
    JMP   Dau1
    RET


DELAY240ms:
    MOV   A,120d;20D
    MOV   COUNT2,A
DLY24b:
    MOV   A,236d;237D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;原来是237D
    MOV   COUNT3,A
DLY24a:

    JMP   $+1
    JMP   $+1
    CLR   WDT

    SDZ   COUNT3
    JMP   DLY24a
    SDZ   COUNT2
    JMP   DLY24b
    RET
     

;DELAY240ms:
;    MOV   A,20d
;    MOV   COUNT4,A
;DLY240:
;    CALL  DELAY124
;    SDZ   COUNT4
;    JMP   DLY240
;    RET
    

DELAY4:
    MOV   A,50D
    MOV   COUNT2,A
DLY4a:
    JMP   $+1
    JMP   $+1
    CLR   WDT

    SDZ  COUNT2
    JMP  DLY4a
   RET

DELAY124:
    MOV   A,6D
    MOV   COUNT2,A
DLY124b:
    MOV   A,237D;250D
    MOV   COUNT3,A
DLY124a:
    JMP   $+1
    JMP   $+1
    CLR   WDT
    SDZ   COUNT3
    JMP   DLY124a
    SDZ   COUNT2
    JMP   DLY124b
    RET

DELAY12:
    MOV   A,140D;150D
    MOV   COUNT2,A
DLY12a:

    JMP   $+1
    JMP   $+1
    CLR   WDT

    SDZ   COUNT2
    JMP   DLY12a
    RET
;====================================================================
;     数据接收
;====================================================================
 
RECEIVE:
		  	SNZ		RF	;BTFSS     RFIN                	; 输入低电平?
	     	JMP		RMT_0	;GOTO      RMT_0           		; 是,接收错误
   
	   		MOV		A,10D	;MOVLW     .10                  	; 10mS计时
	 		MOV		[CNT1],A	;MOVWF     CNT1
RCV0:
	 		MOV		A,200D	;MOVLW     .200
 	 		MOV		[CNT0],A	;MOVWF     CNT0
RCV1:
	 		SNZ		RF	;BTFSS     RFIN                	; 输入高?
	     	JMP		RCV2	;GOTO      RCV2            	; 否,退出循环
;-----------------------------
	 		SDZ		[CNT0]	;DECFSZ    CNT0,F              ; 是, 10mS倒计时
	     	JMP		RCV1	;GOTO      RCV1       
;------------------------------     
	 		SDZ		[CNT1]	;DECFSZ    CNT1,F              
	     	JMP		RCV0	;GOTO      RCV0		
RCV2:   
	 		CLR		[CNT0]	;CLRF      CNT0                ; 清计时器
	 		CLR		[CNT1]	;CLRF      CNT1             

; *************************************************************************
; 开始对同步头计时
; *************************************************************************

RCV3:
	 		SZ		RF	;BTFSC     RFIN                ; 输入高电平?

	     	JMP		RCV6	;GOTO      RCV6            ; [0][0] YES--END CALIBRATION
	 		INC		[CNT0]	;INCF	  CNT0,1              ; 16位计数器加1	
	 		SZ		Z;[status].z;Z		;	;SKPNZ	      	               ; 无进位,跳过
	     	INC		[CNT1]	;INCF      CNT1,1          ; 高位加1
			CLR	WDT			;CLRWDT		               ; 清看门狗

⌨️ 快捷键说明

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