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