原创 短信模块例子转自电子制作实验室

2007-4-25 11:02 2990 6 6 分类: MCU/ 嵌入式

 


1。TC35i模块一个
2。普通SIM卡座一个
3。GSM天线转接线一根
4。GSM小天线一根
5。40芯专用排线及接插件一个


TC35i模块的详细英文PDF资料



GSM配件详细报价

价格(元)

TC35I

299

40芯扁平排线

2

排线专用接插卡座

2

TC35I专用天线转接线(SMA接口)

15

GSM小L形天线(SMA接口)

15

普通SIM卡座

4

高档抽屉式SIM卡座

18

TC35I工业GSM模块 299元


40芯扁平排线和排线专用接插卡座 2+2=4元


TC35I专用天线转接线(SMA接口) 15元一根


GSM小L形天线(SMA接口) 15元


这是普通的SIM卡座 4元一个


这是高档抽屉式SIM卡座 18元一个


LM2941S高性能微波电路专用稳压芯片 6.2元一片


TC35I开发技巧:


    模块的供电电压为3.3V-4.8V。如果电压低于3.3V,模块可自动关机。同时模块在不同工作模式的工作电流不同。在发射脉冲时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值必需不能超过0.4V。所以该模块对电源的要求较高,电源的内阻+FFC联接线的电阻必需小于200mΩ。还有PIN14(BATT-TMEP)脚外接NTC电阻,对于用锂电池对模块供电的应用系统,可对锂电池温度进行监测,温度过高或过低均可导致模块关机。另有关机的问题,开发文档十分推荐使用AT指令关机,不赞成直接切断电源关机,否测可能导致模块故障,所以我们电源设计必需考虑此问题,以应付系统突然断电的情况。同时我对TC35I模块的结构,工作方式,天线接口,串口,SIM接口均有详细了解。最近我在看AT指令部分。总之我感觉TC35I模块功能强大,是一个较成熟的短信应用模块。


    应不少客户的要求,我们推出一款TC35I带单片机试验PCB 15元一块,可以缩短开发周期,快速熟悉TC35I。



1。支持51单片机,例如常用的AT89S51或者SST89C54RD+,如果采用后者,可以省略上电复位电路、看门狗和非易失存储器
2。带两路LED指示灯,可以用于指示GSM状态
3。带一路光藕隔离的继电器输出,可以实现短信遥控继电器开关的功能
4。带一路麦克风输入,可以直接监听环境声音
5。TC35I的电源采用高性能LM2941S芯片供电,并且单片机可以控制LM2941S芯片的电源开启和关闭,实现TC35断电重启。
6。单片机串口可以通过MC14053B切换和TC35I和GPS模块通讯,这个PCB本来用于GPS定位的,如果客户不需要切换,可以自行用线短路。
7。单片机单独用LM7805供电,防止互相干扰。
8。带抽屉式SIM卡座。
   


    客户也可以直接点击进入这个网页购买用TC35I模块开发的GSM短信MODEM,只要GSM短信MODEM的电路板15元一片。


    下面是我们用西门子3508手机开发的车辆报警系统源程序,西门子3508支持AT指令,和TC35I模块完全相同,所以网友可以借鉴学习。


;采用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就退出
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
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;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,65H,SC;判断串口数据F
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,66H,SC;判断串口数据 6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,67H,SC;判断串口数据 6


CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,68H,SC;判断串口数据8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,69H,SC;判断串口数据F
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6AH,SC;判断串口数据 8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6BH,SC;判断串口数据 6


CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6CH,SCC;判断串口数据 6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6DH,SCC;判断串口数据2
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6EH,SCC;判断串口数据A
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,6FH,SCC;判断串口数据 5


CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,70H,SCC;判断串口数据 8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,71H,SCC;判断串口数据B
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,72H,SCC;判断串口数据6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,73H,SCC;判断串口数据 6


;"车辆报警"检测成功!判断是否要修改密码?


CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#36H,FSQR;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#35H,FSQR;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#33H,FSQR;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#39H,FSQR;判断串口数据


;检测到"改"的汉字内码
;密码"车辆报警"存放在64H-73H的内存中
;将"改"后面的两个汉字作为密码保存到单片机64H-73H的内存中!
MOV R3,#16;定义接收数据的总长度为16个
MOV R0,#64H;数据从内存的64H开始依次往后存放
LCALL GPSSJ;调用接收串口数据子程序


