/***************************************************************
GPS GPRS 发短信
博客:www.guooge.com
作者:lurker
QQ:313919848
GPRS: sim300 工业模块
GPS : GR-87
单片机: STC12C5A60S2
****************************************************************/
#include <STC12C5A60S2.H>
#include <absacc.h>
#include <intrins.h>
sbit led=P0^2;
#define FOSC 11059200
#define BAUD 9600
#define uint unsigned int
#define uchar unsigned char
/************************************************
函数声明
************************************************/
Send_Str(uchar * str,uint len);
Send_Char(uchar ch);
void Send_GPS();
/************************************************
GPRS 用
*************************************************/
uchar code PhoneCall[]={ "ATD15265316871;"};//打电话数据 改为你要打电话的号码
uchar code TxtMode[9]={ "AT+CMGF=1"}; //AT+CMGF=1短信模式设置Text模式;AT+CMGF=0PDU模式
uchar code MessCom_PhoneNum[21]={ "AT+CMGS=\"15265316871\""};//发送短信AT指令头+接收短信号码 改为你要发送短信的目标手机的号码
uchar code CenterNum[24]={ "AT+CSCA=\"+8613800531500\""};//24个数(短信息中心号码设置)格式:\位转义字符,将""转移成字符 此号码不要改这是中心号码
uchar code RecNum[11]={ "15265316871"};//11个数(短信接收手机号码设置) 改为接受短信的号码
uchar code umkk[]={ "AT+CLPORT=\"UDP\",\"8002\""};
uchar code sendtext[]={ "AT+CIPSEND"};
uchar code CloseGprs []={ "AT+CIPCLOSE"};
uchar code gprs_server []={ "AT+CIPSTART=\"UDP\",\"123.232.109.4\",\"8002\""};
uchar code AT[2]={ "AT"}; //联机命令
uchar code Enter[1]={0x0D};//回车键"\r"
/**********************************************
定义GPS接收标志
***************************************************/
unsigned char rev_data=0;//数据缓存
unsigned char Num_comma=0;//逗号纪录数
unsigned char read_start=0;//开始接收数据标志位
unsigned int jdindex=0;wdindex=0,jd,wd;//索引
unsigned char wd_buf[10]={ "0111111111"};//纬度
unsigned char jd_buf[12]={ "022222222222"};//经度
unsigned rev_flag=0,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;//接收标志位:GPGGA
/********************************************************
gps标志初始话
********************************************************/
void init_data()
{
rev_flag=0,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,read_start=0;
jdindex=0;wdindex=0,jd=0,wd=0;
Num_comma=0;
}
/********************************************************
延时函数
*********************************************************/
delay_Xms(uint t)//延时函数
{
uint i,j;
for(i=t;i>0;i--)
for(j=920;j>0;j--);
}
/********************************************************
串口中断程序
*********************************************************/
void recv_serial_one() interrupt 4 using 1 //串口1中断函数
{
uchar RecvChar;
if (RI == 1)
{
RI = 0;
RecvChar = SBUF;
Send_Char(RecvChar);
}
else
{
TI = 0;
}
}
void Uart2() interrupt 8 using 1 //串口2中断函数
{
uchar rev_data;
if ((S2CON & 0x01) == 1)
{
S2CON &= 0xFE;
rev_data=S2BUF;
if(rev_data=='$')
flag1=1;
if(rev_data=='G'&&flag1==1)
flag2=1;
if(rev_data=='P'&&flag1==1)
flag3=1;
if(rev_data=='R'&&flag1==1)
flag4=1;
if(rev_data=='M'&&flag1==1)
flag5=1;
if(rev_data=='C'&&flag1==1)
read_start=1;
//开始接收
if(read_start==1)
{
if(rev_data==',')
{
Num_comma++;
}
if(Num_comma==3)
{
wd_buf[wdindex]=rev_data;
S2BUF=wd_buf[wdindex];
wdindex++;
}
if(Num_comma==5)
{
jd_buf[jdindex]=rev_data;
S2BUF=jd_buf[jdindex];
jdindex++;
}
if(Num_comma==6)
{
init_data();
IE2 = 0x00;
led=1;
Send_GPS();
}
}
}
}
/*********串口1发送程序*********************
bb为数据缓冲区,count为要发送的字节数
******************************************/
void sendSer_one(uchar *bb,uchar count)
{
uchar i;
TI=0;
for(i=0;i<count;i++)
{
TI=0;
SBUF=bb[i];
while(!TI) ;
}
}
/**********************************************************
串口初始化
***********************************************************/
void serial_port_one_initial()//初始化串口 1
{
EA=0;
ES=0;
TMOD=0x20;
TH1=0xFD;// 波特率9600 11.0592M
TL1=0xFD;
PCON=0x00;
SCON=0x50;//方式1,10位(1起始8数据1停止),允许接受
TR1=0x01;//启动定时器
EA=1;
ES=1;
}
void serial_port_two_initial()//串口2初始化
{
EA=0;
S2CON = 0x5a; //8位可变波特率 (无校验位)
BRT = -(FOSC/32/BAUD); //设置独立波特率发生器的重载初值
AUXR = 0x14; //独立波特率发生器工作在1T模式
IE2 = 0x01; //使能串口2中断
EA = 1; //开总中断
}
/***********************************************************
GPRS 程序
*************************************************************/
Send_Char(uchar ch)//串口1发送单个字符
{
ES = 0;
SBUF = ch; //送入缓冲区
while(TI == 0); //等待发送完毕
TI = 0; //软件清零
ES = 1;
}
Send_Str(uchar * str,uint len)//串口1发送字符串,调用Send_Char() len字符串长度
{
while(len--)
{
Send_Char(*str++);
}
}
/**********************GSM/GPRS模块程序**********************************/
void GSM_AT() //发"AT"的函数
{
Send_Str(AT,2);
Send_Char('\r'); //以回车作为结束符号,手机才能识别
ES=1;
delay_Xms(100); //延时
}
/***************************短信**********************************/
void GSM_TXT() //发送AT+cmgf=1 设置短信模式Text
{
Send_Str(TxtMode,9);
Send_Char('\r');
ES=1;
delay_Xms(1000);
}
void GSM_CMGS() //发送AT+cmgs= (发短信的命令)
{
Send_Str(MessCom_PhoneNum,21);
Send_Char('\r');
ES=1;
delay_Xms(100);
}
//设置短信接收手机号码
void Mess_PhoneNum()//设置短信接收手机号码
{
Send_Str(RecNum,11);
delay_Xms(100);
}
//设定中心号码
void center_num() //发中心号码
{
Send_Str(CenterNum,24);
Send_Char('\r');
delay_Xms(100);
}
//发送短信息函数
void Text_message() 短信内容message[]
{
Send_Char(0x1a); //发送结束标志位(CTRL+Z )
delay_Xms(1000);
}
/**********************发送GPS数据*********************************/
void Send_GPS()
{
delay_Xms(10);
GSM_AT(); //发送AT
delay_Xms(100);
led=1;
center_num();//发送短信息中心号码
GSM_TXT();//设置为Text模式
delay_Xms(1000);
center_num();//发送短信息中心号码
GSM_TXT();//设置为Text模式
GSM_AT(); //发送AT
delay_Xms(10);
//发送短信息,此程序上电自动发送短信到指定手机 只发一次。
GSM_CMGS();//发短信命令+接收短信号码
for(wdindex=1;wdindex<10;wdindex++)
{
Send_Char(wd_buf[wdindex]);
}
for(jdindex=0;jdindex<12;jdindex++)
{
Send_Char(jd_buf[jdindex]);
}
Send_Char(0x1a); //发送结束标志位(CTRL+Z )
delay_Xms(1000);
IE2 = 0x01;
delay_Xms(1000);
led=0;
}
void Send_Gprs()
{
Send_Str(umkk,23);//指定本地端口
Send_Char('\r');
delay_Xms(1000);
Send_Str(gprs_server,40);
Send_Char('\r');
delay_Xms(1000);
Send_Str(sendtext,10);
Send_Char('\r');
delay_Xms(1000);
for(wdindex=1;wdindex<10;wdindex++)
{
Send_Char(wd_buf[wdindex]);
}
for(jdindex=0;jdindex<12;jdindex++)
{
Send_Char(jd_buf[jdindex]);
}
Send_Char(0x1a); //发送结束标志位(CTRL+Z )
delay_Xms(500);
Send_Str(CloseGprs,11);
Send_Char('\r');
delay_Xms(500);
}
void main() //主函数
{
led=0;
serial_port_one_initial();//初始化串
serial_port_two_initial();//初始化串口2
IE2 = 0x00;
Send_GPS();
Send_Gprs();
led=1;
while(1)
{
}
}
转载自 http://guooge.com/archives/226.html