单片机控制GSM模块.doc

上传人:文库蛋蛋多 文档编号:4135857 上传时间:2023-04-07 格式:DOC 页数:16 大小:392KB
返回 下载 相关 举报
单片机控制GSM模块.doc_第1页
第1页 / 共16页
单片机控制GSM模块.doc_第2页
第2页 / 共16页
单片机控制GSM模块.doc_第3页
第3页 / 共16页
单片机控制GSM模块.doc_第4页
第4页 / 共16页
单片机控制GSM模块.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《单片机控制GSM模块.doc》由会员分享,可在线阅读,更多相关《单片机控制GSM模块.doc(16页珍藏版)》请在三一办公上搜索。

1、单片机控制GSM模块自动收发短信的软件设计 课程设计实验报告郑元 2011年1月2号最近在网上查有关GSM模块的资料时,发现用单片机控制GSM模块是一个很热门的话题。在梅老师的引导下,我和同学决定用单片机和GSM模块做一个自动收发短信软件系统。我们这个系统实现的具体功能是:GSM模块接收外部发送的一个短信信息,信息中前六个字符是密码,紧跟着密码后是一个IP地址,单片机把短信取走,判断密码是否正确。若密码正确,负责把IP地址传送给电脑,若不正确,则不传送IP给电脑并返回短信提示密码错误。该系统涉汲到好多内容,网上有关单片机控制GSM的例子有很多,但是每讲到时,说了一大堆什么是GSM网络,GPRS

2、,SMS的工作原理,AT指令格式,该GSM模块性能特点等等。一但涉及到硬件,软件设计,具体实现方案,都是一些框图,一些不实用的结构程序,或一言而概之,有关具体的细节,更是没有提到。我们这里就不再过多的讲一些系统涉及的历史知识,当讲到哪一步涉及到具体知识时再细细讲之。系统的硬件结构实现:系统的硬件结构是由梅老师提供的,GSM模块选用的是上海讯腾公司的MD231模块,由于单片机要和电脑与MD231进行串口通讯,最少需要两个串口,考虑到一些问题,选用了两块AT89C2051单片机,这样就能满足系统的需求,电源模块采用的是LM2576电源稳压芯片电路有还有MAX232接口转换模块。具体的硬件电路框图如

3、下:PC机MCU2MCU1SMSGSM网络GSM模块具体的电路图如下:软件结构设计我们在写程序之前,先来了解一下必要的知识。MD231把MD231当作标准的GSM/GPRS模块使用,客户通过Com口输入的AT命令使用模块,并从Com口得到模块的反馈信息,此类运用的客户需要外部MCU和Com相连。模块的PWR脚拉低2秒开机。建议客户用手动开机或者使用样式电路使模块上电自动开机。如果用户将PWR脚直接连接在GND上,可以让模块上电就开机。但是,此时,模块对AT模拟按键(AT+CKPD)事件将不再响应。MD231模块开机后,会通过串口反馈一些信息给客户。比如:+EIND: 128 / 128 表示

4、AT命令OK +CREG: 5 /注册到网络的状态registered,roaming.+CSIM: PBK Ready /Phonebooks初始化 OK +CSIM: SMS Ready /短消息初始化OKAT指令有关MD231模块AT指令集介绍有很多,还是英文不好看。但它支持GSM 07.05标准,可以查看相关的PDF中文资料文档去了解AT指令。这里我们详细介绍一下要用到的几个AT指令和SMS模式。与短信有关的AT指令如下:AT指令功能AT握手信号AT+CNMI新消息到达提示命令AT+CMGF选择短消息信息格式:0PDU;1文本AT+CMGL列出SIM卡中的短消息AT+CMGR读取新短消

5、息AT+CMGD删除SIM卡内存的短消息AT+CMGS发送一条短消息命令各指令格式介绍如下:a) 输入“AT”然后回车,屏幕上返回“OK”表明计算机与MD231已连接成功,MD231能够正常工作。这时就可以测试各类AT命令。b) AT+CNMI=,;我们设置为AT+CNMI=2,1,0,0,0。参数解释:mode = 2,表示在TA-TE连接被占用时(如,TA处于数据模式下),指示消息存储在TA的缓冲区中;在TA-TE连接没被占用时,将指示传给TE。mt = 1,表示指示格式为+CMTI:,。bm=0,表示不向TE发送CBM(广播)指示。ds=0,表示不向TE发送SMS-STATUS-REPO

