/*#include <reg52.h>
#include <stdlib.h>
#include <ctype.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <def_bin.h> */
#include <STC.h>
unsigned char xdata T0_flag=0;
unsigned char xdata n1,n2,wifi_flag;
unsigned int xdata c1,c2; //计数变量
unsigned char xdata busy=0; // 串行发送忙标志
char *s1;
bit ReceivingF = 0;
bit EndF = 0;
bit RMCF = 0;
bit GGAF = 0;
bit VTGF = 0;
//*********************************************************************
// 传感器测试信号
unsigned char xdata xhbm; //信号编号
unsigned char xdata xhnrg; //信号内容高字节
unsigned char xdata xhnrd; //信号内容低字节
unsigned char xdata xhjs='0'; //信号结束符
unsigned char xdata io_date=0xff; //当前测试信号
unsigned char xdata T0H=0; //转速高字节
unsigned char xdata T0L=0; //转速低字节
//*********************************************************************
// GPS数据
//*********************************************************************
unsigned char xdata GPS_time[10]; //UTC时间
unsigned char xdata GPS_wd[12]; //纬度
unsigned char xdata GPS_jd[13]; //经度
unsigned char xdata GPS_warn; //定位警告
unsigned char xdata GPS_quality; //定位质量
unsigned char xdata GPS_status; //定位状态
unsigned char xdata GPS_alt[9]; //海拔
unsigned char xdata GPS_sv[3]; //使用卫星
unsigned char xdata GPS_direct[7]; //方位角
unsigned char xdata GPS_speed[7]; //速度
unsigned char xdata GPS_date[10]; //UTC日期
unsigned char Segment; //逗号(段)计数
unsigned char Bytes_counter;
unsigned char Bytes_c;
unsigned char Command;
/* LCY.C文件中的函数定义 */
void main (void);
void int_init (void); //中断设置
void com_init (void); //串行通信初始化设置
void cycl (void); //转速计算
void SendData(char dat); //串行通信字节发送
void rs232_init (void);
void SendString(char *s); //串行通信字符串发送
void com_tx(void);
void com_p(void); //串口接收数据转存发送区,指针加一
void p0_comm(void); // P0口数据判断处理
void p1_comm(void); // P1口数据判断处理
void p2_comm(void); // P2口数据判断处理
void p3_comm(void); // P3口数据(转速)处理
void wifi1(void); //串行口2转wifi发送:传输传感器信息
void wifi2(void); //串行口2转wifi发送:传输GPS信息
void gps(unsigned char); // GPS数据接收处理
void GPGGA(unsigned char); // GPGGA数据处理
void GPRMC(unsigned char); // GPRMC数据处理
void GPVTG(unsigned char); // GPVTG数据处理
/*主程序模块*/
void main (void)
{
com_init(); // 串行通信初始化 调用
int_init ();
EA=1;
while (1)
{
wifi_flag=0;
if(P0!=0xff && P0!=io_date)
p0_comm();
if(P1!=0xff && P1!=io_date)
p1_comm();
if(P2!=0xff && P2!=io_date)
p2_comm();
if (c1<20 && T0_flag==1) //转速#######
p3_comm();
}
}
// 传感器信号处理
void p0_comm(void)
{
io_date=P0;
xhbm=0x10;
xhnrg=0x00;
xhnrd=P0; //手刹、脚刹、行车灯、左转、右转、雾灯、远光、近光
wifi1();
}
void p1_comm(void)
{
io_date=P1;
xhbm=0x20;
xhnrg=0x00;
xhnrd=P1; //倒档、4档、3档、2档、null、null、1档、(加速度)
wifi1();
}
void p2_comm(void)
{
io_date=P2;
xhbm=0x30;
xhnrg=0x00;
xhnrd=P2; //Null、null、null、喇叭、车门、方向盘、离合、安全带
wifi1();
}
void p3_comm(void) //加速度
{
// io_date=P3;
xhbm=0x40;
xhnrg=T0H;
xhnrd=T0L;
wifi1();
}
/****************************************************/
//功能:传感器测试信号WIFI发送
//入口:void
//返回:void
//传感器信号传送:通过调用串行接口2进行“COM to WIFI(AP)"; 信号:xhbm、xhfx_xhqk、xhnrg、xhnrd。
/****************************************************/
void wifi1(void)
{
SendData(xhbm);
SendData(xhnrg);
SendData(xhnrd);
SendData(xhjs);
}
/****************************************************/
//功能:NMEA-183协议解析
//入口:void
//返回:void
//全局变更修改:GPS_*,Segment,command,Bytes_counter,NewByteF
/****************************************************/
void receive() interrupt 4 /*串行中断1:接收GPS信号*/
{
unsigned char tmp;
// char *s1;
RI = 0;
tmp = SBUF;
if(tmp == '$') //起始标志,对GPS数据判断变量初始化
{
Command = 0;
ReceivingF = 1;
Bytes_counter = 0;
Segment = 0; //清空语句段计数器
return;
}
if(ReceivingF) // ReceivingF = 1 表示已经进入某种GPS语句接收标志
{
if(tmp == ',') //','是每段结束的标志,每遇上1个,段标志+1(段标志从0开始)
{
++Segment;
Bytes_counter = 0; // 每段开始时,清空段字节计数器
return; // 此时,段不等于0,清空段字节计数器=0
}
if(tmp == '*') //‘*hh’校验和,是每种GPS语句的结束标志
{
ReceivingF = 0;
EndF = 1;
return;
}
if(Segment == 0)
{
if(Bytes_counter == 4) //段0,语句类型判断(从0开始)
switch(tmp)
{
case 'G': Command = 1;//语句类型 $GPGGA
GGAF = 1;
break;
case 'M': Command = 2;//语句类型 $GPRMC
RMCF = 1;
break;
case 'T': Command = 3;//语句类型 $GPVTG
VTGF = 1;
break;
default: Command = 0; //非有效数据类型,终止当前数据接收
ReceivingF = 0;
break;
}
}
else
{
switch(Command)
{
case 1: GPGGA(tmp); //每段开头,Bytes_counter = 0
break;
case 2: GPRMC(tmp);
break;
case 3:GPVTG(tmp);
break;
default:break;
}
}
++Bytes_counter;
}
// NewByteF = 0;
return;
}
void GPGGA(unsigned char tmp)
{
switch(Segment)
{
case 1: //每段Bytes_counter从0开始,本系统格式规定0字节放信号编码
if(Bytes_counter == 2 || Bytes_counter == 5) //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式
{
GPS_time[Bytes_counter+1] = ':';
++Bytes_counter;
GPS_time[0] = 0x10; //时间编号
GPS_time[9] = '\0';
}
if(Bytes_counter<9)
GPS_time[Bytes_counter+1] = tmp;
if (Bytes_counter==8)
{
// Bytes_c=Bytes_counter++;
s1=GPS_time;
wifi2();
}
break;
case 2: if(Bytes_counter == 4) //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式
{
GPS_wd[Bytes_counter+1] = '.'; //接收第二个字节后插入'.'
++Bytes_counter;
GPS_wd[0] = 0x11; //时间编号
GPS_wd[11] = '\0'; // 结束符
}
if(Bytes_counter<10)
GPS_wd[Bytes_counter+1] = tmp;
// if(Bytes_counter != 4)
//++Bytes_counter;
break;
case 3: GPS_wd[10] = tmp; //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)
// Bytes_c==11;
s1=GPS_wd;
wifi2();
break;
case 4: if(Bytes_counter == 5) //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式
{
GPS_jd[Bytes_counter+1] = '.'
评论0