51 单片机GSM 模块实现通信

1、检测串口线的好坏

1)将串口线插在电脑上,用短路子短接串口的 2 脚和 3 脚

2)打开串口调试助手

3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能接收到自己发的数据表示串口线是正常的,否则是坏的。

 

2、下完单片机程序后,看看串口是否有数据发出检测

 

3、单片机上与模块通信的 4 个灯表示的含义

1)DO 灯

一直闪表示单片机串口与 GSM 模块串口通信不正常,否则串口通信正常

 

2)D1 灯

灯亮就表示模块注册上网络,否则没有注册上网络

 

3)D2 灯

灯亮表示开始发短信

 

4)D3 灯

灯亮表示发短信结束

 

4、单片机板子与 GSM 模块的连接

单片机 ---------GSM 模块

VCC--------vcc(P5 的第 3 脚)

GND--------GND(P5 的第 4 脚)

RX_232(表示单片机的发)----------RXDPC_232(模块的收(P5 的第 5 脚))

TX_232(表示单片机的收)----------TXD_PC232(模块的发(P5 的第 6 脚))

 

 

gsm 模块和单片机连接

单片机连接 GSM 模块,直接就是把异步串行通信口的 TX 和 RX 连上就可以,别忘了地线。

 

注意事项:

1、不同的单片机有不同的电压,一般 GSM 模块的输入输出电平是 2.85V,51 系列的电平是 5V,一般在 51 输出的 TX 那根线上串联 2K 的电阻,基本上可以使用。如果是 3.3V 的单片机,这个电阻就可以很小,几百欧姆就可以。

 

2、GSM 模块本身的电源和 SIM 卡电路很麻烦,首先是大多数 GSM 模块都是用 FPC40 的接口,排线的间距只有零点五毫米,而且是塑料外壳,不好焊接。焊不好的话工作不稳定。其次是电源部分较麻烦,GSM 模块的发射电流较大,最大瞬间电流 2A!所以电源部分一般要用 LM2576 这种大电流的 DC-DC 变换器来提供 4V 的电压,DCDC 电路设计本身就很不容易,个人应用比较难,需要做电路板。搭接的不稳定。还有 SIM 卡部分,SIM 卡与 GSM 模块通信本身就是个复杂的高频过程,电路抗干扰能力强,我曾经试过用电线给它们连接起来,没有十分钟,就掉线了。所以 SIM 卡部分也需要精心设计,别看只有五根数据线而已。

 

单片机控制 TC35GSM 模块的方法

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[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;

}

}

}