6、RT指示。bfr=0,表示当为13时,将TA缓冲区中的指示信息传给TE(在将指示信息传给TE之前必须有“OK”返回)。成功,在返回提示信息前,先返回“OK”,然后返回提示信息,格式为+CMTI:,。c)。用AT+CMGF命令设置消息格式,我们是文本短信,所以设置AT+CMGF=1,表明我们的消息格式为文本方式。成功返回“OK”。d)发送短信:AT+CMGS,格式为“AT+CMGS=,text is entered”。参数解释:da,字符型,GSM03.40 TP-Destination-Address(目的手机号码),要转化为TE选择的字符集,我们时UNICODE编码,所以要转化为UCS2型字

7、符集。toda,整型,GSM04.11 TP-Destination-Address,Type-of-Address(当的第一个字符为+(IRA43)时为145,其他为129)。CR,为回车。送完回车后,我们会收到“”。Text is entered,要发送的文本,因为,我们用的时“UCS2”字符集,所以要把发送的内容转换为UNICODE型。Ctrl-Z,表示发送。成功发送,返回“OK”。e)。阅读短消息命令:AT+CMGR=,index为消息记录号。返回值:+CMGR:,OK。参数解释:stat,消息状态,值有“REC UNREAD“,“REC READ”,“STO UNSENT”,STO

8、SENT“,”ALL“。da,字符型,GSM03.40 TP-Destination-Address,显示为当前选择的字符集。Toda,整型,GSM 04.11TP-Destination-Address.Fo,整形,GSM 03.40 SMS-SUBMIT(默认为17)。Dcs,GSM 03.38 SMS 数据编码方案(默认为0)。Vp,GSM03.40TP-Validity-Period.格式取决于SMS-SUBMIT的值。Sca,字符型,GSM04.11RP SC address,短消息中心地址。Tosca,整形,GSM 04.11RP SC address Type-of-Addres

9、s(见).Length,整型,文本模式时指示的长度。CR,回车。LF,换行。OK,表示成功了。f)。删除短消息命令:AT+CMGR=,index为删除短消息的记录号。指令测试结果:+EIND: 128 +CREG: 5 +CSIM: PBK Ready +CSIM: SMS Ready 直接发送短信:ATOKAT+CMGF=1OKAT+CSCS=GSMOKAT+CMGS=13545492150abcdefg+CMGS: 86OK设置接收短消息模式AT+CNMI=2,1,0,0,0 接受并存到 SIM卡。若有新短信 串口接受到以下信息: +CMTI:SM,X接收新短信:AT+CMGF=1OK+C

10、MTI:”SM”,2;短信提示。AT+CMGR=2;+CMGR: REC UNREAD, +8613545492150,01/08/14,10:46:47+32abcdefgOK删除短信:ATOKAT+CMGD=1OK根据SMS原理,指令格式,指令调试结果,系统功能.本系统决定用C语言来开发。主程序设计框图如下:主程序流程图:MCU2的Main()主程序新消息提示密码正确密码错误返回短信提示密码错误将密码后的IP地址,传送给MCU1,自动返回短信,提示密码正确读取新消息,判断消息内的密码否正确进入while()循环,等待新短信。MCU2初始化串口启动MD231等待MD231串口返回信息 初始化

11、MD231删除新短信有关MCU1的程序设计简单,框图就不画了,但会在后面的的程序文字说明中细细说到。本系统程序开发工具采用Keil51软件,单片机仿真采用proteus设计仿真软件.Proteus为该系统能搭建很好的虚拟仿真环境。由于Proteus中没有MD231的传真模块,而程序调试时没有实际电路调试,于是,就用VSPDxp5(串口虚拟软件),sscom32.exe(串口调试助手)和roteus联合构建仿真环境,达到我们需要的结果。MCU2的程序比较多,调试起来也很费事,调试时要用到两个单片机,两个虚拟串口,两个串口调试助手,用xp5模拟两对串口,com1与com2,com3与3与com4用

12、于sscom32与连接,此时的sscom32想当于模块。Com1与com2用于sscom32 与1连接,此时的sscom231相当于接收数据。在搭建这个仿真环境时并不是一下子就搭建好的,是不断尝试后再搭建成功,如有不好的地方还请指导。调试时我们可以先把和仿真好以后,再后调试与sscom32接收数据。具体的仿真电路图如下:仿真结果观察图如下:主函数的设计思路开机上电后,程序在主函数中运行,单片机和GSM模块分别进行初始化。单片机的初始化包括设置串中工作方式,波特率大小。GSM模块初始化包括开机,等待开机返回信息,发送握手AT指令。设置新消息提示方式,以及短信格式为TEXT模式(不能发送中文短信)

