这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 通讯及无线技术 » 基于GSM模块的远程监控(AT指令说明和部分源代码,原理图)

共115条 1/12 1 2 3 4 5 6 ›| 跳转至

基于GSM模块的远程监控(AT指令说明和部分源代码,原理图)

高工
2012-08-19 20:24:58     打赏

基于GSM模块的远程监控(AT指令说明和部分源代码,原理图)之原理图下载

工程文件下载——回复可见内容——

 

开源活动,只供学习与研究,禁止用于商业用途

 



 

设计实现以下目标:1、通过监控手机监测监控站周围的温度、湿度和光照强度;2、通过监控手机控制监控站的继电器,进而对相应的外部电器设备进行控制;3、通过监控手机对监控站进行监听。


基于GSM模块的远程监控
 

摘要:在日常生活中,我们常常需要对环境进行远距离的监控。比如:护理间环境的温度、湿度和光照强度的监控;保险柜的防盗;厨房燃气泄露情况及防火监控等。鉴于当前GSM网络覆盖面广、双向数据传输、性能稳定等性能特点,针对有线监控的缺陷,本文提出了基于GSM模块的远程监控设计方案。

关键词: MSP430F149单片机;GSM;传感器;远程监控

ABSTRACT:We need to carry on the remote monitoring to the environment frequently in the daily life. For instance: monitoring temperature of nursing environment, strength of illumination and humidity, security of safe cabinet's; monitoring revelation of kitchen fuel gas and fire alarm and so on. There are many shortages of wired monitoring, and the GSM network is used everywhere, that is stable and has ability to exchange data bidirectional. So this monitoring and control system is based on GSM module.

KEYWORDS:MSP430F149MCU; GSM; Sensor; Remote monitor

一、系统组成结构设计

在对系统特性、设计前景、设计要求的深入分析的基础上,远程监控系统的基本组成结构设计如图1所示,系统主要包括远程监控站、GSM[1]网络和用户监控手机。远程监控站由单片机、TC35[2]模块、传感器电路、LCD显示模块和外围控制电路组成;用户监控手机由一台支持GSM网络技术的手机构成。

 


图1系统组成结构框图

                                  
                                二、系统工作流程

为了更加有效地实现系统,在系统组成结构示意图的基础上,对系统各模块的功能进行规划,其工作需流程图如2所示。

 


图2 系统工作流程图

1)        数据采集:a) 通过测温电路获得环境的温度数据;b) 通过光照强度测量电路获得环境的光照强度数据;c) 通过湿度测量电路获得环境的湿度数据;

2)        数据处理:a) 处理传感器中采集来的数据并与TC35模块通过串口通信把数据信息以短信息的方式传送到用户监控手机;b) 对从用户监控手机发送过来的操作指令短信进行解析并根据指令控制继电器最终达到控制相关的外围电路设备的效果。

3)        无线通信:无线通信系统由GSM无线通讯单元组成,用来完成远程监控站与用户监控手机之间信息的相互传递,在系统信息的传输过程中起着桥梁的作用。

4)        动作实施:根据单片机解析出来的指令控制相关继电器来控制外围电路设备。外围设备电路由用户自己搭建。

5)        用户监控:用户监控主要借助一部支持GSM技术的手机,用来接收远程监控站的监测短信和向监控站发送相关的操作指令短息。

三、远程监控站硬件设计框图

硬件设计框图如图3所示,各模块之间的箭头代表了相互之间的连接关系和各数据传输的方向及通信协议。上电之后,监控站系统首先进行初始化,初始化成功后,监控站系统发送短信告知监控手机,系统可以正常通信。同时,监控站系统开始采集传感器数据,并加以处理,在LCD上把处理后的数据和TC35通信状况显示出来。当用户监控手机接收到系统可以正常通信后,用户就可以通过监控手机向监控站发送询问或控制指令,远程监控站的TC35通过GSM网络接收用户监控手机的数据信息并通过串口传递给MSP430F149[3]单片机,通过单片机解析出相应的指令,然后根据这些指令做出相应的控制动作,最后监控站把控制成功的信息以短信息的形式通过GSM网络告知给用户手机。

 


图 3 远程监控站硬件设计框图

3.1、主控芯片

MSP430F149 是一款MSP430系列的超低功耗微控制器。16位的RISC结构,内部自带硬件乘法器,高速度处理能力;双串口;片内带内部参考、采样保持和自动扫描特性的12位的A/D转换器;灵活的时钟设置,可以根据功耗要求和速度要求进行灵活的时钟设置。

3.2、GSM无线通信模块

 


图 4 GSM模块电路及外围电路图

