摘要
现在在我们的生产生活中已经离不开一个电字,我们的生产生活都在用电。我们不是直接用电,而是利用用电
设备将电能转化为其他能源形式供我们使用。我们叫这些设备为用电器。既然有了用电器,我们就要让这些用电器
按我们的使用方式来控制它。所以现在很多用电器都能实现自动控制。基于单片机的GSM模块控制插座也是从控制方
式着手,利用日常生活中常用的手机中的发短信的功能来实现对用电器控制的目的,这种控制方式能解决一些日常
生活中的不方便的问题。因为短信的传播距离很远,所以利用这个方式我们就可以实现用电器的远程控制或者近程
控制。用电器的打开和关闭就可以用一条简单的短信来控制。这会使我们的生活更加方便。
关键词:用电器 远程控制 短信
前言
当今世界是一个电的世界,可以说从电磁感应现象的发现的那一刻起就注定了以后会是一个电的时代,爱迪生
发明的电灯可以说是人类跨进电气时代最重要的一步,紧接着交流电运用以及交流电机的发明使得社会工业迅速发展,出现了电力占主导地位的社会新时代。可以说当今世界就是一个用电支撑起的世界。
电力占据了世界能源的大半江山,电力的供电方式也随着社会的进步和发展也变得多种多样,最原始的是直接
供电,后面为了生产生活方便加入手动开关,就能实现人类根据自己的需求来手动控制电力的使用。随着后来半导
体的发展,人们能够使用先进芯片的根据环境的变化或者其他一些条件实现智能供电。这大大方便了人类的生产生
活需要,使得社会生产的效率大大增加了。
将智能供电的技术植入到一些用电器中使得用电器变得能根据特定的要求实现自我控制,这就是智能设备。比
如:饮水机、电热器、电视,空调等。这些都可以根据用户的需求来自动控制自己。如:空调中控制压缩机的工作
来将温度稳定在一定值。这些都是智能设备。
时代在进步社会在发展。我们发现以前的智能设备,虽然能自己控制自己的运作情况,但对于我们人来说还不
够,因为不能远程控制它的运作,但有时我们又特别需要这个功能,如:饮水机不再反复的烧水;空调在我们回家
之前就打开;电热器忘关闭了不用担心发生火灾,我们就需要能远程控制这些设备。以此能够在回家前才打开饮水
机、打开空调,出门后想起电热器忘关了再也不用麻烦回家一趟。
我们知道,插座的发明很好的解决了从架设的电线到普通家庭的用电器的连接问题,现在绝大部分的用电器的供电
都与插座相连,插座就是连接电力和用电器的桥梁,所以说控制了插座和电力的通断情况就间接的控制了用电器的
打开和关闭情况。
实现远程控制的方式多种多样可以说只要信息能够远程传播就能利用它实现远程控制,比如:因特网、WIFI、
蓝牙、手机短信等。本次设计基于单片机的GSM模块控制插座采用的方式就是短信。
1 研究方向的确定
1.1 日常生活中的问题
在我们生活中离不开各种各样的用电器,用这些用电器能实现不同的功能。带给我们不一样的生活体验。比
如:电灯、电视机、饮水机、取暖器、热水器、电热毯等。这些用电器的诞生使我们的生活变得更加方便,使我们
生活变得更加舒心。但是有时这些用电器也会造成一些烦恼,比如:取暖器忘记关了,结果造成火灾。饮水机里的
热水经过反复的烧开冷却对健康不好。出门后记起电热毯忘关了,又会千里迢迢回家一趟将其关闭来让自己放心。
这些问题在生活中很是常见。造成了我们生活的很多不便。所以我们需要合适的解决方法。
1.2 想到的解决方案
面对前面提出的问题我们不难看出,我们需要一种更加贴近生活的对用电器的控制方式来解决这些问题。这种
方式就是远程控制。这样我们就能远程关闭这些用电器再也不用麻烦千里迢迢回家就为了关闭忘记关的用电器。等
自己将要回家才将饮水机打开,避免了饮水机反复烧水的现象。有了远程控制用电器的方式必定会使生活更加方
便。
1.3 国内外情况分析
当前国内外能实现的解决方法有很多,目前常见的方式有利用WIFI或者蓝牙来实现插座的控制。在国外由于技
术成熟,相对于国内人们的生活水平较高,所以使用的人数还是较多。有了市场还出现了一批新产品利用因特网加
上WIFI技术实现远程对用电器的控制。市场上把这个技术叫做物联网技术。相应的公司正在迅速发展壮大,相信在
未来这是人们生活中不可缺少的一种技术。就像现在的手机一样。对此也有很多的公司为了发展物联网技术,将这
些技术中常用的技术做成了模块,以此来实现简单化模块化,方便技术更快的提升。
2 实现方案
2.1 被控对象选择
实现远程控制的方案有很多,可以直接在用电器上加入控制设备,达到远程控制的目的。也可以利用一些中间
控制器来间接控制。还可以利用一些辅助设备来间接控制。在选择被控对象时,可以直接控制用电器,这需要直接
在用电器上加入一些功能器件,这种方式比较有针对性,不同的产品只能用特定的器件。明显对于目前的社会发展
情况来看不太现实。所以我们可以选择间接的方式,即控制另外一个器件达到控制用电器的目的。我们知道目前绝
大部分的用电器都是利用插座这个中间体来连接交流电源的。我们可不可以通过控制插座的通电情况来间接控制用
电器呢?答案是肯定的。控制插座方式简单、面对的用电器对象很广,可以达到普遍化的要求。所以我们选用控制
插座来间接控制用电器的方式。
我们知道在家里对于220V交流电的布线十分重要,这涉及到我们使用用电器是否方便,一般来讲,我们使用的
220V交流电是通过高压电线路变压而来,到达社区总线再分到各个用户。线路进了家中,经过必要的保护电路(熔断器、闸刀、漏电保护器)才正式进入家庭中的布线的环节,布线会留出接口以供用户使用用电器,这个接口就是
插座。其进线原理如图2.1所示:
图2.1 普通布线原理图
在图2.1中我们不难看出,只要在插座与220V交流电源线的两根线之间加入一个控制器件,就能使插座与交流电
源线的连接变成可以由器件来控制。这个器件我们选用5V的继电器。主要有三个优点:
- 继电器的接通和断开正好对应线路的接通和断开。
- 继电器的低压(5V)正好是单片机的工作和输出电压。
- 继电器是通过低压(5V)来控制高压(220V),起到了低压线和相对高压线路的隔离作用。加入继电器后我们的
进线和布线就发生了相应的改变,如图2.2所示:
图2.2 加入继电器布线
当然为了使我们改变线路有一定的安全性,我选择控制交流电源线中的火线与插座的接线。并且在继电器和
220V交流电接线处中间线路中加入一个熔断器来防止电流过大,来达到保护线路和各种低压元器件的安全的目的。
加入熔断器后的布线图如图2.3所示:
图2.3 加入保护装置布线
2.2 信息传播载体选择
要实现远程控制,就要要求信息能够传播,并且能够被接收和处理。在前言中提到信息远程传播的方式在当今
世界主要有因特网、WIFI、蓝牙、手机短信等。选择合适的方式,才会更好的实现最初设想。其中WIFI和蓝牙的传
输距离比较短,只有几十米。因特网开发难度相对我们新人来说较大,相比之下我们选用短信作为信息传播的载体
比较合理。主要有以下优点:
- 短信使用简单,现在只要有手机就可以发送。
- 短信是基于通讯网络分布较广,可利用性大。
- 目前有对应的通讯模块,不需要自主研发设备。减少了开发的时间。
要想接收和处理短信我们需要专业的通讯芯片,本次设计我选用的是SIMcom公司研发和生产的SIM900A这个GSM
通讯模块,它能够接收短信和发送短信,也可以打电话,也可以连接GPRS网络,本次设计中主要用到了SIM900A模块
的收发短信的功能。
2.3 信息处理器选择
信息的处理器件不仅需要能处理数据还要能够根据相应的数据作出对应的输出。现在处理数据的芯片有很多,
有ARM系列的嵌入式处理器,有DSP数据处理器,还有工业上常用的PLC处理器等,这些都能处理数据并根据数据作出
对应的输出。但我选用的是51单片机这个系列中的常用的STC89C52这个的处理器。其优点在于: - 我们做的小系统的开发,其工作结构和原理比较简单51单片机足够胜任。
- 相对于其他处理器来说51单片机的价钱相对较低,经济实惠。
2.4 器件供电方式选择
为了使系统的安全性更高避免发生意外,通讯模块的供电以及单片机的供电还有继电器的电源都采用电池供电
的方式,如果采用220V交流电通过变压和整流得到的电源来供电,可能发生意外烧毁单片机和模块。并且单片机和
继电器以及GSM模块的用电量很小,所以我用了一块手机上常用的锂电池。锂电池结构简单、供电量足、供电电压稳
定,完全满足模块和单片机的供电需求。供电图以及单片机的供电图如图2.4所示:
图2.4 设计供电原理
2.5 单片机程序编写
程序流程图如图2.5所示:
图2.5 程序流程图
2.6 方案的基本原理介绍
2.6.1 原理简介
本次设计的基于单片机的GSM模块控制插座项目选用的方式是利用连接用电器和交流电源的中间体——插座作为
被控制对象来间接控制用电器。插座与交流电源接通则插在插座上的的用电器打开。与交流电源断开则插在插座上
的用电器关闭。并且通过普通的手机短信作为信息的传播的中间载体,利用单片机对收到的短信内容进行识别,从
而使单片机做出对应的输出来控制继电器的通断,进而控制插座的通电情况。从而达到控制用电器的打开或者关闭
的目的。
2.6.2 原理流程图
本次系统的工作原理大概流程图如图2.6所示:
图2.6 工作原理
2.7 方案的可行性分析
本次设计采用的都是常见的常用的一些模块,如:51系列的单片机,5V的继电器等。虽然GSM模块中的SIM900A
模块的功能很是强大,但是本次系统主要运用到的是这个模块的收发短信的功能,所以相对难度比较低,所需要掌
握的命令还是比较少。综上所述按照目前的知识积累和平常在实际中的经验开发出自己所想的功能是没有问题的。
但是要在这些基础上加入更加复杂的功能就需要更多知识了。首先51单片机的处理速度不够快,要是加入更多的功
能不得不考虑新的处理器。其次模块的功能很多,要运用这些就要学习更多的指令,所需要的开发时间更多。
2.8 方案的预计成果
通过手机发送短信的方式实现普通插座的通电情况可远程控制或近程控制,从而实现连接在插座上的用电器的
远、近程打开或关闭操作。使得我们能够远程或者近程控制用电设备,让我们的生活更加方便和人性化。通过对单
片机写入程序,实现了当手机发送“打开”或者“关闭”到对应的电话号码即可实现插座中电流的导通或者断开。
从而实现对插座的远程或者近程控制,进而对连接在插座上的用电器进行远程或者近程控制。
3 硬件介绍
3.1 51 单片机
3.1.1 单片机简介
单片机具有一台计算机的所有功能,但是处理能力没有PC机那么强大。单片机芯片因为体积小、成本低、功能
较为全面,所以应用十分广泛,目前很多工业控制单元、机器人、智能设备等需要控制的设备中很多都会运用。
本次设计采用的是51系列单片机中的STC89C52单片机,它是STC公司生产的一个采用低电压(3.3V-5V),拥有
较高性能的8位单片机处理器。它的电源电压是5V,晶振频率可用范围是0~24MHZ,片内含有8k 字节的可反复擦写的
Flash只读程序存储器和256 字节的随机存取数据存储器。STC89C52采用的是标准的MCS-51指令系统,内置通用的8
位中央处理器和Flash存储单元。它的外形及封装如图3.1所示:
图3.1 单片机外型
3.1.2 51单片机的发展历程
单片机是1971年实现首次应用,最早的单片机是4位的,每次能处理4位的数据,后来经过发展工艺不断提升,
出现了8位单片机。当时应用最广泛的是Intel公司开发出来的8051单片机,并且在8051单片机的基础上发展出了
MCS51系列的MCU单片机系统,由于性能好功能全面处理速度快这一系列的单片机被广泛应用。很多芯片公司都基于
这个MCU系统开发出了自己的产品。这些都被称为51系列单片机,目前的应用依然很广泛。
随着工业控制要求的不断提高,传统的单片机已经不能满足工业控制的要求。所以新的单片机出来了,拥有的
是16位或者32位的数据处理能力。数据处理速度明显提升。90年代随着电子消费产品的迅速发展,对单片机的要求
也不断提高,32位的单片机得到了广泛运用。现在的手机普遍采用的是ARM系列的单片机。处理速度快功能强大。
相对于ARM系列的32位单片机,传统的8位单片机处理数据的速度并不快,但是由于工艺的提升,其性能相对于
以前有很大的改善。现在的应用主要是用于一些功能简单对处理数据的能力要求不高的地方。所以51系列的单片机
目前的应用依然广泛。
在当代很多开发项目要求功能很多,所以要求单片机处理速度快、功能很强大。目前很多单片机都采用嵌入式
系统使用,不需要采用编写大量程序来实现这些功能。主要的系统有专用的Windows和Linux操作系统。
3.1.3 51单片机的主要引脚说明
STC89C52单片机含有40个引脚,有32个双向I/O端口可以输入输出。本设计主要运用了串行通讯口。引脚图如图
3.2所示:
图3.2 单片机引脚图
其中,P1、P2、P3口可直接作为输入输出端口,P0口作为普通输入输出需要加入上拉电阻才可使用,P3口还是
具有特殊功能的接口。图中已经标出特殊功能。本次设计主要用到了P3.0串口写入引脚以及P3.1串口读取引脚,用
于单片机对模块的信息处理以及交换。
3.1.4 51单片机主要功能介绍
- 定时器/计数器
STC89C52单片机中有2个定时计数器,作为定时器用时只需用软件将对应的功能打开即可。作为计数器时需要连
接P3.4或P3.5来作为计数的输入。 - 中断
STC89C52这个单片机含有5个中断源,其中2个外部中断,2个定时器中断,还有1个串行口中断。利用外部中断
时有P3.2和P3.3两个接口。 - 串口通讯
STC89C52单片机引脚中的P3.0(RXD)为接收数据端口,P3.1(TXD)为发送数据端口。串口的工作方式有四
种,可以通过软件来设置SCON寄存器中的SM0和SM1两个位来选择不同的工作方式。选择合理的工作方式能更好的利
用资源。本次设计用到了方式一,所以需要将SCON寄存器赋值为0x50。对应的工作方式选择和达到的功能说明如下
表3.1:
表3.1 设置工作方式
SM0 SM1 方式 功能说明 波特率
0 0 0 移位寄存器 Fosc/12
0 1 1 10位异步收发(数据8位) 可自行设定
1 0 2 11位异步收发(数据9位) Fosc/32或Fosc/64
1 1 3 11位异步收发(数据9位) 可自行设定
使用的串口c程序编写: - 设置定时器工作方式为方式2(自动重装初值)用于循环产生脉冲。
- 根据表3.1中的公式计算出9600kbs的波特率,为定时器装入初值。TH1=0xfd。TL1=0xfd。
- 打开定时器1。
- 打开串口中断,ES=1。
- 打开总中断。
串口中断产生标志:
TI:串行口发送完成一组数据后的中断标志,产生中断时TI=1。所以当发送完成一组数据后还要继续发送就需要在
软件中将TI位置0,及写TI=0。
RI:串行口接收完成一组数据后产生的中断标志。同TI一样,接收完成后还要继续接收,则需要将RI置0。
注意:串口不论是接收完成还是发送完成都会产生中断,进入串口中断服务程序。
3.1.5 单片机最小系统搭建
单片机功能齐全,要实现的项目如果比较简单那么就可以直接搭建一个单片机的最小系统,加上一些模块就可
以实现。
搭建单片机的最小系统只需要一些简单的电子元件包括两颗22pf电容、一颗12MHZ的晶振、10K的电阻以及一个
按键。按键的作用是连接单片机的复位引脚,将引脚电平拉高就可以实现单片机的复位。将单片机的EA引脚电位拉
高表明单片机采用外部时钟,及所用的12MHZ的晶振频率。具体的线路连接图如图3.3所示:
图3.3 最小系统电路
3.2 GSM模块
3.2.1 模块简介
GSM模块具有打电话,接收短信,发送短信等功能。在早期的手机生产中手机厂商将模块加入显示屏,电池和键
盘就构成了一部简单的手机。GSM模块在现代的工业和民用产品以及一些智能电器中也应用广泛,本次设计用到了
GSM模块中的SIM900A型,它是SIMCOM公司生产的,采用3.8V~5V供电。
3.2.2 模块的主要结构
模块的接口主要有:天线接口、电源接口、串口、LCD接口、SIM卡接口等。其内部主要有存储器、射频器、基带
等。如图3.5所示:
图3.5 GSM模块结构
本次设计只用到了部分接口,所以直接选用市面上已经集成好的模块,其对应的引脚已经选出。天线和电源接
口已经连接好,SIM卡卡套已经连接完成,我们只需插入SIM卡加上电源即可使用。如图3.6所示:
图3.6 集成好的GSM模块
3.2.3 运用到的AT指令及说明
SIM900A模块的操作不是直接编辑程序,也不是利用对应的操作程序来使用,而是使用AT指令来操作它,通过将
串口接口发送相应的AT指令即可对模块进行操作。由于SIM900A模块功能强大,所以AT指令较多。这里只对本次设计
所用到的AT指令进行说明。
- AT:用于GSM模块同单片机的波特率是否同步的检测,若是都为同一个波特率则模块会返回“OK”。
- ATI:握手指令,用于检测模块是否能正常工作。能正常工作会返回模块的型号数据。
- AT+CMGD=1:用于删除存储在位置“1”空间的短信内容。
- AT+CMGF=1:选择择发送短信数据包类型(text)。
- AT+CMGR=1:用来读取短信的内容,其中“1”表示“1”位置,所以这条指令的功能是,读取存储在位置1的短信
内容。注意的是:读取出来的短信内容不是中文,需要进行编码转换才能变成我们能读懂的中文。 - AT+CMGDA=6 :删除所有存储在SIM卡中的短信。其中最后的6不可变动,不然指令的功能会改变。
3.2.4 使用模块的主要电路 - 供电电路
下图3.7中是直流输入电压为+5V的供电电路。模块在启动时的瞬间电流会达到2A,所以在设计电路时应该考虑
这个问题,所以应该在电路中加入稳压管来保证电压电流的正常,让模块能够正常工作。可以直接用3.6V的锂离子单电池给模块供电,也可以使用镍镉或者镍锰电池直接给模块供电,但注意其最大电压不能超过模块的最大电压,
否则会损坏模块。
图3.7 GSM模块供电电路
2. 开机电路
使用PWRKEY引脚开启模块(开机)。通过拉低PWRKEY信号至少1秒然后释放来开机。此引脚已在模块内部上拉到
3V。设计的电路如下图3.8,将图中的按键改为导线,就可以实现开机自启动。
3. 关机
用户可以使用AT命令“AT+CPOWD=1”关闭模块。关机过程中,模块首先从网络上注销,让内部软件进入安全状
态并且保存相关数据,最后关闭内部电源。
在最后断电前模块的串口将发送以下字符:NORMAL POWER DOWN。
这之后模块将不会执行AT命令。模块进入关机模式,仅RTC处于激活状态。关机模式可以通过STATUS引脚来检
测,在关机模式下此引脚输出为低电平。
4. SIM卡接口电路
模块的SIM卡接口支持GSM Phase 1规范,支持1.8V和3.0V SIM卡。SIM卡的接口电源由模块内部的电压稳压器提供,
正常电压值为2.8V或者1.8V。
SIM卡接口引脚定义如下表3.2:
表3.2 SIM卡接口引脚
引脚名称 引脚序号 功能
SIM_VDD 30 SIM供电,为3.0V±10%或者为1.8V±10% ,电流10mA。
SIM_DATA 31 SIM 卡数据 I/O
SIM_CLK 32 SIM 卡时钟
SIM_RST 33 SIM 卡复位
SIM_PRESENCE 34 SIM 卡插拔检测
图3.9是SIM卡接口电路。为了保护SIM卡,可以使用STESDA6V1W5或者ONSEMIMF05C来做静电保护。图中,串在I
/O口线中的22电阻用于匹配模块和SIM卡之间的阻抗。
SIM_PRESENCE脚主要用于SIM卡的插拔检测。可以使用AT命令“AT+CSDT”来打开或者关闭SIM卡插拔的检测功能
模块串口介绍
- 串口接口
SIM900A提供两个非对称的异步串行接口,一个用于通讯,另一个用于软件调试升级。模块是DCE 设备,根据传
统的DCE-DTE 连接方式,模块和用户机(DTE)之间的连接是通过信号线的连接来完成的。 - 串口对应引脚说明:
表3.3 引脚说明
名称 引脚 功能
DTR 3 数据终端准备
RI 4 振铃检测
DCD 5 数据载波检测
DSR 6 数据设备准备
CTS 7 发送清除
续表3.3
RTS 8 发送请求
TXD 9 数据发送
RXD 10 数据接收 - 模块串口波特率
串口支持的通讯波特率如下:
1200,2400,4800,9600,19200,38400,57600,115200bps。
自动波特率模式支持的通讯速率如下:
1200,2400,4800,9600,19200,38400 和 57600 bps,默认为自动波特率模式。在自动波特率模式下模块可以自
动的检测并适应主机应用的波特率。模块默认设置为自动波特率检测。
为了能够正常的使用自动波特率功能,应该注意:DTE和 DCE的同步,当模块开机后延迟2至3秒后再发送同步字
符,用户必须发送大写字母“AT”来和模块同步波特率,当主机收到模块返回的“OK”后,则DTE和DCE同步成功。 - 串口电平处理
串口不支持RS232电平,只支持CMOS电平。当主机比如单片机串口电平为5V时,在和模块串口连接时需要进行电
平转换。可以使用 FAIRCHILD公司生产的电平转换芯片NC7WZ07
3.3 继电器
3.3.1 继电器原理
继电器是一种当控制电路电压达到指定值能够使被控制的电路实现导通或者断开的电子元件。常常用于各种控
制电路中。其主要原理是利用线圈产生磁场吸合衔铁来实现电路的导通或者断开。本次设计利用的是带光耦的继电
器,能够保护电路。
3.3.3 继电器使用方法
继电器一般来说一路继电器有五个接线端子,VCC(控制回路电源)、GND(接地)、NO(常开触点)、NC(常闭
触电)、COM(常开、常闭接线公共端)。使用中只需要将VCC连接电源,GND接地连接COM公共端,再选择常开或者
常闭连接即可。
本次设计用到了单片机,但是单片机的的I/O口驱动电流较弱,所以在使用继电器时需要加入三极管来增加驱动
电路使得继电器能够正常工作。图3.13中是一个简单的电路来测试继电器的工作。将P1.0引脚电平拉高就可以点亮
LED灯。
图3.13 继电器仿真连线图
附录1 GSM模块测试程序
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
//**************************************************
//延时程序 (约一毫秒)
//******************************************************
Void delay(uint ms)
{
uchar i;
ms=ms*50;
while(ms--)
for(i=0;i<=120;i++)
;
}
// *************************************************
//初始程序设置单片机工作
//**************************************************
Void chushi()
{
TMOD=0x20; //设置定时器1
TH1=0xfd;
23
TL1=0xfd;
TR1=1; //开启定时器1
REN=1; //串口接收数据设置 1为允许接收
SM0=0;
SM1=1;
ES=1; //开启串口中断
EA=1; //开启总中断
}
//**************************************************
//发送到串口(用于发送AT指令)
//**************************************************
Void fasong(uchar *p) //数组名首地址为p指针
{
while(*p!='\0')
{
SBUF=*p;
while(TI!=1)
;
TI=0;
delay(1);
p++; //地址加一
}
}
//**************************************************
//主程序
//**************************************************
Void main()
{
uchar ch; //ch为功能选择开关
delay(600); //模块启动时间
chushi();
qingchu();
fasong("AT\r\n");
delay(1);
if(jiance("OK")) //等待同步成功
{
fasong("AT\r\n");
delay(1);
}
fasong("ATI\r\n"); //发送握手指令
delay(1);
qingchu();
fasong("AT+CPMS?\r\n"); //检测短信功能并删除以前所有短信
delay(1);
fasong("AT+CMGF=0\r\n"); //选择pdu模式
delay(1);
fasong("AT+CMGDA=6\r\n");
24
delay(3);
LED1=1;
fasong("AT+CMGF=1\r\n");
delay(5);
qingchu();LED1=0;
while(1)
{
if(jiance("CMTI")) //新短信提示
{
qingchu();
fasong("AT+CMGR=1\r\n");
delay(40);
if(jiance("67E58BE2"))//查询
{
ch=0;
tiqu();
}
if(jiance("62535F00"))//打开
ch=1;
if(jiance("517395ED"))//关闭
ch=2;
fasong("AT+CMGD=1\r\n");
delay(40);
qingchu();
}
else
;
//**************************************************
//串口中断(用于接收短信和数据)
//**************************************************
Void jieshou() interrupt 4
{
uchar temp;
temp=SBUF;
shuju[j++]=temp;
if(j>=100)
j=0;
else
;
RI=0;//接收中断信号清零,表示将继续接收
}
附录2 继电器测试程序
#include <reg52.h>
#define uint unsigned int
sbit key=P2^0;
sbit relay=P1^0;
Void delay(uint a)
25
{
while(a--);
}
Void main()
{
while(1)
{
if(key==0)
{
delay(20);
if(key==0)
relay=0;
}
else
relay=1;
}
}
附录3 总程序
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0; //定义LED1端口
sbit jidianqi=P1^1; //继电器端口
uchar shuju[150]; //存储数组
uint j=0;
uchar shanchu[]={"AT+CMGD=1\r\n"};//删除短信
uchar xuanzhe[]={"AT+CMGF=1\r\n"};//选择短信数据包类型(text)
uchar duqu[]={"AT+CMGR=1\r\n"};//读取短信指令
//**************************************************
//延时程序 约一毫秒
//***************************************************
Void delay(uint ms)
{
uchar i;
ms=ms*50;
while(ms--)
for(i=0;i<=120;i++)
;
}
// **********************************************
//初始程序设置单片机工作
// *************************************************
Void chushi()
{
TMOD=0x20; //设置定时器1
TH1=0xfd;
26
TL1=0xfd;
TR1=1; //开启定时器1
REN=1; //串口接收数据设置 1为允许接收
SM0=0;
SM1=1;
ES=1; //开启串口中断
EA=1; //开启总中断
}
//************************************************
//发送到串口(用于发送AT指令)
// ************************************************
Void fasong(uchar *p) //传送数组名相当于数组名首地址为p指针
{
while(*p!='\0')
{
SBUF=*p;
while(TI!=1)
;
TI=0;
delay(1);
p++; //地址加1
}
}
//**************************************************
//清除数据存储数组shuju
//***********************************************
Void qingchu()
{
uint i=0,j=0;
for(i=0;i<100;i++)
{
shuju[i]='0';
i++;
}
LED2=0;
}
//**************************************************
//检测返回数据是否有期望的数据用strstr函数搜索字符串第一次出现,有返回出现地址没有返回null 有返回1没
有返回0
//**************************************************
uchar jiance(uchar *h)
{
if(strstr(shuju,h)!=NULL)
return 1;
else
return 0;
}
27
//**************************************************
//主程序
//**************************************************
Void main()
{
uchar ch; //ch为功能选择开关
delay(600); //模块启动时间
chushi();
qingchu();
fasong("AT\r\n");
delay(1);
if(jiance("OK")) //等待同步成功
{
fasong("AT\r\n");
delay(1);
}
fasong("ATI\r\n"); //发送握手指令
delay(1);
qingchu();
fasong("AT+CPMS?\r\n");
delay(1);
fasong("AT+CMGF=0\r\n"); //选择pdu模式
delay(1);
fasong("AT+CMGDA=6\r\n");//删除全部短信
delay(3);
LED1=1;
fasong("AT+CMGF=1\r\n");
delay(5);
qingchu();LED1=0;
while(1)
{
if(jiance("CMTI")) //新短信提示
{
qingchu();
fasong("AT+CMGR=1\r\n");
delay(40);
if(jiance("67E58BE2"))//查询
{
ch=0;
tiqu();
}
if(jiance("62535F00"))//打开
ch=1;
if(jiance("517395ED"))//关闭
ch=2;
fasong("AT+CMGD=1\r\n");
delay(40);
28
qingchu();
}
else
;
switch(ch)
{
case 1:{
jidianqi=0;
break;
}
case 2: {
jidianqi=1;
break;
}
default : break;
}
}
}
//************************************************
//串口中断(用于接收短信)
//*************************************************
Void jieshou() interrupt 4
{
uchar temp;
temp=SBUF;
shuju[j++]=temp;
if(j>=100)
j=0;
else
;
RI=0;//接收中断信号清零,表示将继续接收
4 模块调试
4.1 SIM900A模块调试
SIM900A模块采用串口通信,本次设计选用的集成好的SIM900A模块,它采用TTL接口。可以直接与单片机的串口
相连。
本次设计使用的模块采用标准的AT指令进行控制,前面已经对用到的AT指令进行介绍。要使用这个模块只需要
插入普通的SIM卡到卡座,连接好电源以及对应的串口接口即可调试。硬件连接完毕后,就可以通过串口调试助手这
个软件来发送相应的AT指令进行模块的调试。
我们可以先用电脑控制模块,当能够实现对应的功能。模块能够实现正常工作后,然后再对单片机写入程序以
此来控制模块实现本次课题设计。
4.1.1 电脑控制模块线路连接
在使用电脑调试模块时需要用到一个将SIM900模块与电脑连接起来的另一个模块,常见的调试设备有USB–TTL
模块或USB–232串口线。对于USB–TTL模块现在常用的是74HC14这个芯片。只需要将芯片对应的引脚连接电脑USB接
口和对应的TTL接口引出即可,这里不再做介绍。
- USB–TTL模块与SIM900A模块的硬件连接为:
USB–TTL模块TTL端的TXD连接SIM900A的TTL电平接口的RXD。
USB–TTL模块TTL端的RXD连接SIM900A的TTL电平接口的TXD。
USB–TTL模块的GND连接SIM900A的GND。 - USB–232模块与SIM900A模块的硬件连接为:
USB–232模块232端的TX连接SIM900A的232电平接口的RXD。
USB–232模块232端的RX连接SIM900A的232电平接口的TXD。
USB–232模块的GND连接SIM900A的GND。
4.1.2 利用调试助手调试模块
需要注意的是:AT 指令必须以“AT”或“at”开头( 第一条发给模块的指令要都大写),以回车结尾。模块的响
应通常紧随其后,格式为:<回车><换行><响应内容><回车><换行>。
通过串口调试助手 SSCOM 测试模块: - 打开软件选择正确的 COM 号(连接到 SIM900A模块的 COM 端口),然后设置波特率为 9600bps, 勾选发送新
行,这可以让串口调试助手这个软件自动添加回车换行功能。然后发送“AT”到 SIM900A 模块,如下图4.1所示:
图4.1 同步波特率成功
我发送2次AT指令,可以从图4.1中看出模块返回数据为“OK”,表示模块和电脑已经同步好波特率,电脑已经
可以和模块通信,通过发送不同的 AT 指令,就可以实现对 SIM900A 的各种控制。
2. 发送ATI握手指令,用于检测模块是否能正常工作。从图4.2中可以看出模块返回了其型号为SIM900A R11.0。
3. AT+COPS?该指令用于查询当前运营商,如图4.3返回数据为:+COPS:0,0,“CHINAMOBILE”,表示当前选择的运
营商是中国移动。
4. 发送:AT+CMGF=1,设置为文本模式。我们用手机发送一条短信到我们的模块上,模块接收到短信后,会提示:
+CMTI:“SM”,1如图4.4表明收到了新的短信。
在调试模块的时候我发现一些问题:
- 读取到的短信内容编码不是中文编码,需要进行编码转换。
2. 某些时候,模块收到了短信,但却不发送提示,原因是:模块存储容量有限,当存储容量用完后,不能继续
存储短信。解决方法:可以删除一些短信,例如发送:AT+CMGD=6,删除全部短信命令。
4.1.3 调试中的硬件错误 - 误认VCC_MCU是给模块供电的管脚。
- 没有公地。
- 电源接反了。本次使用的SIM900A模块是自启动的,并且上面是有LED指示灯的。一旦通电,模块的LED就会亮
起。 - 过压和欠压。常见供电电压为5V,电流为1A 以上,有些USB设备会提供一个5V电源,但是多数这样的5V电源并不
能达到要求。当电源功率不足时,模块上的常亮的灯会闪烁起来,另一个闪烁灯会常亮几秒钟然后又开始闪烁起来
。模块上的灯闪烁情况对应的工作状态说明如下表4.1:
表4.1 工作状态说明
LED灯闪烁情况 模块工作状态
20
熄灭 关机
64ms亮/800ms灭 没注册到网络
60ms亮/3000ms灭 注册到网络
64ms亮/300ms灭 GPRS通讯
4.1.4 指令操作时常见问题 - 指令无回复。
原因:模块开机后执行的第一条指令没有大写;硬件连接不正确,包括无公地,信号线连接错误;每条指令后面没
有回车换行指令。 - 指令返回error。
原因:指令发送错误;模块损坏。
4.1.5 用单片机控制模块 - 硬件连接
单片机与SIM900A模块使用一个5V 2A电源供电。
单片机TXD连接模块5VR。
单片机RXD连接模块5VT。
模块的VCC(或VCC5V)接入DC5V。
注意:单片机的电源和SIM900A模块的电源都接入5V 2A电源。如果单片机是TTL电平高电压为5V,那么模块上的
VCC_MCU接DC5V。 - 编程
编写程序时只需将对应的指令信息利用单片机的串口发送到模块即可,再利用单片机程序检测模块返回来的数
据。对应的参考程序见末尾附录1。
4.2 单片机控制继电器调试
对于继电器我们只需要将对应的线路连接好,编写程序时只需要将对应的单片机的引脚输出高电平或者低电平
即可对其控制。这里我采用Proteus仿真对其调试。程序见附录2。
在用单片机控制继电器时,由于单片机I/O口驱动电流较小,所以我们需要利用三极管对单片机引脚输出的电流
进行放大,来满足继电器对电流的需求。硬件仿真电路如图4.6所示。图中单片机的P1.0口连接三极管的基极,三极
管的集电极连接5V电源,三极管发射极连接继电器的控制端,在继电器控制端和接地端连接一个单向二极管是为了
将电流转化为电压,使得继电器控制端能够有足够的电压。图中的LED灯和驱动LED灯的电源连接继电器的常闭触
点。
图4.6 继电器仿真连线
当程序运行时断开开关sw1可以看到LED灯被点亮。如图4.7:
图4.7 继电器仿真效果
5 功能实现
5.1 硬件搭建
综合以上内容,我们可以搭建硬件电路来实现GSM模块的使用、单片机最小系统的搭建、继电器的使用。再加上
一些LED灯用于显示系统的工作状态、模块的通电情况、写入模块的AT指令执行情况,这些都可以利用单片机对其进
行检测,用单片机的引脚点亮相应的LED灯来表达这些信息。大概的硬件组装情况如图5.1:
图5.1 总的连线图
5.2 软件编写
对于软件编写这里进行一些说明:
- 我们可以对单片机接收到的数据存储在一个专门的数组里面,以便于对这些数据进行识别和判断。但是在识别数
组后一定要清除存储在数组里的内容,以免影响下次的存储和识别。 - 检测数组里的数据可以用到strstr这个函数,在函数库string.h里面。函数功能是:搜索字符串第一次出现的地
址,如果有这个字符串则返回出现地址,没有返回NULL。在程序中作用是:检测数组是否有设定的数据。 - 单片机接收模块返回的数据时,我们可以利用串口中断服务程序,将数据写入到我们设定好的保存数组里面。但
是记得将RI中断标志为软件置0,以便于多次写入。 - 读取到的短信内容不是中文编码,在进行数据包比对时,对应的中文命令编码是:打开“62535F00”。关闭
“517395ED”。 - 模块是需要注册到移动网络才可以使用,所以在程序启动的时候需要为模块预留一定的时间。等到注册到网络才
可以进行操作。 - 具体的参考程序见附录3。
5.3 功能操作
本次设计功能较为简单,只是利用了模块的一些基本的功能。设计达到的效果是: - 启动:按下电源键等待模块注册到网络,等到面板上的蓝色指示灯亮起表明可正常工作。
- 打开插座:直接发送“打开”到对应的SIM卡的电话号码。即可实现插座通电。
- 关闭插座:直接发送“关闭”到对应的SIM卡的电话号码。即可实现插座断电。
5.4 实物图
做出的实物如图5.2所示:
图5.2 实物图
总结
本次设计采用的是经典的51系列单片机,结合数字电路基础、模拟电路基础等基础知识。用到了GSM通讯模块中
的SIM900A模块的短信接收功能。再根据具体设计要求编写相关的单片机程序,实现单片机对接收到的短信内容进行
识别和比对,从而在对应的单片机I/O口输出相应的高低电平来控制连接到单片机的继电器。而继电器又与插座进线
的火线相连,使得继电器的通断决定了插座的通断。从而实现了利用普通的手机发送短信到对应的SIM卡控制插座的
目的。
相对于普通的插座优点就在于:能够利用手机短信来控制插座。由于手机可以远距离操作,所以本设计能够使
得插座变得能够被远程和近程控制,增加了控制的灵活性。
在设计中遇到了很多的困难,特别是在调试模块的时候,感觉程序没有问题,但是就是出现不了对应的结果,
一步一步查找原因发现是,在对单片机定时器装入初值时,对应值写错了,导致波特率和模块的波特率对应不上,
从而无法实现模块同单片机通讯。所以在遇到困难时多去找找原因,一步一步查找和解决,最终会成功的。