2012-05-31 18:09:00 dreamtdp 阅读数 7150
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3998 人正在学习 去看看 朱有鹏
#include "serial.h"
#include "bianliang.h"
#include <REG51.h>
#include <string.h>
#include "1602.H"
#define rev_FAUSE 0 
#define rev_OK 1
#define SELInt_on() ES=1      
#define SELInt_off() ES=0      
uchar temp[3];
unsigned long ss;


extern bit P0_0;
extern bit P0_1;
extern bit P0_2;
extern bit P0_3;
extern bit P0_4;
extern bit P0_5;
extern bit P0_6;
extern bit P0_7;


sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;


void delay1(int n)
{
  uchar i;
  while(n--)
   for(i=0;i<100;i++);
}
void Excrescent(void)
{
if(Rev_Buf[0]==0x00)
xx=1;
else
xx=0;
}


void gsm_Over(void)
{
  Ser_TxDchar(0x0d);
  Ser_TxDchar(0x0a);
}






void Cls_Rebuf(void)
{
unsigned char i;
for(i=0;i<Rev_BufSIZE+1;i++)
{
    Rev_Buf[i]=0;
}
Rev_count=0;  
}




Test_Mc39i(void)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,2);//发送AT
gsm_Over();//回车换行
SELInt_on();
while(Rev_count<9);
Rev_count=0;
Excrescent();
for(i=5+xx;i<7+xx;i++)
{
temp[i-5-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;


}




MES_Mode(unsigned char mode)
{
Cls_Rebuf();
  SELInt_off();
  Ser_TXDstring(TC_HEAD,3);
  Ser_TXDstring(TC_CMGF,5);
  Ser_TxDchar(mode+0x30);
  gsm_Over();
  SELInt_on();
while(Rev_count<15);
Rev_count=0;
Excrescent();
for(i=12+xx;i<14+xx;i++)
{
temp[i-12-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
    return rev_OK;
else
return rev_FAUSE;

}




Set_Speed(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_IPR,8);
gsm_Over();
SELInt_on();
while(Rev_count<18);
Rev_count=0;
Excrescent();
for(i=14+xx;i<16+xx;i++)
{
temp[i-14-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;

}


Sent_Mes(unsigned char *p)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGS,5);
Ser_TxDchar(0x22);
  Ser_TXDstring(TelNumber,11);
  Ser_TxDchar(0x22);
  gsm_Over();
  SELInt_on();
ss=0xffff;
while(Rev_Buf[Rev_count-1]!=0x3e)
    {
ss--;   
if(ss==0)
{return;}
    }
SELInt_off();
Ser_TXDstring(p,5);
Ser_TxDchar(0x1a);
SELInt_on();
}
Store_Location(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CPMS,5);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
Ser_TxDchar(0x2C);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
Ser_TxDchar(0x2C);
Ser_TxDchar(0x22);
Ser_TXDstring(TC_SM,2);
Ser_TxDchar(0x22);
gsm_Over();
SELInt_on();
while(Rev_count<54);
Rev_count=0;
Excrescent();
for(i=50+xx;i<52+xx;i++)
{
temp[i-50-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;


}




Auto_Prompt(void)
{


Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CNMI,8);
gsm_Over();
  SELInt_on();
while(Rev_count<17);
Rev_count=0;
Excrescent();
for(i=14+xx;i<16+xx;i++)
{
temp[i-14-xx]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
}




void New_Mes(void)
{
Excrescent();
for(i=3+xx;i<7+xx;i++)
{
temp1[i-3-xx]=Rev_Buf[i];
}


    if(!strcmp(temp1,TC_CMTI))
{
if(Rev_Buf[10]==0x53&&Rev_Buf[11]==0x4D)
{
NewSMS_flag=1;
MES_COUNT=Rev_Buf[13];
Cls_Rebuf();
}
}


}




void Read_Mes(uchar num)
{
Cls_Rebuf();
  SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGR,5);
Ser_TxDchar(num);
gsm_Over();
SELInt_on();
ss=0xffff;
while(Rev_Buf[Rev_count-1]!=0x4B)
    {
ss--;  
if(ss==0)
{return;}
    }
for(i=30;i<40;i++)
{
if(Rev_Buf[i]==0x2B&Rev_Buf[i+1]==0x38&Rev_Buf[i+2]==0x36)
{
t=i;

}
}
for(i=t+3;i<t+14;i++)
{
TEL_Buf[i-t-3]=Rev_Buf[i];
}
TEL_Buf[11]=0x00;

for(i=t-20;i<t-15;i++)
{
CMD_Buf[i-t+20]=Rev_Buf[i];
CMD_Buf[5]=0x00;
}


}




Del_Mes(num)
{
Cls_Rebuf();
SELInt_off();
Ser_TXDstring(TC_HEAD,3);
Ser_TXDstring(TC_CMGD,5);
Ser_TxDchar(num);
gsm_Over();
SELInt_on();
while(Rev_count<14);

Rev_count=0;
for(i=12;i<14;i++)
{
temp[i-12]=Rev_Buf[i];
}
    if(!strcmp(temp,TC_OK))
return rev_OK;
else
return rev_FAUSE;
Cls_Rebuf();
}






void CMD_SHIBIE(void)
{
if(!strcmp(TEL_Buf,TelNumber))
{
P1_2=0;
TELNUM_OK=1;  

}
else  
{ P1_3=0;
TELNUM_OK=0;
Del_Mes(MES_COUNT);
Cls_Rebuf();
NewSMS_flag=0;
}
if(!strcmp(CMD_Buf,CMD_1))
{
CMD=1;


}
else if(!strcmp(CMD_Buf,CMD_2))
{
CMD=2;


}
else
{
CMD=0;
}
}






void INIT_GSM(void)
{
if(Test_Mc39i())
{
if(MES_Mode(1))
{
if(Set_Speed())
{
if(Store_Location())
{
if(Auto_Prompt())
P1_0=0;
}


}

}
}
Cls_Rebuf();

}


我做过一点;
(1)pc机和单片机发送的串口数据是不是不一样?
答:一样,一般都为9600,n,8,1

(2)把单片机和pc上位机相连,pc的超级终端接收的命令确实正确的?
答:可以连,注意RXD和TXD应交叉对联。满足单片机发送PC接收,PC发送MCU接收的关系

(2)是不是单片机和pc机波特率不一样?
答,GSM模块一般都是自适应模特率的,只要断电一次,就可以自己适应当前波特率

注意:你通讯补上可能是RXD和TXD交叉的问题(交换TXD和RXD尝试)
,也可能是需要硬件握手的问题(RTS  CTS

2014-01-10 21:49:40 findaway123 阅读数 20255
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3998 人正在学习 去看看 朱有鹏

摘要:借助系统模型,阐明GSM模块收发短信的基本概念以及串口控制SMS的基本原理。详细介绍单片机控制GSM模块工作的软件实现过程,对怎样用单片机控制GSM模块收发短信进行探讨,也对程序设计的主体思想作了较为细致的分析。

关键词:单片机 短信收发 软件设计

GSM(Global System for Mobile communication)系统是目前基于时分多址技术的移动通信体制中,比较成熟完善,且应用最广泛的一种系统。目前已建成的覆盖全国的GSM数字蜂窝移动通信网,是我国公众移动通信网的主要方式。基于GSM的短信信息服务,是一种在移动网络上传送简短信息的无线应用,是一种信息在移动网络上存储和转寄的过程。由于公众GSM网络在全球范围内实现了联网和漫游,建议上述系统不需再组建专用通信网络,所以具有实时传输数据功能的短信应用将得到迅速普及。笔者开发设计的基于GSM网络的温度数据采集与无线传输系统正是借助该网络平台,利用短信息业务实现数据的自动双向传递。系统模型图如图1所示。

本系统由数据采集部分、数据接收和发送部分、终端处理部分三个模块组成。数据采集模块将采集到的温度数据存入存储器中。数据收发模块采用双单片机共用E2RPOM的方式,单片机2控制数据从存储器转存入E2PROM中;单片机1负责将数据从E2PROM中读出,并经GSM模块2借助GSM网络将数据发送出去。单片机1不仅控制数据的发送,也控制数据的接收。在这里,E2PROM是温度数据临时存储和上传的中转站。终端处理模块负责将接收到的数据交给计算机处理,并将处理后的结果存放到数据库中,以供查询。当终端处理模块需要向GSM模块2发送控制命令时,GSM模块2接收过程正好与上述过程相反,从而实现数据的自动双向传递。

系统中,三个模块相互独立,彼此又相互依赖,共同完成数据的传输。数据收发模块在系统中起着承上启下的作用,是系统的核心模块。该模块以双单片机为核心,以RS232通信接口,在物理层上实现与GSM模块的连接。由于篇幅的限制,本文主要介绍单片机控制这一模块工作的软件实现过程,旨在对怎样用单片机控制GSM模块收发短信息进行探讨。

1 GSM模块MZ28

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

2 串口控制SMS的工作原理

单片机与GSM模块一般采用串行异步通信接口,通信速度可设定,通常为19200bps。采用这种RSM232电缆方式进行连接时,数据传输的可靠性较好。RS232接口方式连接,通过串行接口集成电路和电平转换电路与GSM模块连接,电路比较简单,所涉及的芯片包括单片机89C52和电平转换芯片MAX232,是非常常见的接口电路。需要说明的是,该接口通过I2C总线扩展了一个E2PROM存储器芯片AT24C64,它的主要作用是存储数据,而且断电信息也不会丢失,这些特性正是存储数据所必须的。

GSM的短信息业务SMS利用信令信道传输,这是GSM通信网所特有的。它不用拨号建立连接,把要发的信息加上目的数据发送到短信息服务中心,经短信服务中心完成存储后再发送给最终的信宿。所以当目的GSM终端没开机时信息不会丢失。每个短信的信息量限制为160字节。

现在市场上大多数手机均支持GSM07.05规定的AT指令集。该指令集是ETSI(欧洲通信技术委员会)发布的,其中包含了对SMS的控制。利用GSM手机的串行接口,单片机向手机收发一系列的AT命令,就能达到控制GSM模块收发SMS的目的。必须注意的是,用单片机实现时,编程必须注意它发送指令与接收到的响应都是字符的ASCII码。用单片机控制GSM模块收发短信息所涉及以的AT指令如表1所列。

表1 AT指令

AT指令

功 能 描 述

AT+OFF 关机并重新启动
AT+CSDH=0 在TEXT模式下在返回值中不显示详细的头信息
ATE0 关闭回显
AT+CMGF=1 选择短信格式为TEXT模式
AT+CMGS 发送短信息
AT+CMGR 读取短信息
AT+CMGD=0 删除全部短信息

3 软件实现

3.1 上位机模块和下位机模块半双工通信协议的实现

3.1.1 应答和重发

上位机模块和下位模块的通信双方遵照半双工通信方式进行,即数据传送是双向的。但是,任何时刻只能由其中的一方发送数据,另一方接收数据,因为E2PROM的读出和写入不能同时进行。为了避免一方在发送信息帧时(这里的信息帧指的是下位机模块发送的数据帧和上位机模块发送的命令帧,下同),另一方也会发送数据,必须把信道变成半双工方式。尽管这样效率可能不如全双工方式,但通过此举牺牲效率可以换取模块工作性能的稳定。双方采取的顺序是:发→收到应答后→再发。

按照整个系统的设计思路,上位机模块(即图1中的GSM模块1,下同)发送的帧包括命令帧、确认帧和非确认帧;下位机模块(即图1中的GSM模块2,下同)发送的帧包括数据帧、确认帧和非确认帧。其中确认帧和非确认帧是发送数据后等待对方发送的应答帧,以此作为继续发送下一帧和重新发送上一帧的依据。命令帧和数据帧是信息帧,当一方先发送完信息帧,如果收方接收到对方的信息帧,而又没有信息帧需要发送,那么情况就比较简单,收方将根据信息帧的正确与否决定发送确认帧还是非确认帧,以使对方决定是继续发送还是重新发送;如果此刻收方也有信息帧需要发送,那么收方将不立即发送应答帧,而是立即发送本方的信息帧给对方,并等待对方对此帧的应的应答帧,在收到对方的应答帧后,收方将依据应答帧的内容(即确认帧或者是非确认帧,下同)决定是继续发送下一信息帧,还是重新发送原来的信息帧。如果由于链路本身不可靠等因素造成应答帧的丢失,收方将在一定时间内因为没有收到应答帧而延时重发原来的信息帧。在收到对方的应答帧后,收方将继续发送下一信息帧,并等待对方的应答帧,如此反复,直到收方全部发送完信息帧。在本方收到对方最后一个应答帧后,表明本方全部的信息帧发送完毕。然后收方将发送对方仍然等待的应答帧,通知对方收到的信息帧正确与否。

图2

3.1.2 延时重发

在双方通信过程中,有两个时间t1和t2,分别表示重新发送信息帧的最大延时。t1表示一方发送完信息帧到收到对方应答帧的时间,如果等待应答帧的时间超过了t1,则发方会重新发送原来的信息帧;当收方接收到对方发送的信息帧,如果收方此时有需要发送的信息帧,则收方此记得不发送应答帧,而是发送信息帧给对方。也就是说,利用对方等待收方应答帧的时间t1内,收方插入发送本文的信息帧,同样本方的发送也存在一个延时重发的问题。在规定的时间内,如果没有收到对方应答帧,收方也同样需要重发原来的信息帧,这个规定的时间就是t2。显然由于收方是利用间隙时间发送本方信息帧,所以t2<t1。

图2以下位机模块先发数据帧为例,阐述双方通信的具体实现过程。

需要说明的是,由于版面的限制,图2所示的通信过程没有涉及到发送非确认帧的情况,如果收方发送非常认帧,发方的发送过程跟发送数据帧是一样的,只不过这种情况下需要重发同一帧号的数据帧。如果上位机模块先发命令帧,双方通信的实现过程跟图2类似,所不同的是数据帧此时变成命令帧,命令帧变成数据帧。在延时的时间上,无论是下位机发送数据帧还是上位机发送命令帧,t2的大小都应该是一样的,都是利用时间间隔t2发送收方信息帧,延时的时间是相同的。然而,对于t1而方,情况就有所不同。因为下位机模块先发送数据帧时,利用t1的间隔时间上位机模块发送的命令帧可靠较少,因此当下位机模块先发送数据帧时所定义的t1应该小于当上位机模块先发送命令帧时,所定义的t1。这是因为当上位机模块先发送命令帧时,利用t1的间隔时间下位机模块发送的数据帧可能比较多。

3.2 帧格式

GSM模块通过异步通信接口实现对SMS的控制共有三种接入协议:Block Mode;基于AT指令的Text Mode;基于AT指令PDU Mode。本系统发送和接收的数据都是基于数字的温度数据和命令字,为了保证系统的适用性,SMS的收发采用TEXT模式。TEXT模式是基于字符的,更具体地说是基于ASCII码的一种结构模式。在该模式下,模块发送和接收的信息帧格式如下:

帧头 帧序号 数据 校验子

信息帧包括数据帧和命令帧。

帧头表示数据帧的标记,是由固定的字符“WQ”构成。

帧序号表示数据帧的序号,由两个字节组成。帧序号表示下位机模块发送的递增数据帧序号和上位机模块发送的命令帧序号。为了简化帧结构,命令帧的序号统一为00H。

数据字段的长度为154字节,最多发送77个字符(采用TEXT模式,不能发送汉字)。

检验子为数据字段所有字节累加和的初码(原码取反加1),由一个字节组成。

除了信息帧外,双向传递的还有应答帧,它包括确认帧和非确认帧。确认帧是双方反馈给发方的应答帧,表示收方已经正确接收到了发方发送的信息帧。确认帧格式仅包括两个字段,且两个字段的内容都是固定的,即帧头“WQ”和数据字段“ACK”,确认帧格式如下。

WQ ACK

非确认帧是收方给发方的应答帧,表示收方收到的是无效的信息帧,其格式与应答帧格式类似,帧格式如下。

WQ NACK

3.3 E2PROM空间的分配

采用8KB的E2PROM,按照每77个字节为一个块进行划分,共106块,如图3所示。

第00、01块留作系统使用,第02块~第105块是数据块,用作存放数据。

3.4 收发端与采集端的握手协议

收发端与采集端共用一个存储器,即双CPU对同一个E2PROM进行操作。实现方案是分别使两个微处理器的一个I/O脚相连,两个CPU采用查询方式对此I/O端进行查询。如果某时候收发端查询到本地I/O端为高电平,则单片机1拥有此存储器的操作权,可以对E2PROM进行读写操作。如果采集端查询到本地I/O端为高电平,则单片机2拥有此存储器的操作权,可以对它进行写操作。一方操作完毕后将I2C总线置为高电平,表明本端已经释放I2C总线,E2PROM目前处于可用状态。

3.5 程序的设计

3.5.1 主函数的设计思路

开机上电后,程序在主函数中运行,单片机和GSM模块分别进行初始化。单片机的初始化包括设置串口工作方式、波特率,并初始化变量参数和标志位。GSM模块初始化包括重新启动、关闭回显、设置在TEXT模式下的返回值中不显示详细的头信息、选择短信格式为TEXT模式、开发串口中断准备接收数据。

3.5.2 GSM返回参数的处理—SHELL函数

SHELL函数是进入时钟中断程序时被调用时,该函数是对GSM模块返回参数进行处理的函数。根据系统设计的要求,需要对GSM模块进行下列操作:呼叫对方模块号码、发送数据、阅读短信、删除短信。基于以上操作指令,如果操作成功GSM模块会分别返回不同的参数:>、+CMGS、+CMGR、OK。根据接收到的不同参数,下位机模块将转向不同的操作步骤,判断并改变标志位的值。比如,如果某时刻接收到>,这表明呼叫对方模块号码获得成功,接下来需要发送数据。这时SHELL函数将检查发送不同数据所代表的标志位f_sending、f_ack、f_nack,从而决定需要发送何种类型的数据。

3.5.3 短信数据的处理—ExecData函数

进入时钟中断调用SHELL函数时,如果接收到了返回的参数+CMTI,表明上位机模块向下位机模块发送了短信数据,可能是命令帧,也可能是确认帧或者非确认帧。在这种情况下,SHELL函数需要对短信内容进行分析,并根据短信的内容进行不同的处理,负责完成以上功能的就是ExecData函数,它是被SHELL函数调用的,用来分析并处理短信数据。

结语

通过以上的分析不难发现,整个程序错综复杂,函数之间相互牵扯。标志位在程序的实现过程中扮演着非常重要的角色,正是依靠这些标志位,程序才能很好地实现各个功能之间的切换,而标志位的值是通过OSM模块返回的参数修改的。因此程序的实现过程应该是阅读参数→修改标志位→发送指令。

主函数、时钟中断和串口中断程序、SHELL函数、ExecData函数贯穿整个程序的主线和核心部分,对它们的分析可以理解程序的主体思想,这也正是笔者着重介绍的原因所在。然而这些函数和中断程序的实现,还需要依靠其它函数的配合,比如基于I2C总线的E2PROM操作函数、字符串操作函数以及串口发送函数等,由于篇幅所限,在此不再介绍。GSM网络本身是不完全可靠的,可能会发生帧发送错误、帧丢失的现象。但是由于重发、延时重发机制的存在,程序可以最大程度避免上述情况的发生。在实际应用过程中,模块运行正常,性能稳定,实时性好。

2009-06-08 13:54:00 hdbcf 阅读数 3626
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3998 人正在学习 去看看 朱有鹏

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

介绍一种 采用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完成。

三、  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<sizeof(Buf);i++)
{
  Buf=*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;
}
}
}