本系统设计中采用TC35 GSM无线通信模块。TC35Siemens公司推出的新一代通信GSM模块,可以快速安全可靠地实现系统方案中的数据、语音传输、短消息服务(Short Message Service)和传真。模块的工作电压为3.35.5V,可以工作在900MHz1800MHz两个频段。TC35模块有5个工作模式,它们的电流消耗指标为:1、通话模式的峰值电流(TALK mode of peak),1.8A2、通话模式的典型电流(TALK mode),300mA900MHz频段)和270mA1800MHz频段);3、空闲模式(IDLE mode)的消耗电流,10mA4、休眠模式(SLEEP mode)的消耗电流,3mA5、关机模式(Power Down mode)的消耗电流,50µA。模块有AT命令集接口,支持文本和PDU模式的短消息以及波特率为2.4k4.8k9.6k的串口传输模式。其外围电路如图4所示。

3.3、环境传感器电路及继电器控制电路的设计

环境传感器电路中的温度测量电路采用MSP430F149单片机的内部温度传感器;光照强度测量电路采用光敏电阻作为核心元器件,光敏电阻与串联电阻分压,并通过A/D转换器读取电压并通过程序计算、校正发映出光照强度;湿度测量电路采用湿敏电阻作为核心元器件,湿敏电阻与串联电阻分压,并通过进行A/D转换器读取电压并通过程序计算、校正得到湿度。在继电器控制电路中由于本系统MSP430F149单片机的工作电压只有2.9V,它的I/O口的输出是无法直接驱动继电器的,所以采用了两级驱动。如图5所示。

 


图5传感器电路及继电气控制电路

3.4、LCD模块

ILI9325[4]是台湾奕力科技公司生产的一款a-TFT LCD面板驱动IC。240x320的分辨率,65K(最大值262K2.4寸的只有65K)色的显示屏;支持MVA(多域垂直对齐)的视图;172800字节的内部RAMSPI(同步串行)通信协议;兼容8/16位的数据接口,通过外部电路选择;低电压运行:Vio=1.65--3.3VI/O接口);Vcc=2.4--3.3V(内部逻辑);Vci=2.5--3.3V(模拟)。


四、程序总体流程设计

根据系统设计的功能要求,设计出以下程序流程如图6所示。系统初始化后,它将访问MSP430F149单片机的内部Flash,读出监控中心的号码,并询问TC35模块当前网络提供商、信号质量(RSSI)和当前时间,接下来采集和处理环境数据,并在LCD上显示出来,然后检测是否有来电或者新短信,再判断来电或新短信是否来自于监控中心,如果是则接听电话或解析短信做出相应的控制,否则,进行挂机或者删除短信息操作。在这里着重介绍一下短信的发送程序和短信接收解析程序。

 


图6程序总体流程图

短信的发送:本设计中短信息是以TEXT格式发送的(TC35初始化中设定,发送AT+CMGF=1[5],调用串口发送字符程序和串口接收字符串程序,单片机通过串口TC35模块发送数据和串口接口TC35回应数据进行短消息的发送。其程序流程图如图7所示。单片机从串口向TC35模块发送“AT+CMGS=13752417617”字符串。等待一段时间后,应用字符函数strstr(RecBuffer,SK) [6]在缓存数组RecBuffer中查找是否包含有字符'>',如果包含有则向TC35模块发送短信息的内容并在短信末尾加上结束符'',否则重新发送“AT+CMGS=13752417617”字符串,重复上述操作。短信发送成功后TC35模块会回应"OK"字符,如果没有回应则TC35初始化。

短信接收解析程序:从用户监控手机给远程监控站发过来的短信息分为两种:一种是监测指令短信,也就是询问当前环境状况;另一种是控制指令短信,也就是控制本系统中继电器的开闭动作。如图8所示。调用串口发送程序向TC35发送字符串:“AT+CMGR=index”(index为短信储存地址),然后监测短信是否是监控手机发送过来的。如果是的话就读取短信内容,然后判断是否是监控中心发过来的短信,接着与对照预存信息解析出是控制指令或者询问指令,控制指令则控制相应的继电器,并把操作结果反馈给监控手机;询问指令则把环境参数以短信的形式告知监控手机。否则,该短信时无效短信,删除!


图7 短信发送程序流程图               图8 短信接收解析程序流程图

五、综合调试

综合测试也是最终的调试,它是对设计功能实现、系统稳定性及可靠性的进行检测。确保系统基本功能的实现。监控手机发送询问指令“ask”给监控站后,监控站会把环境状况以短信的方式告知监控手机。监控手机可以通过返回的环境数据对监控站通过短信发出具体控制指令,监控站接收控制指令后紧系控制解析并控制相应的继电器的关闭,而且以短信告知监控手机控制操作成功。在PC机上应用串口监控该工程如图9所示。

从综合调试的监测界面可以看出,系统首先跟TC35进行联机测试,然后对短信格式和新信息提示方式进行设置,再访问实时时钟和网络提供商,接着用户监控手机给监控站发送询问短信,监控站把环境的温度、湿度和光强度发送给监控手机,最后用户监控手机发送“open1”控制指令短信给监控站,监控站解析短息并打开继电器1,并且把“Succeed in Set open1”短信发送给用户监控手机,告知此操作成功。

 

9综合调试监测界面

六、结束语

系统旨在建立一个基于GSM短消息方式在中央监控中心和远程监控站台之间进行远程通信的监控平台。本系统的主要设计对象是远程监控站,它包括传感器电路模块、数据信息处理控制模块和GSM模块。而用户监控手机可以借助一部支持GSM的手机完成其功能,所以在这里不对其进行设计。远程监控站由传感器电路模块、MSP430F149单片、GSM模块通信实现功能。监控站具有以下功能:采集、处理传感器数据;通过串口通信控制GSM模块发送和接收信息;解析用户监控手机发送过来的指令短信,并且根据指令控制相关电路的功能。

 

参考文献:

[1] 程运峰,李丽等.个人终端通信设备应用技术.北京:国防工业出版社.2005.

[2] 秦龙.MSP430单片机应用系统开发典型实例.北京:中国电力出版社.2005.

[3] Siemens. PDF. Cellular Engine TC35.2001.

[4] ILI TECHNOLOGY CORP. PDF. ILI9325 a-Si TFT LCD Single Chip Driver 240RGBx320 Resolution and 262K color.2007.

[5] Siemens. PDF. AT Commands for GSM-Engine TC35.2001.

[6] 谭浩强.C语言设计(第三版).北京:清华大学出版社.2005.

 




关键词: 基于     模块     远程监控     指令     说明     部分     源代码         

高工
2012-08-19 20:32:56     打赏
2楼
上面的论文是太监版,只是介绍了个大概。下面来着重说一下GSM模块TC35和常见的AT指令:
        TC35模块有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出,这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。
    电源端引脚介绍:

TC35模块的第15引脚是正电源输入脚VCC通常推荐值4.2V的锂电池;第610引脚是电源地;第1112POWER)引脚接外部电源(5.5V-8.5V),在关机或休闲的模式下可以通过正电源输入脚给锂电池进行充电;第13VDD)引脚为对外输出2.9V的电压,在本系统中该引脚为MSP430单片机提供电压。

控制类引脚介绍:

15IGT)是TC35的触发点火信号端, 本设计应用开机键SW3按键来拉低该端电平来开启模块,低电平有效。系统加电后为使TC35进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms;第31PD)引脚是TC35的关闭电源端, 需一个大于3.5秒的低脉冲才能生效,本系统设计中应用关机键SW2按键来达到此效果。

数据输入/输出引脚介绍:

1623为数据输入/输出端,本系统中只用到了第18脚(RXD0)和第19脚(TXD0),TC35模块的数据接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准,它的参数为:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600bps,支持标准的AT命令集,可以直接与单片机或者通过MAX232PC进行通信。

SIM卡接口引脚介绍:

2429SIM卡接口引脚,连接方式如图2-1中所示,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。

语音接口引脚介绍:

3538为语音接口引脚,第3536脚接扬声器放音。第3738可以直接连接话筒进行采集声音(37是话筒正端,39是话筒负端)。

此外,SYNC引脚可以用来输出一个同步信号(Synchronization Signal),也可以在应用使来控制一个LED灯的输出状态。如图2-2电路所示,SYNC端通过一个三极管控制LEDLED的工作模式完全类同于同步信号,显示的是TC35的工作状态:

1LED灯灭,表示TC35电源关闭,处于休眠或充电的模式下。

2LED灯亮600 ms、灭600ms ,表示未插入SIM卡、或者网络正在搜寻中、或者正在进行用户身份鉴定、或者网络注册正在进行中。

3LED灯亮75ms 、灭3s ,表示网络注册成功,并且没有来电。

4LED灯亮,表示声音呼叫或者数据呼叫建立完成时的状态。


高工
2012-08-19 20:39:46     打赏
3楼

常见的AT指令:

模块中AT指令的介绍及相关应用规则 GSM模块提供的命令接口符合GSM07.05和GSM07.07规范。GSM07.05对短消息作了详细的规定,提供了一种移动平台与数据终端设备之间的通用接口;GSM07.07中定义AT Command接口。在短消息模块收到网络发来的短消息时,能够通过串口发送指示,数据终端设备可以向GSM模块发送各种命令。GSM AT指令集,是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。常见 AT指令[9]见表2-1。 SMS是有Etsi所制定的一个规定。当使用7-bits编码的时候它可以发送最多160个字符,一般被用来作为数据信息,例如:Smart Messaging 中的图片、铃声和OTA WAP设置;8-bits编码最多140个字符;16-bits编码(最多70个字符)被用来显示Unicode(UCS2)文本信息,可以被大多数的手机显示。 GSM模块的短信模式有两种。第一种是:TEXT模式;第二种是:PDU模式。PDU模式采用Unicode编码发送英文、汉字。但PDU编码比较复杂,而TEXT模式虽然只能发送英文,但它无需编码。   表2-1常见AT指令表
FUNCTIONS AT COMMANDS DETAILS
连机 AT TC35连机后应答:OK
网络注册 AT+CREG? 当前网络注册情况
注册网络 AT+COPS? 查询当前网络提供者
当前时间 AT+CCLK? 查询当前时间
挂机命令 ATH 挂机
回应呼叫 ATA 当模块被呼叫时回应呼叫
拨号命令 ATD 拨打电话号码
信号质量 AT+CSQ 查询信号质量
新消息提示 AT+CNMI 选择当有信息是系统的提示方式
读短信 AT+CMGR 读取短消息
删除短信息 AT+CMGD 删除保存的短信息
短消息格式 AT+CMGF 选择短消息支持格式(TEXT or PDU)
默认设置 ATZ 恢复到默认设置
波特率设置 AT+IPR 改变波特率,系统默认的波特率为9600
  在本设计中采用的是TEXT模式。下面具体的介绍AT指令在TC35中的应用实例: 1、 联机测试 发送内容:AT<CR> TC35回应: OK 2、 查询信号质量: 发送内容:AT+CSQ<CR> TC35回应:+CSQ: 30,99 此处的数值30表示当前的信号RSSI,数值index与对应信号强度的换算公式如下:(dBm)。RSSI大于-90dBm就能正常通话。 3、 查询当前注册网络 发送内容:AT+COPS?<CR> 接收内容:+COPS: 0,0, "China Mobile"                OK 4、查询TC35的实时时钟 发送内容:AT+CCLK?<CR> TC35回应:+CCLK: "10/05/20,16:40:15"        OK AT+CCLK="10/05/25,12:30:21"可以设子TC35的实时时钟,使之实时时钟为10年5月25日,12点30分21秒。 5、 短信的读取 发送内容:AT+CMGR=10<CR> TC35回应:+CMGR: "REC UNREAD","13752417***",,"10/05/20,20:24:32+02" ask OK 短信息解析 ask——短信内容。 "REC UNREAD"——表示短信未读过。 "REC READ"——表示短信已读过。 "13752417***"——发送短信的手机号。 "10/05/20,20:24:32+02"——短信息发送的时间。 如果无短信,则TC35回应:+CMGR: 0,,0 例:发送内容:AT+CMGR=23<CR>         TC35回应:+CMGR: 0,,0 6、 选择当有信息是系统的提示方式 发送内容:AT+CNMI=2<CR> 接收内容:OK “AT+CNMI”指令语法为:AT+CNMI=<mode>,<mt>,<bm>,<ds>,<bfr>。 <mode>——通知方式 0:不通知TE。 1:只在数据线空闲的情况下,通知TE;否则不通知TE。 2:通知TE。在数据线被占用的情况下,先缓冲起来,等数据线空闲,再行通知。 3:通知TE。在数据线被占用的情况下,通知混合在数据中一起传输。 <mt>——消息储存或直接转发到TE 0:储存到默认的内存位置(包括class 3)。 1:储存到默认的内存位置,并且向TE发出通知(包括class 3)。 2:对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到 TE。 3:对于class 3,直接将消息转发到 TE;对于其它class,同mt=1。 <bm>、ds>、<bfr>在本设计中没用应用到,请参考相关标准文档。 在本设计中使用mode=2。对所有类型的短消息,只要在收到ME送来的“+CMTI”通知后,用“AT+CMGR”指令读取消息内容就行了。 7、 发送短信 在本设计中短信时采取TEXT模式发送的,所以在发送短信前还要设置短消息的格式。具体设置如下:(<CR>代表回车字符) 发送内容:AT+CMGF=1<CR> TC35回应:OK        接下来TEXT格式的短信的发送分成两步:        第一步:发送接收的手机号码,等待应答:“>”        发送内容:AT+CMGS="13752417***"<CR>        TC35回应:AT+CMGS="13752417***" >        第二步:输入短信的内容(只能是英文):ask ->(->为完结符)

                       TC35回应:+CMGS: 95

                                            OK

 