MOV R3,#8;跳过8个数据
LCALL TGSJ;调用跳过串口数据子程序


FSQR:
LCALL JPA


SCC:;删除短信


LCALL SCJSDX


RET


JPA:
MOV DPTR,#1000
LCALL DELAYXMS


LCALL CMGR;再次调用读短信子程序


MOV R3,#42;跳过42个数据
LCALL TGSJ;调用跳过串口数据子程序


;把短信授权的手机号码存储起来
;手机号码存放在74H-7F的内存中
MOV R3,#12;定义接收手机号码的数据长度
MOV R0,#74H;数据在内存的存放位置
LCALL GPSSJ;调用接收串口数据子程序


MOV DPTR,#1000
LCALL DELAYXMS


;校验短信授权的手机号码


LCALL CMGR;再次调用读短信子程序


MOV R3,#42;跳过42个数据
LCALL TGSJ;调用跳过串口数据子程序


LCALL DXJC
JZ JPA


LCALL FDX;发送授权成功的短信息通知客户!
JNZ JPA1
LCALL FDX;发送授权成功的短信息通知客户!


JPA1:LCALL BCDM;保存授权电话号码及密码


RET


;发送AT指令!
AT:
MOV A,#41H;将ASCII码A发送到串口去
LCALL FS
MOV A,#54H;将ASCII码T发送到串口去
LCALL FS
RET


;发送ATH,挂机
ATH:
LCALL AT
MOV A,#48H
LCALL FS
LCALL HC;回车!


RET


;发送ATA,应答
ATA:
LCALL AT
MOV A,#41H
LCALL FS
LCALL HC;回车!


RET


;发送AT+C,应答
ATC:
LCALL AT
MOV A,#2BH
LCALL FS
MOV A,#43H
LCALL FS


RET


;发送HC回车指令!
HC:
MOV A,#0DH
LCALL FS
MOV A,#0AH
LCALL FS
RET


;发送AT+CMGD=删除第X条短消息指令!
SCDX:
LCALL ATC


MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#44H
LCALL FS
MOV A,#3DH
LCALL FS


RET


;发送AT+CPBW=
CPBW:
LCALL ATC


MOV A,#50H
LCALL FS
MOV A,#42H
LCALL FS
MOV A,#57H
LCALL FS
MOV A,#3DH
LCALL FS
RET


;发送AT+CPBR=
CPBR:
LCALL ATC


MOV A,#50H
LCALL FS
MOV A,#42H
LCALL FS
MOV A,#52H
LCALL FS
MOV A,#3DH
LCALL FS


RET


;发送AT+CNMI=1,1,0,0,1,短信到达TE
CNMI:
LCALL ATC


MOV A,#4EH;4E
LCALL FS
MOV A,#4DH;4D
LCALL FS
MOV A,#49H;49
LCALL FS
MOV A,#3DH;3D
LCALL FS
MOV A,#31H;31
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#31H;31
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#30H;30
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#30H;30
LCALL FS
MOV A,#2CH;2C
LCALL FS
MOV A,#31H;31
LCALL FS
LCALL HC;回车!


LCALL PDOK;判断手机是否回答OK?
JZ CNMI;如果没有检测到OK,重复发


RET


;发送AT+CMGR=26H,读短信
;00 43 00 4D 00 47 00 52 00 3D
CMGR:
LCALL ATC
MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#52H
LCALL FS
MOV A,#3DH
LCALL FS
MOV A,26H
LCALL FS
LCALL HC;回车!
RET


;发送AT+CMGL=4列出所有短消息指令!
CMGL:
LCALL ATC


MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#4CH
LCALL FS
MOV A,#3DH
LCALL FS
MOV A,#34H
LCALL FS
LCALL HC;回车!
RET


FANG:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#39H,FANG1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#36H,FANG1;判断串口数据6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#33H,FANG1;判断串口数据3
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#32H,FANG1;判断串口数据2
CLR RI;软件清除串口中断标记
;跳过8个内存(0D 0A 0D 0A 4F 4B 0D 0A)
MOV R3,#8;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序


AJMP FANG2


FANG1:LCALL SB


FANG2:
RET


;和手机握手,单片机发ATE手机回答OK子程序
ATEOK:
MOV DPTR,#500
LCALL DELAYXMS
;发送ATE指令!
LCALL AT
MOV A,#45H;将ASCII码E发送到串口去
LCALL FS
LCALL HC;回车!