2019-07-14 13:01:29 weixin_43216060 阅读数 348
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3998 人正在学习 去看看 朱有鹏

基于单片机的烟雾监测报警与控制系统

(给手机打电话或发短信报警)
现在有很多场所对烟雾浓度的要求很严格,比如在电梯里烟雾浓度超过一定的阈值就要求报警并采取一系列的控制措施。又比如目前大部分学校,普遍都有几千甚至几万的住宿学生,安全防范压力极大,现在学生宿舍普遍六至八人一间,有些学校甚至更多。而且随着经济条件的改善,和生活水平提高,学生们使用各种电器设备数量日益增长。虽然各个学校都出各种规章制度,严禁学生私自搭线或使用大功率电器,但仍然防不胜防。在学生宿舍人员密集的地方,部分人员安全意识淡薄,上述行为可能会导致群死群伤的事情发生,因此电梯、学生宿舍等公共场所进行烟雾监测监控也是一个必然的趋势。
我本文介绍的是基于单片机技术,利用sim900a(GSM模块),烟雾传感器MQ-2等模块制作一个烟雾监测报警与控制系统,此系统主要分为三个部分

1、烟雾监测:我选用的烟雾传感器是MQ-2

MQ-2电路图:
在这里插入图片描述
MQ-2实物图: 在这里插入图片描述在这里插入图片描述
MQ-2烟雾传感器存在两种输出模式AO(模拟量输出),DO(数字量输出);若用DO(数字量输出)则可通过如图的电位器调节来控制输出电压大小从而控制单片机对信号的反馈来影响阈值,若用AO(模拟量输出)可通过单片机的内部程序代码来设置烟雾阈值。