8、 短信的删除方法 发送内容:AT+CMGD=<index><CR> TC35回应:OK index是短信的储存位置。一般小于40。

专家
2012-08-19 20:53:44     打赏
4楼
有源码参考的话就美了

高工
2012-08-19 21:06:56     打赏
5楼
GSM的文本信息常用的有两种格式:TEXT,PDU;TEXT只能发英文格式的;PDU是在我们生活中常用的。(设计用的TEXT),TEXT的应用上面已经做了介绍,这里介绍PDU

PDU的结构根据短息是由终端发起或以终端为目的而不同。由终端发送时PDU的格式为: SMSC PDU Type MR DA PID DCS VP UDL UD 表1发送端PDU数据分析表
分段 含义 说明
08 SMSC地址信息的长度 8613800250500,补‘F’凑成偶数
11 基本参数Type 11表示发送
00 消息基准值 00表示短消息
0B 目标地址数字个数 共13个十进制数(不包括91和‘F’)
81 目标地址格式 用国际格式号码(在前面加‘+’)
3106504562F7 目标地址DA 8613851872468,补‘F’凑成偶数
00 协议标识PID 是普通GSM类型,点到点方式
08 用户信息编码方式DCS UCS2编码(00:7-bit编码)
10 有效期VP 短信的有效时间
04 用户信息长UDL 实际长度4个字节
6B228FCE 用户信息UD “欢迎”
例如(1)发送信息的PDU:向手机13600554267发送中文“欢迎”两字,格式如下:0891683108503705F011000B913106504562f7000810046B228FCE对以上的PDU数据分析如表1所示。   接收端的PDU格式为: SMSC PDU Type OA PID DCS SCTS UDL UD 例如(2)接受信息的PDU串:读取以上发送来的短信,接受到来自13600554267 “欢迎”PDU数据为如表2所示。 表 2接收端PDU数据分析表
含义 说明
08 SMSC地址信息的长度 共8个八位字节(包括91)
683108503705F0 SMSC地址 8613800573500,补‘F’凑成偶数
04 基本参数 04表示接收
0D 回复地址数字个数 共13个十进制数(不包括91和‘F’)
91 回复地址格式 用国际格式号码(在前面加‘+’)
683106504562F7 回复地址OA 8613600554267,补‘F’凑成偶数
00 协议标识PID 是普通GSM类型,点到点方式
08 用户信息编码方式 UCS2编码(即中文)
30507001021500 时间戳SCTS 2003-3-12 08:36:45 +8时区
04 用户信息长度UDL 实际长度4个字节
6B228FCE 用户信息UD “欢迎”
其中SMSC为短消息业务中心地址,MR为指明发出信息还是收到信息,DA
0891683108503705F0040D91683106504562F7000830507001021500046B228FCE /OA为源目的的地址,PID为协议识别,DCS为据编码,VP为数据有效时间,UDL为用户数据长度,SCTS指短消息到达业务中心的时间。PDU结构中的数据必须以16进制发送且必须为大写。用户数据UD即有效载荷有8bit方式和7bit方式两种,选用何种方式可由DCS中的设置决定。

高工
2012-08-19 21:17:20     打赏
6楼

现在讲程序了,其实也没什么可说的直接贴程序吧,里边用的最多的就是就是在这个strstr函数了,