LCALL PDOK;判断手机是否回答OK?
JZ ATEOK;如果没有检测到OK,重复发
RET


;发送AT+CSCA?查询短信中心号码子程序
CSCA:
MOV DPTR,#500
LCALL DELAYXMS


LCALL ATC


MOV A,#53H
LCALL FS
MOV A,#43H
LCALL FS
MOV A,#41H
LCALL FS
MOV A,#3FH
LCALL FS
LCALL HC;回车!


RET


;检测手机是否回答短信中心号码?
XRDXZX:
LCALL CSCA


MOV R3,#13;跳过13个数据
LCALL TGSJ;调用跳过串口数据子程序
JNC XRDXZX1


;准备接收短信中心号码
MOV R3,#5;循环接收5次
MOV R0,#58H;数据从58H-63H内存开始存放
TFSJ:
INC R0;内存单元地址
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
DEC R0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
INC R0;内存单元地址
INC R0;内存单元地址
DJNZ R3,TFSJ;判断是否已经接收完10个短信中心号码?
MOV A,#46H;字母F的固定代码
MOV @R0,A
INC R0;内存单元地址
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
INC R0;内存单元地址
;短信中心的号码已经存放在58H-63H的内存中


MOV R3,#13;跳过13个数据
LCALL TGSJ;调用跳过串口数据子程序


LCALL CSCA;调用询问手机SIM卡中短信中心号码子程序


MOV R3,#13;跳过13个数据
LCALL TGSJ;调用跳过串口数据子程序


LCALL JYZXHM;调用校验短信中心号码子程序


JZ XRDXZX


AJMP XRDXZX2


XRDXZX1:LCALL XRDXZX


XRDXZX2:
RET


;检测13800597500,PDU码--3108507905F0
;短信中心的号码存放在58H-63H的内存中
JYZXHM:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,59H,JYZXHM1;判断串口数据1
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,58H,JYZXHM1;判断串口数据3
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5BH,JYZXHM1;判断串口数据8
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5AH,JYZXHM1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5DH,JYZXHM1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5CH,JYZXHM1;判断串口数据5
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5FH,JYZXHM1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,5EH,JYZXHM1;判断串口数据7
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,61H,JYZXHM1;判断串口数据5
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,60H,JYZXHM1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,63H,JYZXHM1;判断串口数据0
CLR RI;软件清除串口中断标记


MOV R3,#13;跳过13个数据
LCALL TGSJ;调用跳过串口数据子程序


AJMP JYZXHM2
JYZXHM1:LCALL SB


JYZXHM2:


RET


;读出授权电话号码及密码,写入内存中
XRSJ:
MOV DPTR,#2000
LCALL DELAYXMS


LCALL CPBR;读出授权电话AT+CPBR=1
MOV A,#31H
LCALL FS


LCALL HC


LCALL DCSJ
JNC XRSJ1


;手机号码存放在74H-7F的内存中


MOV R3,#12;定义接收手机号码的数据长度
MOV R0,#74H;数据在内存的存放位置
LCALL GPSSJ;调用接收串口数据子程序


MOV R3,#16;跳过16个数据
LCALL TGSJ;调用跳过串口数据子程序


;读出密码AT+CPBR=2
LCALL CPBR
MOV A,#32H
LCALL FS


LCALL HC


LCALL DCSJ
JNC XRSJ1


;密码"车辆报警"存放在64H-73H的内存中


MOV R3,#16;定义接收手机号码的数据长度
MOV R0,#64H;数据在内存的存放位置
LCALL GPSSJ;调用接收串口数据子程序


MOV R3,#16;跳过16个数据
LCALL TGSJ;调用跳过串口数据子程序


RET


DCSJ:
;+CPBR: 1,"13906079959",129,""


MOV R3,#12;跳过12个数据
LCALL TGSJ;调用跳过串口数据子程序


XRSJ1:


RET


;写入授权电话号码及密码
BCDM:
;AT+CPBW=1,"13906079959"
DDH:;写入授权电话号码
LCALL CPBW
MOV A,#31H
LCALL FS


MOV A,#2CH
LCALL FS
MOV A,#22H
LCALL FS


LCALL JSFSJ;调用写入授权电话号码13906079959


MOV A,#22H
LCALL FS


LCALL HC


LCALL PDOK
JZ DDH


;写入密码
;AT+CPBW=2,"8F 66 8F 86 62 A5 8B 66"
XMM:
LCALL CPBW
MOV A,#32H
LCALL FS


MOV A,#2CH
LCALL FS
MOV A,#22H
LCALL FS


;写入"车辆报警"4个汉字 从内存64H-73H一共16个内存
MOV R3,#16;定义发送的数据总长度为16个
MOV R0,#64H;数据从内存的64H开始
LCALL HZSZ;调用发送内存数据的子程序


MOV A,#22H
LCALL FS


LCALL HC


LCALL PDOK
JZ XMM


RET


JCDYH:
CLR RI;清除有串口数据标志
LCALL PDRI;2秒内检测串口是否有数据返回?
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#3EH,WD;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#20H,WD;判断串口数据
CLR RI;软件清除串口中断标记
;判断手机是不是回答>代码? 0D 0A 3E 20
MOV A,#0FFH;检测到>,对A置1
RET


WD:CLR A;没有检测到>,对A清零
CLR RI;清除有串口数据标志
RET


;检测手机是否回答OK?
PDOK:
LCALL PDDA


LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4FH,SB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4BH,SB;判断串口数据


LCALL PDDA


;判断是不是手机回答的OK代码? 0D 0A 4F 4B 0D 0A
MOV A,#0FFH;检测到OK,对A置1


RET


;检测手机是否回答0D/0A?
PDDA:
CLR RI;清除有串口数据标志
LCALL PDRI;2秒内检测串口是否有数据返回?


MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,SB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,SB;判断串口数据
CLR RI;软件清除串口中断标记
RET


SB:CLR A;没有检测到OK,对A清零
CLR RI;清除有串口数据标志


RET


;发送AT+CLCC,来电显示
;00 43 00 4C 00 43 00 43
CLCC:
LCALL ATC


MOV A,#4CH
LCALL FS
MOV A,#43H
LCALL FS
MOV A,#43H
LCALL FS
LCALL HC;回车!


RET


;发送AT+CPAS查询手机状态子程序
CPAS:
LCALL ATC
MOV A,#50H
LCALL FS
MOV A,#41H
LCALL FS
MOV A,#53H
LCALL FS
LCALL HC;回车!


;手机状态子程序


;跳过9个内存
MOV R3,#9;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序


MOV R0,#25H;数据在内存的存放位置
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A


MOV @R0,A
INC R0;内存单元地址


;跳过8个内存
MOV R3,#8;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序


RET


;发送AT+CMGS=150,发送短信
;00 43 00 4D 00 47 00 53 00 3D
CMGS:
LCALL ATC


MOV A,#4DH
LCALL FS
MOV A,#47H
LCALL FS
MOV A,#53H
LCALL FS
MOV A,#3DH
LCALL FS
MOV A,#31H
LCALL FS
MOV A,#35H
LCALL FS
MOV A,#30H
LCALL FS
LCALL HC;回车!


LCALL JCDYH;调用等待手机回答“>”的子程序
JNC CSJ;检测到>,转入CSJ
MOV DPTR,#2000;延时2秒
LCALL DelayXmS
AJMP CMGS


CSJ:
LCALL DXZT;调用发固定的短信字头089168子程序
LCALL HMCS;调用发送短信中心号码子程序13800597500
LCALL DZZB;调用短信中部固定数据11000B81
LCALL JSFSJ;调用发送短信接收方手机号码子程序13906079959
LCALL DYZXSJ;调用下部固定数据0008A9


RET


;发送短信固定字头089168子程序
DXZT:
MOV A,#30H
LCALL FS
MOV A,#38H
LCALL FS
MOV A,#39H
LCALL FS
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS
MOV A,#38H
LCALL FS
RET


;发送短信中心号码子程序
;短信中心的号码存放在58H-63H的内存中
HMCS:
MOV A,58H
LCALL FS
MOV A,59H
LCALL FS
MOV A,5AH
LCALL FS
MOV A,5BH
LCALL FS
MOV A,5CH
LCALL FS
MOV A,5DH
LCALL FS
MOV A,5EH
LCALL FS
MOV A,5FH
LCALL FS
MOV A,60H
LCALL FS
MOV A,61H
LCALL FS
MOV A,62H
LCALL FS
MOV A,63H
LCALL FS
RET


;发送短信中间固定数据11000B81子程序
DZZB:
MOV A,#31H
LCALL FS
MOV A,#31H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#42H
LCALL FS
MOV A,#38H
LCALL FS
MOV A,#31H
LCALL FS
RET