如需程序代码等资料可联系我。本人QQ:1163845390

**
MQ-2烟雾传感器的应用领域很广,可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。MQ-2型传感器对天然气、液化石油气等烟雾有很高的灵敏度,尤其对烷类烟雾更为敏感。也具有良好的抗干扰性,可准确排除有刺激性非可燃性烟雾的干扰信息。
(经过测试:对烷类的感应度比纸张木材燃烧产生的烟雾要好的多,输出的电压升高的比较快)。
MQ-2型传感器具有良好的重复性和长期的稳定性。初始稳定,响应时间短,长时间工作性能好。需要注意的是:在使用之前必须加热一段时间,否则其输出的电阻和电压不准确。
其检测可燃气体与烟雾的范围是100~10000ppm(ppm为体积浓度。 1ppm=1立方厘米/1立方米)
电路设计电压范围宽,24V以下均可,加热电压5±0.2V
需要注意:加热电压。如果过高,会导致内部的信号线熔断,从而器件报废。
*

2、报警系统:我采用①蜂鸣器报警和②通过sim900a模块(GSM模块)给手机打电话报警

①蜂鸣器分为有源蜂鸣器和无源蜂鸣器
有源蜂鸣器和无源蜂鸣器的差别主要差别为:
1、有源蜂鸣器和无源蜂鸣器的根本区别是产品对输入信号的要求不一样。
2、有源蜂鸣器工作的理想信号是直流电,通常标示为VCC、VDD等。因为蜂鸣器内部有一简单的振荡电路,能将恒定的直流电转化成一定频率的脉冲信号,从面实出磁场交变,带动钼片振动发音。
3、但是在某些有源蜂鸣器在特定的交流信号下也可以工作,只是对交流信号的电压和频率要求很高,此种工作方式一般不采用。
4、而无源蜂鸣器没有内部驱动电路,有些公司和工厂称为讯响器,国标中称为声响器。无源蜂鸣器工作的理想信号方波。如果给预直流信号蜂鸣器是不响应的,因为磁路恒定,钼片不能振动发音。

我采用的是有源蜂鸣器与PNP三极管结合的电路,通过控制PNP的导通和截止来控制蜂鸣器的开启和关闭
电路图如下:
在这里插入图片描述
PE5引脚输出为高电平时,pnp截止,蜂鸣器两端都为低电平,蜂鸣器关闭;PE5引脚输出为低电平时,pnp导通,蜂鸣器开启;当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,控制PE5引脚的高低电平,来控制蜂鸣器的开启和关闭(实现报警)。

②通过sim900a模块(GSM模块)给手机打电话报警
sim900a实物图:
在这里插入图片描述sim900a与单片机连接,当烟雾传感器检测到烟雾浓度超过阈值时,输出信号给单片机,当单片机收到烟雾浓度过高的信号时,发送一系列指令给sim900a,来控制sim900a给手机打电话或者发短信(报警)

如需sim900a的详细资料及指令代码可联系我 ,本人QQ:1163845390

3、控制系统:我采用的是L298N模块和电机来模拟开关门窗

L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
  L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。
  L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围VIH为+2.5~46V。输出电流可达2A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。下图是L298N内部原理图:
在这里插入图片描述

总之,三个部分(烟雾检测、报警、模拟控制)与单片机连接,烟雾传感器MQ-2检测到烟雾浓度超过阈值就发送一个信号给单片机,单片机接收到信号后控制蜂鸣器和sim900a报警并控制L298N模拟开窗或开门。本次设计很好的运用了单片机和传感器、GSM模块等结合的知识,提高了一系列公共场所的安全保障。

实物图(制作的比较简易,但功能都完全具备):
在这里插入图片描述

2010-10-31 16:26:00 newstime 阅读数 4557
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3998 人正在学习 去看看 朱有鹏

     虽然单片机和TC35I模块都是TTL电平,但是TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,但是单片机的输入输出的TTL正电平逻辑是+5V,所以如果直接将TC35I的RX,TX与单片机的TX,RX对应连接后,当然也要连接GND,是不会通信的,因为电平不通一。

    解决方法;

         1.给单片机的RX TX的IO口加上拉电阻,也就是分压,叫它那两个IO的电压等于2.9V左右,和GSM模块匹配。

         2。给GSM模块上面的RX,TX加OC门驱动,提高电压。

         3。单片机和GSM模块上面如果都有DB9(串口)和MAX232,那么可以直接将单片机的DB9和GSM模块的DB9上面的2-3.3-2.5-5这样连接。

附带:

    OC门主要用于3个方面:

1、 实现与或非逻辑,用做电平转换,用做驱动器。由于OC门电路的输出管的集电极悬空,使用时需外接一个上拉电阻Rp到电源VCC。OC门使用上拉电阻以输出高电平,此外为了加大输出引脚的驱动能力,上拉电阻阻值的选择原则,从降低功耗及芯片的灌电流能力考虑应当足够大;从确保足够的驱动电流考虑应当足够小。

2、 线与逻辑,即两个输出端(包括两个以上)直接互连就可以实现“AND”的逻辑功能。在总线传输等实际应用中需要多个门的输出端并联连接使用,而一般TTL门输出端并不能直接并接使用,否则这些门的输出管之间由于低阻抗形成很大的短路电流(灌电流),而烧坏器件。在硬件上,可用OC门或三态门(ST门)来实现。 用OC门实现线与,应同时在输出端口应加一个上拉电阻。

3、 三态门(ST门)主要用在应用于多个门输出共享数据总线,为避免多个门输出同时占用数据总线,这些门的使能信号(EN)中只允许有一个为有效电平(如高电平),由于三态门的输出是推拉式的低阻输出,且不需接上拉(负载)电阻,所以开关速度比OC门快,常用三态门作为输出缓冲器

 

TTL电平

TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”0V等价于逻辑“0”,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。

数字电路中,由TTL电子元器件组成电路使用的电平。电平是个电压范围,规定输出高电平>2.4V, 输出低电平<0.4V在室温下,一般输出高电平是3.5V,输出低电平是0.2V。最小输入高电平和低电平:输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V

2TC35i

tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600

其中18RxD019TxD0TTL的串口通讯脚,需要和单片机或者PC通讯。

TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。

 

 

       

没有更多推荐了,返回首页