13、。若初始化成功后,串口返回OK字符,并进入死循环,用receive_ready()函数检测是否有新消息,若有新消息将接收标志位receiveready置1,并进入read_message()函数读取短信,将读取来的短信中的密码与原先设置的密码进行密码比对,若密码正确MCU2向MCU1的外中断发送低电平并把后面的IP地址数据赋给MCU1的P1口,MCU1收到信号后,读取P1口的数据,并将数据送给串口输出,MCU2再向MD231发送一个发短信指令,短信的内容是密码正确。若密码错误,MCU2不向MCU1发送读取信号,放弃IP数据,并返回短信,提示密码错误。最后进入delete message()函数

14、,删除短信。至此接收和发送一条短信的过程就完,就进入等待下一条新短信状态。MCU2的C程序:#include#include#define uchar unsigned char#define uint unsigned int#define RxIn 90uchar Rx,receiveready;sbit P_ON=P37; /开机sbit SINT=P33;/向第二个单片机提供中断信号uchar code SMS_init=+CSIM;/短消息初始化OKuchar code AT_MD231=AT;/握手信号uchar code CNMI_MD231=AT+CNMI=2,1,0,0,0;

15、/设置新消息到达自动提示uchar code RecMsg_MD231=+CMTI; /新消息来到,串口接收到的字符uchar code Password=123456; /密码uchar code returnERROR=PASSWORD IS ERROR! Pealse again;/密码错误提示uchar code returnRIGNT=PASSWORD IS RIGHN; /密码正确提示uchar code OK_MD231=OK; /命令成功uchar code SMS_text=AT+CMGF=1;/短信格式为text格式uchar code MD231_CMGR=AT+CMGR

16、=;/读取短信指令uchar code MD231_CMGS=AT+CMGS=;/发送短信指令uchar code MD231_CMGD=AT+CMGD=;/删除短信指令 uchar idata RecBufRxIn;/接收缓冲区uchar AT_delete12; /用来存储删除短信指令uchar AT_Read12;/用来存储发送读取短信指令 uchar SendNumber25; /用来存储发送短信号码指令uchar numberbuf3; /用来保存短信条数/uchar passwordip21;void delay_ms(uint z) /延时子程序 uint x,y;for(x=z

17、;x0;x-)for(y=110;y0;y-);void URT_init()/串口通讯初始化TMOD=0x20;设置波特率.TH1=0xfd;TL1=0xfd;PCON=0x00;SCON=0x50;/串口方式1TR1=1;EA=1;ES=1;void sendchar(uchar asc)/发送单个字符SBUF = asc;while(TI=0);TI=0;void sendstring(uchar *str)/发送字符串,调用Send_Char()while(*str)sendchar(*str);str+;sendchar(0x0D);sendchar(0x0A);void Start

18、_MD231()/启动MD231P_ON=0;delay_ms(2000); /拉低秒使D231开机P_ON=1;delay_ms(2000); void MD231_INIT()/MD231的初始化 uchar *p1; LOOP: delay_ms(1000); sendstring(AT_MD231); delay_ms(1000); sendstring(CNMI_MD231); delay_ms(1000); for(Rx=0;RxRxIn;Rx+) RecBufRx=0x00; Rx=0; sendstring(SMS_text); delay_ms(3000); p1=strst

19、r(RecBuf,OK_MD231); if(p1!=NULL) for(Rx=0;RxRxIn;Rx+)RecBufRx=0x00;Rx=0; else for(Rx=0;RxRxIn;Rx+)RecBufRx=0x00;Rx=0;goto LOOP; void wait_MD231()/等MD231出现+EIND: 128+CREG: 5 +CSIM: PBK Ready +CSIM: SMS Readyuchar *p; LOOP:delay_ms(1000);p=strstr(RecBuf,SMS_init);if(p!=NULL)for(Rx=0;RxRxIn;Rx+)RecBufR

20、x=0x00;Rx=0;elsegoto LOOP; void receive_ready(void)/检测是否有短信来。uchar i,*p;p=strstr(RecBuf,RecMsg_MD231);if(p!=NULL) /如果有新短信(TI)来,模块会通过串口向单片机发送字符串,如果收到CMTI: /此函数的功能是判断是否有新短信来,如果来的话就置位准备接受位标志为1 receiveready=1;elsefor(i=0;iRx;i+)RecBufi=0x00;Rx=0;void read_message(void) /发送指令读取发过来的短信 uchar i; delay_ms(10

21、00); for(i=0;i3;i+) numberbufi=RecBuf14+i; for(i=0;i8;i+)AT_Readi=MD231_CMGRi; for(i=8;i11;i+) AT_Readi=numberbufi-8; for(Rx=0;RxRxIn;Rx+) RecBufRx=0x00; Rx=0; sendstring(AT_Read); void sendmessage(uchar *str1)/发送回复短信 uchar i;for(i=0;i8;i+) SendNumberi=MD231_CMGSi; for(i=8;i24;i+) SendNumberi=RecBuf

