📄 89c2051.txt
字号:
;采用AT89C2051单片机,晶振11.0592MHZ,通讯速率19200,采用TTL串口通讯
;手机号码缓存在28H-33H的内存中
;短信内容缓存在48H-57H的内存中
;短信中心的号码存放在58H-63H的内存中
;密码"车辆报警"存放在64H-73H的内存中
;手机号码存放在74H-7F的内存中
;P1.0为手机开关机控制端
;P1.1为串口接收模块数据OK
;P1.2为解防/设防控制端
;P1.3
;P1.4
;P1.5
;P1.6
;P1.7
;P3.0串行接收端(RXD)
;P3.1串行发射端(TXD)
;P3.2
;P3.3
;P3.4
;P3.5
;P3.7
;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H ;外部中断P3.2脚INT0入口地址
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 000BH;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0013H;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 001BH;中断陷阱
NOP
NOP
NOP
NOP
NOP
NOP
RETI
ORG 0023H
NOP
NOP
NOP
NOP
RETI
;定义各个接口
FOK EQU P1.0;定义为串口接收模块数据OK
KGJ EQU P1.1;定义手机开关机控制端
SX EQU P1.2;定义手机模块上线状态
JSF EQU P1.3;定义解防/设防控制端(解防 0 设防1)
TC EQU P1.4;定义
ZK EQU P1.5;定义中控控制端
;EQU P1.6;定义
KK EQU P1.7;定义
BJ EQU P3.2;定义报警触发控制端
DY EQU P3.3;定义电源断线控制端
CM EQU P3.4;定义车门控制端
XL EQU P3.5;定义行李厢
JJ EQU P3.6;定义紧急
DD EQU P3.7;定义低电压报告
MAIN:
;以下为主程序进行CPU中断方式设置
SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV TH1,#0FDH;预置初值(按照波特率9600BPS预置初值)
MOV TL1,#0FDH;预置初值(按照波特率9600BPS预置初值)
SETB TR1;启动定时器T1
MOV PCON,#10000000B;设定SMOD为1,波特率翻倍!
;以上完成串口19200通讯初始化设置
LCALL YUSJ;开机清除接收短消息手机号码
CLR KGJ;打开手机
MOV DPTR,#1000;延时1秒
LCALL DELAYXMS;开机延时
SETB KGJ;复位手机控制
;MOV DPTR,#10000;延时10秒
;LCALL DelayXmS;开机延时
LCALL ATEOK;开机发送ATE指令!
LCALL CNMI ;发送(AT+CNMI=1,1,0,0,1),短信到达TE
LCALL SCQBDX;调用删除SIM卡中所有短信的子程序
;完成和手机通信握手,和SIM卡删除所有短消息初始化
START:
LCALL XRDXZX;调用询问手机SIM卡中短信中心号码子程序
LCALL XRSJ;读出授权电话号码及密码,写入内存中
LCALL MJCS
LCALL MJCS
CLR SX;模块上线
;**********************************************
KKS:
JB RI,UARTI;检测到RI变1就退出 *RI 串口中断标示 中断触发
JNB BJ,BAOJIN
JB RI,UARTI;检测到RI变1就退出
JNB DY,DYBJ
JB RI,UARTI;检测到RI变1就退出
JNB CM,CMBJ
JB RI,UARTI;检测到RI变1就退出
JNB XL,XLBJ
JB RI,UARTI;检测到RI变1就退出
JNB JJ,JJBJ
AJMP KKS
;**********************************************
DYBJ:
LCALL FDYBJ ;*FDYBJ 发送AT+CMGS=150短信长度子程序
AJMP KKS
CMBJ:
LCALL FCMBJ
AJMP KKS
XLBJ:
LCALL FXLBJ
AJMP KKS
JJBJ:
LCALL FJJBJ
AJMP KKS
;报警程序
BAOJIN:
LCALL CPAS;调用模块状态报告子程序
MOV A,25H
CJNE A,#34H,BAOJIN1;判断串口数据
AJMP BAOJIN3;如果模块正在呼出或通话,就退出
BAOJIN1:
LCALL CPAS
MOV A,25H
CJNE A,#34H,BAOJIN2
AJMP BAOJIN3
BAOJIN2:
LCALL ATH;调用串口发送ATH挂机子程序
LCALL PDOK;判断手机是否回答OK?
JZ BAOJIN2;如果没有检测到OK,重复发
LCALL FBJDX
MOV DPTR,#5000;延时5秒
LCALL DelayXmS
LCALL ATD;调用串口发送13906079959子程序
BAOJIN3:
AJMP KKS
;**********************************************
;**********************************************
;进入串口中断方式接收
UARTI:
CLR RI;清楚串口中断标志
LCALL PDDA;调用串口接收0D/0A数据子程序
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#2BH,PDRD;判断串口数据+PDR
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#43H,EXITT1;判断串口数据C
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
;+CMTI: "SM",7短信到达存放位置
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4DH,EXITT1;判断串口数据M
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#54H,EXITT1;判断串口数据T
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#49H,EXITT1;判断串口数据I
CLR RI;软件清除串口中断标记
;检测到"CMTI"的ASCII码--------
;跳过7个内存(: "SM",)
MOV R3,#7;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
;短信位置,存放在26H中
MOV R0,#26H;数据在内存的存放位置
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
INC R0;内存单元地址0
;跳过8个内存
MOV R3,#8;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
LCALL DXNR;解析短信内容
EXITT1:LJMP EXITT
PDRD:LCALL RING;电话呼入提示
EXITT:
CLR RI;软件清除串口中断标记,退出串口中断
AJMP KKS
;**********************************************
RING:;电话呼入提示
CLR RI;清楚串口中断标志
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#52H,RING1;判断串口数据R
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#49H,RING1;判断串口数据I
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4EH,RING1;判断串口数据N
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#47H,RING1;判断串口数据G
CLR RI;软件清除串口中断标记
LCALL PDDA;调用串口接收0D/0A数据子程序
MOV DPTR,#100;延时0.1秒
LCALL DelayXmS
;发送AT+CLCC
LCALL CLCC;调用来电显示指令子程序
;跳过20个内存(: 1,1,4,0,0,")
MOV R3,#20;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
LCALL DHHM;判断来电号码
JZ GJ
;跳过13个内存
MOV R3,#13;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
MOV DPTR,#100;延时0.1秒
LCALL DelayXmS
;检查是否继续呼入
;等待第二次RING电话呼入提示
CLR RI;软件清除串口中断标记
LCALL PDDXRI;5秒内检测串口是否有数据返回?
JNC RING1;如果5秒内没检查到铃音,就退出
;震铃2次后关机,解防/设防
;震铃5次后进入通话状态
;跳过8个内存
MOV R3,#8;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
;**********************************************
PDLYT:
;发送AT+CPAS,模块状态报告
MOV R2,#30
ZLYKK1:
MOV DPTR,#500;延时0.5秒
LCALL DelayXmS
LCALL CPAS;调用模块状态报告子程序
MOV A,25H
CJNE A,#30H,ZL1
AJMP ZLYK;如果没有检测到呼入,就进入振铃遥控
ZL1:
DJNZ R2,ZLYKK1
MOV R2,#15
ZLYKK2:
MOV DPTR,#500;延时0.5秒
LCALL DelayXmS
LCALL CPAS;调用模块状态报告子程序
MOV A,25H
CJNE A,#30H,ZL2
AJMP RING2;如果没有检测到呼入,就退出
ZL2:
DJNZ R2,ZLYKK2
;**********************************************
LCALL ATA;应答
RING1:AJMP RING2
GJ:
MOV DPTR,#500;延时1秒
LCALL DelayXmS
LCALL ATH;调用串口发送ATH挂机子程序
AJMP RING2
ZLYK:
MOV DPTR,#500;延时0.5秒
LCALL DelayXmS
LCALL CPAS;调用模块状态报告子程序
MOV A,25H
CJNE A,#30H,ZLYKK1;如果没有检测到呼入,就退出
JB JSF,ZLYK1
SETB JSF;设防
AJMP RING2
ZLYK1:CLR JSF;解防
RING2:
RET
;**********************************************
;**********************************************
DXNR:;信息内容检测
MOV DPTR,#1000
LCALL DELAYXMS
LCALL CMGR;调用读短信子程序
MOV R3,#42;跳过42个数据
LCALL TGSJ;调用跳过串口数据子程序
LCALL DXJC;检测电话号码
JZ DPDSQ;如果电话号码是默认值,就检测信息内容
;跳过20个内存(含0 4)
MOV R3,#20;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
;**********************************************
PDCX:;查询信息
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#36H,PDJF;判断串口数据6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#37H,PDJF;判断串口数据7
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#45H,PDJF;判断串口数据E
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#35H,PDJF;判断串口数据5
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#38H,PDJF;判断串口数据8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#42H,PDJF;判断串口数据B
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#45H,PDJF;判断串口数据E
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#32H,PDJF;判断串口数据2
CLR RI;软件清除串口中断标记
MOV R3,#8;跳过8个数据
LCALL TGSJ;调用跳过串口数据子程序
JB JSF,DFASF
LCALL FAJF;调用发送"解防"子程序
AJMP SCC
DFASF:LCALL FASF;调用发送"设防"子程序
AJMP SCC
;**********************************************
DPDSQ:LCALL PDSQ
;**********************************************
;检测"(解)防",PDU码--0489E39632
;30 34 38 (39 45 33) 39 36 33 32
PDJF:
MOV DPTR,#1000;延时1秒
LCALL DelayXmS
LCALL CMGR;再次调用读短信子程序
MOV R3,#74;跳过74个数据
LCALL TGSJ;调用跳过串口数据子程序
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#38H,PDSQ;判断串口数据8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#39H,SHEFAN;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#45H,PDSQ;判断串口数据E
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#33H,PDSQ;判断串口数据3
CLR RI;软件清除串口中断标记
LCALL FANG;调用(防)接收串口数据子程序
JZ SC
CLR JSF;解防
AJMP SCC
;**********************************************
;检测"(设)防",PDU码--048BBE9632
;30 34 38 (42 42 45) 39 36 33 32
SHEFAN:;(设)
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#42H,PDSQ;判断串口数据B
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#42H,PDSQ;判断串口数据B
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#45H,PDSQ;判断串口数据E
CLR RI;软件清除串口中断标记
LCALL FANG;调用(防)接收串口数据子程序
JZ SC
SETB JSF;设防
SC:AJMP SCC
;**********************************************
;**********************************************
PDSQ:;短信授权检测
;如果电话号码不是默认值,就检测信息内容
MOV DPTR,#1000
LCALL DelayXmS
LCALL CMGR;再次调用读短信子程序
MOV R3,#74;跳过74个数据
LCALL TGSJ;调用跳过串口数据子程序
;校验存放在64H-73H的内存中密码"车辆报警"
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,64H,SC;判断串口数据8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -