×
单片机 > 单片机程序设计 > 详情

51单片机的315M接收头接收汇编程序(从机)

发布时间:2020-05-28 发布时间:
|
;防盗器子机程序 
 
      FSDY EQU P1.7     ;发射电源端,高电平为输出 
      FSKZ EQU P1.6     ;发射控制端,低电平有效 
      FSDD EQU P1.5     ;发射控制D端,高电平控制有效 
      FSCC EQU P1.4     ;发射控制C端,高电平控制有效 
      FSBB EQU P1.3     ;发射控制B端,高电平控制有效 
      CGDY EQU P1.2     ;传感器电源端,高电平为输出 
      SPK1 EQU P1.1     ;报警喇叭,高电平为输出,暂时不用 
      DYAD EQU P1.0     ;电源AD输入端 
 
      CGQ1 EQU P3.0     ;振动传感器 
      CGQ2 EQU P3.1     ;微波传感器 
 
      JSVT EQU P3.2     ;接收头VT端 
      JSDD EQU P3.3     ;接收头D输出端,有效高电平输出 
      JSCC EQU P3.4     ;接收头C输出端,有效高电平输出 
      JSBB EQU P3.5     ;接收头B输出端,有效高电平输出 
      LED1 EQU P3.7     ;指示灯 
 
      P1MO EQU 91H 
      P1M1 EQU 92H 
 
      P1MA EQU 00000001B 
      P1MB EQU 10111110B 
 
      JSBM EQU 00111100B;设置接收端口状态,屏蔽P3.7、P3.6、P3.1、P3.0 
      KJBM EQU 00100000B;设定开机编码为011(即接收头B为0、C为1、D为1) 
      ZDBM EQU 00110000B;设定振动探测报警编码为110 
      WBBM EQU 00101000B;设定微波探测报警编码为101 
      DYBM EQU 00010000B;设定子机电源低压报警编码为010,也是接收寻车 
      GJBM EQU 00001000B;设定2分钟联络子机一次编号为001,也是接收启动 
 
      DYBJ EQU 80H      ;设定电源低电压(9V以下)报警值 
 
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
;A/D转换程序。 
ADC_CONTR   EQU 0C5H    ;A/D转换寄存器 
ADC_DATA    EQU 0C6H    ;A/D转换结果寄存器, 
                        ;为10位A/D转换结果的高8位 
;ADC_LOW2   EQU 0BEH    ;A/D转换结果寄存器,低2位有效, 
                        ;为10位A/D转换结果的低2位 
                        ;如果不用ADC_L0W2的低2位, 
                        ;只用ADC_DATA的8位,则为8位A/D转换 
 
ADC_Powerl0 EQU 11100000B;P1.0作为A/D输入 
 
;定义变量 
ADC_Chl0    EQU 32H     ;0通道A/D转换结果 
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 
 
      ORG  0000H ;程序执行开始地址 
      LJMP KS   ;跳至KS 
      ORG  0003H ;外中断0中断程序入口 
      LJMP INT00        ;中断返回 
      ORG  000BH        ;定时器T0中断程序入口 
      LJMP INTT0        ;跳至INTT0中断服务程序 
      ORG  0013H ;外中断1中断入口 
      RETI        ;中断返回 
      ORG  001BH ;定时器T1中断程序入口 
      RETI       ;中断返回 
      ORG  0023H ;串口中断入口地址 
      RETI 
 
      ORG 100H 
;开机初始化 
KS:   ACALL CLEAR1      ;设定初值 
      MOV PSW,#00H      ;设程序状态字寄存器为00 
      MOV SCON,#00H     ;设串行口控制寄存器为00 
      CLR LED1          ;指示灯提示通电 
      ACALL YS2         ;延时 
      SETB LED1         ;关指示灯 
 
;---------------------------------------------------------------- 
;开机检测 
      ACALL ADAD 
      SUBB A,#DYBJ      ;与预定值比较 
      ACALL CLEAR1      ;重新设定初值 
      JNC KS2           ;电压低报警,正常才能开防盗器 
      MOV A,#20         ;低压则连续报警20次 
