/*****************************************************
*****功能: 单片机串口2取GPS时间经纬度等,然后通过GSM发送出去,同时显示发送出去的数据
串口1用于与GSM通信
*****单片机型号: STC12C5A32S2
*****调试者: 启蒙电子
*****调试日期: 2010.10.21
*****************************************************/
#include<STC_NEW_8051.H>
#include <absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/****************************************************************************/
//128*64引脚定义,串行控制显示
sbit RS = P2^6; //此管脚没用
sbit SID = P2^5; //数据
sbit SCLK = P1^1; //时钟
sbit PSB = P2^4;//0-串行,1-并行
#define comm 0
#define dat 1
#define x1 0x80
#define x2 0x88
#define y 0x80
#define comm 0
#define dat 1
//*****************************************************************//
sbit START_SIM=P1^4; //启动SIM300的控制端
sbit Key_sendMes=P3^4;//发短信息键
sbit KEY2=P3^5;//phone
/*****GPS取数据变量参数定义*****/
uchar idata comma;//逗号变量存储
//////////以下4个数组最后一个作为0,字符串结束标志/////////
uchar idata Time[11];//时间hour-2 bytes, minute-2 bytes,second-6 bytes
uchar idata Data_YMD[7]; //日期
uchar idata Longitude[11];//经度
uchar idata Latitude[10];//纬度
uchar idata haoma[16]; //收到短信的手机号码
////////时分秒///////////////
uchar idata hour[3];//最后一个作为0,字符串结束标志,显示时使用
uchar idata minute[3];
uchar idata second[7];
////////日月年///////////////
uchar idata day[3];//最后一个作为0,字符串结束标志
uchar idata month[3];
uchar idata year[3];
////////////////////////////////////////////////////////////
uchar count_T,count_Lati,count_Longi,count_Data;//串口接收 时间 纬度 经度 日期 接收数组计数 接收到的短信号码计数
uchar haoma_k=0;
uchar duanxin_sz;//短信设置
uchar zhentou_t=0,jiahao_a=0,kcz=0,kcz2=0,kcz3=0,duanxin_neirong=0,neirong_a,neirong_b,neirong_c,duanxin_js=0; //判断短信内容时的变量
uchar end_a,end_b,end_c;
uchar changdu=0; //经纬度长度计数 //判断短信内容时的变量
uchar num_comma;//逗号计数
uchar dudouhao=0;//读短信逗号计数
uchar GPS_state;//GPS资料可用状态
uchar N_or_S,E_or_W;//半球标志数据存储
uchar frame_flag;//接收到帧头标志
uchar data_flag;//接收数据标志
uchar duanxin_flag=0;//接收短信代码标志
uchar haoma_flag=0;//接收短信的手机号码标志
uchar fasong_flag=0;//发送短信代码标志
uchar duduanxin_flag=0;//读短信代码标志
uchar faduanxin_flag=0;//发送 读短信代码 标志
uchar shezhi_flag=0; //接受 “短信设置参数” 标志
uchar star_flag=0;// gps开始工作码标志
uchar shanduanxin_flag=0;// 删短信 标志
uchar Frame_header[5];
uchar duanxin_tishi[5]; //短信提示帧头存放数组
uchar overflow_count;//定时器0溢出中断计数
//////////////GSM使用////////////////////////////////////////
uchar code PhoneCall[]={"ATD15846613967;"};//打电话数据
uchar code TxtMode[9]={"AT+CMGF=1"}; //AT+CMGF=1短信模式设置Text模式;AT+CMGF=0PDU模式
uchar code duanxintishi[17]={"AT+CNMI=2,1,0,0,0"}; //短信提醒模式设置
uchar code MessCom_PhoneNum[21]={"AT+CMGS=\"13654545434\""};//发送短信AT指令头+接收短信号码
uchar code CenterNum[24]={"AT+CSCA=\"+8613800451500\""};//24个数(短信息中心号码设置)格式:\位转义字符,将""转移成字符
uchar code RecNum[11]={"13654545434"};//11个数(短信接收手机号码设置)
uchar code message[6] = {"Heoaa!"};//发送的短信内容
uchar code huixian[4] = {"ATE0"};//关 回显 代码
uchar code AT[2]={"AT"}; //联机命令
uchar code Enter[1]={0x0D};//回车键"\r"
uchar code duduanxin[9]={"AT+CMGR=1"}; //读短信命令
uchar code shanduanxin[9]={"AT+CMGD=1"}; //删短信命令
//uchar idata send_data[11]={0x41,0x42,0x43,0x44,0x45,0x46,0x35,0x36,0x37,0x38,0};
uchar idata Frequency[5]={0x35,0x30,0x2E,0x30,0x30};//测试使用
uchar idata Voltage[6]={0x32,0x32,0x35,0x2E,0x36,0x30};
/****************************************************************************/
//函数声明
void lcm_w_word(uchar addr,unsigned char *str) ; //写字符 例:lcm_w_word("您好!");
void lcm_w_test(bit start,unsigned char ddata); //(0,指令) (1,数据)
void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm
void lcm_w_char(unsigned char add,unsigned char value); //写一个字符给lcm
void delaynms(unsigned int di); //延时
void lcm_init(void); //lcm初始化
void lcm_clr(void); //清屏
delay_Xms(uint t)
{
uint i,j;
for(i=t;i>0;i--)
for(j=920;j>0;j--);//89:113;12:920
}
/**************串口1程序**********/
void serial_port_one_initial()//初始化串口
{
EA=0;
ES=0;
TMOD=0x21;
TH1=0xfd;// 波特率9600 11.0592M
TL1=0xfd;
PCON=0x00;
SCON=0x50;//方式1,10位(1起始8数据1停止),允许接受
TR1=0x01;//启动定时器
EA=1;
ES=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)
_nop_();
}
}
/*******************************************************/
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++);
}
}
//串口接收中断函数
void recv_serial_one() interrupt 4 using 1
{
uchar temp=0;
RI=0;//清除标志位
if(shezhi_flag==1)
{
shezhi_flag=0;
duduanxin_flag=0;
duanxin_sz=SBUF;
// Send_Char(duanxin_sz);
star_flag=1;//开始工作
shanduanxin_flag=1;
}
if(duduanxin_flag==0)
{
//第一位
if(SBUF==0X2B && zhentou_t==0)
{
jiahao_a=1;//判断是否接到 “+”
duanxin_tishi[zhentou_t] = SBUF;
zhentou_t++;
}
//第二位
if(jiahao_a==1 && zhentou_t==1 && SBUF==0x43 )
{
duanxin_tishi[zhentou_t] = SBUF;
zhentou_t++;
}
//第三位
if(jiahao_a==1 && zhentou_t==2 && SBUF==0x4D )
{
duanxin_tishi[zhentou_t] = SBUF;
zhentou_t++;
}
//第四位
if(jiahao_a==1 && zhentou_t==3 && SBUF==0x54 )
{
duanxin_tishi[zhentou_t] = SBUF;
zhentou_t++;
}
//第五位
if(jiahao_a==1 && zhentou_t==4 && SBUF==0x49 )
{
duanxin_tishi[zhentou_t] = SBUF;
}
////判断收到的帧头是否是 +CMTI *****
if((duanxin_tishi[0]==0x2B)&&(duanxin_tishi[1]==0x43)&&(duanxin_tishi[2]==0x4D)&&(duanxin_tishi[3]==0x54)&&(duanxin_tishi[4]==0x49))
{
if(kcz<8)
{
kcz++; //空操作
}
else
{
kcz=0;
duanxin_tishi[0]=0;
duanxin_tishi[1]=0;
duanxin_tishi[2]=0;
duanxin_tishi[3]=0;
duanxin_tishi[4]=0;
faduanxin_flag=1;//发送 读短信代码 标志
duduanxin_flag=1;
zhentou_t=0;
}
}
}
if(duduanxin_flag==1)
{
if(dudouhao==1)
{
haoma[haoma_k] = SBUF;
haoma_k++;
}
if(dudouhao==4) //如果接到4个“逗号" 清零
{
kcz2++; //空操作
if(kcz2==15)
{
kcz2=0;
dudouhao=0;
haoma_k=0;
duanxin_neirong=1;
}
}
if(duanxin_neirong==1)
{
duanxin_js++;
if(duanxin_js==1)
{
if(SBUF==0x21)//如果接收到 感叹号 “!” -ASCCII码0x21
{
neirong_a=1;
end_a=1;
}
else
{
duanxin_js=0;
duduanxin_flag=0;
duanxin_neirong=0;
shanduanxin_flag=1; //垃圾短信删掉
}
}
if(neirong_a==1 )
{
if(SBUF==0x73) //"s"
{
neirong_b=1;
}
if(neirong_b==1 )
{
if(SBUF==0x74) //"t"
{
duanxin_js=0;
duanxin_neirong=0;
neirong_a=0;
neirong_b=0;
neirong_c=0;
shezhi_flag=1; //接收 “短信设置参数” 标志
}
}
}
if(end_a==1)
{
if(SBUF==0x65) // "e"
{
end_b=1;
}
if(end_b==1)
{
if(SBUF==0x6E) //"n"
{
end_c=1;
}
}
if(end_c==1)
{
if(SBUF==0x64) //"d"
{
end_a=0;
end_b=0;
end_c=0;
duduanxin_flag=0;
Send_Char('u');
shanduanxin_flag=1;
}
}
}
}
if(SBUF==0x2C)//帧起始符号 "逗号" -ASCCII码0x2c
{
dudouhao++;//逗号计数加1
}
}
/* if(jiahao_a==1)
{
if(zhentou_t<5)
{
duanxin_tishi[zhentou_t] = SBUF; //接收短信提示帧头
zhentou_t++;
}
if(zhentou_t==5)
{
jiahao_a=0;
////判断收到的帧头是否是 +CMTI *****
if((duanxin_tishi[0]==0x2B)&&(duanxin_tishi[1]==0x43)&&(duanxin_tishi[2]==0x4D)&&(duanxin_tishi[3]==0x54)&&(duanxin_tishi[4]==0x49))
{
faduanxin_flag=1;//发送 读短信代码 标志
zhentou_t=0;
}
//**********判断收到的帧头是否是 +CMGR *********************
if((duanxin_tishi[0]==0x2B)&&(duanxin_tishi[1]==0x43)&&(duanxin_tishi[2]==0x4D)&&(duanxin_tishi[3]==0x47)&&(duanxin_tishi[4]==0x52))
{
zhentou_t=0;
// duduanxin_flag=1;
Send_Char('s');
}
}
}
/*
if(duduanxin_flag==1)
{
if(dudouhao==1)
{
haoma[haoma_k] = SBUF;
haoma_k++;
}
if(dudouhao>=4) //如果接到4个“逗号" 清零
{
dudouhao=0;
haoma_k=0;
t=0;
}
if(duanxin_flag==1)//开始接收短内容代码
{
if(SBUF==0x73) //"s"
{
temp=1;
}
if(temp==1)
{
if(SBUF==0x74) //"t"
{
star_flag=1 ;//gps开始工作标志位
duanxin_flag=0;
duduanxin_flag=0;
temp=0;
}
}
}
if(SBUF==0x2C)//帧起始符号 "逗号" -ASCCII码0x2c
{
dudouhao++;//逗号计数加1
}
if(SBUF==0x21)//如果接收到 感叹号 “!” -ASCCII码0x21
{
duanxin_flag = 1;
}
}*/
// else
// {
// TI = 0;
// }
}
//串口查询接收函数
/*uchar recvSer()
{
uchar dat;
RI=0x00;
while(!RI)
{
_nop_();
}
dat=SBUF;
return(dat);
}*/
/*************************************************************/
/**********************GSM/GPRS模块程序**********************************/
start_SIM300() //启动SIM300的函数
{
START_SIM=1;//启动SIM300
delay_Xms(2800);// 时间必须大于1500ms
START_SIM=0;//完成启动 //此后一直保持高电平
}
void GSM_AT() //发"AT"的函数
{
Send_Str(AT,2);
Send_Char('\r'); //以回车作为结束符号,手机才能识别
ES=1;
delay_Xms(100); //延时
}
/***************************短信**********************************/
void GSM_huixian() //ATE0 关闭 回显
{
Send_Str(huixian,4);
Send_Char('\r');
ES=1;
delay_Xms(1000);
}
void GSM_TXT() //发送AT+cmgf=1 设置短信模式Text
{
Send_Str(TxtMode,9);
Send_Char('\r');
ES=1;
delay_Xms(1000);
}
void GSM_tishi() //发送AT+CNMI=2,1,0,0,0 设置来短信提示模式
{
Send_Str(duanxintishi,17);
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_Str(message,6);
//Send_Str(send_data,10);
/*day[0] = ddata/10+0x30;//日
day[1] = ddata%10+0x30;
month[0] = mmonth/10+0x30;//月
month[1] = mmonth%10+0x30;
year[0] = yyear/10+0x30;//年
year[1] = yyear%10+0x30;
hour[0] = T_hour/10+0x30;//时
hour[1] = T_hour%10+0x30;
minute[0] = Time[2];//分
minute[1] = Time[3];
for(i=0;i<6;i++) //秒
second[i] = Time[i+4];
//////////////经纬度///////////////
lcm_w_word(0x88,Latitude);//显示纬度
lcm_w_char(0x8E,N_or_S);//lcm_w_test(1,N_or_S);//北南半球
lcm_w_char(0x8F,GPS_state);//lcm_w_test(1,GPS_state);//显示GPS资料状态A-可用 V-不可用
lcm_w_word(0x98,Longitude);//显示经度
lcm_w_char(0x9E,E_or_W);//lcm_w_test(1,);//东西半球
// Send_Str(Voltage,6);
// Send_Str(Frequency,5);
// Send_Str(hour,2);
// Send_Str(minute,2);
// Send_Str(second,6);
// Send_Str(year,2);
// Send_Str(month,2);
// Send_Str(day,2); */
Send_Char(duanxin_sz);
Send_Str(haoma,16);//测试
// Send_Char(changdu);
Send_Str(Latitude,9);//纬度
Send_Char(N_or_S);
Send_Str(Longitude,10);//经度
Send_Char(E_or_W);
Send_Char(0x1a); //发送结束标志位(CTRL+Z )
delay_Xms(1000);
}
void GSM_duduanxin() //读短信
{
Send_Str(duduanxin,9);
Send_Char('\r');
ES=1;
delay_Xms(1000);
}
void GSM_shanduanxin() //删短信位置1
{
Send_Str(shanduanxin,9);
Send_Char('\r');
ES=1;
delay_Xms(1000);
}
/**********************拨号的程序*********************************/
void phone()
{
Send_Str(PhoneCall,15);//{"ATD15846613967;"};//打电话数据
Send_Char('\r');
ES=1;
delay_Xms(5000);
delay_Xms(5000);
}
/**********************串口2程序*******************************/
void serial_port_two_initial()//初始化串口2
{
// 波特率9600 11.0592M
EA = 0;
S2CON|= 0x50;//方式1,10位(1起始8数据1停止),允许串口2接收
BRT = 0xFD;//设置独立波特率发生器 BRT 的自动重装数
AUXR|= 0x10;//BRTR位=1启用独立波特率发生器
AUXR1= 0x00;
IE2 = 0x01;//开串口2中断ES2=1;
EA = 1;//开总中断
}
|