#include <string.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
char const AT_Tc35[]="AT+";      //联机
char const ATZ_Tc35[]="ATZ";      //软件初始化
char const Text_Tc35[]="AT+CMGF=1"; //1为文本模式,0为PUD模式
char const Pud_Tc35[]="AT+CMGF=0";
char const Read_Tc35[]="AT+CMGR=1";  //读信息
char const Erase_Tc35[]="AT+CMGD=1"; //删除信息
char const Send_Tc35[]="AT+CMGS=";  //发送信息
char const CNMI_Tc35[]="AT+CNMI=2";
char const AT_CSQ[]="AT+CSQ"; //信号质量
char const AT_Cops[]="AT+COPS?";
char const AT_Clk[]="AT+CCLK?";
char const Rece_Cops[]="China Mobile";
char const Rece_Clk[]="+CCLK:";
char const Creg_Tc35[]="+CREG:";  //注册
char const AT_Code[]="OK";
char const ATA[]="ATA";   //回应呼叫
char const ATH[]="ATH";   //挂机
char const Rece_Call[]="+CLIP:";  //来电
char const Rece_CSQ[]="+CSQ:";
char const send1[]="Communication Success!";
const char Ask_No[]="+CMGR:0,,0"; //没有消息
const char ERROR[]="ERROR";
//const char Ask_Tc35[]="/";
const char SK[]=">";
const char Ask_GSM[]="ask";
const char New_Msg[]="+CMTI: \"SM\",";
const char OpenContr1[]="open1";
const char OpenContr2[]="open2";
const char OpenContr3[]="open3";
const char OpenContr4[]="open4";
const char CloseContr1[]="close1";
const char CloseContr2[]="close2";
const char CloseContr3[]="close3";
const char CloseContr4[]="close4";
const char Change[]="change";
unsigned int count,sec,Askflag,RecPoint,Readflg,ADCOverflag,indexcnt,IHTflag,ERRORflag;
unsigned char NewMsgCnt,T,H,I;
unsigned int A0results[8];
unsigned int A1results[8];
unsigned int A2results[8];;
char RecClkBuffer[15];
char RecBuffer[100];
char MsgCntBuffer[2];
//uchar cntBuffer[2];
char CSQcntBuffer[]="-000dBm";
char send2[]="T:00C;H:00%;I:00%;";
char Phone1[]="13752417617";
char SetSucced[21]="Succeed in Set ";
char csq,RecOverflag;

void Delay(unsigned int us)
{
   unsigned int i,j;
   for(i=0;i<us;i++)
      for(j=0;j<=65530;j++);
}

void ClearBuffer(void)
{
    int i;
    for(i=0;i<100;i++)
        RecBuffer[i]=0;
    RecPoint=0;
}
//--------------发射一个字符------------    
void SendASC(char ASC)
{
    while((IFG1&UTXIFG0)==0);
    U0TXBUF=ASC;   
}
//-------------发射命令到TC35-----------        
void SendToTc35(const char *p,unsigned int Long)
{
    while(Long--)
    {
        SendASC(*p++);
    }
}
//-------------GSM网络注册成功-------------
void Creg_GSM(void)
{
    char *p;
    ClearBuffer();
    while(1)
    {
        Delay(40);
        p=strstr(RecBuffer,Creg_Tc35);
        if(p!=NULL) break;
    }
}
//-----------发射AT联机命令并得到返回---------
void Send_AT(void)
{
    char *p;
    unsigned char i=200;
    ClearBuffer();
    while(i--)
    {
        SendToTc35(AT_Tc35,2);
        SendASC(0x0D);
        Delay(6);
        p=strstr(RecBuffer,AT_Code);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL) break;  //接收返回成功
    }   
}
//-----------------软件复位-----------------
void Send_ATZ(void)
{
    char *p;
    unsigned char i=200;
    ClearBuffer();
    SendToTc35(ATZ_Tc35,3);
    SendASC(0x0D);
    while(i--)
    {   
        Delay(4);
        p=strstr(RecBuffer,AT_Code);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL) break;  //接收返回成功
    }   
}
//--------------设置短信类型------------------
void SetSMS(char t)
{
    char *p;
    unsigned char i=200;
    ClearBuffer();
    if(t==0x01)  SendToTc35(Text_Tc35,9);
    else  SendToTc35(Pud_Tc35,9);
    SendASC(0x0D);
    while(i--)   //有应答
    {
        Delay(4);
        p=strstr(RecBuffer,AT_Code);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL) break;
    }
}
//------------设置短信接收模式-----------
void Set_CNMI(void)
{
    char *p;
    unsigned char i=200;
    ClearBuffer();
    SendToTc35(CNMI_Tc35,9);
    SendASC(0x0D);
    while(i--)   //有应答
    {
        Delay(4);
        p=strstr(RecBuffer,AT_Code);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL) break;
    }
}   
//---------------询问信号质量-----------
void Send_Csq()
{
    char *p;
    int j,i=200;
    ClearBuffer();
    SendToTc35(AT_CSQ,6);
    SendASC(0x0D);
    while(i--)
    {
        Delay(4);
        p=strstr(RecBuffer,Rece_CSQ);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL)
        {
            p=p+6;
            for(j=1;j<3;j++)
            CSQcntBuffer[j]=*p++;
            csq=113-((CSQcntBuffer[1]-48)*20+(CSQcntBuffer[2]-48)*2);
            CSQcntBuffer[1]=csq/100+48;
            CSQcntBuffer[2]=csq%100/10+48;
            CSQcntBuffer[3]=csq%10+48;           
            break;
        }
    }
}
//--------------询问注册网络名称-----------
int Send_Cops()
{
    char *p;
    int i=200;
    ClearBuffer();
    SendToTc35(AT_Cops,8);
    SendASC(0x0D);
    while(i--)
    {
        Delay(4);
        p=strstr(RecBuffer,Rece_Cops);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL) return 1;
    }
    return 0;
}
//------------------询问时间-------------------------
void Send_Clk()
{
    char *p;
    int j,i=200;
    ClearBuffer();
    SendToTc35(AT_Clk,8);
    SendASC(0x0D);
    while(i--)
    {
        Delay(4);
        p=strstr(RecBuffer,Rece_Clk);//找出OK在RecBuffer中的位置,返回该位置的指针,找不到则为空指针
        if(p!=NULL)
        {
            p=p+8;
            for(j=0;j<14;j++)
            RecClkBuffer[j]=*p++;         
            break;
        }
    }
}
//-----------------GSM初始化-------------------------
void Init_GSM(void)
{
    //  Creg_GSM();
      Send_AT();
      Send_ATZ();
      SetSMS(1);
      Set_CNMI();
      Send_Csq();
      Send_Clk();
}
//-----------删除信息-------------------
int EraseMsg()
{
    char *p;
    int i=200;
    ClearBuffer();
    SendToTc35(Erase_Tc35,8);
    SendToTc35(MsgCntBuffer,2);
//    SendASC(index);
    SendASC(0x0D);
    while(i--)
    {
        Delay(4);
        p=strstr(RecBuffer,AT_Code);
        if(p!=NULL) return 1;   //删除成功
     }
     return 0;    //删除失败
}

//---------------读取Text短信息-----------
int ReadTextMsg()//char index)
{
    char *p;
    int j;
    char Buf[40];
    ClearBuffer();
    SendToTc35(Read_Tc35,8);
    SendToTc35(MsgCntBuffer,2);
//  SendASC(index);
    SendASC(0x0d);  //"CR"
    Delay(32);
    Delay(32);
    p=strstr(RecBuffer,ERROR);
    if(p!=NULL)
    {
        Send_AT();
        return 0;
    }
    p=strstr(RecBuffer,Ask_No);
    if(p!=NULL) return 0;
    p=strstr(RecBuffer,Phone1);
    if(p==NULL) return 0;
//    p=strstr(RecBuffer,Ask_Tc35);
//    if(p==NULL) return 0;
    p=p+38;          //37个字节后是MSG
    for(j=0;j<40;j++)
        Buf[j]=*p++;
    if(EraseMsg()==0) return 0;//删除失败
    p=strcpy(RecBuffer,Buf);
    return 1;  //读取成功
}

//-------------发送文本格式短信息-----------
void SendTextMsg(const char *q)
{
     char *p;
     unsigned int i=200;
     ClearBuffer();
     SendToTc35(Send_Tc35,8);
     SendASC(0X22);   //"号
     SendToTc35(Phone1,strlen(Phone1));//可能是小灵通号码
     SendASC(0X22);   //"号
     SendASC(0X0D);  //"CR"回车
     while(i--)
     {
        Delay(8);    //等待">"
        p=strstr(RecBuffer,SK);//有应答
        if(p!=NULL)
        {
          ClearBuffer();
          SendToTc35(q,strlen(q));
          SendASC(0X1a);//结束符
          break;
         }
      }
      while(1)
      {
          Delay(8);
          p=strstr(RecBuffer,ERROR);//有应答
          if(p!=NULL)
          {
              ERRORflag=1;
              break;
           }
         p=strstr(RecBuffer,AT_Code);//有应答
         if(p!=NULL) break;
      }
}
//-----------------检测是否有来信或者来电---------------
char NewMsgOrCall(void)
{
    char *p;
    int i;
    p=strstr(RecBuffer,New_Msg);//是否是短信
    if(p==NULL)
    {
        p=strstr(RecBuffer,Rece_Call);
 if(p==NULL)   return 0x00;
        else
        {
            p=strstr(RecBuffer,Phone1);
            ClearBuffer();
            if(p==NULL)
            {
                SendToTc35(ATH,3);//挂机
                SendASC(0X0D);
                return 0x00;
            }
            else
            {
                SendToTc35(ATA,3);//接听
                SendASC(0X0D);
                return 0x00;
            }
    }
    }
    else   
    {                             //读取短信的存储位置
        p=p+12;
        for(i=0;i<2;i++)
          MsgCntBuffer[i]=*p++;
        ClearBuffer();
        return 0x01;
    }         
}
//----------------询问短信,控制短信-------------------
int AskOrControl(void)
{
 char *p;
 int i;
 p=strstr(RecBuffer,Ask_GSM);
 if(p!=NULL) return 1;
 p=strstr(RecBuffer,OpenContr1);
 if(p!=NULL) return 2;
 p=strstr(RecBuffer,OpenContr2);
 if(p!=NULL) return 3;
 p=strstr(RecBuffer,OpenContr3);
 if(p!=NULL) return 4;
 p=strstr(RecBuffer,OpenContr4);
 if(p!=NULL) return 5;
 p=strstr(RecBuffer,CloseContr1);
 if(p!=NULL) return 6;
 p=strstr(RecBuffer,CloseContr2);
 if(p!=NULL) return 7;
 p=strstr(RecBuffer,CloseContr3);
 if(p!=NULL) return 8;
 p=strstr(RecBuffer,CloseContr4);
 if(p!=NULL) return 9;
 p=strstr(RecBuffer,Change);
 if(p!=NULL)
 {
     p=p+6;
     for(i=0;i<11;i++)
       write_buff[i]=*p++;      
     return 10;
 }
 return 0;
}

void Init_ADC12(void)
{
        ADC12CTL0 &=~ ENC; //在进行设置时首先复位ADC的转换使能
        ADC12CTL0 = ADC12ON+SHT0_8+REF2_5V+MSC; //采用内部2.5V参考,打开通道10REFON自动打开
        ADC12CTL1 = SHP+ADC12SSEL_2+CONSEQ_3; //上升沿采样,主时钟,MEM0
        ADC12MCTL0 = INCH_0;
        ADC12MCTL1 = INCH_1;
        ADC12MCTL2 = INCH_10+EOS; //选择通道10,Vcc为参考电压,进行温度测量
        ADC12IE=0X04;
        ADC12CTL0 |= ENC;
        ADC12CTL0 |= ADC12SC;
}  

void ADCOver(void)
{
    unsigned int i,SUM0=0,SUM1=0,SUM2=0;
    for(i=0;i<8;i++)
    {
 
        SUM0+=A0results[i];
        SUM1+=A1results[i];
 SUM2+=A2results[i];
 
    }
    I=(unsigned char)((SUM0-200)*3/788);
    H=(unsigned char)((SUM1/8-1137)*6/167+3);
    T=(unsigned char)((SUM2-11280)*5/144);//((SUM2/8-1294)*8/33+15);
    send2[2]=T/10+48;
    send2[3]=T%10+48;
    send2[8]=H/10+48;
    send2[9]=H%10+48;
    send2[14]=I/10+48;
    send2[15]=I%10+48;
    ADC12IE=0X04;
    IHTflag=1;
}

void Control(void)
{
         int i;
         switch(AskOrControl())
        {
          case 0: break;
          case 1:{
                  while(IHTflag==1);
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,Ask_GSM,Blue,Cyan);
                  SendTextMsg(send2);
                  };break;
          case 2:{
                  P4OUT &=~BIT0;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,OpenContr1,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,OpenContr1));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 3:{
                  P4OUT &=~BIT1;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,OpenContr2,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,OpenContr2));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 4:{
                  P4OUT &=~BIT2;
                  zhixian(184,231,146,161,Cyan);
                  LCD_PutString(184,146,OpenContr3,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,OpenContr3));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 5:{
                  P4OUT &=~BIT3;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,OpenContr4,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,OpenContr4));
                  for(i=14;i<20;i++)
                      SetSucced[i]='\0';
                  };break;
          case 6:{
                  P4OUT |=BIT0;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,CloseContr1,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,CloseContr1));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 7:{
                  P4OUT |=BIT1;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,CloseContr2,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,CloseContr2));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 8:{
                  P4OUT |=BIT2;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,CloseContr3,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,CloseContr3));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 9:{
                  P4OUT |=BIT3;
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,CloseContr4,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,CloseContr4));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
          case 10:{
                  zhixian(184,231,146,161,White);
                  LCD_PutString(184,146,Change,Blue,Cyan);
                  SendTextMsg(strcat(SetSucced,Change));
                  Flash_erase( pc_flash_segment);
                  Write_array(pc_flash,write_buff,11);
                  Read_array(pc_flash,Phone1,11);
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
    LCD_PutString(117,124,Phone1,Blue,White);
    SendTextMsg(strcat(SetSucced,Change));
                  for(i=14;i<21;i++)
                      SetSucced[i]='\0';
                  };break;
         }      
}


高工
2012-08-19 21:20:27     打赏
7楼

差不多了,,版主你看看


专家
2012-08-19 21:24:23     打赏
8楼
开源版的资源,加精~

高工
2012-08-19 21:26:38     打赏
9楼
等回我把原理图和工程文件什么的上传一下

专家
2012-08-19 21:29:10     打赏
10楼
对,工程文件分享下,如果可以的话

共115条 1/12 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]