;发送短信息接收方手机号码子程序
;手机号码存放在74H-7F的内存中
JSFSJ:
MOV A,74H
LCALL FS
MOV A,75H
LCALL FS
MOV A,76H
LCALL FS
MOV A,77H
LCALL FS
MOV A,78H
LCALL FS
MOV A,79H
LCALL FS
MOV A,7AH
LCALL FS
MOV A,7BH
LCALL FS
MOV A,7CH
LCALL FS
MOV A,7DH
LCALL FS
MOV A,7EH
LCALL FS
MOV A,7FH
LCALL FS
RET


;发送短信中间固定数据0008A9子程序
DYZXSJ:
MOV A,#30H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#30H
LCALL FS
MOV A,#38H
LCALL FS
MOV A,#41H
LCALL FS
MOV A,#39H
LCALL FS
RET


;短信发送检测,+CMGS: 138


FSCG:CLR RI;清除有串口数据标志
LCALL PDDXRI;5秒内检测串口是否有数据返回?


MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0DH,SBB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#0AH,SBB;判断串口数据
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#2BH,SBB;判断串口数据+
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#43H,SBB;判断串口数据C
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据


MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#4DH,SBB;判断串口数据M
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#47H,SBB;判断串口数据G
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,#53H,SBB;判断串口数据S
CLR RI;软件清除串口中断标记
;检测到"CMGS"的ASCII码--------


;跳过5个内存(: 116)
MOV R3,#5;定义接收数据的总长度
LCALL TGSJ;调用接收串口数据子程序
AJMP FSCG1
SBB:LCALL SB


FSCG1:
RET


;发送ATD,拨打电话13906079959
ATD:
LCALL AT
MOV A,#44H
LCALL FS
MOV A,75H
LCALL FS
MOV A,74H
LCALL FS
MOV A,77H
LCALL FS
MOV A,76H
LCALL FS
MOV A,79H
LCALL FS
MOV A,78H
LCALL FS
MOV A,7BH
LCALL FS
MOV A,7AH
LCALL FS
MOV A,7DH
LCALL FS
MOV A,7CH
LCALL FS
MOV A,7FH
LCALL FS
MOV A,#3BH
LCALL FS
LCALL HC;回车!


RET


;发送"恭喜您!您已经获得车辆报警系统的控制权限!"短消息的子程序
FDX:
MOV DPTR,#500
LCALL DELAYXMS
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(24+4个汉字)
MOV A,#33H
LCALL FS
MOV A,#38H
LCALL FS


;准备发送"恭喜您!您已经获得车辆报警系统的控制权限!密码:"汉字


MOV DPTR,#TAB1
MOV R1,#96;发送24个汉字
LCALL FSS;调用发送汉字的子程序


;发送"车辆报警"4个汉字 从内存64H-73H一共16个内存
MOV R3,#16;定义发送的数据总长度为16个
MOV R0,#64H;数据从内存的64H开始
LCALL HZSZ;调用发送内存数据的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序


RET


;发送"有人动您的车,请察看!"短消息的子程序
FBJDX:
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(11个汉字)
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS


;准备发送"有人动您的车,请察看!"


MOV DPTR,#TAB2
MOV R1,#44;发送11个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


RET


;发送"车辆电源异常,请检查!"短消息的子程序
FDYBJ:
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(11个汉字)
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS


;准备发送"车辆电源异常,请检查!"


MOV DPTR,#TAB3
MOV R1,#44;发送11个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FDYBJ1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FDYBJ
FDYBJ1:


RET


;发送"车门已被打开,请检查!"短消息的子程序
FCMBJ:
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(11个汉字)
MOV A,#31H
LCALL FS
MOV A,#36H
LCALL FS


;准备发送"车门已被打开,请检查!"


MOV DPTR,#TAB4
MOV R1,#44;发送11个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FCMBJ1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FCMBJ
FCMBJ1:


RET


;发送"行李厢异常,请检查!"短消息的子程序
FXLBJ:
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(10个汉字)
MOV A,#31H
LCALL FS
MOV A,#34H
LCALL FS


;准备发送"行李厢异常,请检查!"


MOV DPTR,#TAB5
MOV R1,#40;发送10个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FXLBJ1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FXLBJ
FXLBJ1:


RET


