;采用AT89C2051单片机,晶振11.0592MHZ,通讯速率9600,采用TTL串口通讯 ;接收板为SB-JS1-L4 超再生锁存型接收板,8位地址4位数据(地址码均悬空) ;VT=17===P3.3=遥控接收板解码有效输出端 中断INT1 ;D0=10===P1.5=系统解防 ;D1=11===P1.4=模拟报警 ;D2=12===P1.3=系统静音报警/有声报警 ;D3=13===P1.2=系统设防 ;P3.0是振铃遥控设防、解防端,1为解防(LED8灭)0为设防(LED8亮) ;P1.6为设防指示灯,点亮红色LED为设防状态 ;P1.7为解防指示灯,点亮绿色LED为解防状态 ;25H中的2AH---报警设防、解防标志位(1为设防、0为解防) ;25H中的2BH---静音报警标志位(1为静音报警、0为有声报警) ;P3.5报警时控制拨打电话或者发出报警短消息 ;P3.7为现场报警器控制端,高电平报警,低电平停止 ;28H和29H用于串口触发寄存器 ORG 0000H CLR P3.7;开机报警器静音 AJMP MAIN;转入主程序 ORG 0003H ;外部中断P3.2脚INT0入口地址 AJMP INT ;转入外部中断振动报警器报警程序 ;以下为主程序进行CPU中断方式设置 MAIN:SETB EA ;打开CPU总中断请求 SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发 MOV SCON,#50H;设置成串口1方式 MOV TMOD,#20H;波特率发生器T1工作在模式2上 MOV TH1,#0FDH;预置初值(按照波特率9600BPS预置初值) MOV TL1,#0FDH;预置初值(按照波特率9600BPS预置初值) SETB TR1;启动定时器T1 ;以上完成串口9600通讯初始化设置 CLR 2AH;开机对报警标志位复位 CLR 2BH;默认为有声报警 ACALL DELAY100;开机延时一会儿,确保硬件稳定 ACALL DELAY100;开机延时一会儿,确保硬件稳定 ACALL DELAY100;开机延时一会儿,确保硬件稳定 SETB P3.7;报警器响一声,表示上电,同时检验报警器是否完好 ACALL DELAY100;延时约0.1秒 CLR P3.7;然后关闭报警器 JB P3.0,AA;开机时对P3.0口状态作一个备份(JB35的第八路,振铃遥控端) MOV R1,#00H;如果P3.0口为低电平,那么R1=#00H AJMP START AA:MOV R1,#0FFH;如果P3.0口为高电平,那么R1=#0FFH KKB:MOV R4,#248 FF:MOV R5,#100 START:JB P3.3,PANDUAN;循环判断遥控接收头第17脚VT是否有高电平信号输出? JB P3.0,BB;判断此时P3.0口电平高低? MOV R2,#00H;如果P3.0口为低电平,那么R2=#00H AJMP K2 BB:MOV R2,#0FFH;如果P3.0口为高电平,那么R2=#0FFH K2:MOV A,R1;比较R1和R2是否相同?也就是检测P3.0口电平是否变化过 XRL A,R2;如果P3.0口电平变化A=1;没有变化A=0 JNZ HH;如果P3.0口电平有变化,就改变输出状态 DJNZ R5,START DJNZ R4,FF JNB 2AH,KKB;如果在解防状态,就循环等待 JNB 2BH,KKB;如果在有声报警模式,就循环等待 CPL P1.6;如果在静音报警模式,每隔0.3秒让红灯闪烁一次 AJMP KKB HH:JB P3.0,BBB;检测到变化,将R1更新 MOV R1,#00H;如果P3.0口为低电平,那么R1=#00H SETB 2AH;对报警标志位置位 CLR P1.6;点亮红色设防指示灯 SETB P1.7;确保绿色指示灯在熄灭状态 SETB P3.7 ACALL DELAY100 CLR P3.7 ACALL DELAY100 SETB P3.7 ACALL DELAY100;报警器连续响两声,提示主人主机已经进入设防状态 CLR P3.7 SETB EX0 ;允许振动传感器报警中断 SS:AJMP START BBB:MOV R1,#0FFH;如果P3.0口为高电平,那么R1=#0FFH CLR 2AH;对报警标志位复位 CLR P1.7;点亮绿色解防指示灯 SETB P1.6;确保红色指示灯在熄灭状态 SETB P3.7 ACALL DELAY100;报警器响一声,表示主机撤防 CLR P3.7 CLR EX0 ;禁止振动传感器报警中断 AJMP START ;以下为进入P3.2脚振动报警中断程序 INT: CLR EA ;暂时关闭CPU的所有中断请求 ACALL DELAY100;调用100毫秒延时子程序,触点消抖 JB P3.2,EXIT;如果是干扰,就返回 ACALL BAOJING;调用现场报警子程序 EXIT: SETB EA;允许中断 RETI;退出解码子程序 ;准备处理无线遥控器接收到的数据 PANDUAN:ACALL DELAY10;延时10毫秒触点消抖 JNB P3.3,SS;如果是干扰就返回 MOV A,#00H;对A清零 MOV 20H,P1;利用20H可以位寻址 MOV C,05H;将20H中的第13脚的状态移入 RRC A MOV C,04H;将20H中的第12脚的状态移入 RRC A MOV C,03H;将20H中的第11脚的状态移入 RRC A MOV C,02H;将20H中的第10脚的状态移入 RRC A CJNE A,#00H,A0;如果P1口没有检测到数据码,就出错返回! AJMP START A0:CJNE A,#10000000B,A1;如果检测到这个数据,说明是手持遥控器遥控设防 SETB 2AH;对报警标志位置位 CLR P1.6;点亮红色设防指示灯 SETB P1.7;确保绿色指示灯在熄灭状态 SETB P3.7 ACALL DELAY100 CLR P3.7 ACALL DELAY100 SETB P3.7 ACALL DELAY100;报警器连续响两声,提示主人主机已经进入设防状态 CLR P3.7 JB P3.3,$ SETB EX0 ;允许振动传感器报警中断 AJMP START A1:CJNE A,#00010000B,A2;如果检测到这个数据,说明是手持遥控器遥控解防 CLR 2AH;对报警标志位复位 CLR P1.7;点亮绿色解防指示灯 SETB P1.6;确保红色指示灯在熄灭状态 SETB P3.7 ACALL DELAY100;报警器响一声,表示主机撤防 CLR P3.7 JB P3.3,$ CLR EX0 ;禁止振动传感器报警中断 AJMP START ;如果报警标志位为0说明系统没有开启,返回待机;为1就跳转到A21,继续判断代码 A2:JB 2AH,A21 AJMP START;返回待机状态 A21:CJNE A,#01000000B,A3;如果P1口检测到这个数据,说明是设置静音/有声报警 CPL 2BH;设置静音/有声报警 JB 2BH,XG;如果是1为静音模式 SETB P3.7 ACALL DELAY100;鸣叫一声,进入正常的有声报警模式 CLR P3.7 JNB 2AH,OVER;如果在解防状态,直接退出 CLR P1.6;如果在设防状态下确保红色设防指示灯点亮 AJMP OVER XG:SETB P3.7 ACALL DELAY100 ACALL DELAY100;鸣叫一声 CLR P3.7 ACALL DELAY100 ACALL DELAY100 SETB P3.7 ACALL DELAY100 ACALL DELAY100;鸣叫第二声 CLR P3.7 ACALL DELAY100 ACALL DELAY100 SETB P3.7 ACALL DELAY100 ACALL DELAY100;鸣叫第三声,提示进入静音模式 CLR P3.7 OVER:JB P3.3,$;等待遥控信号消失 F1:AJMP START A3:CJNE A,#00100000B,A4;如果P1口检测到这个数据说明是模拟报警 MOV R7,#13 F2:ACALL DELAY100 JNB P3.3,F1;如果模拟报警按下时间小于1秒,就无效返回 DJNZ R7,F2 CLR P3.5;触发JB35的第12脚,可以拨打电话,或者发短消息 SETB P3.7 ACALL DELAY100;报警器响第一声,表示收到遥控指令 CLR P3.7 JB P3.3,$ SETB P3.5;消除12脚报警信号 AJMP START ;以上四个代码是系统专用的,专为配合手持遥控器使用的,无线报警传感器不能使用! ;系统可以提供11个无线报警传感器的识别代码,用来判断无线传感器的安装位置 A4:CJNE A,#00110000B,A5;检测到这个代码,发送COMSMS03 MOV 28H,#30H MOV 29H,#33H A5:CJNE A,#0101000B,A6;检测到这个代码,发送COMSMS04 MOV 28H,#30H MOV 29H,#34H A6:CJNE A,#01100000B,A7;检测到这个代码,发送COMSMS05 MOV 28H,#30H MOV 29H,#35H A7:CJNE A,#01110000,A8;检测到这个代码,发送COMSMS06 MOV 28H,#30H MOV 29H,#36H A8:CJNE A,#10010000B,A9;检测到这个代码,发送COMSMS07 MOV 28H,#30H MOV 29H,#37H A9:CJNE A,#10100000B,A10;检测到这个代码,发送COMSMS08 MOV 28H,#30H MOV 29H,#38H A10:CJNE A,#10110000B,A11;检测到这个代码,发送COMSMS09 MOV 28H,#30H MOV 29H,#39H A11:CJNE A,#11000000B,A12;检测到这个代码,发送COMSMS10 MOV 28H,#31H MOV 29H,#30H A12:CJNE A,#11010000B,A13;检测到这个代码,发送COMSMS11 MOV 28H,#31H MOV 29H,#31H A13:CJNE A,#11100000B,A14;检测到这个代码,发送COMSMS12 MOV 28H,#31H MOV 29H,#32H A14:CJNE A,#11110000B,A15;检测到这个代码,发送COMSMS13 MOV 28H,#31H MOV 29H,#33H A15: CLR TI;先对TI进行软件复位 MOV A,#43H;将ASCII码C发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,#4FH;将ASCII码O发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,#4DH;将ASCII码M发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,#53H;将ASCII码S发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,#4DH;将ASCII码M发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,#53H;将ASCII码S发送到串口去 MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,28H MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 MOV A,29H MOV SBUF,A JNB TI,$;如果TI为0说明发送没有完成,程序等待 CLR TI;对TI软件复位 ACALL BAOJING JB P3.3,$ ACALL DELAY100;等待这次报警信号消失 LJMP START ;10毫秒延时子程序,占用R4、R5 DELAY10:MOV R4,#20 D2:MOV R5,#248 DJNZ R5,$ DJNZ R4,D2 RET ;100毫秒延时子程序,占用R4、R5 DELAY100:MOV R4,#100 D222:MOV R5,#248 DJNZ R5,$ DJNZ R4,D222 RET ;现场报警子程序 BAOJING:CLR P3.5;触发JB35的第12脚,可以拨打电话,或者发短消息 SETB P3.7 ACALL DELAY100 ACALL DELAY100;报警器响一声,表示报警 CLR P3.7 SETB P3.5;消除12脚报警信号 JB 2BH,TXT ;现场报警15秒 SETB P3.7;开启现场报警器! MOV R3,#255 D3:MOV R4,#100 D22:MOV R5,#248 DJNZ R5,$ JB P3.3,TXT;如果出现遥控信号,马上退出 DJNZ R4,D22 DJNZ R3,D3 CLR P3.7;关闭现场报警器! TXT:JNB P3.2,$ RET END
|