求助短信点亮数码管(51控制GSM模块接收短信)

2020-02-02 09:38发布

#include<reg52.h>
#include<absacc.h>
#include<stdio.h>

sbit P2_4=P2^4;
sbit P2_2=P2^2;


//---LED显示控制---------
sbit S1=P1^3;
sbit S2=P1^4;
sbit S3=P1^5;
sbit S4=P1^6;
sbit WD=P1^0; //这是什么作用
sbit CLK=P1^2; //这是什么作用
sbit EN_LED=P1^1; //这是什么作用


//-----------------------

#define uint unsigned int
#define uchar unsigned char




uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd,0xff};//0-9,-,全灭 (共阳字段表)


#define RST 0X01
#define CMGF 0X02
#define CMGD 0X03
#define CREG 0X04
#define CMGR 0X05
#define CMGS 0X06
#define CSCA 0X07
#define ATDAT 0X08
#define TC35RET 0X00


uint temp;


void delay(int de_u)
{
int u,n;
//10us
for(u=0;u<de_u;u++)
{
for(n=0;n<1000;n++)
{;}
}
}



void Displaybyte(uchar byte)
{
uchar num,c;
num= 0xff-tab[byte];//共阴
EN_LED=0;EN_LED=1;
for(c=0;c<8;c++)
{
if(num&0x01) //(0x80即十进制的128, 二进制的10000000 按位发送)
WD=1;
else
WD=0;
num>>=1;
CLK=0;
CLK=1;
}
delay(2);
// Delay_ms(1);//A0;B0;C0;D0;//CLR_LED;
}



#include"GSM.h"

void ATE0(void);
void delay_GSM(uint);
void init_serialcom( void );
void send_uart( unsigned char);
void ATNAME(void);
void AT_CMGS(void);
void AT_CSCA(void);
void AT_RST(void);
void AT_CREG(void);
void AT_CMGF(void);
void AT_CMGR(void);
void AT_CMGD(void);



void Init_T0 (void)
{
TMOD = 0x21;
TH0 = (65536-10000) /256;
TL0 = (65536-10000) %256;
EA = 1;
ET0 = 1;
TR0 = 1;
}



//中断赋初值部分
void Time0_ISR(void) interrupt 1 using 0
{
TH0 = (65536-10000) /256; //初始值 高八位 类似进制转换(八进制 三位时除以2的3次方)
TL0 = (65536-10000) %256; //低八位
}





main()
{
//--------初始化-------------------
init_serialcom();
//Init_T0();

//--------发三次关闭回显命令----------------
S1=1;S2=0;S3=0;S4=0;
Displaybyte(0X00);
delay_GSM(100);
ATE0();
Displaybyte(0X01);
delay_GSM(100);
TC35_MAX=0;
ATE0();
Displaybyte(0X02);
delay_GSM(100);
//SMS_CONFIG();
ATE0();
Displaybyte(0X03);
delay_GSM(100);
//------------------------------


for(i_TC35=0;i_TC35<=69;i_TC35++)
{
TC35_RE[i_TC35]=0;
}
i_TC35_RECE=0;
TC35_MAX=0;
ATE0();
while(1)
{
RECEIVE_MESSAGE();
}
}








这是头文件GSM.h
//----------------------------------------------
//本文件为存放子函数区域
//子函数功能为标准发送AT指令函数
//------------------------------------------------
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define RST 0X01
#define CMGF 0X02
#define CMGD 0X03
#define CREG 0X04
#define CMGR 0X05
#define CMGS 0X06
#define CSCA 0X07
#define ATDAT 0X08
#define SMST 0X09
#define TC35RET 0X00
uchar TC35_CON,SMS_NUM,SMS_RECEIVE;
uchar read_flag;
uchar i_TC35_RECE;
uchar i_receive,
TC35_RE[80],
TC35_MAX,
i_TC35;
///////需要改动的地方//////其他省份请自己百度下/////////////////////////////////////////////
uchar code TC_MDSJ2[]={"15620323981"}; //目的手机地址,
uchar code TC_ZXH2[]={"+8613800535500"}; //烟台移动本地中心号。
//uchar code TC_ZXH2[]={"+8613010161500"}; //烟台联通本地中心号。
////////其他地方不要乱动////////////////////////////////////////////////////////
uchar code TC_MDSJ1[]={"AT+CMGS="}; //目的手机地址,
uchar code TC_ZXH1[]={"AT+CSCA="}; //本地中心号。
uchar code TC_FSNR[]={"I AM OK"}; //发送短信内容。
uchar code TC_WLZT[]={"AT+CREG?"}; //网络状态查询
uchar code TC_MSXZ[]={"AT+CMGF=1"}; //发送模式选择。
uchar code TC_DQML[]={"AT+CMGR=1"}; //短信读取命令。
uchar code TC_SCML[]={"AT+CMGD=1"}; //短信删除命令。
uchar code TC_ATF[]={"AT&F"}; //格式化命令。
uchar code TC_ATE0[]={"ATE0"}; //清除回显命令
uchar code TC_SMS_1[]={"AT+CNMI=2,1,0;"}; //短信通知命令



void delay_GSM(uint i)
{ unsigned int i_delay,j_delay;
for(i_delay=0;i_delay<i;i_delay++)
{
for(j_delay=0;j_delay<100;j_delay++){;}
}
}



//串口中断初始化
void init_serialcom( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART为模式1,8位数据,允许接收
TMOD |= 0x21 ; //TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON |= 0x00 ; //SMOD=1;
TH1 = 0xFD ; //Baud:9600 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;

}



//向串口发送一个字符
void send_uart( char a_s)
{ // TI= 0 ;

while (TI!=1){;}
SBUF=a_s;
TI= 0 ;

}
//串口接收中断函数
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
i_receive=SBUF;
TC35_RE[i_TC35_RECE++]=i_receive;
// i_TC35_RECE++;
if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}



}
}

void SMS_CONFIG()
{
uchar i;
for(i=0;i<sizeof(TC_SMS_1)-1;i++)
{
send_uart(TC_SMS_1[i]);
}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=SMST;
}

void ATE0()
{
uchar i;
for(i=0;i<sizeof(TC_ATE0)-1;i++)
{
send_uart(TC_ATE0[i]);
}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=RST;
}
void ATNAME()
{//I AM OK
uchar i;
for(i=0;i<sizeof(TC_FSNR)-1;i++)
{
send_uart(TC_FSNR[i]);
}
delay_GSM(1000);
send_uart(0X1A);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=ATDAT;
}
//写目的手机的
void AT_CMGS()
{//AT+CMGS=13132061066
uchar i;
for(i=0;i<sizeof(TC_MDSJ1)-1;i++)
{
send_uart(TC_MDSJ1[i]);
}

send_uart(0X22);
for(i=0;i<sizeof(TC_MDSJ2)-1;i++)
{
send_uart(TC_MDSJ2[i]);
}
send_uart(0X22);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGS;
}


//写信息中心号
void AT_CSCA()
{//AT+CSCA=+8613010130500
uchar i;
for(i=0;i<sizeof(TC_ZXH1)-1;i++)
{
send_uart(TC_ZXH1[i]);
}
send_uart(0X22);
for(i=0;i<sizeof(TC_ZXH2)-1;i++)
{
send_uart(TC_ZXH2[i]);
}

send_uart(0X22);

send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CSCA;
}


//AT复位指令
void AT_RST()
{
uchar i;
for(i=0;i<sizeof(TC_ATF)-1;i++)
{
send_uart(TC_ATF[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=RST;
}


//AT网络状态查询指令
void AT_CREG()
{
uchar i;
for(i=0;i<sizeof(TC_WLZT)-1;i++)
{
send_uart(TC_WLZT[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CREG;
}

//AT接收格式指令
void AT_CMGF()
{//AT+CMGF=1
uchar i;
for(i=0;i<sizeof(TC_MSXZ)-1;i++)
{
send_uart(TC_MSXZ[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGF;
}


//AT短消息读取指令
void AT_CMGR()
{//AT+CMGR=1
uchar i;
for(i=0;i<sizeof(TC_DQML)-1;i++)
{
send_uart(TC_DQML[i]);
}

//send_uart(SMS_NUM+0x30);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGR;
}


//AT短消息删除指令
void AT_CMGD()
{//AT+CMGD=1
uchar i;
for(i=0;i<sizeof(TC_SCML)-1;i++)
{
send_uart(TC_SCML[i]);
}
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGD;
}





void RECEIVE_MESSAGE()
{
delay_GSM(10);
if(TC35_MAX>0)
{
if(TC35_CON==RST)
{
if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X00);
TC35_CON=TC35RET;
delay_GSM(10);
AT_CMGF();
}
//如果不成功则重新关闭回显
else
{
delay_GSM(10);ATE0();
}


}
else if(TC35_CON==CMGF)
{
if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X01);
TC35_CON=TC35RET;
delay_GSM(10);
AT_CREG();
}
else
{
AT_CMGF();
}
}
else if(TC35_CON==CREG)
{
if(((TC35_RE[9]=='0')&&(TC35_RE[11]=='1'))||((TC35_RE[9]=='0')&&(TC35_RE[11]=='5')))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X02);TC35_CON=TC35RET;
SMS_CONFIG();
}
else
{
S1=0;S2=0;S3=1;S4=0;
Displaybyte(0X00);
AT_CMGF();
}
}
else if(TC35_CON==SMST)
{
if((TC35_RE[2]=='O')&&(TC35_RE[3]=='K'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X03);
TC35_CON=TC35RET;
delay_GSM(10);
AT_CMGD();
}
}
else if(TC35_CON==CMGD)
{
if((TC35_RE[2]=='+')&&(TC35_RE[3]=='C')&&(TC35_RE[4]=='M')&&(TC35_RE[5]=='T')&&(TC35_RE[6]=='I'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0X04);
TC35_CON=TC35RET;
if(TC35_MAX==16)
{
SMS_NUM=(TC35_RE[14]-0x30);
}
else if(TC35_MAX==17)
{
SMS_NUM=((TC35_RE[14]-0x30)*10+(TC35_RE[15]-0x30));
}
delay_GSM(100);
AT_CMGR();
}
}
else if(TC35_CON==CMGR)
{
if((TC35_RE[2]=='+')&&(TC35_RE[3]=='C')&&(TC35_RE[4]=='M')&&(TC35_RE[5]=='G')&&(TC35_RE[6]=='R'))
{
S1=0;S2=1;S3=0;S4=0;
Displaybyte(0x05);
delay_GSM(100);


SMS_RECEIVE=TC35_RE[TC35_MAX-9];
S1=0;S2=0;S3=0;S4=1;
Displaybyte(SMS_RECEIVE-0x30);
delay_GSM(50);
AT_CMGD();

}

}






//复位接收组
for(i_TC35=0;i_TC35<=79;i_TC35++)
{
TC35_RE[i_TC35]=0;
}
i_TC35_RECE=0;
TC35_MAX=0;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。