;发送"车辆被劫,请速与110联系!!"短消息的子程序
FJJBJ:
LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(15个汉字)
MOV A,#31H
LCALL FS
MOV A,#45H
LCALL FS


;准备发送"车辆被劫,请速与110联系!!"


MOV DPTR,#TAB6
MOV R1,#60;发送15个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FJJBJ1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FJJBJ
FJJBJ1:


RET


;发送"解防"短消息的子程序
FAJF:


LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(2个汉字)
MOV A,#30H
LCALL FS
MOV A,#34H
LCALL FS


;准备发送"解防!"


MOV DPTR,#TAB7
MOV R1,#8;发送2个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FAJF1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FAJF
FAJF1:


RET


;发送"设防"短消息的子程序
FASF:MOV DPTR,#500
LCALL DELAYXMS


LCALL CMGS;发送AT+CMGS=150短信长度子程序


;发送汉字的字数(2个汉字)
MOV A,#30H
LCALL FS
MOV A,#34H
LCALL FS


;准备发送"设防!"


MOV DPTR,#TAB8
MOV R1,#8;发送2个汉字
LCALL FSS;调用发送汉字的子程序


MOV A,#1AH;发送16进制的1A结束字符
LCALL FS


LCALL FSCG;调用短信发送检测子程序
JNZ FASF1
MOV DPTR,#500
LCALL DELAYXMS
AJMP FASF
FASF1:


RET


;清除接收方手机号码子程序
YUSJ:
MOV 74H,#30H
MOV 75H,#30H
MOV 76H,#30H
MOV 77H,#30H
MOV 78H,#30H
MOV 79H,#30H
MOV 7AH,#30H
MOV 7BH,#30H
MOV 7CH,#30H
MOV 7DH,#30H
MOV 7EH,#30H
MOV 7FH,#30H
;初始化"车辆报警"的内码
MOV 64H,#38H
MOV 65H,#46H
MOV 66H,#36H
MOV 67H,#36H
MOV 68H,#38H
MOV 69H,#46H
MOV 6AH,#38H
MOV 6BH,#36H
MOV 6CH,#36H
MOV 6DH,#32H
MOV 6EH,#41H
MOV 6FH,#35H
MOV 70H,#38H
MOV 71H,#42H
MOV 72H,#36H
MOV 73H,#36H


RET


;检测13906079959,PDU码--3109069759F9
;手机号码存放在74H-7F的内存中
DXJC:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,74H,DXJC1;判断串口数据3
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,75H,DXJC1;判断串口数据1
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,76H,DXJC1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,77H,DXJC1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,78H,DXJC1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,79H,DXJC1;判断串口数据6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7AH,DXJC1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7BH,DXJC1;判断串口数据7
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7CH,DXJC1;判断串口数据5
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7DH,DXJC1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7EH,DXJC1;判断串口数据F
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7FH,DXJC1;判断串口数据9
CLR RI;软件清除串口中断标记
AJMP DXJC2
DXJC1:LCALL SB
DXJC2:
RET
NOP
NOP


;检测13906079959
DHHM:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,75H,DHHM1;判断串口数据1
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,74H,DHHM1;判断串口数据3
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,77H,DHHM1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,76H,DHHM1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,79H,DHHM1;判断串口数据6
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,78H,DHHM1;判断串口数据0
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7BH,DHHM1;判断串口数据7
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7AH,DHHM1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7DH,DHHM1;判断串口数据9
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7CH,DHHM1;判断串口数据5
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
CJNE A,7FH,DHHM1;判断串口数据9
CLR RI;软件清除串口中断标记
AJMP DHHM2
DHHM1:LCALL SB
DHHM2:
RET


;删除SIM卡中所有短信的子程序
SCQBDX:
LCALL CMGL
LCALL PDOK
JNZ DXSCT


JNB RI,$


MOV DPTR,#100
LCALL DELAYXMS


MOV R2,#1
DXSC:
LCALL DXSZ;调用将R2转化成两位ASCII数值子程序
;十位为20H,个位为21H
LCALL SCDD;调用删除短信程序,同一条短信删除1次
INC R2
CJNE R2,#26,DXSC;删除超过25条也退出循环


DXSCT:
RET


SCDD:
LCALL SCDX;调用删除第X条短信指令子程序
MOV A,20H
LCALL FS
MOV A,21H
LCALL FS


LCALL HC


MOV DPTR,#1200
LCALL DELAYXMS
RET