KS1:  ACALL DYFS        ;电压低发射010报警信号 
      CLR LED1          ;红灯亮 
      ACALL YS2         ;延时 
      SETB LED1         ;红灯灭 
      ACALL YS2         ;延时 
      DEC A 
      JNZ KS1 
      CLR LED1          ;红灯闪20次后常亮 
      ORL PCON,#2       ;进入掉电模式,只有复位才能启动 
      NOP 
      NOP 
      NOP 
      AJMP KS           ;软件陷阱 
 
;-------------------------------------------------- 
;电源电压检测(AD转换)后进入待机状态 
;-------------------------------------------------- 
KS2:  CLR IT0           ;外部中断低电平触发 
      SETB EA           ;开总中断允许 
      SETB EX0          ;开外部中断0 
 
KS3:  ORL PCON,#01H     ;进入待机,只有外中断或复位才能启动 
      NOP               ;退出中断后设置软件陷阱 
      NOP 
      NOP 
      CJNE A,#KJBM,KS2  ;必须是开机信号,信号不对返回继续进入待机 
 
;-------------------------------------------------- 
;开始进入防盗状态 
;-------------------------------------------------- 
KS0:  SETB CGDY         ;打开振动和微波探测头电源 
      CLR A             ;A清零 
      CLR LED1          ;进入报警监测状态,指示灯亮 
      SETB SPK1         ;报警器响一下,进入防盗状态 
      ACALL YS3         ;延时 
      CLR SPK1          ;关报警器 
      ACALL KJFS        ;发射011回应主机,表示收到并进入防盗状态 
      SETB LED1         ;指示灯灭 
      ACALL YS2 
 
;-------------------------------------------------- 
;-------------------------------------------------- 
      MOV TMOD,#00010001B;设定时器T1为计数器方式(方式1) 
      MOV TH0,#3CH      ;设T1为100mS 
      MOV TL0,#0B0H 
      SETB ET0          ;允许定时器T1中断 
      SETB TR0          ;启动计数器T1 
      MOV 30H,#00H      ;100ms时间计数器清零 
      MOV R0,#00H       ;10s时间到标志位清零 
      MOV 34H,#00H 
      MOV 33H,#0FH 
      MOV 35H,#00H 
      MOV R1,#0FH       
 
;-------------------------------------------------- 
;正式进入防盗状态 
;-------------------------------------------------- 
 
KS4:  JNB CGQ1,KS5      ;检测振动传感器是否输出(有盗情) 
      ACALL YS1 
      JNB CGQ1,KS5 
      CLR TR0           ;关定时中断 
      INC 35H 
      MOV A,35H 
      CJNE A,#10,S2 
      DEC 35H 
      SETB SPK1         ;报警器响一下 
      ACALL YS2         ;延时 
      CLR SPK1          ;关报警器 
      SJMP KS5 
S2:   ACALL ZDFS        ;检测到振动传感器有输出,发射110报警信号 
      ACALL YS2         ;延时 
      SETB TR0          ;开定时中断允许 
   
KS5:  JB CGQ2,KS6       ;检测微波传感器是否输出(有盗情) 
      ;ACALL YS1 
      ;JB CGQ2,KS6 
      CLR TR0           ;关定时中断 
      DJNZ R1,S1 
      INC R1 
      SETB SPK1         ;报警器响一下,进入防盗状态 
      ACALL YS2         ;延时 
      CLR SPK1          ;关报警器 
      SJMP KS6 
S1:   ACALL WBFS        ;检测到微波传感器有输出,发射101报警信号 
      ACALL YS2         ;延时 
      SETB TR0          ;开定时中断允许 
 
KS6:  CJNE R0,#01H,KS7  ;10S检测一次电源电压 
      CLR TR0           ;关定时中断 
      ACALL ADAD        ;调用电源电压检测程序 
      ACALL CLEAR2      ;重新设定初值 
      SUBB A,#DYBJ      ;与预定值比较 
      CLR A             ;A清零 
      MOV R0,#00H       ;10s时间到标志位清零 
      SETB TR0          ;开定时中断允许 
      JNC KS7           ;电压低报警 
      CLR TR0           ;关定时中断 
      ACALL DYFS        ;电压低发射010报警信号 
      SETB TR0          ;开定时中断允许 
      DJNZ 33H,KS7 
      CLR LED1 
      CLR TR0           ;关定时中断 
      AJMP KS2 
 