22、14+i;/将对方号码提取用来回复给对方 sendstring(SendNumber);delay_ms(400); sendstring(str1);delay_ms(300);sendchar(0X1A);void read_password() /读取短信内容,进行密码比对uchar k,*p2;p2=strstr(RecBuf,Password);if(p2!=NULL)delay_ms(1000);sendmessage(returnRIGNT);for(k=0;k15;k+)SINT=0;P1=RecBufk+64;delay_ms(1);SINT=1;elsesendmessag

23、e(returnERROR); for(Rx=0;RxRxIn;Rx+) /清空接收缓存RecBufRx=0x00;Rx=0; void delete_message(void) uchar i; delay_ms(1000); delay_ms(1000); delay_ms(5000); for(i=0;i8;i+)AT_deletei=AT_CMGDi; for(i=8;i11;i+) AT_deletei=numberbufi-8; for(Rx=0;RxRxIn;Rx+) SystemBufRx=0x00; Rx=0; sendstring(AT_delete); /发送AT+CMG

24、R=?,?代表短信储存所在位置 void main() /主程序 URT_init(); Start_MD231();wait_MD231(); MD231_INIT(); while(1) delay_ms(3000); receive_ready();delay_ms(1000);if(receiveready=1)sendstring(returnRIGNT);delay_ms(1000);read_message();delay_ms(4000);receiveready=0;read_password();read_message(void);for(Rx=0;RxRxIn;Rx+)

25、 SystemBufRx=0x00; Rx=0; void urtint() interrupt 4 /串口中断接收数据if(RI)if(RxRxIn)RecBufRx=SBUF;Rx+;RI=0;MCU1的程序:#include #define uchar unsigned char #define uint unsigned int sbit SINT=P33; uchar a,flag1; uchar returnRIGNT121=THE PASSWORD IS RIGHT; void delay(uint z) /延时子程序 uint x,y;for(x=z;x0;x-)for(y=1

26、10;y0;y-); void URT_init1()TMOD=0x20;TL1=0xfd;TH1=0xfd;PCON=0x00;SCON=0x40;/串口方式1TR1=1;EA=1;EX1=1; void send_Char1(uchar sh)/发送单个字符SBUF = sh;while(TI=0);TI=0;void send_Str1(uchar *str,uint len)/发送字符串,调用Send_Char()while(len-)send_Char1(*str+); void main() P1=0xff;URT_init1();while(1) void EX_1() inte

27、rrupt 2 EX1=0;send_Char1(P1);EX1=1;总结:由于本次软件设计并没有实际的电路去验证,所以很难知道是否完全正确。而且程序上还有一些小问题,由于时间不够,我们会在以后不断去完善软件设计。具体的问题有两个:一是短信内容的格式,到底多少个字符是来电号码,以及短信的内容在多少个字符后。二是我们定义的数接组缓存较大,超过了128B,这样Keil在编译的时候语法没有错误,但是却不能生成目标文件。基于存在上面两方面问题,所以本次软件设计还不算成功,不过总体结构是正确无误的,我们相信再花点时间一定能解决这两个问题。这次做这个软件系统,我们学到了一些新东西,比如:GSM 功能及引脚

28、,AT指令,短信原理,更重要是的单片机串口接收控制方面。实际动手做了一遍,比只看课本要强很多,而且在做的过程中学到了处理一些新问题的新方法。用单片机控制GSM模块不是一个简单的问题,网上有专门招聘这方面的人才,它能实现很多功能,能用在很多方面,解决的办法也有多种,也会用到一些新的东西。我们这次所做的,只是这方面的一个很简单的准备工作,要想做好还需要更多努力。在本次报告中,我们并没有在GSM网络及MD231芯片的功能 ,AT指令,短信原理,单片机串口接收控制方面等等原理做过细讲解。网上有送这方面的资料多了去了,有兴趣的可以查找。我们所说的是网上没有的,就是引处理这个问题的解决办法,怎么充分去利用现有的软件工具去模拟现实硬件电路功能进行仿真,以及解决这个问题一步步过程。以及一个系统的程序是一步步调试出来的,并不是一次写好的,在调试上花的时间要比写的时间多多了。由于这一次只是尝试,而且能力尚浅,对这方面知道的也很少,如有高手还望多多指教。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号