4.1.2 PDU 编码规则
目前,发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用三种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由ABCDEFGHIJKLM十三项组成。
A: 短信息中心地址长度,2位十六进制数(1字节)。 B: 短信息中心号码类型,2位十六进制数。
C: 短信息中心号码,B+C的长度将由A中的数据决定。 D: 文件头字节,2位十六进制数。 E: 信息类型,2位十六进制数。
F: 被叫号码长度,2位十六进制数。
G: 被叫号码类型,2位十六进制数, 取值同B。 H: 被叫号码,长度由F中的数据决定。 I: 协议标识,2位十六进制数。
J: 数据编码方案,2位十六进制数。 K: 有效期,2位十六进制数。
L: 用户数据长度,2位十六进制数。
M: 用户数据,其长度由L中的数据决定。J中设定采用 UCS2 编码,这里是中英文的Unicode字符。
21
4.2 主程序设计
4.2.1 主程序流
开始 是否有解防信号号 否 是 是否有振动报警信号 否 延时处理 是 否 是否有红外报警信号 是否P0.7=1 是 检测到报警信号准备发送报警信号 否 结束 TC35i是否响应 否 是 送控制信息到输出缓存区
图4.1 主程序流程图
22
4.2.2主程序清单
采用AT89C52单片机,晶振11.0592MHZ,通讯速率19200,采用TTL串口通讯手机号码缓存在28H-33H的内存中 短信内容缓存在48H-57H的内存中
短信中心的号码存放在58H-63H的内存中 密码\车辆报警\存放在64H-73H的内存中 手机号码存放在74H-7F的内存中 P1.0为手机开关机控制端 P1.1为串口接收模块数据OK P0.2为解防/设防控制端 P0.1红外信号采集端 P0.0振动信号采集端 P3.0串行接收端(RXD) P3.1串行发射端(TXD) ORG 0000H
AJMP MAIN;转入主程序
FOK EQU P1.0;定义为串口接收模块数据OK KGJ EQU P1.1;定义手机开关机控制端 SX EQU P1.2;定义手机模块上线状态
JSF EQU P0.2;定义解防/设防控制端(解防 0 设防1) ZK EQU P1.5;定义中控控制端
DY EQU P0.7;定义电源断线控制端 JJ EQU P3.6;定义紧急
DD EQU P3.7;定义低电压报告 MAIN:
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,波特率翻倍! 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卡中所有短信的子程序 START:
23
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;循环监测 MDBJ:
LCALL FMDBJ;调用鸣笛报警响应子程序 AJMP KKS JDBJ:
LCALL FJDBJ;调用继电器报警响应子程序 AJMP KKS
4.3电话呼入提示子程序
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;软件清除串口中断标记
24
LCALL PDDA;调用串口接收0D/0A数据子程序 MOV DPTR,#100;延时0.1秒 LCALL DelayXmS
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;调用接收串口数据子程序 4.4查询信息字子程序
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
25