无线LED显示屏通过GSM短信的方式可实现远距离控制

上传人:少*** 文档编号:58957216 上传时间:2022-03-01 格式:DOC 页数:92 大小:670.50KB
收藏 版权申诉 举报 下载
无线LED显示屏通过GSM短信的方式可实现远距离控制_第1页
第1页 / 共92页
无线LED显示屏通过GSM短信的方式可实现远距离控制_第2页
第2页 / 共92页
无线LED显示屏通过GSM短信的方式可实现远距离控制_第3页
第3页 / 共92页
资源描述:

《无线LED显示屏通过GSM短信的方式可实现远距离控制》由会员分享,可在线阅读,更多相关《无线LED显示屏通过GSM短信的方式可实现远距离控制(92页珍藏版)》请在装配图网上搜索。

1、1 前言12 方案论证12.1 整体方案选择12.2 GSM Modem的选择13 设计要求34 系统总体框图35 单片机外围器件及其驱动程序的设计45.1 SoC型单片机STC89C516RD+45.2 实时时钟电路55.2.1 驱动程序设计65.3 看门狗电路115.3.1 STC89C516RD+单片机内部看门狗的使用116 TC35i模块AT指令及中文短信息的收发126.1 单片机与TC35i的硬件接口126.2AT指令介绍136.3 单片机发送AT指令的程序设计136.4 中文短信息的收发156.4.1 PDU模式及中文短信息的编码156.4.2 PDU模式中文短信息发送的程序设计1

2、76.4.3 PDU模式中文短信息的接收与解码207 LED显示屏与模拟串口258 结束语26致谢26参考文献27附录一 STC89C516RD+头文件28附录二 总程序清单311 前言现代社会中,作为人-机信息视觉传播媒体的显示器,LED显示屏将有可能成为21世纪主流产品,广泛应用于银行,医院,机场,证券等公共场所。传统有线LED显示屏由于距离限制,束缚了屏幕的应用。本文设计的无线LED显示屏通过GSM短信的方式可实现远距离控制字符的显示。 本文详细地叙述了基于西门子公司的TC35i型GSM手机模块的无线LED显示屏的设计过程。文中探讨了利用GSM短消息作为数据传输媒介实现远程控制LED显示

3、屏的可行性,给出了采用TC35i模块和STC89C516RD+单片机构成的远程控制LED显示屏的设计方案,并详细介绍了远程控制LED显示屏的硬件组成和软件的工作流程。文章重点阐述了STC89C516RD+单片机和TC35i模块的接口、TC35i的特点和主要功能、AT指令的应用、短信PDU编解码在单片机上的实现,LED显示屏的构成等。该系统单片机STC89C516RD+通过标准串口经电平变换与TC35i模块相连,完成对TC35i模块的初始化和短消息的数据收发功能,同时使用一个定时器模拟的串口与LED显示屏相连,完成单片机与LED显示屏的信息传递。实践证明,这种设计思想充分的使用了单片机的内部资源

4、,有利于系统硬件的简单化,大大方便了系统硬件的设计,并很大成度的提高了系统的可靠性。2 方案论证2.1 整体方案选择方案一:基于ARM的嵌入式系统。这种方案中我们可以使用现有的操作系统(COS-II),在系统的基础上进行应用程序的开发。由于ARM处理器的功能强大,资源丰富,因此使用这种方案可以使系统功能近乎完美,并且由于使用了操作系统,应用程序的设计会变得简单可靠。但是这种方案成本较高,同时使用的嵌入式操作系统也会占用一部分额外的硬件资源,这样会大大的提高开支。目前情况下我们不考虑这种方案。方案二:SoC型单片机与GSM模块构成的系统。目前SoC型单片机已非常普遍,基于51内核的SoC型芯片也

5、有众多供应厂商。例如,国内宏晶科技的STC系列,Cyganl公司的C8051系列。这些单片机都有丰富的片上资源,一般都不需要外扩其他器件就可以构成一个完整的系统。片上系统的优点在于减小了布线的麻烦,提高了系统的整体性能。因此我们选用这种方案1。2.2 GSM Modem的选择本设计中GSM Modem是该系统中的核心部分,正确选择合适GSM Modem将关系到整个项目设计的成败。目前GSM Modem有众多供应商提供,我们将对几种常用的GSM模块进行评估,以便选择合适的方案。(1)MZ28模块MZ28模块是中兴通讯推出的GSM无线双频调制解调器,主要为语音传输、短信发送和数据业务提供无线接口。

6、MZ28集成了完整的射频电路和GSM的基带处理器,特别适合于迅速开发基于GSM无线网络的无线应用产品。带有人机接口(MMI)界面的应用产品内部与MZ28的通讯可通过标准的串行接口(RS232)进行。MZ28使用简单的20-PIN ZIP插座与用户自己的应用系统相连,此ZIP连接方式提供开发所需的数据通信、音频和电源等接口信号。MZ28可以作为无线引擎,嵌入到用户自己的产品当中,用户可以用单片机或其他CPU的UART口,使用相应的AT命令,对模块进行控制,达到使其产品可以轻松进入GSM网络的目的2。(2) Q2406B GSM模块Q2406B 是WAVECOM公司双频GSM/GPRS模块内嵌IC

7、P/IP协议,支持点对点的MT&MO,短消息区域广播等。Q2406B(支持class10),下载53.6.8kbits/s,上传26.8kbits/s。数据线路异步传输和同步可达14,400 bits/s。提供RS232数据接口,通过AT指令进行操作,波特率从300到115,200 bits/s,自动速率从2,400到19,200 bits/s。单一天线接口,3V/5VSIM卡接口。使用3.6V供电。(3)TC35i模块TC35i是Siemens公司推出的新-代无线通信GSM模块。自带RS232通讯接口,可以方便地与PC机、单片机连机通讯。可以快速、安全、可靠地实现系统方案中的数据、语音传输、

8、短消息服务(Short Message Service)和传真。TC35模块的工作电压为3.35.5V,可以工作在900MHz和1800MHz两个频段,所在频段功耗分别为2w(900M)和1w(1800M)。模块有AT命令集接口,支持文本和PDU模式的短消息、第三组的二类传真、以及2.4k,4.8k,9.6k的非透明模式。此外,该模块还具有电话簿功能、多方通话,漫游检测功能,常用工作模式有省电模式、IDLE、TALK等模式。通过独特的40引脚的ZIF连接器,实现电源连接、指令、数据、语音信号、及控制信号的双向传输。通过ZIF连接器及50天线连接器,可分别连接SIM卡支架和天线。TC35i模块主

9、要由GSM基带处理器、GSM射频模块、供电模块(ASIC)、闪存、ZIF连接器、天线接口六部分组成。作为TC35的核心,基带处理器主要处理GSM终端内的语音、数据信号,并涵盖了蜂窝射频设备中的所有的模拟和数字功能。在不需要额外硬件电路的前提下,可支持FR、HR和EFR语音信道编码。其它功能介绍可参见相关资料3。通过对比以及资料的查找,我们发现TC35i有众多的用户,资料介绍比较全面详细。网络上也有很多电子爱好者、工程师对TC35i比较感兴趣,讨论的话题比较多,更有很多调试笔记等可以参考。因此我们考虑选用该模块,这样风险较小,成功率较高,遇到问题方便解决。3 设计要求(1)TC35i驱动程序设计

10、;(2)PDU串解码;(4)LED显示屏驱动程序(模拟串口);(5)汉字编码转换程序;(6)DS1302驱动程序的设计;(7)终端主程序;(8)电源系统;4 系统总体框图根据设计要求及方案论证,系统终端电路方框图如下图1。RTCDS1302XRAMCY62256Watch DogMAX6865MCUSTC89C516单片机系统RS232RS232点阵LED显示屏GSMmodemTC35i电源+5V图1 系统终端硬件电路方框图在图1所示的方框图中,单片机系统包括STC89C516RD+4、时钟芯片DS1302、看门狗芯片MAX68655、以及扩展的32K片外存贮器CY62256。CY62256通

11、过地址锁存器74HC573以总线的方式与单片机连接。这样在用C语言编程的时候只需要在程序中把要使用的变量定义为外部(XDATA)变量即可。无需考虑存贮空间的分配以及寻址的方式,使程序设计有所简化6。GSM模块采用TC35i,TC35i带有标准的串行通信接口通过MAX232进行电平转换后与单片机进行接口。在本设计中我们的重点是进行短信息的接收与PDU解码,因此LED显示屏我们不在自行设计,而是采用市面上出售的带有标准RS232接口的成品LED屏幕。这样我们只需要编写与LED显示屏通信的串口驱动程序。由于TC35i与LED显示屏都必须通过串行通信接口与单片机相连,而大多数单片机都只有一个标准的UA

12、RT接口(也有少部分Soc型单片机如,C8051F系列中的一些芯片以及华邦的W79E225等有两个UART接口,但价格相对较高),因此我们考虑使用模拟的串行通信口,这样既降低了成本又充分的利用了片内的定时器资源,事实证明这是可行的。关于模拟串口将在下文详细介绍。5 单片机外围器件及其驱动程序的设计5.1 SoC型单片机STC89C516RD+STC89C51RC/RD+系列单片机是宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机。指令代码完全兼容传统51内核的单片机,12时钟(机器周期),6时钟(机器周期)可任意选择,最新D版本内部集成了MAX810专用复位电路。STC89C516RD+单

13、片机PQFP封装管脚分布如图24。图2 STC89C516RD+单片机PQFP封装管脚分布STC89C516RD+单片机的特点:(1)增强型6时钟(机器周期),12时钟周期(机器周期)8051CPU(2)3.4-5.5V工作电压(5V单片机)(3)工作频率范围080MHz (4)用户应用程序空间64K(5)片上集成1280字节RAM(6)36个通用I/O口,P1、P2、P3、P4准双向口弱上拉,P0口开漏输出(7)支持ISP、IAP,无需专用编程器,可通过串口(P3.0,P3.1)直接下载用户程序(8)EEPROM功能支持(9)硬件看门狗支持,可完全省去外部看门狗(10)内部集成专用复位电路M

14、AX810,外部晶振20M一下时可省去外部复位电路(11)3个16位定时器计数器(12)外部中断4路,下降沿中断或低电平触发中断,Power Down模式可由外部低电平触发方式唤醒(13)全双工UART串行口,可用软件模拟多个串行口(14)特有的软件复位功能(15)程序加密性强STC89C516RD+单片机的特殊功能寄存器在原有51内核单片机的基础上进行了扩展,新增加了一些特殊功能寄存器,详细资料可以查阅STC89C51RC/RD+系列单片机的用户手册,这里不在赘述。不过为了方便使用C语言对这些特殊功能寄存器进行访问,在使用该系列单片机之前可以现定义一些关于特殊功能寄存器的头文件。关于STC8

15、9C516RD+单片机特殊功能寄存器定义的头文件请参阅附录1。5.2 实时时钟电路在本系统中需要显示当前的日期、时间等,因此我们使用一个时钟芯片,用来提供年、月、日、星期、小时、分钟等信息。我们选用MAXIM公司生产的时钟芯片DS1302,外形图如图3所示。图3 DS1302外形及管脚分布DS1302 是 DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和 31 字节静态 RAM 通过简单的串行接口与单片机进行通信 实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息。每月的天数和闰年的天数可自动调整时钟操作可通过 AM/PM 指示决定采用24 或12小时格式DS1302

16、与单片机之间能简单地采用同步串行的方式进行通信 仅需用到三个口线1RES 复位 2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达 31 个字节的字符组方式通信 DS1302工作时功耗很低保持数据和时钟信息时功率小于1mW。DS1302有两个电源端VCC1和VCC2,VCC1作为主电源端接电源电压,VCC1作为备用电源端,可接一个电容,或是接一个备用电池,当失去电源电压时,DS1302可以通过备用电源或是电容的放电来维持供电,保证时钟芯片能正常运行。当电源电压正常时,备用电源在线路里不起作用。5.2.1 驱动程序设计DS1302的输入输出时序图如图4和图5所示。由

17、于图中的tCC、tCCZ、tCDZ、tDC、tCDH、tCDD、tCL、tR、tF、tCCH、tCWH、tCH时间都不大于1s,所以程序中不用考虑加延时。图4 读数据时序图5 写数据时序字节输入、输出、读写DS1302以及数据处理的C语言程序如下所示:sbit DS1302_CLK = P12; /实时时钟时钟线引脚 sbit DS1302_RST = P14; /实时时钟复位线引脚sbit DS1302_IO = P13; /实时时钟数据线引脚#define DS1302_SECOND0x80#define DS1302_MINUTE0x82#define DS1302_HOUR 0x84

18、#define DS1302_DAY 0x86#define DS1302_MONTH0x88#define DS1302_WEEK 0x8A#define DS1302_YEAR 0x8C#define CountDay 8#define CountMonth 8/倒计时结束日期08年8月8日INT8U code SetTimeBuf7 = 0x30, 0x50, 0x08, 0x22, 0x05, 0x04, 0x08;INT8U code Countdown13=0,31,29,31,30,31,30,31,31,30,31,30,31;/月份天数/* 函数名称: DS1302Input

19、Byte* 功能描述: 实时时钟写入一字节数据* 输入: d* 输出: 无* 全局变量: 无* 调用模块: 无*/void DS1302InputByte(INT8U d)/实时时钟写入一字节 INT8U i;ACC = d;for (i = 8; i 0; i-)DS1302_IO = ACC0; DS1302_CLK = 1;_nop_(); DS1302_CLK = 0; ACC = ACC 1; /*函数名称: DS1302OutputByte* 功能描述: 实时时钟读取一字节* 输入: 无* 输出: ACC* 全局变量: 无* 调用模块: 无*/INT8U DS1302OutputB

20、yte(void)/实时时钟读取一字节 INT8U i; for (i = 8; i 0; i-) ACC = ACC 1; ACC7 = DS1302_IO; DS1302_CLK = 1;_nop_(); DS1302_CLK = 0; return (ACC); /*函数名称: Write1302* 功能描述: 向DS1302指定的地址写入数据* 输入: ucAddr, ucData* 输出: 无* 全局变量: 无* 调用模块: DS1302InputByte*/void Write1302(INT8U ucAddr, INT8U ucData) /ucAddr: 地址, ucData:

21、 数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucData); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0;/*函数名称: Read1302* 功能描述: 读取DS1302指定地址的数据* 输入: ucAddr* 输出: ucData* 全局变量: 无* 调用模块: DS1302InputByte, DS1302OutputByte*/unsigned char Read1302(INT8U ucAd

22、dr)/读取DS1302某地址的数据 INT8U ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);/*函数名称: Initial_DS1302* 功能描述: DS1302初始化函数* 输入: * 输出: * 全局变量: 无* 调用模块: Write1302*/void Initial_

23、DS1302(void)DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;Write1302(0x90, 0xA5); /充电方式设置DS1302_CLK = 1;DS1302_RST = 0; /*函数名称: DS1302_SetProtec* 功能描述: DS1302写保护* 输入: flag* 输出: * 全局变量: 无* 调用模块: Write1302*/void DS1302_SetProtect(bit flag) /是否写保护 0不保护,1保护if(flag)Write1302(0x8E,0x80);elseWrite1302(0x8E,0

24、x00);/* 函数名称: DS1302_SetTime* 功能描述: DS1302设置时间函数* 输入: * 输出: * 全局变量: 无* 调用模块: Write1302*/void DS1302_SetTime(void) / 设置时间函数 DS1302_SetProtect(0);Write1302(DS1302_SECOND, SetTimeBuf0); Write1302(DS1302_MINUTE, SetTimeBuf1);Write1302(DS1302_HOUR, SetTimeBuf2);Write1302(DS1302_DAY, SetTimeBuf3);Write130

25、2(DS1302_MONTH, SetTimeBuf4);Write1302(DS1302_WEEK, SetTimeBuf5);Write1302(DS1302_YEAR, SetTimeBuf6);DS1302_SetProtect(1);/*函数名称: DS1302_DS1302_GetTimeCHG* 功能描述: DS1302读当前时间并转换成ASC码* 输入: * 输出: * 全局变量: 无* 调用模块: Read1302*/void DS1302_GetTimeCHG(void) INT8U ReadValue=0,i=0,j=0;INT8S CountTmp=0;INT8U Ge

26、tTimeBuf7; for(i=0;i4)*10 + (ReadValue&0x0F);/BCD码转换为十进制数据便于处理j+;CHstring8 = GetTimeBuf6/10 + 0;/把日期数据转换为ASCII码CHstring9 = GetTimeBuf6%10 + 0;CHstring12 = (GetTimeBuf4/10 + 0);CHstring13 = GetTimeBuf4%10 + 0;CHstring16 = (GetTimeBuf3/10 + 0);CHstring17 = GetTimeBuf3%10 + 0;CHstring48 = (GetTimeBuf2/

27、10 + 0);CHstring49 = GetTimeBuf2%10 + 0;CHstring51 = (GetTimeBuf1/10 + 0);CHstring52 = GetTimeBuf1%10 + 0;CHstring54 = (GetTimeBuf0/10 + 0);CHstring55 = GetTimeBuf0%10 + 0;switch (GetTimeBuf5)/把与星期对应的数据转换为中文一,二. case 0x01: CHstring25 =0xD2,CHstring26 =0xBB;break; case 0x02: CHstring25 =0xB6,CHstring

28、26 =0xFE;break; case 0x03: CHstring25 =0xC8,CHstring26 =0xFD;break; case 0x04: CHstring25 =0xCB,CHstring26 =0xC4;break; case 0x05: CHstring25 =0xCE,CHstring26 =0xE5;break; case 0x06: CHstring25 =0xC1,CHstring26 =0xF9;break; case 0x07: CHstring25 =0xC8,CHstring26 =0xD5;break; default: CHstring25 =E ,

29、CHstring26 =r; for(i=GetTimeBuf4;iCountMonth;i+) /计算距离08年8月8日的剩余天数CountTmp+= Countdowni;CountTmp=(CountTmp-GetTimeBuf3)+CountDay;CHstring84 = (CountTmp/10 + 0);CHstring85 = CountTmp%10 + 0; 5.3 看门狗电路由于我们的终端是工作在无人值守的环境中,因此必须防止程序跑飞而造成的死机,系统崩溃等。STC89C516RD+单片机内部集成了硬件看们狗可以满足系统安全性的需求。另外我们还使用了一个外部看门狗芯片MAX

30、6865备用。MAX6865是美信公司纳安级功耗的微处理器监控电路,带有手动复位及看门狗定时器,MAX6865的详细资料可以参阅MAX6865的器件手册。5.3.1 STC89C516RD+单片机内部看门狗的使用STC89C516RD+单片机通过向特殊功能寄存器WDT_CONTR写入指定的数据,来启动或复位内部看门狗。WDT_CONTR寄存器的各位及其功能如表1所示4。表1 WDT_CONTR寄存器表中各位描述:(1)EN_WDT 看门狗允许位,当设置为“1”时,看门狗启动。(2)CLR_WDT看门狗清“0”位,当设置为“1”时,看门狗重新计数,硬件将自动清“0”此位。(3)IDLE_WDT

31、看门狗“IDEL”模式,当设置为“1”时,看门狗定时器在“空闲模式”计数。当该位清“0”时,看门狗计数器在“空闲模式”不计数。(4)PS2、PS1、PS0 看门狗定时器预分频设置控制位。看门狗预分频值如表2所示。看门狗溢出时间计算。看门狗溢出时间=(NPre_scale32768)/Oscillator frequency,例如,当系统晶振频率为12MHz,12时钟模式,则看门狗溢出时间= (12Pre_scale32768)/12000000。了解了看门狗定时器特殊功能寄存器各位的功能,我们就可以使用汇编语言或者C语言来操作该寄存器。下面是使用C语言操作单片机内部看门狗的子程序。表2 看门狗

32、定时器预分频值PS2PS1PS0预分频(Pre_scale)看门狗定时器溢出时间(ms)(12MHz晶振,12时钟模式)000265.50014131.00108262.101116524.2100321048.5101642097.11101284194.31112568388.6void Reset_Wdt(void)WDT_CONTR = 0x3f; /复位看门狗void Init_Wdt(void)WDT_CONTR = 0x3f; /看门狗初始化,使用18.432MHz晶振,设置为256分频,溢出时间大约5.46 s有了这两个子程序,在使用STC89C516RD+的内部看门狗的时候,

33、在程序的开始处调用Init_Wdt函数,然后在主程序的适当位置调用Reset_Wdt函数就可以实现启动以及复位看门狗。一旦程序跑飞或者死机,在规定的时间内(例如本程序中的5.46s)没有调用Reset_Wdt函数,看门狗计数器就会溢出,同时发复位信号给单片机,重新启动系统。MAX6865的使用与单片机内部看门狗的使用相同,只是MAX6865的定时器清“0”是通过把单片机的P4.2脚(P4.2脚与MAX6865的WDI脚相连)置“1”来实现的,这里不再赘述。6 TC35i模块AT指令及中文短信息的收发6.1 单片机与TC35i的硬件接口单片机与TC35i是通过标准串口进行数据交换的。因此只需要使

34、用一根串口通信电缆(DB9)连接单片机的串口与TC35i的串口即可。单片机与TC35i的通信电缆连接方式如图6所示。单片机与TC35i的波特率都设置为9600bit/s、8位数据位、1位停止位、无校验位8。图6 单片机与TC35i的连接方式6.2AT指令介绍单片机与TC35i通讯实现任何功能都是通过向TC35i发送AT指令来实现的。在TC35i的用户手册中用来操作TC35i的AT指令非常繁多,但常用的指令并不是很多。表3列出了常用的AT指令8。表3 常用AT指令AT指令功能描述AT联机命令AT+CSQ查询信号质量AT+CREG?查询注册状况AT+IPR设置串行通信的波特率AT&V显示GSM模块

35、当前的一些设置AT+CMGF设置短信编码格式 1-Text格式,0-PDU格式AT+CNMI选择短消息到来时系统的提示方式AT+CMGR读取一条短消息AT+CMGL将SIM卡中存贮的短消息列表AT+CMGS发送短消息AT+CMGD删除一条短消息6.3 单片机发送AT指令的程序设计单片机与GSM模块(TC35i)的软件接口其实就是单片机通过发送相关的AT指令对GSM模块进行操作的技术。如设置短信息的编码方式、读取手机的短信息内容、删除短信息内容、列出手机中还未读的短消息等。执行1条指令,并非某些资料介绍的那么简单,事实上,指令的执行过程需要单片机与手机交互应答完成,每一次发送或接收的字节数都有严

36、格的规定,二者必须依据这些规定实现数据交换,否则,就会出现通信失败。表4列出AT指令执行过程。需要重点说明的是,所有AT指令的指令符号、常数、PDU数据包等都是以ASCII编码形式传送的。比如“A”的ASCII编码为41H,“T”的ASCII编码为54H,数字“0”的ASC编码为30H等。单片机通过串口向手机发送每一条指令后,必须以回车符作为该条指令的结束,回车符的ASCII编码为0DH。例如,单片机向手机发送“AT+CMGF=0”这条指令,其ASCII编码序列为“41H、54H、2B H、42H、4DH、47H、46H、3DH、30H、0DH”,最后一个字节“0D”表4 AT指令的执行过程H

37、就是回车符,表示该条指令结束,如果没有这个回车符,手机将不识别这条指令。当手机接收到一条完整的AT指令后,手机并不立即执行这条指令,而是首先把刚才接收到的AT指令的全部ASC编码序列全部反发送出来(含0DH),其次发送1个回车符和换行符的ASC编码即0DH和0AH,最后执行该条指令。例如发送“AT+CMGF=0”这条指令给GSM模块,如果通信成功,则GSM模块返回“AT+CMGF=0 OK”,即单片机接收到的数据是该字符串的ASCII码“41H 54H 2BH 43H 4DH 47H 46H 3DH 30H 0DH 0DH 0AH 4FH 4BH 0DH 0AH”这表示该条指令已经被成功的执行

38、。遵循以上的AT指令执行原则,通过单片机发送一条AT指令到GSM模块的C语言程序如下:INT8U code Command_At3 = ATr;/Send AT/* 函数名称: AT_Send* 功能描述: 发送AT联机命令,通信正常返回ok* 输入: 无* 输出: 无* 全局变量: 无* 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error*/void AT_Send(void) INT8U i, error_counter;error_counter = 0;Serial_Inter_Close();while(1) TI =

39、 0; RI = 0;for(i = 0; i 9; i+)reci = 0x00;Start_timer2();/用定时器2做超时处理,在其他子程序中使用功能相同 Uart_send(Command_At,3);for(i = 0; i 9; i+)while(!RI);reci = SBUF;RI = 0;Close_timer2();if(rec5 = O&rec6 = K) break;/返回ok说明通信成功else if(error_counter+5) /否则延时重发Delaytx100ms(10);else deal_with_error();Serial_Inter_Open(

40、);Delaytx100ms(10); RI = 0;这个子函数的功能是向GSM模块发送“AT”这条联机命令,通信正常则返回“OK”。如果要发送其他AT指令,则只需要在程序的开始定义该条指令,例如要发送“AT+CREG?”,在头文件中需要定义INT8U code Command_Creg9 = “AT+CREG?r”;其中指令末尾的“r”是回车符。6.4 中文短信息的收发6.4.1 PDU模式及中文短信息的编码短信收发的编码格式一共有三种:Block模式, Text模式和PDU(protocol description unit)模式。其中Block Mode已经逐渐被淘汰,目前很少用了。Te

41、xt Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。PDU Mode被所有手机支持,可以使用任何字符集,这也是手机默认的编码方式。Text Mode比较简单,而且不适合做自定义数据传输,我们就不讨论了。下面介绍的内容,是在PDU Mode下发送和接收短消息的实现方法。PDU串表面上是一串ASCII码,由“0”-“9”、“A”-“F”这些数字和字母组成。它们是8位的十六进制数,或者BCD码十进制数。PDU串不仅包含可显示的消息本身,还包含很多其他信息,如SMS服务中心号码、目标号码、回复号码、编码方式和服务时间等。发送和接收

42、的PDU串,结构是不完全相同的。我们先用两个实际的例子说明PDU串的结构和编排方式。例1,发送一条PDU格式的中文短信息,SMSC号码是(短信中心号码)+8613800371500,目标号码+8615939026810,短信息内容是“你好!”,则从单片机发送到GSM模块的PDU串可以是“0891683108301705F011000D91685139096218F0000801064F60597DFF01”,如果使用默认的短信中心号码则PDU串可以是:“0011000D91685139096218F0000801064F60597DFF01”。对照PDU编码的规范,各段含义如表5所示。例2,接

43、收一条短信息,SMSC号码是(短信中心号码)+8613800371500,对方号码是+8615893810886,则从GSM模块读取的PDU串为:“0891683108301705F0240D91685198830188F6000880401001156423064F60597DFF01”,表6列出了对该PDU串的详细解释。表5 发送PDU串分析分段含义说明08SMSC短信中心地址长度共8个8 位字节包含9191SMSC地址格式用国际格式号码(在前面加“+”)683108301705F0SMSC短信中心号码8613800371500字节翻转后补“F”凑成偶数个11基本参数(TP-MTI/VFP

44、)发送TP-VP,用相对格式00消息基准值(TP-MR)00D目标号码长度共13个十进制数(不包含91,“F”)91目标地址格式用国际格式号码(在前面加“+”)685139096218F0目标号码8615939026810,补“F”凑成偶数个00协议标示(TP-PID)普通GSM类型,点对点方式08用户信息编码方式(TP-DSC)8bit编码01短消息有效期(TP-VP)(VP+1)*5分钟06用户信息度(TP-UDL)实际长度6个字节4F60597DFF01用户信息(TP-UD)“你好!”Unicode编码表6 接收PDU串详解分段含义说明08SMSC短信中心地址长度共8个8 位字节(包含9

45、1)91SMSC地址格式用国际格式号码(在前面加“+”)683108301705F0SMSC短信中心号码8613800371500字节翻转后补“F”凑成偶数个24基本参数接收、无更多信息、有回复地址0D对方号码长度共13个十进制数(不包含91,“F”)91地址格式用国际格式号码(在前面加“+”)685198830188F6对方号码15893810886,补“F”凑成偶数个00协议标示(TP-PID)普通GSM类型,点对点方式08用户信息编码方式(TP-DCS)Unicode编码80401001156423时间戳(TP-SCTS)08-04-01 10:51:46 时区2306用户信息长度实际长

46、度6个字节4F60597DFF01用户信息内容“你好!”从以上两个表格中内容我们可以看出:(1)若基本参数的最高位(TP-RP)为0,则没有回复地址的三个段。从Internet上发出的短消息常常是这种情形。(2)SMSC号码、手机号码和时间的表示方法,不是按正常顺序顺着来的,而是按照先存放地位字节后存放高位字节的规则形成的,而且要加“F”将奇数补成偶数。在PDU模式中,可以采用三种编码方式来对发送的内容进行编码,它们是UTF7、UTF8和UCS2编码。(1)UTF7编码用于发送普通的ASCII字符,它将一串7位的字符(ASCII码表示形式)编码成8位的二进制数据,每8个字符可“压缩”成7个,U

47、TF7处理 ASCII 字符的时候需要做“补位”处理。补位规则:将后一字节的从尾取位补在前一字节的头,补满8位。(2)UTF8编码通常用于发送数据消息,比如图片和铃声等。(3)如果发送中文字符,则采用UCS2编码方式,每个中文字符用16位二进制数据的Unicode字符编码方式表示,如果是中英文混合的短信,由于英文字符只占1字节,需要补0,成为16位的编码。例如,“你好!”的Unicode编码为4F60597D0021,其中“!”的ASCII码为21H,编码后为0021H。6.4.2 PDU模式中文短信息发送的程序设计在PDU模式中,UCS2编码用于发送UNICODE字符。PDU串的用户信息(T

48、P-UD)段最大容量是140字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是160、140和70。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。了解了PDU串的格式以及PDU模式下中文信息的编码方式,我们就可以使用汇编或C语言来实现中文短消息的发送和接收。以下是C语言编写的发送一条中文短消息的程序。/* 函数名称: AT_cmgs* 功能描述: 发送短消息命令函数* 输入: 无* 输出: 无* 全局变量: 无* 调用模块: Start_timer2,Uart_send,Close_timer2, deal_with_error*/Void AT_cmgs(INT8

49、U Cmgs_buffer,INT8U Cmgs_len)INT8U i, error_counter;error_counter = 0;Serial_Inter_Close(); while(1) TI = 0;RI = 0;for(i = 0; i 16; i+)reci = 0x00;Uart_send(Cmgs_buffer,Cmgs_len);Start_timer2(); for(i=0;i 16;i+) while(!RI); reci = SBUF; RI = 0; Close_timer2(); if(rec14= 0x3E& rec15= 0x20)break; else

50、 if(error_counter+5)Delaytx100ms(10); else deal_with_error(); Serial_Inter_Open();Delaytx100ms(5);/延时一段时间 RI=0;TI=0;/* 函数名称: Send_sms* 功能描述: 发送短消息函数 ,发送GSMhead,Phone_number,GSM_set,GSM_sms,0x1A结束符号;* 输入:* 输出: 无* 全局变量: 无* 调用模块: Serial_Inter_Close(), deal_with_error,Serial_Inter_Open();*/void Send_sms

51、(INT8U GSM_sms_buffer,INT8U Send_sms_len)INT8U i;Serial_Inter_Close();TI=0;RI=0;/send GSMhead(12 bytes)for(i=0;i12;i+) SBUF = GSMheadi; while(!TI);TI = 0; /send phone number(12 bytes)for(i=0;i12;i+) SBUF = User_numberi; while(!TI); TI = 0; /send GSM_set(6 bytes)for(i=0;i6;i+) SBUF = GSM_seti; while(

52、!TI);TI = 0; /send sms contents(Send_sms_len bytes)for(i=0;iSend_sms_len;i+) SBUF = GSM_sms_bufferi;while(!TI);TI = 0; /send end bytes:0x1ASBUF =0x1A;while(!TI); TI = 0;/发送信息结束Serial_Inter_Open();Delaytx100ms(10); RI=0;TI=0;6.4.3 PDU模式中文短信息的接收与解码由于中文字的编码是采用2个字节的编码,因此发送和接收中文或中英文混合的短信息只能采用PDU模式。使用AT指令“AT+CMGR”就可以从GSM 模块中读取一条PDU格式的中英文短信息字符串。但在GSM标准中,中文编码采用UTF-8的编码,不是目前国内常用的GB-

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!