RET


;删除短信的子程序
SCJSDX:
MOV R2,#1
DXSC1:
LCALL DXSZ;调用将R2转化成两位ASCII数值子程序
;十位为20H,个位为21H
LCALL SCDD1;调用删除短信程序,同一条短信删除1次


INC R2
CJNE R2,#5,DXSC1;删除超过25条也退出循环
RET


;取出删除短信条数的十位/个位
DXSZ:
MOV A,R2
MOV B,#10 ;取出十位和个位
DIV AB
ORL A,#00110000B;调整为ASCII码
MOV 20H,A ;十位在a
MOV 21H,B ;个位在b
MOV A,21H
ORL A,#00110000B;调整为ASCII码
MOV 21H,A


RET


SCDD1:
LCALL SCDX;调用删除第X条短信指令子程序
MOV A,20H
LCALL FS
MOV A,21H
LCALL FS


LCALL HC


MOV DPTR,#1000
LCALL DELAYXMS
RET


;判断串口数据时候发送成功?超时退出
PDTI:;占用R4/R5/R1
MOV R1,#200;5毫秒超时退出!
PSZ:
MOV R4,#5
DT2:MOV R5,#5
DT1:JB TI,KQ
DJNZ R5,DT1
JB TI,KQ
DJNZ R4,DT2;25毫秒检测一次
DJNZ R1,PSZ;超时退出
KQ:
RET


;判断串口数据是否接收成功?超时退出
PDRI:;占用R4/R5/R1
MOV R1,#60;300毫秒超时退出!
PBZ:MOV R4,#200
DY2:MOV R5,#25
DY1:JB RI,KKQ;检测到RI变1就退出
DJNZ R5,DY1;25微秒检测一次
JB RI,KKQ;检测到RI变1就退出
SETB C;程序正常时C=1
DJNZ R4,DY2;内循环50毫秒
DJNZ R1,PBZ;超时退出
CLR C;对串口接收超时退出C=0
CLR RI;清除有串口数据标志
KKQ:RET


;判断短信是否发送成功?超时退出
PDDXRI:;占用R4/R5/R1
MOV R1,#1000;5秒超时退出!
PBZ1:MOV R4,#200
DY22:MOV R5,#25
DY33:JB RI,KKQ1;检测到RI变1就退出
DJNZ R5,DY33;延时25微秒检测一次
JB RI,KKQ1;检测到RI变1就退出
SETB C;程序正常时C=1
DJNZ R4,DY22;内循环50毫秒
DJNZ R1,PBZ1;超时退出
CLR C;对串口接收超时退出C=0
CLR RI;清除有串口数据标志
KKQ1:RET


;跳过接收数据的子程序(专门针对PDU码数据)
TGSJ:
SETB C
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
JNC XPAS;如果检测到发生超时退出,就跳出这段程序
DJNZ R3,TGSJ;判断是否已经收全部数据?
XPAS:
RET


;接收短信授权后的手机号码子程序
GPSSJ:
CLR RI;软件清除串口中断标记
LCALL PDRI;等待下一个串口数据
MOV A,SBUF;将串口寄存器中接收到的数据给A
MOV @R0,A
INC R0;内存单元地址
DJNZ R3,GPSSJ;判断是否已经收全部数据?
RET


FS:
CLR TI;先对TI进行软件复位
MOV SBUF,A
LCALL PDTI;调用检测TI变为高电平的子程序
RET


;发送汉字的子程序(DPTR存放汉字内码、R1存放汉字的字数X2)
FSS:
MOV R3,#0
CF2:CLR TI;对TI软件复位
MOV A,R3
MOVC A,@A+DPTR;查表汉字的内码
MOV SBUF,A
JNB TI,$;如果TI为0说明发送没有完成,程序等待
INC R3
MOV A,R3
DJNZ R1,CF2
RET


;这是发送内存数据的子程序
HZSZ:
CLR TI;先对TI进行软件复位
MOV A,@R0
MOV SBUF,A
LCALL PDTI;调用检测TI变为高电平的子程序
INC R0
DJNZ R3,HZSZ
RET


;鸣叫一声子程序
MJCS:
CLR FOK
MOV DPTR,#2500
LCALL DELAYXMS
SETB FOK
RET


;***************************************************
;***************************************************
;入口参数:DPTR=MS(毫秒1-65535mS)
DELAYXMS:


MOV A,DPH
MOV R7,#01
JZ DF1
MOV R7,DPH
DF1:
MOV A,DPl
MOV R6,#1
JZ DEL1
MOV R6,DPl
DEL1:
MOV B,#0
DJNZ B,$
DJNZ B,$
DJNZ R6,DEL1
DJNZ R7,DF1

RET
NOP
NOP


;恭喜您!您已经获得车辆报警系统的控制权限!密码:


TAB1:DB 36H,30H,36H,44H,35H,35H,39H,43H; 606D559C
DB 36H,30H,41H,38H,30H,30H,32H,31H; 60A80021
DB 36H,30H,41H,38H,35H,44H,46H,32H; 60A85DF2
DB 37H,45H,43H,46H,38H,33H,42H,37H; 7ECF83B7
DB 35H,46H,39H,37H,38H,46H,36H,36H; 5F978F66
DB 38H,46H,38H,36H,36H,32H,41H,35H; 8F8662A5
DB 38H,42H,36H,36H,37H,43H,46H,42H; 8B667CFB
DB 37H,45H,44H,46H,37H,36H,38H,34H; 7EDF7684
DB 36H,33H,41H,37H,35H,32H,33H,36H; 63A75236
DB 36H,37H,34H,33H,39H,36H,35H,30H; 67439650
DB 30H,30H,32H,31H,35H,42H,43H,36H; 00215BC6
DB 37H,38H,30H,31H,30H,30H,33H,41H; 7801003A


;有人动您的车,请察看!16
TAB2:DB 36H,37H,30H,39H,34H,45H,42H,41H;67094EBA
DB 35H,32H,41H,38H,36H,30H,41H,38H;52A860A8
DB 37H,36H,38H,34H,38H,46H,36H,36H;76848F66
DB 30H,30H,32H,43H,38H,42H,46H,37H;002C8BF7
DB 35H,42H,44H,46H,37H,37H,30H,42H;5BDF770B
DB 30H,30H,32H,31H;0021


;车辆电源异常,请检查!16
TAB3:DB 38H,46H,36H,36H,38H,46H,38H,36H;8F668F86
DB 37H,35H,33H,35H,36H,45H,39H,30H;75356E90
DB 35H,46H,30H,32H,35H,45H,33H,38H;5F025E38
DB 30H,30H,32H,43H,38H,42H,46H,37H;002C8BF7
DB 36H,38H,43H,30H,36H,37H,45H,35H;68C067E5
DB 30H,30H,32H,31H;0021


;车门已被打开,请检查!16
TAB4:DB 38H,46H,36H,36H,39H,35H,45H,38H;8F6695E8
DB 35H,44H,46H,32H,38H,38H,41H,42H;5DF288AB
DB 36H,32H,35H,33H,35H,46H,30H,30H;62535F00
DB 30H,30H,32H,43H,38H,42H,46H,37H;002C8BF7
DB 36H,38H,43H,30H,36H,37H,45H,35H;68C067E5
DB 30H,30H,32H,31H;0021


;行李厢异常,请检查!14
TAB5:DB 38H,38H,34H,43H,36H,37H,34H,45H;884C674E
DB 35H,33H,41H,32H,35H,46H,30H,32H;53A25F02
DB 35H,45H,33H,38H,30H,30H,32H,43H;5E38002C
DB 38H,42H,46H,37H,36H,38H,43H,30H;8BF768C0
DB 36H,37H,45H,35H,30H,30H,32H,31H;67E50021


;车辆被劫,请速与110联系!!1E
TAB6:DB 38H,46H,36H,36H,38H,46H,38H,36H;8F668F86
DB 38H,38H,41H,42H,35H,32H,41H,42H;88AB52AB
DB 30H,30H,32H,43H,38H,42H,46H,37H;002C8BF7
DB 39H,30H,31H,46H,34H,45H,30H,45H;901F4E0E
DB 30H,30H,33H,31H,30H,30H,33H,31H;00310031
DB 30H,30H,33H,30H,38H,30H,35H,34H;00308054
DB 37H,43H,46H,42H,30H,30H,32H,31H;7CFB0021
DB 30H,30H,32H,31H;0021


;解防 04
TAB7:DB 38H,39H,45H,33H,39H,36H,33H,32H;89E39632

;设防 04
TAB8:DB 38H,42H,42H,45H,39H,36H,33H,32H;8BBE9632


END

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条