王爱爱的三娘教子全本:单片机控制GSM模块TC35的方法

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 14:49:14
孤独的牧   加博友   关注他  他的网易微博

最新日志

  • Ubuntu将于2014年推平板电脑
  • Ubuntu可能成为第二个Androi
  • 等离子边缘化:松下大收缩 
  • 长焦钢炮 35倍光学变焦佳能P
  • 让你的照片更精彩 HDR效果数
  • 别光看像素 拍照手机选购误

该作者的其他文章

    博主推荐

    • 美国媳妇和中国婆婆干仗谁的错?
    • 合肥农妇给中级法院赠腐败锦旗
    • 电脑组装之主板接口一看便知(装机图解教程)
    • 循迹小车程序
    • 科学要流行就差上春晚
    • 考大学记

    相关日志

      随机阅读

        首页推荐

        • 中国男人们的'妓女情结'
        • 日本没有性生活的夫妻们
        • 李莲英为防盗墓使用秘法
        • 美国希望把户口卖给谁?
        • 冠希与嫩模艳照幕后(图)
        • 湄公河血案是有预谋屠杀
        更多>>
        对“推广广告”提建议

          用单片机控制的智能太阳能充电器  主机云台控制协议一览表

        单片机控制GSM模块TC35的方法  

        2009-12-04 13:55:23|  分类: 单片机 |  标签: |字号大中小 订阅

        时间:2007-05-14   来源:   作者:
        http://www.dzkf.cn/html/zonghejishu/2007/0514/2079.html
        < -- font-face font-family panose- mso-font-altsimsun mso-font-charset mso-generic-font-familyauto mso-font-pitchvariable mso-font-signature font-face font-family panose- mso-font-charset mso-generic-font-familyauto mso-font-pitchvariable mso-font-signature pmsonormal limsonormal divmsonormal mso-style-parent margincm margin-bottompt text-alignjustify text-justifyinter-ideograph mso-paginationnone font-sizept mso-bidi-font-sizept font-familytimes new roman mso-fareast-font-family mso-font-kerningpt alink spanmsohyperlink colorblue text-decorationunderline text-underlinesingle avisited spanmsohyperlinkfollowed colorpurple text-decorationunderline text-underlinesingle page mso-page-border-surround-headerno mso-page-border-surround-footerno page section sizept pt marginpt pt pt pt mso-header-marginpt mso-footer-marginpt mso-paper-source layout-gridpt divsection pagesection --> --<--<--<

        介绍一种采用GSM的短信功能,可以使某些控制达到“零距离”。由于短信息的费用低廉,可以取代传统的无线遥控。现在详细介绍一种采用单片机(MCS51系列)控制TC35(廉价的GSM模块)发送、接收GSM短信的方法。

        一、TC35的控制简介

        TC35是Siemeils公司推出的新-代无线通信GSM模块。自带RS232通讯接口,可以方便地与PC机、单片机连机通讯。可以快速、安全、可靠地实现系统方案中的数据、语音传输、短消息服务(Short Message Service)和传真。TC35模块的工作电压为3.3—5.5V,可以工作在900MHz和1800MHz两个频段,所在频段功耗分别为2w(900M)和1w(1800M)。

        模块有AT命令集接口,支持文本和PDU模式的短消息、第三组的二类传真、以及2.4k,4.8k,9.6k的非透明模式。此外,该模块还具有电话簿功 能、多方通话,漫游检测功能,常用工作模式有省电模式、IDLE、TALK等模式。通过独特的40引脚的ZIF连接器,实现电源连接、指令、数据、语音信号、及控制信号的双向传输。通过ZIF连接器及50Ω天线连接器,可分别连接SIM卡支架和天线。

        TC35模块主要由GSM基带处理器、GSM射频模块、供电模块(ASIC)、闪存、ZIF连接器、天线接口六部分组成。作为TC35的核心,基带处理器 主要处理GSM终端内的语音、数据信号,并涵盖了蜂窝射频设备中的所有的模拟和数字功能。在不需要额外硬件电路的前提下,可支持FR、HR和EFR语音信 道编码。其它功能介绍可参见有关资料!

        二、AT指令的介绍

        TC35模块的通讯全部采用AT+xxx完成。基本的AT指令见:

        /html/zonghejishu/2007/0514/2078.html

        三、TC35的连机方法

        任何一个TC35模块首次使用时,必须要测试其工作是否正常,由于其自带RS232接口,所以我们可以用PC机的串口调试软件进行调试。

        1、启动串口调试软件(见界面)


        串口调试软件有许多,可以使用任意一款软件,也可以使用WINDOWS自带的“超级终端”。设置波特率19.2k,这是TC35的默认波特率,首次连机可以从2400~57.6k不断测试,直到TC35有应答。

        2、发送“AT”

        AT 回车

        3、改变波特率“AT+IPS=XXXX"

        TC35的默认波特率是19.2k,实际使用时,可以改成9600或38.4K,方法如下:

        AT+IPR=9600 回车

        4、短信模式的设置

        (GSM模块的短信模式有2种。第1种是:TEXT模式;第2种是:PDU模式。PDU模式可以采用unicode编码发送英文、汉字。但合成PDU码比较复杂,而TEXT模式只能发送英文,但无须编码。实际使用可以采用TEXT模式。

        设置如下:

        AT+CMFG=1 回车

        5、短信模式简介

        SMS是由Etsi所制定的一个规范(GSM 03.40和GSM 03.38)。当使用7-bits编码的时候它可以发送最多160个字符;8-bit编码(最多140个字符)。通常无法直接通过手机显示;通常被用来作为数据消息,例如:smart messaging中的图片和铃声和OTA WAP设置。16-bit信息(最多70个字符)被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。一个以class 0开头的16-bit的文本信息将在某些手机上作为Flash SMS显示(闪烁的SMS和警告SMS)。

        有两种方式来发送和接收SMS信息:使用文本模式或者使用PDU(protocol description unit)模式。文本模式(可能某些手机不支持)实际上也是一种PDU编码的一种表现形式。在显示SMS信息,可能使用不同的字符集和不同的编码方式。

        6、短信读取方法

        AT+CMGR=X回车

        如果有短信息,TC35回应:

        AT+CMGR=1

        +CMGR:"REC UNREAD","13307496548",,"04/08/17,22:24:32+02

        testOK

        OK

        短信息分析:

        “test OK"就是短信息内容。

        短信息的存储容量与Ic卡有关,序号从1-N。

        REC UNREAD":代表短信息未读过。

        REC READ" :已读过。

        13307496548":接收的手机号码。

        04/08/17,22:24:32+02":短信息发送的时间。

        无短信息,TC35回应:

        AT+CMGR=3

        +CMGR:0,,0

         

        7、短信的删除方法

        AT+CMGD=1回车

        8、短信的发送方法

        短信息的发送分成两步:

        1:发送接收的手机号码,等待应答:“>"

        AT+CMGS="13307496548"回车(目的地址)

        TC35回应:

        AT+CMGS="13307496548" >

        2:输入短信息的内容(只能是英文):Test 回车

        四、单片机控制TC35的方法

        上面介绍了用PC机控制TC35的方法,我们只需将PC机输出的控制命令转化成单片机输出的指令即可。

        1、硬件连接

        电路见下图只需设计一个TTL转RS232电平电路,连接到MCU的UART口,另一端直接连接到TC35。


        2、指令输出的方法

        单片机串口设置成模式1(9600,N,8,1),依次将AT+xxx以ASCII码形式输出到UART口;接收TC35的数据采用中断方式。这里给出详细的程序清单(Keil C51),不介绍编程的方法。程序见下:

        //AT指令的定义

        char code AT_Tc35[]="AT+"; //连机

        char code Bps_Tc35[]="IPR=38400"; //波特率

        char code Text_Tc35[]="CMGF=1"; //文本模式

        char code Read_Tc35[]="CMGR="; //读信息

        char code Erase_Tc35[]="CMGD="; //删除信息

        char code Send_Tc35[]="CMGS="; //发送信息

        char code Creg_Tc35[]="CREG?"; //注册

        //模式设置

        void UART_Init(void)

        {

        SCON=0x50; //01010000b=>1模式scon,#11011000b;

        ES=l;

        }

        //发送-个ASCII

        void SendASC(unsigned char ASC)

        {

        bit es;

        es=ES;

        ES=0;//关闭中断

        TI=0;

        SBUF=ASC;

        while(!TI);

        TI=0;

        ES=es;

        )

        //发送命令到TC35

        void SendToTc35(unsigned char* p,unsigned char Long)

        {

        while(Long--)

        {

        SendASC(*p++);

        }

        }

        // 通讯中断接收程序

        void Rs485_Do(void) interrupt 4 using 1

        {

        if(RI==l)

        {

        RI=0;

        RsBuq[RsPoint++]=SBUF;

        if fRsPoint>=sizeof(RsBuf))

        {

        RsPoint=0;//FlagRs485=0;

        } //数据处理

        }

        }

         

        // 发送AT连机命令

        char code AT_Code[]="OK";

        void Send_AT(void)

        {

        unsigned char *p;

        while(1)

        {

        ClrRsBuf(RsBuf,sizeof(RsBuf));

        SendToTc35(AT_Tc35,2);    //"AT"

        SendASC(OVER);

        //************等待应答“ok"

        ES=1; //必须中断

        Delay(50);

        P=strstr(RsBuf,AT_Code);

        if(p!=NULL) break;

        }

        )

        //发送bps连机命令

        void Send_BPS(void)

        {

        SendToTc35(AT_Tc35,3); //"AT+"

        SendToTc35(Bps_Tc35,sizeof(Bps_Tc35)-1);//"IPR=19200"

        SendASC(OVER);

        }

        //设置文本

        void SetText(void)

        {

        SendToTc35(AT_Tc35,3);    //"AT+"

        SendToTc35(Text_tc35,sizeof(Text_tc35)-1);//"IPR=19200"

        SendASC(OVER);

        Delay(100);

        }

        //删除短信息

        unsigned char EraseMsg(unsigned char index)

        {

        unsigned char *p,i=20;

        SendToTc35(AT_Tc35,3); //"AT+"

        SendToTc35(Erase_Tc35,sizeof(Erase_Tc35)-1);//"IPR=19200"

        SendASC(index);

        SendASC(OVER);

        ES=1;

        while(i--)

        {

        Delay(200);

        P=strstr(RsBuf,AT_Code);

        if(P!=NULL) {return 1;}

        }

         

        return 0;

        }

        //读取短信息

        char code Ask_No[]="+CMGR:0,,0";

        char code ERROR{]="ERROR";

        char code Ask_Tc35[]="/";

        unsigned char ReadMsg(unsigned char index)

        {

        unsigned char *p,i;

        unsigned char Buf[40];

         

        SendToTc35(AT_Tc35,3); //"AT+"

        SendToTc35(Read_Tc35,sizeof(Read_Tc35)-1);

        SendASC(index);

        SendASC(OVER);

        ES=1; //必须中断

        Delay(600);

        /*-------

        ES=0:

        SendToTc35(RsBuf,99);

        ES=1;

        */

         

        p=strstr(RsBuf,ERROR);

        if(P!=NULL)

        {

        Send_AT();return 0;

        p=strstr(RsBuf,Ask_No);//无信息

        if(p!=NULL)return 0;

        p=strstr(RsBuf,Ask_Tc35);//20个字节后是MSG

        if(p==NULL) return 0;

        p=p+21;

        for(i=0;i

        {

        Buf[i]=*p++;

        }

         

        if(EraseMsg(index)==0) return 0;

        p=strcpy(RsBuf,Buf); //放回RsBuf

        return 1;

        }

        }

        //发送短信息

        char code SK[]=">";

        void SendMsgStart(void)

        {

        unsigned char *p,i=10;

        SendToTc35(AT_Tc35,3); //"AT+"

        SendToTc35(Send_Tc35,sizeof(Send_Tc35)-1);//"IPR=19200"

        SendASC(YinHao);

        SendToTc35(Mp1.Hand,sizeof(Mp1.Hand)); //"AT+"

        SendASC(YinHao);

        SendASC(OVER);

        ES=1;

        while(i--)

        {

        Delay(100); //Get">"

        p=strstr(RsBuf,SK);//">"

        if(p!=NULL)

        {

        ClrRsBuf(RsBuf,sizeof(RsBuf));

        Delay(150); //Get">"

        break;

        }

        }

        }