#include
//SIM300测验灯接口
sbit LED_S0= P1^7;
sbit LED_S1= P1^6;
sbit LED_S2= P1^5;
//BELL接口
sbit BELL= P1^4; //这儿以P1.4口的LED指示灯替代蜂鸣器接口
sbit LED_S7= P1^0; //AT+CPIN指令失利
//串口接纳数组
#define RxIn 90//界说接纳的数组长度为90
unsigned char idata SystemBuf[RxIn]; //贮存出口接纳数据
unsigned char Rx=0;
//AT指令表
unsigned char code AT[]=”AT”;//握手信号
unsigned char code ATZ[]=”ATZ”;//设备初始化
unsigned char code ATE0V1[]=”ATE0V1″;//关回显设置指令回来OK/V1 0/V0
unsigned char code AT_IPR[]=”AT+IPR=9600″; //波特率设置
unsigned char code AT_CPIN[]=”AT+CPIN?”;//查询SIM卡状况
unsigned char code AT_CSQ[] =”AT+CSQ”;//查询信号
unsigned char code ATH[]=”ATH”;//呼叫挂起
unsigned char code AT_COPS[]=”AT+COPS?”;//查询网络运营商
unsigned char code AT_CDSNORIP[]=”AT+CDNSORIP=0″;//GPRS IP 方法
unsigned char code AT_CIPHEAD[]=”AT+CIPHEAD=1″; //GPRS 接纳方法
unsigned char code AT_CIPSTART[]=”AT+CIPSTART=\”TCP\”,\”218.109.58.100\”,\”2003\””;//GPRS衔接方法\GPRS衔接地址(依据用户实践IP修正)\GPRS衔接的端口
unsigned char code AT_CIPSEND[]=”AT+CIPSEND”;//GPRS发送信息指令
unsigned char code AT_CIPCLOSE[]=”AT+CIPCLOSE”;//TCP衔接封闭
unsigned char code AT_CIPSHUT[]=”AT+CIPSHUT”;//GPRS衔接封闭
unsigned char code ATA[]=”ATA”;//来电接听
//守时TIMER0用
unsigned int timercount;//50MS守时器,
unsigned char timer_1S_cnt;
unsigned char timer_10S_cnt;
unsigned char timer_S_cnt;
//SIM300函数声明
void Delay_ms(unsigned i);
void UART_init(void);
void GSM_init(void);
void sendchar(unsigned char ch);
void sendstring(unsigned char *p);
void sys_init(void);
void clear_SystemBuf(void);
void BELL_UP(void);
unsigned char strsearch(unsigned char *ptr2,unsigned char *ptr1_at);//查字符串*ptr2在*ptr1中的方位
//延时函数
void delayms(unsigned int ii)//1ms延时函数
{
unsigned int i,x;
for (x=0;x
for (i=0;i<100;i++);
}
}
void delay(unsigned int i)
{
while(i!=0)
{
i–;
}
}
/*********************************************************************
** 函数称号: strsearch ()
** 函数功用: 在指定的数组里接连找到相同的内容
** 进口参数: ptr2要查找的内容, ptr1当时数组
** 出口参数: 0-没有 找到 >1 查找到
*********************************************************************/
unsigned char strsearch(unsigned char *ptr2,unsigned char *ptr1_at)//查字符串*ptr2在*ptr1中的方位
//本函数是用来查看字符串*ptr2是否彻底包含在*ptr1中
//回来: 0 没有找到
//1-255 从第N个字符开端相同
{
unsigned char i,j,k;
unsigned char flag;
if(ptr2[0]==0) return(0);
flag=0;
for(i=0,j=0;i
if(ptr1_at[i]==ptr2[j])
{//榜首个字符相同
for(k=i;k
if(ptr2[j]==0)//比较正确
return(i+1); //回来值是整数,不含0
if(ptr1_at[k]!=ptr2[j]) break;
}
j=0;
}
}
return(0);
}
/******************************************************************************************************************
//////////////////////函数void BELL();完成功用:////////////////////////////////////////////////////////////////////
*****************************************************************************************************************/
void BELL_UP()
{
BELL=0;
Delay_ms(2000);
BELL=1;
Delay_ms(2000);
}
/******************************************************************************************************************
//////////////////////函数void sendchar(uchar ch);完成功用:发送一字节数据//////////////////////////////////////////
*****************************************************************************************************************/
void sendchar(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/*****************************************************************************************************************
//////////////////////函数void sendstring(uchar *p);完成功用:经过串口发送字符串//////////////////////////////////
*****************************************************************************************************************/
void sendstring(unsigned char *p)
{
while(*p)
{
sendchar(*p);
p++;
}
sendchar(0x0D);
sendchar(0x0A);
}
/*****************************************************************************************************************
////////////////////////////////函数void Delay_ms(unsigned int i);完成功用:进行毫秒延时///////////////////////////////////
*****************************************************************************************************************/
void Delay_ms(unsigned int i)
{
unsigned int j;
for(;i>0;i–)
{
for(j=0;j<125;j++)
{;}
}
}
//—延时US——————————
void dmsec (unsigned int count)
{
unsigned int i;
while (count)
{
i =300;
while (i>0) i–;
count–;
}
}
/************************************************************************************************
********************************体系初始化*******************************************************
************************************************************************************************/
void sys_init(void)//UART TIMER0初始化
{
TH0 = 0xB8;
TL0 = 0x00; //20ms的时钟基准
//串口中止
TI=0;
RI=0;
SCON=0x50; //选用方法1
TMOD=0x20;
TMOD = (TMOD & 0xf0) | 1;//MODE 1
TH1=0xfd; //波特率为9600
TL1=0xfd;
PCON=0x00; //倍频0x80
IE = 0xb0; // EA XX ET2 ES ET0 EX0 ET1 EX1
TR1=1; //enable TIMER1
ES=1; //开串口开断
TR0=1; //串口接纳中止
ET0=0; //T0 中止
ET1=0; // T1 中止
EA=1;
timer_1S_cnt=0;
}
/******************************************************************************************************************
///////////////////函数void GSM_INIT(void);完成功用:初始化模块///////////////////////////////
******************************************************************************************************************/
void GSM_init(void)
{
Delay_ms(5000); //
Delay_ms(5000);
Delay_ms(5000); //等候模块发动并联网
while(1)
{
clear_SystemBuf();
sendstring(AT);
Delay_ms(1000);
if((SystemBuf[5]==O)&&(SystemBuf[6]==K))//判别是否模块初始化成功,成功的话模块会回复”OK”给单片机
{//假如单片机没有收到OK,就持续发送初始化指令/
LED_S0=~LED_S0;break; //P1.7指示灯亮
}
Delay_ms(1000);
}
sendstring(ATZ);//初始化
Delay_ms(1000);
sendstring(AT_IPR);//9600
Delay_ms(1000);
sendstring(ATE0V1);//封闭回显设置DCE为OK方法
Delay_ms(1000);
while(1)
{
clear_SystemBuf();
sendstring(AT_CPIN);//查询SIM卡状况
Delay_ms(1000);
// MOUDULE -> MCU
//[0D][0A]
//+CPIN: READY[0D][0A]
//[0D][0A]
//OK[0D][0A]
if((SystemBuf[18]==O)&&(SystemBuf[19]==K))
{
LED_S1=~LED_S1;break; //P1.6指示灯亮
}
Delay_ms(1000);//READY??
LED_S7=~LED_S7;
}
//GPRS初始化
//其他选用模块默认设置
sendstring(AT_CDSNORIP);Delay_ms(1000); //挑选域名仍是IP方法,这儿咱们选用IP形式
sendstring(AT_CIPHEAD); Delay_ms(1000); //接纳的数据带+IPD字符串
}
/****************************************************************************************************************/
///////////////////////////////////////void clear_SystemBuf();铲除串口接纳缓冲区/////////////////////////////////
/****************************************************************************************************************/
void clear_SystemBuf()
{
for(Rx=0;Rx
SystemBuf[Rx]=0x00;
}
Rx=0;
}
/******************************************************************************************************************
///////////////////函数void receive(void) interrupt 4 using 1;完成功用:经过串口接纳数据////////////////////////////
******************************************************************************************************************/
void receive(void) interrupt 4 using 1
{
if(RI)
{
if(Rx
SystemBuf[Rx]=SBUF;
Rx++;
}
RI=0;
}
}