#include
#include
#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 TC35RET 0X00
sbit IGT=P1^0;
uchar TC35_CON;
uchar i_TC35_RECE;
uchar TC35_RE[30],
TC35_MAX,
i_TC35;
extern uchar TC35_CON;
extern uchar i_TC35_RECE;
extern uchar i_receive,
TC35_RE[30],
TC35_MAX,
i_TC35;
void delay(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);
uchar code TC_MDSJ[]={"AT+CMGS=13969138509"};
//目的手机地址,
uchar code TC_ZXH[]={"AT+CSCA=+8613800531500"};
//本地中心号。
////////其他地方不要乱动//
uchar code TC_FSNR[]={"zhangkaiqiang"};
//发送短信内容。
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"};
//格式化命令。
void delay(uint i)
{
unsigned int i_delay,j_delay;
for(i_delay=0;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 |= 0x20 ;
//TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口发送一个字符
void send_uart( unsigned char ch)
{
while (TI==0);
TI= 0 ;
SBUF=ch;
}
//串口接收中断函数
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 ATNAME()
{
uchar i;
for(i=0;i {
send_uart(TC_FSNR[i]);
}
delay(1000);
send_uart(0X1A);
TC35_CON=ATDAT;
}
//写目的手机的
void AT_CMGS()
{
uchar i;
for(i=0;i {
send_uart(TC_MDSJ[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGS;
}
//写信息中心号
void AT_CSCA()
{
uchar i;
for(i=0;i {
send_uart(TC_ZXH[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CSCA;
}
//AT复位指令
void AT_RST()
{
uchar i;
for(i=0;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 {
send_uart(TC_WLZT[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CREG;
}
//AT接收格式指令
void AT_CMGF()
{
uchar i;
for(i=0;i {
send_uart(TC_MSXZ[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGF;
}
//AT短消息读取指令
void AT_CMGR()
{
uchar i;
for(i=0;i {
send_uart(TC_DQML[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGR;
}
//AT短消息删除指令
void AT_CMGD()
{
uchar i;
for(i=0;i {
send_uart(TC_SCML[i]);
}
send_uart(0X0D);
send_uart(0X0D);
send_uart(0X0A);
TC35_CON=CMGD;
}
void delay1(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=150;a>0;a--);
}
void GSM(void)
{
uchar shou=100;
IGT=0;
delay1();
IGT=1;
init_serialcom(); //初始化串口
delay(100);
TC35_MAX=0;
AT_RST();
while(shou--)
{
delay(100);
if(TC35_MAX>0)
{
if(TC35_CON==RST)//TC35_CON==0x01
{
if((TC35_RE[7]==O)&&(TC35_RE[8]==K))
{
TC35_CON=TC35RET;
AT_CMGF();
}
else
{}
}
//AT+CMGF 优先信息格式。执行格式有TEXT 方式和PDU 方式。
else if(TC35_CON==CMGF) //TC35_CON==0x02
{
if((TC35_RE[12]==O)&&(TC35_RE[13]==K))
{
TC35_CON=TC35RET; // delay(100);
AT_CREG();
}
else
{}
}
//AT+CREG 网络注册。获得手机的注册状态。
else if(TC35_CON==CREG)//TC35_CON==0x04
{
if(((TC35_RE[18]==0)&&(TC35_RE[20]==1))||((TC35_RE[18]==0)&&(TC35_RE[20]==5)))
{
TC35_CON=TC35RET;
AT_CMGD();
}
else
{
AT_CREG();
}
}
//AT+CMGR 读短信。信息从+CPMS 命令设定的存储器读取。
else if(TC35_CON==CMGR)//TC35_CON==0x05
{
if(TC35_MAX<=30)
{
AT_CMGR();
}
else //if((TC35_MAX==77)||(TC35_MAX==79))
{
if(TC35_RE[69]==0)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==1)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==2)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==3)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==4)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==5)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==6)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else if(TC35_RE[69]==7)
{
TC35_CON=TC35RET;
delay(100);
AT_CMGD();
}
else
{
TC35_CON=TC35RET;
AT_CMGR();
}
}
}
//AT+CMGD 删除短信息。删除一个或多个短信息。
else if(TC35_CON==CMGD)//TC35_CON==0x03
{
delay(100);
if((TC35_RE[12]==O)&&(TC35_RE[13]==K))
{
AT_CSCA();
}
else
{
}
}
//AT+CSCA 短信服务中心地址。
else if(TC35_CON==CSCA)//TC35_CON==0x07
{
delay(100);
if((TC35_RE[25]==O)&&(TC35_RE[26]==K))
{
AT_CMGS();
}
else
{
}
}
//填写发送内容
else if(TC35_CON==CMGS)//TC35_CON==0x06
{
delay(100);
if((TC35_RE[22]==0X3E)&&(TC35_RE[23]==0X20))
{
ATNAME();
}
else{}
}
//发送完毕返回继续扫描接收
else if(TC35_CON==ATDAT)//0x08
{
delay(100);
if((TC35_RE[0]==+)||(TC35_RE[0]==0x1A))
{
AT_CMGR();
}
else
{}
}
//复位接收组
for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
{
TC35_RE[i_TC35]=0;
}
i_TC35_RECE=0;
TC35_MAX=0;
}
}
}
void main()
{
GSM();
}