KS7:  MOV A,P3          ;收到子机的反馈信号则判断是否正确 
      ANL A,#JSBM       ;屏蔽P3.7、P3.6、P3.1、P3.0 
      CJNE A,#GJBM,KS8  ;检测是否收到主机的关机信号 
      CLR ET0           ;无信号则关定时器T1中断 
      CLR CGDY          ;关传感器电源 
 
      CLR LED1          ;进入报警监测状态,指示灯亮 
      SETB SPK1         ;报警器响一下,进入防盗状态 
      ACALL YS2         ;延时 
      CLR SPK1          ;关报警器 
      ACALL YS3         ;延时 
      SETB SPK1         ;报警器响一下,进入防盗状态 
      ACALL YS3         ;延时 
      CLR SPK1          ;关报警器 
      ACALL GJFS        ;调用关机发射程序 
      SETB LED1         ;进入报警监测状态,指示灯亮 
      JNB JSVT,$        ;等待主机停止发射 
      AJMP KS2          ;返回进入待机状态 
 
KS8:  CJNE A,#KJBM,S3 
      JNB JSVT,$        ;等待主机停止发射 
      AJMP KS0          ;返回进入待机状态 
 
S3:   CJNE A,#DYBM,S4 
      SETB SPK1         ;报警器响一下,进入防盗状态 
      ACALL YS3         ;延时 
      CLR SPK1          ;关报警器 
      MOV R1,#01H 
S4:   AJMP KS4 
 
;**************************************************************** 
;---------------------------------------------------------------- 
;以下为子程序 
;---------------------------------------------------------------- 
;---------------------------------------------------------------- 
;以下为开机发射程序 
;---------------------------------------------------------------- 
;主机开机子机发射编码011给主机以联通 
KJFS: CLR LED1          ;指示灯亮 
      CLR FSBB          ;B端为0 
      SETB FSCC         ;C端为1 
      SETB FSDD         ;D端为1 
      CLR FSKZ          ;允许发射 
      ACALL TZFS        ;调用停止发射程序 
      RET               ;返回 
 
;---------------------------------------------------------------- 
;以下为振动输出(有盗情)的发射程序 
;---------------------------------------------------------------- 
;振动输出(有盗情)发射编码110给主机进行报警 
ZDFS: CLR LED1          ;指示灯亮 
      SETB FSBB         ;B端为1 
      SETB FSCC         ;C端为1 
      CLR FSDD          ;D端为0 
      CLR FSKZ          ;允许发射 
      ACALL TZFS        ;调用停止发射程序 
      RET               ;返回 
 [page]
;---------------------------------------------------------------- 
;以下为微波输出(有盗情)的发射程序 
;---------------------------------------------------------------- 
;微波输出(有盗情)发射编码101给主机进行报警 
WBFS: CLR LED1          ;指示灯亮 
      SETB FSBB         ;B端为1 
      CLR FSCC          ;C端为0 
      SETB FSDD         ;D端为1 
      CLR FSKZ          ;允许发射 
      ACALL TZFS        ;调用停止发射程序 
      RET               ;返回 
 
;---------------------------------------------------------------- 
;以下为联络主机的发射程序 
;---------------------------------------------------------------- 
;联络主机发射编码001给主机 
GJFS: CLR LED1          ;指示灯亮 
      CLR FSBB          ;B端为0 
      CLR FSCC          ;C端为0 
      SETB FSDD         ;D端为1 
      CLR FSKZ          ;允许发射 
      ACALL TZFS        ;调用停止发射程序 
      RET               ;返回 
 
;---------------------------------------------------------------- 
;以下为电源低压的发射程序 
;---------------------------------------------------------------- 
;子机电源低压发射编码010给主机进行报警 
DYFS: CLR LED1          ;指示灯亮 
      CLR FSBB          ;B端为0 
      SETB FSCC         ;C端为1 
      CLR FSDD          ;D端为0 
      CLR FSKZ          ;允许发射 
      ACALL TZFS        ;调用停止发射程序 
      RET               ;返回 
 
;---------------------------------------------------------------- 
;以下为停止发射程序 
;---------------------------------------------------------------- 
TZFS: ACALL YS2         ;延时 
      ACALL YS2         ;延时 
      SETB FSKZ         ;停止发射 
      CLR FSBB          ;B端为0 
      CLR FSCC          ;C端为0 
      CLR FSDD          ;D端为0 
      SETB LED1         ;指示灯灭 
      RET               ;返回 
 
;---------------------------------------------------------------- 
;以下为初始化程序 
;---------------------------------------------------------------- 
CLEAR1:MOV P1MO,#P1MA   ;P1端口状态 
      MOV P1M1,#P1MB 
      MOV SP,#50H       ;设推栈初值 
      SETB FSDY         ;关闭发射编码IC电源 
      SETB FSKZ 
      CLR FSDD          ;发射电路不发射(D端为0) 
      CLR FSCC          ;发射电路不发射(C端为0) 
      CLR FSBB          ;发射电路不发射(B端为0) 
      CLR CGDY          ;关传感器电源 
      CLR SPK1          ;关报警喇叭 
      RET 
 
;---------------------------------------------------------------- 
;以下为进入防盗后AD转换后初始化程序 
;---------------------------------------------------------------- 
CLEAR2:MOV P1MO,#P1MA   ;P1端口状态 
      MOV P1M1,#P1MB 
      ;MOV SP,#50H      ;设推栈初值 
      SETB FSDY         ;关闭发射编码IC电源 
      SETB FSKZ 
      CLR FSDD          ;发射电路不发射(D端为0) 
      CLR FSCC          ;发射电路不发射(C端为0) 
      CLR FSBB          ;发射电路不发射(B端为0) 
      SETB CGDY         ;开传感器电源 
      CLR SPK1          ;关报警喇叭 
      RET 
 
;---------------------------------------------------------------- 
;以下为外中断(接收头收到信号)处理程序 
;---------------------------------------------------------------- 
INT00:CLR EX0           ;关外中断 
      MOV A,P3          ;收到子机的反馈信号则判断是否正确 
      ANL A,#JSBM       ;屏蔽P3.7、P3.6、P3.1、P3.0 
      MOV 34H,A 
      JNB JSVT,$        ;等待主机停止发射 
      ;SETB EA           ;开总中断允许 
      RETI 
 
;---------------------------------------------------------------- 
;以下为处理程序 
;---------------------------------------------------------------- 
;中断处理程序 
INTT0:CLR EA            ;关总中断 
      PUSH ACC          ;进栈保护ACC数据 
      PUSH PSW          ;进栈保护PSW数据 
      MOV TH0,#3CH      ;设T1为100mS 
      MOV TL0,#0B0H 
      INC 30H           ;ms时间计数器 
      MOV A,30H 
      CJNE A,#100,LOP2  ;计时计数器,10s进位1次 
      MOV 30H,#00H      ;ms时间计数器清零,重新开始计时 
      MOV R0,#01H       ;10s到标志       
LOP2: POP PSW           ;PSW出栈 
      POP ACC           ;ACC出栈 
      SETB EA           ;开总中断 
      RETI              ;中断返回 
 
;---------------------------------------------------------------- 
;以下为AD转换程序,监测电源电源 
;---------------------------------------------------------------- 
;AD转换 
ADAD:ACALL ADC_Power_On       ;开ADC电源,第一次使用时要打开内部模拟电源 
                              ;开ADC电源,可适当加延时,1mS以内就足够了 
 
    ACALL Set_ADC_Channel_0   ;设置P1.0作为A/D转换通道 
 
    ACALL Get_AD_Result       ;测量电压并且取A/D转换结果 
 
    MOV   A, ADC_Chl0         ;A/D转换结果 
 
    RET 
 
;┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ 
ADC_Power_On: 
    PUSH  ACC 
    ORL   ADC_CONTR,#80H ;开A/D转换电源 
    MOV   A, #20H 
    ACALL Delay          ;开A/D转换电源后要加延时,ImS以内就足够了 
    POP   ACC 
    RET 
;┈┈┈┈┈┈┈┈┈┈┈ 
Set_ADC_Channel_0: 
    MOV   ADC_CONTR,#ADC_Powerl0 
                    ;选择P1.0作为A/D转换通道 
    MOV   A,#05H    ;更换A/D转换通道后要适当延时,使输入电压稳定 
                    ;以后如果不更换A/D转换通道的话,不需要加延时 
    ACALL Delay    ;切换A/D转换通道,加延时20uS~200uS就可以了, 
           ;也输入电压源的内阻有关 
   ;如果输入电压信号源的内阻在10K以下,可不加延时 
    RET 
 
;┈┈┈┈┈┈┈┈┈┈┈ 
 
Get_AD_Result: 
    PUSH  ACC                    ;入栈保护 
    MOV   ADC_DATA,#0   
    ORL   ADC_CONTR,#00001000B   ;启动 AD 转换 
 
Wait_AD_Finishe: 
    MOV   A,#00010000B           ;判断 AD 转换是否完成 
    ANL   A,ADC_CONTR 
    JZ    Wait_AD_Finishe        ;AD 转换尚未完成,继续等待 
       
    ANL  ADC_CONTR,#11100111B    ;清0 ADC_FLAG,ADC_START位,停止A/D转换           
    MOV   A,ADC_DATA 
    MOV   ADC_Chl0,A             ;保存 AD 转换结果 
    POP   ACC 
    RET 
;┈┈┈┈┈┈┈┈┈┈┈ 
Delay: 
    PUSH  02                 ;将寄存器组0的R2入栈 
    PUSH  03                 ;将寄存器组0的R3入栈 
    PUSH  04                 ;将寄存器组0的R4入栈 
    MOV   R4,A 
Delay_Loop0: 
    MOV   R3,#200            ;2 CL0CK┈┈┈┈┈┈┈┈+ 
Delay_Loop1:                 ;                     │               
    MOV   R2,#249            ;2 CL0CK┈+           │ 
Delay_Loop:                  ;         │1002 CLOCK│200406 CLOCK 
    DJNZ  R2, Delay_LooP     ;4 CL0CK  │          │ 
    DJNZ  R3, Delay_LooP1    ;4 CL0CK ┈+          │  
    DJNZ  R4, Delay_LooP0    ;4 CL0CK┈┈┈┈┈┈┈┈+ 
  
    POP   04 
    POP   03 
    POP   02 
    RET 
 
;---------------------------------------------------------------- 
 
;---------------------------------------------------------------- 
;以下为延时子程序 
;---------------------------------------------------------------- 
;延时子程序 
YS1:  MOV R6,#100 
Y11:  MOV R7,#0FFH 
Y12:  NOP 
      NOP 
      NOP 
      DJNZ R7,Y12 
      DJNZ R6,Y11 
      RET 
 
YS2:  MOV R5,#08H       ;中长时间延时 
Y20:  MOV R6,#0FFH 
Y21:  MOV R7,#0FFH 
Y22:  NOP 
      NOP 
      NOP 
      DJNZ R7,Y22 
      DJNZ R6,Y21 
      DJNZ R5,Y20 
      RET 
;---------------------------------------------------------------- 
YS3:  MOV R5,#05H     ;长长时间延时 
Y30:  MOV R6,#0FFH 
Y31:  MOV R7,#0FFH 
Y32:  NOP 
      NOP 
      NOP 
      DJNZ R7,Y32 
      DJNZ R6,Y31 
      DJNZ R5,Y30 
      RET 
 
      ORG 0400H 
      NOP               ;设置软件陷阱 
      NOP 
      NOP 
      LJMP KS 
      END 
;***************************************************************** 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式