📄 main.c
字号:
/*
**********************************************************************************************
*
* 文件功能:主程序处理
*
**********************************************************************************************
*/
#define W77E58
#include "myfile.h"
#include "main.h"
#include "can.h"
#include "gprs_program.h"
#include "general.h"
#include "ABSACC.H"
/*
*********************************************************************************************
*
* 所用的全局变量
*
*********************************************************************************************
*/
uchar xdata cg_mSec;
uchar xdata cg_Sec;
uchar xdata cg_Min;
uchar xdata cg_DispStatus; //显示状态
uchar xdata cg_DispCycTime; //循环显示时间
uchar xdata cg_DispPeopleCount; //显示记录的时间
uchar xdata TimeCount; //时间计时,计数单位(定时器0----20ms)
uchar xdata cg_ExtInter;
uchar xdata cg_CanComId;
uchar xdata cg_CanTarget;
uchar xdata cg_LedBuff[8]; //
uchar xdata cg_GprsComId; //gprs发送命令ID号
uchar xdata cg_GprsErrorCount; //gprs出错计数
int xdata cg_TotalPeople;
uchar xdata cg_CanCheckTime; //can网络定时检测间隔
uchar xdata cg_GprsCheckTime; //Gprs网络定时检测间隔
uchar xdata cg_GprsConnectTime; //gprs
uchar xdata cg_CanRequireTime; //can
uchar xdata cg_GprsFlashCount;
uchar xdata cg_GprsTxTimeCount; //
uchar xdata cg_GprsGpsTxTime;
S_SEND_QUENE xdata sg_CanSendQuene;
S_OVER_TIME xdata sg_CanOver;
S_TIME xdata sg_Time;
S_DATE xdata sg_Date;
S_LED xdata sg_CanLed;
S_LED xdata sg_CanLedBuff;
S_LED xdata sg_GprsLed;
S_LED xdata sg_GprsLedBuff;
bit bg_Gps;
bit bg_Gprs;
bit bg_Disp;
bit bg_DispPeople; //显示人数标志
bit bg_CanRst;
bit bg_DataTxGprs;
bit bg_GprsRedStatus;
bit bg_GprsRepeat; //gprs 重发标志
bit bg_PsmfNew;
bit bg_PsmhNew;
bit bg_GpsFirst; //
/*
*********************************************************************************************
*
* 所用到的外部变量
*
*********************************************************************************************
*/
extern bit bg_CanRx;
extern bit bg_GprsRxData; //gprs收到一帧数据
extern S_GPRS_COLLECT_REPORT xdata sg_GprsReport;
extern S_GPRS_COLLECT_REPORT xdata sg_GprsCollectReport;
extern S_SAVE_QUENE xdata sg_GprsSendQuene;
extern S_PSMF_REPORT xdata sg_PsmfReport; //
extern S_PSMF_REPORT xdata sg_PsmhReport; //
extern uchar xdata cg_GprsOverCount;
extern bit bg_GprsOverFlag;
extern uchar xdata cg_GprsRecDataBuff[GPRS_REC_DATA_SIZE];
extern char xdata cg_IpAddr[];
extern char xdata cg_Port[];
extern uchar xdata cg_CanTxTime;
extern bit bg_CanSinger;
extern bit bg_GpsZdaRx;
extern bit bg_GpsRmcRx;
extern bit bg_PsmfNull;
extern bit bg_PsmhNull;
extern bit bg_GprsRst;
extern bit bg_GprsRedFlash; //gprs 红灯闪烁标志
extern S_SYS_ID xdata sg_Psmf; //PSMF ID
extern S_SYS_ID xdata sg_Psmh; //PSMH ID
extern S_SYS_ID xdata sg_Ccm; //CCM ID
extern S_SYS_ID xdata sg_Assm; //ASSM ID
extern uchar xdata cg_CanErrCount;
extern bit bg_GprsRxByteOver; //gprs 接收单字节超时标志
extern uchar xdata cg_GprsRxByteCount; //gprs 接收单字节超时计数
extern long xdata gl_PrevLongi;
extern long xdata gl_PrevLati;
extern uchar xdata gc_GpsErrorCount;
extern ulong xdata gl_GpsError;
extern ulong xdata gl_GpsCorrect;
extern uint xdata gu_GpsIntervalTime;
extern bit bg_GprsRxFirst; //接收到gprs第一次回复标志
extern bit bg_GprsRxHead;
extern bit bg_GprsCr;
extern bit bg_GprsRecSE;
extern bit bg_GprsDataHead;
/*
*********************************************************************************************
*
* 所用到的外部函数
*
*********************************************************************************************
*/
extern void CanTxDeal(uchar ComId,uchar Target);
extern void TakeOutDeal(uchar *pComId,uchar *pTarget,S_SEND_QUENE *pSave);
extern uchar CanIni(void);
extern uchar CanTest(void);
extern void CanRxDeal(void);
extern void LedIni(void);
extern void LedDisp(uchar *cl_Data);
extern void delay(uchar i);
extern void SaveDeal( uchar ComId,uchar Target, S_SEND_QUENE *pSave);
extern void GprsSerialIni();
extern uchar GprsStartUp();
extern uchar GprsConnect(uchar *IpAddr, uchar *Port);
extern void GprsTxDeal(ComId);
extern void GprsRxDeal(void);
extern void TakeOutQuene(uchar *pComId, S_SAVE_QUENE *pSave);
extern void SendComm(uchar ComId, S_SAVE_QUENE *pSaveQuene);
extern void GpsFormat(void);
extern void Extint0(uchar cl_Buff);
extern void GpsDataSelect(void);
/*
*********************************************************************************************
*
* 定义的内部函数
*
*********************************************************************************************
*/
void DispError(uchar n);
void LedClear();
void DispDeal(uchar n);
void LightDeal(void);
uchar GprsRepeatConnect(void);
/*
*********************************************************************************************
*
* 主程序处理
*
*********************************************************************************************
*/
void main(void)
{
uchar i;
uchar cl_Buff;
#ifdef W77E58
// CD1CD0=01, 4 Clocks/Machine , 10 -- 64 clocks/machine, 11 -- 1024
PMR = 0x40;
// select external osc.
EXIF = 0x08;
// no baud rate double
PCON = 0;
// 1/12 clock source
CKCON &= 0xef;
#endif
// no use
T2CON = 0x34;
// Gate C/T M1M0 = 01, 18 bits, no prescale
TMOD = 0x21;
//#endif
bg_Disp = 1;
//cg_ExtInter = 0x20;
// EXT_INTER = cg_ExtInter;
sg_GprsCollectReport.Time.Sec = 0x01;
sg_GprsCollectReport.Time.Min = 0x02;
sg_GprsCollectReport.Time.Hour = 15;
sg_GprsCollectReport.Date.Year = 2004;
sg_GprsCollectReport.Date.Month = 5;
sg_GprsCollectReport.Date.Day = 8;
sg_GprsCollectReport.Date.Week = 6;
sg_GprsCollectReport.PassengerStat.In = 6;
sg_GprsCollectReport.PassengerStat.Out = 9;
sg_GprsCollectReport.PassengerStat.Door = 0;
sg_GprsCollectReport.GpsInfo.Longitude = 121 * 600000;
sg_GprsCollectReport.GpsInfo.Latitude = 31 * 600000;
sg_GprsCollectReport.GpsInfo.Altitude = 300;
sg_GprsCollectReport.GpsInfo.Speed = 400;
sg_GprsCollectReport.GpsInfo.Direction = 180;
sg_GprsCollectReport.GpsInfo.Flag = 'V';
sg_GprsReport.GpsInfo.Longitude = 121 * 600000;
sg_GprsReport.GpsInfo.Latitude = 31 * 600000;
sg_GprsReport.GpsInfo.Altitude = 300;
sg_GprsReport.GpsInfo.Speed = 400;
sg_GprsReport.GpsInfo.Direction = 180;
sg_GprsReport.GpsInfo.Flag = 0;
cg_DispPeopleCount = 0;
sg_CanLed.GreenOn = 0; //初始化can指示灯
sg_CanLed.GreenOff = 0;
sg_CanLed.RedOn = CAN_LED_NORMAL_ON;
sg_CanLed.RedOff = CAN_LED_NORMAL_OFF;
sg_CanLedBuff.GreenOn = 0;
sg_CanLedBuff.GreenOff = 0;
sg_CanLedBuff.RedOn = 0;
sg_CanLedBuff.RedOff = 0;
sg_Psmf.Id = 0xff;
sg_Psmh.Id = 0xff;
sg_PsmhReport.In = 0;
sg_PsmhReport.In = 0;
sg_PsmhReport.Out = 0;
sg_PsmhReport.Out = 0;
sg_PsmfReport.In = 0;
sg_PsmfReport.In = 0;
sg_PsmfReport.Out = 0;
sg_PsmfReport.Out = 0;
bg_PsmfNew = 0;
bg_PsmhNew = 0;
gl_PrevLongi = 121.0 * 600000;
gl_PrevLati = 31.0 * 600000;
gc_GpsErrorCount = 0;
gl_GpsError = 0;
gl_GpsCorrect = 0;
bg_DispPeople = 1; //初始化显示时间
cg_GprsTxTimeCount = 0;
//初始化定时器0
TH0 = TIME0H;
TL0 = TIME0L;
TMOD = 0X21; //T1 工作方式为8位自动重装载
ET0 = 1;
TR0 = 1;
EA = 1;
LedIni();
for(cl_Buff=0; cl_Buff<8; cl_Buff++)
{
cg_LedBuff[cl_Buff] = 8;
}
LedDisp(cg_LedBuff);
if(!GPS_Y)
{
// GPS Yes
bg_GpsFirst = 0;
bg_Gps = 1;
cg_ExtInter |= GPS_ON;
EXT_INTER = cg_ExtInter; //打开GPS
//
#ifdef W77E58
// sm0_1 sm1_1 sm2_1 ren_1
SCON1 = 0x50;
TH1 = 250;
TL1 = 250;
ET1 = 1;
ES1 = 1;
TR1 = 1;
#endif
}
else
{
//GPS no
bg_Gps = 0;
}
if(!GPRS_Y)
{
//GPRS yes
sg_GprsSendQuene.Len = 0;
sg_GprsSendQuene.Position = 0;
cg_GprsRecDataBuff[0] = 0;
GprsSerialIni();
cl_Buff = GprsStartUp(); //启动GPRS,连接上网
cg_GprsConnectTime = 0; //gprs重新建链时间清0
if(cl_Buff != 0)
{
//gprs启动失败
bg_Gprs = 0;
DispError(2);
delay(10);
}
else
{
cg_ExtInter &= GPRS_RED_OFF; //gprs工作正常
EXT_INTER = cg_ExtInter;
bg_Gprs = 1;
bg_GprsRxData = 0;
}
}
else
{
//Gprs no
bg_Gprs = 0;
}
while(1)
{
//检测can,直到can工作正常
cl_Buff = CanTest();
cl_Buff = CanIni();
cl_Buff = CAN_IER;
i = 0;
while((i<100) && (cl_Buff != CAN_IER_SET))
{
cl_Buff = CanIni();
cl_Buff = CAN_IER;
if(cl_Buff == CAN_IER_SET)
{
break;
}
i ++;
}
if(cl_Buff != CAN_IER_SET)
{
//can work erro,disp erro ID
//DispError(CAN_ERR);
sg_CanLed.RedOn = 5;
sg_CanLed.RedOff = 0;
}
else
{
//can 工作正常,初始化
sg_CanLed.GreenOn = CAN_LED_NORMAL_ON;
sg_CanLed.GreenOff = CAN_LED_NORMAL_OFF;
sg_CanLed.RedOn = 0;
sg_CanLed.RedOff = 0;
sg_CanOver.Flag = CAN_OVER_TIME_INVALID;
sg_CanOver.Count = 0;
sg_CanSendQuene.Len = 0;
sg_CanSendQuene.Position = 0;
sg_Psmf.Flag = LABLE_INVALID;
sg_Psmh.Flag = LABLE_INVALID;
sg_Ccm.Flag = LABLE_INVALID;
sg_Assm.Flag = LABLE_INVALID;
bg_CanRst = 0;
cg_CanErrCount = 0;
cg_CanTxTime = 0;
bg_PsmfNull = 1;
bg_PsmhNull = 1;
break;
}
}
SaveDeal(BROADCAST,0x00,&sg_CanSendQuene);
// SendComm(GPRS_COLLECT_REPORT,&sg_GprsSendQuene);
//完成初始化,进入主循环流程
while(1)
{
cl_Buff = CAN_IR;
if(cl_Buff != 0)
{
Extint0(cl_Buff);
cl_Buff = CAN_STATUS;
}
cl_Buff = CAN_ECC;
if(cl_Buff == 0)
{
sg_CanLed.RedOn = 0;
}
else
{
sg_CanLed.RedOn = 3;
sg_CanLed.RedOff = 50;
}
if(!bg_CanSinger) //can系统是多节点,可以进行正常通信
{
if(cg_CanCheckTime > 59) //每隔1分钟发一次查询帧
{
cg_CanCheckTime = 0;
SaveDeal(BROADCAST,0x00,&sg_CanSendQuene); //发送广播命令
}
if(cg_CanRequireTime > 10) //每隔20秒发一次记录查询信息
{
cg_CanRequireTime = 0;
if((!bg_DataTxGprs) && (bg_Gprs))
{
if(sg_Psmf.Flag == LABLE_VALID)
{
SaveDeal(Q_CAN_COLLECT_REPORT,sg_Psmf.Id,&sg_CanSendQuene);
}
if(sg_Psmh.Flag == LABLE_VALID)
{
SaveDeal(Q_CAN_COLLECT_REPORT,sg_Psmh.Id,&sg_CanSendQuene);
}
}
}
if(bg_CanRx)
{
//can接收到一帧数据,进行数据接收处理
CanRxDeal();
bg_CanRx = 0;
}
else if(sg_CanOver.Flag == CAN_OVER_TIME_VALID)
{
//can 超时有效,检测是否到超时
if(sg_CanOver.Count > CAN_OVER_TIME)
{
//can 超时,超时处理
sg_CanOver.Try ++;
if(sg_CanOver.Try > 4)
{
cg_CanErrCount ++;
if(cg_CanErrCount > 2) //can 超时错误次数大于5,重新复位CAN
{
cg_CanErrCount = 0;
cl_Buff = CanIni();
}
sg_CanOver.Flag = CAN_OVER_TIME_INVALID;
sg_CanOver.Count = 0;
sg_CanOver.Try = 0;
bg_DataTxGprs = 0; //
}
else
{
sg_CanOver.Count = 0;
CanTxDeal(cg_CanComId,cg_CanTarget); //重发上次数据,输入参数(cg_CanComId,cg_CanTarget)
}
}
}
else if(sg_CanSendQuene.Len != 0)
{
//can 发送队列不为零,发送处理
TakeOutDeal(&cg_CanComId,&cg_CanTarget,&sg_CanSendQuene);
if(!bg_DataTxGprs)
{
CanTxDeal(cg_CanComId,cg_CanTarget);
}
else if(cg_CanComId != Q_CAN_COLLECT_REPORT) //向gprs发送数据时,不再发送新的命令到psmf,psmh
{
CanTxDeal(cg_CanComId,cg_CanTarget);
}
}
}
else //can系统是单节点,不能进行通信,定时对can网络进行检测
{
if(cg_CanCheckTime > 1) //间隔时间为 2S
{
cg_CanCheckTime = 0;
SaveDeal(BROADCAST,0x00,&sg_CanSendQuene); //发送广播命令
bg_CanSinger = 0;
}
}
if(cg_GprsTxTimeCount > 30)
{
cg_GprsTxTimeCount = 0;
bg_DataTxGprs = 0;
}
if(!GPRS_Y) //gprs 发送处理
{
if(bg_Gprs) //gprs 建莲成功,可以进行正常的通讯
{
if(cg_GprsCheckTime > 120)
{
cg_GprsCheckTime = 0;
if(!bg_DataTxGprs)
{
// SendComm(GPRS_CHECK,&sg_GprsSendQuene);
}
}
if(cg_GprsGpsTxTime > 29) //上报Gps信息
{
cg_GprsGpsTxTime = 0;
if( (!bg_DataTxGprs) && (sg_GprsReport.GpsInfo.Flag != 'V') )
{
SendComm(GPRS_GPS_POSITION,&sg_GprsSendQuene);
}
}
//gprs模块存在
if(bg_GprsRxData) //gprs 收到一帧信息
{
GprsRxDeal();
bg_GprsRxData = 0;
}
else if(bg_GprsOverFlag) //超时标志有效
{
if(cg_GprsOverCount > GPRS_OVER_TIME) //检测是否超时
{
cg_GprsErrorCount ++;
if(cg_GprsErrorCount > 9)
{
bg_GprsOverFlag = 0; //清除超时标志,
bg_Gprs = 0; //Gprs连续无响应,置标志位
sg_GprsSendQuene.Len = 0; //将gprs发送缓冲区清空
cg_GprsErrorCount = 0; //
bg_DataTxGprs = 0; //
cg_GprsConnectTime = 2; //
}
else
{
bg_GprsRepeat = 1;
cg_GprsOverCount = 0;
GprsTxDeal(cg_GprsComId); //超时,重发
}
}
}
else if(sg_GprsSendQuene.Len != 0) //检测gprs发送队列长度是否为零
{
cg_GprsErrorCount = 0; //Gprs 发送错误计数清零
TakeOutQuene(&cg_GprsComId, &sg_GprsSendQuene);
if( !bg_DataTxGprs)
{
if(cg_GprsComId == GPRS_COLLECT_REPORT)
{
bg_GprsRxFirst = 0; //发送一次新的记录,标志清零
}
GprsTxDeal(cg_GprsComId);
}
else if(cg_GprsComId == GPRS_COLLECT_REPORT)
{
bg_GprsRxFirst = 0;
GprsTxDeal(cg_GprsComId);
}
}
}
else //gprs 不能正常建莲,定时进行重新建莲
{
if(cg_GprsConnectTime > 1)
{
cl_Buff = GprsRepeatConnect(); //Gprs重新建莲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -