基于单片机的短信收发系统设计文档格式.docx
《基于单片机的短信收发系统设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的短信收发系统设计文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
功
能
描
述
AT+OFF
关机并重新启动
AT+CSDH=0
在TEXT模式下在返回值中不显示详细的头信息
ATE0
关闭回显
AT+CMGF=1
选择短信格式为TEXT模式
AT+CMGS
发送短信息
AT+CMGR
读取短信息
AT+CMGD=0
删除全部短信息
2.2软件实现
2.2.1上位机模块、下位机模块
2.2.1.1应答和重发
上位机模块和下位模块的通信双方遵照半双工通信方式进行,即数据传送是双向的。
但是,任何时刻只能由其中的一方发送数据,另一方接收数据,因为EEPROM的读出和写入不能同时进行。
为了避免一方在发送信息帧时(这里的信息帧指的是下位机模块发送的数据帧和上位机模块发送的命令帧,下同),另一方也会发送数据,必须把信道变成半双工方式。
尽管这样效率可能不如全双工方式,但通过此举牺牲效率可以换取模块工作性能的稳定。
双方采取的顺序是:
发→收到应答后→再发。
按照整个系统的设计思路,上位机模块(即图1-1中的GSM模块1,下同)发送的帧包括命令帧、确认帧和非确认帧;
下位机模块(即图1-1中的GSM模块2,下同)发送的帧包括数据帧、确认帧和非确认帧。
其中确认帧和非确认帧是发送数据后等待对方发送的应答帧,以此作为继续发送下一帧和重新发送上一帧的依据。
命令帧和数据帧是信息帧,当一方先发送完信息帧。
2.2.1.2延时重发
在双方通信过程中,有两个时间t1和t2,分别表示重新发送信息帧的最大延时。
t1表示一方发送完信息帧到收到对方应答帧的时间,如果等待应答帧的时间超过了t1,则发方会重新发送原来的信息帧;
当收方接收到对方发送的信息帧,如果收方此时有需要发送的信息帧,则收方此时不发送应答帧,而是发送信息帧给对方。
图2.1.1-1以下位机模块先发数据帧为例,阐述双方通信的具体实现过程。
图2.2.1-1下位机模块
2.2.2帧格式
GSM模块通过异步通信接口实现对SMS的控制共有三种接入协议:
BlockMode;
基于AT指令的TextMode;
基于AT指令PDUMode。
本系统发送和接收的数据都是基于数字的温度数据和命令字,为了保证系统的适用性,SMS的收发采用TEXT模式。
TEXT模式是基于字符的,更具体地说是基于ASCII码的一种结构模式。
在该模式下,模块发送和接收的信息帧格式如下:
表2.2.2-1发送接收
帧头
帧序号
数据
校验子
信息帧包括数据帧和命令帧。
帧头表示数据帧的标记,是由固定的字符“WQ”构成。
帧序号表示数据帧的序号,由两个字节组成。
帧序号表示下位机模块发送的递增数据帧序号和上位机模块发送的命令帧序号。
为了简化帧结构,命令帧的序号统一为00H。
除了信息帧外,双向传递的还有应答帧,它包括确认帧和非确认帧。
确认帧是双方反馈给发方的应答帧,表示收方已经正确接收到了发方发送的信息帧。
确认帧格式仅包括两个字段,且两个字段的内容都是固定的,即帧头“WQ”和数据字段“ACK”,确认帧格式如下。
表2.2.2-2帧格式
WQ
ACK
非确认帧是收方给发方的应答帧,表示收方收到的是无效的信息帧,其格式与确认帧格式类似,帧格式如下。
表2.2.2-3信息帧
NACK
2.2.3EEPROM空间的分配
采用8KB的EEPROM,按照每77个字节为一个块进行划分,共106块,如图2.2.3-1所示。
第00、01块留作系统使用,第02块~第105块是数据块,用作存放数据。
图2.2.3-1EEPROM空间的分配
2.2.4收发端与采集端的握手协议
收发端与采集端共用一个存储器,即双CPU对同一个EEPROM进行操作。
实现方案是分别使两个微处理器的一个I/O脚相连,两个CPU采用查询方式对此I/O端进行查询。
如果某时候收发端查询到本地I/O端为高电平,则单片机1拥有此存储器的操作权,可以对EEPROM进行读写操作。
2.2.5程序的设计
2.2.5.1主函数的设计思路
开机上电后,程序在主函数中运行,单片机和GSM模块分别进行初始化。
单片机的初始化包括设置串口工作方式、波特率,并初始化变量参数和标志位。
GSM模块初始化包括重新启动、关闭回显、设置在TEXT模式下的返回值中不显示详细的头信息、选择短信格式为TEXT模式、开发串口中断准备接收数据。
2.3短信数据的处理
进入时钟中断调用SHELL函数时,如果接收到了返回的参数+CMTI,表明上位机模块向下位机模块发送了短信数据,可能是命令帧,也可能是确认帧或者非确认帧。
在这种情况下,SHELL函数需要对短信内容进行分析,并根据短信的内容进行不同的处理,负责完成以上功能的就是ExecData函数,它是被SHELL函数调用的,用来分析并处理短信数据。
3系统硬件介绍
3.1系统核心部分
单片机AT89C51有内部RAM,可以作为各种数据区使用,内部闪电存储器存放数字时钟的控制程序。
它的主要功能是控制74LS138和74LS47,实现对LED显示器的位控和段控,完成时间的转换计算,并把计算的时间转换到相应的显示段码,控制LED显示器以动态扫描方式进行时、分、秒的显示。
AT89系列单片机是ATMEL公司生产的。
这是当前最新的一种电擦写8位单片机,与MCS-51系列完全兼容,有超强的加密功能,可完全替代87C51/52和8751/52。
3.1.189C51具有下列主要性能
◇4KB可改编程序Flash存储器(可经受1,000次的写入/擦除周期)
◇全静态工作:
0Hz~24MHz
◇三级程序存储器保密
◇128X8字节内部RAM
◇32条可编程I/O线
3.1.289C51的引脚及功能
3.1.2.1主要电源引脚
Vcc电源端
GND接地端
3.1.2.2外接晶体引脚
XTAL1接外部晶体的一个引脚。
在单片机内部,它是构成片内振荡器的反相放大器的输入端。
当采用外部振荡器时,该引脚接收振荡器的信号,既把此信号直接接到内部时钟发生器的输入端。
XTAL2接外部晶体的另一个引脚。
在单片机内部,它是上述振荡器的反相放大器的输出端。
采用外部振荡器时,此引脚应悬浮不连接。
3.1.2.3电源复用引脚
RES复位输入端。
当振荡器运行时,在该引脚上出现两个机器周期的高电平将使单片机复位。
ALE//PROG当访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。
即使不访问外部存储器,ALE端仍以不变的频率(此频率为振荡器频率的1/6)周期性地出现正脉冲信号。
3.1.2.4输入/输出引脚P0.0~P0.7、P10.~P1.7、P2.0~P2.7和P3.0~P3.7
P0端口(P0.0~P0.7)P0是一个8位漏极开路型双向I/O端口。
P1端口(P1.0~P1.7)P1是一个带有内部上拉电阻的8位双向I/O端口。
P1的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入在对Flash编程和程序验证时,P1接收低8位地址。
P2端口(P2.0~P2.7)P2是一个带有内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。
P3端口(P3.0~P3.7)P3是一个带有内部上拉电阻的8位双向I/O端口。
在89C51中,P3端口还用于一些专门功能,这些兼用功能见表3.1.2-1
表3.1.2-1P3端口兼用功能表
端口引脚
兼用功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
/INT0(外部中断0)
P3.3
/INT1(外部中断1)
P3.4
T0(定时器/计数器0的外部输入)
P3.5
T1(定时器/计数器1的外部输入)
P3.6
/WR(外部数据存储器写选通)
P3.7
/RD(外部数据存储器读选通)
3.1.3Flash存储器的编程
AT89C51单片机内部有一个4K字节的FlashPEROM。
这个Flash存储阵列通常是处于已擦除状态(既存储单元的内容为FFH),随时可对它进行编程。
编程接口可接收高电压(12V)或低电压(Vcc)的允许编程信号。
低电压编程方式可很方便地对AT89C51内的用户系统进行编程;
而高电压编程方式则可与通用的EPROM编程器兼容。
AT89C51的程序存储器阵列是采用字节写入方式编程的,既每次写入一个字节。
要对片内的PEROM程序存储器写入任何一个非空字节,都必须用片擦除方式将整个存储器的内容清除。
3.1.3.1对Flash存储器编程
编程前,必须建立好地址、数据和相应的控制信号。
编程单元的地址加在P1端口和P2端口的P2.0~P2.3(11位地址为0000H~0FFFH),数据从P0端口输入。
引脚P2.6、P2.7和P3.6、P3.7的电平选择见表2。
/PSEN应保持低电平,而RST应保持高电平。
/EA/VPP是编程电源的输入端,按要求加入编程电压。
ALE//PROG端输入编程脉冲(应为负脉冲信号)。
编程时,采用4~20MHz的振荡器。
对AT89C51编程的步骤如下:
在地址线上输入要编程单元的地址。
在数据线上输入要写入的数据字节。
激活相应的控制信号。
在采用高电压编程方式时,将/EA/VPP端的电压加到12V。
每对Flash存储阵列写入一个字节或每写入一个程序加密位,加一个ALE//PROG编程脉冲。
改变编程单元的地址和要写入的数据,重复上述步骤,直到全部文件编程完毕。
每个字节写入周期是自动定时的,通常不大于1.5ms。
数据查询方式
AT89C51单片机用数据查询方式来检测一个写周期是否结束。
在一个写周期期间,如果想读出最后写入的哪个字,则读出数据的最高位(P0.7)是原来写入字节最高位的反码。
3.1.3.2程序的校验
如果加密位LB1和LB2没有被编程,那么就可以对AT89C51内部已编好的程序进行校验。
程序存储器的地址仍由P1端口和P2端口的P2.0~P2.3输入,数据由P0端口输入。
/PSEN保持低电平,而ALE、/EA和RST保持高电平。
3.2GSM模块MZ28
MZ28是中兴通讯推出的GSM无线双频调制解调器,主要为语音传输、短信发送和数据业务提供无线接口。
MZ28集成了完整的射频电路和GSM的基带处理器,特别适合于迅速开发基于GSM无线网络的无线应用产品。
图3.2-1原理
3.3单片机MSC1210
在许多传统行业中,多路高精度温度采集系统是不可或缺的。
电厂、石化行业、钢铁厂以及制药厂等企业使用了大量的各类测温器件,如热电阻、热电偶等,这些器件需要定期校准;
在严格执行GMP规范的制药厂等企业,高温灭菌需要定期进行灭菌率的验证;
在某些要求进行严格的温度控制的场合,也需要进行多点高精度温度测量。
这些工作往往需要一多路高精度测温系统来完成。
3.3.1MSC1210具有以下主要特性
◇3个16位的定时器,16位PWM波输出;
◇多达21个中断源;
◇32个数字输入/输出端口,带有看门狗;
◇8路ADC提供24位分辨率可编程的无丢失码解决方案;
◇可编程增益放大(PGA)在1~128之间可调,极大提高了ADC精度;
◇带FIFO的SPI端口,双UART;
◇64TQFP封装,MSC1210系列的硬件和引脚完全兼容,必要时可以互换。
3.3.2MSC1210的增强功能
作为智能高精度测温模块的核心,MSC1210完成了微弱信号的多路切换、信号缓冲、PGA编程放大、24位∑-ΔA/D转换、数字滤波、数据处理、信号校准以及SPI通讯等功能。
MSC1210集成了一个8通道24位∑-ΔA/D转换器,采用8051兼容内核。
与ADuC824相比,其有如下增强的功能:
采用非常灵活的FLASH与SRAM存储器配置,可以对片上FLASH进行分区,根据需要设定程序FLASH与数据SRAM所占的比例。
改写次数可达一百万次,数据可保存100年。
片上RAM为1280B,有34个高电流驱动I/O,可以设外部存储器的存取时间,使用双数据指针提高存取速度,具有完善的节电功能,还有电压监视器、21个中断源、3个16位定时器计数器以及内部时间间隔计数器(TIC)。
4SMS的体系结构
GSM标准中定义的点-点短消息服务使得短消息能在移动台和短消息服务中心之间传递。
这些服务中心是通过称为SMS-GMSC的特定MSC同GSM网络联系的。
SME:
ShortMessagingEntity,短消息实体。
它可以接收或改善短消息,位于固话系统、移动基站或其他服务中心内;
SMSC:
ShortMessageServiceCenter,短消息服务中心,负责在基站和SME间中继、储存或转发短消息;
移动台(ME)到SMSC的协议能传输来自移动台或朝向移动台的短消息,协议名为SMTP(ShortMessageTransmissionProtocol);
SMCGWMS或SMCGMSC:
SMS-GatewayMSC,SMS网关。
接收由SMSC发送的短消息,向HLR查询路由信息,并将短消息传送给接收者所在基站的交换中心;
5结束语
通过以上的分析不难发现,整个程序错综复杂,函数之间相互牵扯。
标志位在程序的实现过程中扮演着非常重要的角色,正是依靠这些标志位,程序才能很好地实现各个功能之间的切换,而标志位的值是通过OSM模块返回的参数修改的。
因此程序的实现过程应该是阅读参数→修改标志位→发送指令。
主函数、时钟中断和串口中断程序、SHELL函数、ExecData函数贯穿整个程序的主线和核心部分,对它们的分析可以理解程序的主体思想,这也正是笔者着重介绍的原因所在。
然而这些函数和中断程序的实现,还需要依靠其它函数的配合,比如基于I2C总线的EEPROM操作函数、字符串操作函数以及串口发送函数等,由于篇幅所限,在此不再介绍。
GSM网络本身是不完全可靠的,可能会发生帧发送错误、帧丢失的现象
通过这次毕业设计,让我进一步了解了单片机的相关内容,对程序的编写也有了进一步的加强,但是这次设计过程中遇到了许多难题,由于对相关知识基础不够扎实,概念比较模糊,在设计中不能正确地写出相关程序内容。
忠心的感谢尊敬的XX老师!
本毕业设计在XX老师的悉心指导下完成。
毕业设计期间,甚至在平时的学习当中,XX老师给与我极大的帮助和指导,正是他的精心指导,是我在获取知识的同时,综合管理也得到了较大的提高,这将对我今后的学习、工作产生深远的影响。
藉此毕业设计完成之际,谨向长期指导和栽培我的XX老师表示真诚的感谢!
感谢XX学院提供了良好的学习、实践环境,感谢老师的教导,你们给了我一生最宝贵的财富。
最后,谨借此机会向所有关心、支持和帮助过本人的同学。
朋友致以最真挚的谢意!
附录:
程序
/*smsforGSM*/
#include"
AT89*51.h"
reg51.h"
ATcommend.h"
ExecData.h"
ScanKey.h"
Shell.h"
ReceivePara.h"
/*初始化串行端口*/
int_rs232()/*通信协议:
192000N81>
*/
{
intinbufl[20];
/*接收缓存*/
SCON=0x50;
TMOD=0x20;
TH1=0xFF;
TR1=1;
TI=1;
}
tx_char(unsignedcharc)/*发送字符*/
{
while
(1)/*循环*/
/*判断TI是否为1*/
if((SCON&
0x02)==0x02)break;
/*清除发送中断标志TI=0*/
TI=0;
SBUF=c;
/*将字符送至串行输出缓冲器*/
tx_str(char*str)/*送出字符串*/
chari;
for(i=0;
i<
strlen(str);
i++)
tx_char(str[i]);
tx_strl(char*str)/*以指针的方式送出字符串*/
{do{tx_char(*str++);
while(*str=='
\0'
);
//串口接收中断函数
voidserial()interrupt4using3
if(RI)
{
unsignedcharch;
RI=0;
ch=SBUF;
if(ch>
127)
count3=0;
inbuf1[count3]=ch;
checksum=ch-128;
}
else
count3++;
checksum^=ch;
if((count3==(INBUF_LEN-1))&
&
(!
checksum))
read_flag=1;
//如果串口接收的数据达到INBUF_LEN个,且校验没错,
//就置位取数标志
/*初始化定时器*/
int_timer();
TMOD=60H;
/*设置定时器1为工作方式2,250us周期*/
TH1=0FFH;
TL1=03H;
/*初始化gsm模块*/
int_gsm()
tx_strl(AT+OFF);
/*关机并重启*/
tx_strl(ATE0);
/*关闭回显*/
tx_strl(AT+CSDH=0);
/*设置在TEXT模式下的返回值中不显示详细的头信息*/
tx_strl(AT+CMGF=1);
/*选择短信格式为TEXT模式*/
EA=1;
;
/*总中断允许*/
ES=1;
/*打开串口中断准备接收数据*/
ET1=1;
/*打开时钟中断*/
/*时钟中断shell函数*/
voidshell()interrupt3
intReceivePara();
/*开启串口接收返回参数,并存到ReceivePara中,在ReceivePara.c文件中实现*/
intHandle;
intCommend;
intScanKey();
/*按键扫描,返回操作码*/
/*该函数在ScanKey.c中实现*/
switch(ScanKey)/*call(),sendsms(),readsms,deletesms()等函数在shell.c文件中实现*/
casecall:
call();
break;
/*呼叫对方模块号码*/
casesendsms:
sendsms();
break;
/*发送数据*/
casereadsms:
readsms();
/*阅读短信*/
casedeletesms:
deletesms();
/*删除短信*/
switch(ReacevePara)
case>
:
SendData();
/*呼叫对方模块号码获得成功,接下来需要发送数据*/
caseCMGS:
CMGS();
/*在ReceibePara.c文件中实现*/
caseCMGR:
CMGR();
/*在ReceibePara.c文件中实现*/
caseCMTI:
ExeData();
/*转短信数据处理函数*/
caseOK:
OK();
/*短信数据的处理-ExecData函数*/
/*Commend_handle();
Ack_handle();
Nak_handle();
三个函数的实现在ExecDat.c中*/
ExecData()
switch(Handle)
caseCommend:
Commend_handle();
/*处理命令帧*/
caseAck:
Ack_handle();
/*处理确认帧*/
case