⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exec_func.c

📁 C语言源代码及相关资料
💻 C
📖 第 1 页 / 共 4 页
字号:
			GetOmoveAddr(CUSTOM_PARAMS,CUSTOM_PARAMS_COUNT,0x0004,&len,&moveAddr);
			for(i=0;i<sizeof(cur_Sec);i++)
				cur_Sec[i]=(MILEAGE_ACC_SEC+j)>>(8*(sizeof(cur_Sec)-i-1));
	    	W25X32_WRITE(GetAddr(CUSTOM_PARAMS_SEC,moveAddr),len,cur_Sec);
	    	
		}
		
	}	
	*Addr=addr;
	
	return	TRUE;
	
}
*/

//=======================里程统计部分===========================

/********************************************************************************************************
**	函数名:	CalcMil
**	功  能:	利用经纬度差来计算距离 
**	输  入:	x1,第一点的经度,y1,第一点纬度;x2,第二点的经度,y2,第二点纬度		
**	返回值:	两点的距离
**	说  明:	经纬度是以度为单位的实数,为实际值×1000000
********************************************************************************************************/
 
float CalcMil(unsigned long X1,unsigned long Y1,unsigned long X2,unsigned long Y2)
{
	#define PI 3.1415926
	#define EARTH_RADIUS  6378137  //地球半径 

	float CurRadLong = 0;	//两点经纬度的弧度
	float CurRadLat = 0; 
	float PreRadLong = 0;
	float PreRadLat = 0;
	float a=0,b=0;              //经纬度弧度差
	float MilValue=0;	

	//将经纬度换算成弧度
	CurRadLong = (float)(X1)/1000000.0;
	CurRadLong = CurRadLong*PI/180.0;    	

	PreRadLong = (float)(X2)/1000000.0 ;  		 
	PreRadLong = PreRadLong*PI/180.0; 	

	CurRadLat  = (float)(Y1)/1000000.0;
	CurRadLat = CurRadLat*PI/180.0;   

	PreRadLat  = (float)(Y2)/1000000.0 ;  		 
	PreRadLat  = PreRadLat*PI/180.0;	

    //计算经纬度差值
 	if(CurRadLat>PreRadLat)		    
	{
		a = CurRadLat - PreRadLat ;	
	}
	else
	{
		a = PreRadLat - CurRadLat;
	}  

	if(CurRadLong>PreRadLong)
	{
		b = CurRadLong -PreRadLong ;	
	}
	else
	{
		b = PreRadLong - CurRadLong;
	}  	

	MilValue = 2*(sqrt(sin(a/2.0)*sin(a/2.0)+cos(CurRadLat)*cos(PreRadLat)*sin(b/2.0)*sin(b/2.0)));
	MilValue = (float)(EARTH_RADIUS*MilValue);
	return(MilValue);
	
	
} 






/*********************************************************************************************************
** 函数名称:  PLL_CFG
** 函数功能:  重新连接PLL
** 入口参数:  无
** 出口参数:  无
*********************************************************************************************************/
void PLL_CFG(void)   
{

	if (PLLSTAT & (1 << 25))
    {
		PLLCON 	= 1;							// PLL连接已经断开了,使能PLL 
		PLLFEED = 0xAA;
		PLLFEED = 0x55;
    }

    PLLCON 		= 0;							// PLL连接已经断开了,禁用PLL 
    PLLFEED		= 0xAA;
    PLLFEED 	= 0x55;
    while (PLLSTAT & (3 << 24));	
	
    SCS 		= (SCS & 0x04) | 0x20;         	// 使能主振荡器,范围在1MHz~20MHz       							      
	while ((SCS & 0x40) == 0);			 		// 等待主振荡器可用 
	
	CLKSRCSEL 	= 0x01;					 		// 选择主振荡器为PLL的时钟源
										 
    PLLCFG  	= (((PLL_NValue) << 16) | (PLL_MValue));    
      
	PLLCON  	= 1;
    PLLFEED 	= 0xAA;							// 使能PLL,断开PLL连接
    PLLFEED 	= 0x55;	
    while (((PLLSTAT & (1 << 24)) == 0));		// 等待PLL稳定可用
	
	CCLKCFG 	= CCLKDivValue;	
		
	while (((PLLSTAT & (1 << 26)) == 0));		// 查询PLL是否锁定
	while (((PLLSTAT & 0x00007FFF) != PLL_MValue) && (((PLLSTAT & 0x00FF0000) >> 16) != PLL_NValue));
	
 	PLLCON  	= 3;							// 连接PLL 
    PLLFEED 	= 0xAA;
    PLLFEED 	= 0x55;	    						
	while (((PLLSTAT & (1 << 25)) != (1 << 25)));// 等待PLL锁定并连接

 }	
 

/*******************************************************************************
*功能:休眠省电模块
*******************************************************************************/
uint8 powerdown(uint16 *powerdown_cou,uint16 *acc_closetime)
{   
	uint16 dly=*powerdown_cou;
	uint16 acc=*acc_closetime;
	
	if(bl_powerdown==0)//判断是否处于休眠状态,不是则进入休眠
	{
		if(Get_ACCIN()==0)
		{
			acc++;
		  	if(acc>=powerdown_settime)//ACC持续关时间是否满足中心设置时间
		 	{
		 		if(Comm_PowerDown()) 		    //发送关闭模块指令(关闭GPRS通讯链路和GPS)将GPRS或CDMA的工作状态调整到短信状态
	 	 		{
	 	 			bl_powerdown=1;				//置休眠标志
	 	 		
		 	 		Connect_OK=FALSE;
		 	 		ReConnect_OK=0;
		 	 		
		     	 	acc=0;
	     	 	}
	     	}
	     	
		}
		else
		{
		 	acc=0;
		 	bl_powerdown=0;
		 	
		}
		if((Connect_OK==TRUE)&&(ReConnect_OK==2))
		{
		 	if(dly<=90)
		 		dly++;
		 	if(dly==90)	//延迟90秒(中心定位) 	
		 	{
				uint8	uiReviceBuf0[TRANSINFOLEN/2];
				uint16	uiNum=0;
					
				ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_UploadPlaceComm);
				Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
				uartWrite(UART2,uiReviceBuf0,uiNum,NULL); 
				OSTimeDly(10); 
			}
			
		}
	
	}
		
	if(bl_powerdown==1) //已处于休眠状态时,判断是否需要重新激活
	{
		if(Get_ACCIN()>0||(bl_Warning==1)||(bl_DiaoDuMes==1))
		{
			bl_powerdown=0;
 	 		acc=0;
 	 		dly=0;
 	 		
 	 		//GPRS开机
 			//P0_GPIOClr((1 << 24));	//输出低电平   开GPRS
			//OSTimeDly(60);	//300ms
			P0_GPIOSet((1 << 24));	//输出高电平
			OSTimeDly(60);	//300ms
			P0_GPIOClr((1 << 24));	//输出低电平   开GPRS
 			
 			P0_GPIOSet((1 << 17));	//输出高电平//设置P0.17为低,开GPS模块
		}
	}
	
 	
	*powerdown_cou=dly;
	*acc_closetime=acc;
	
	return TRUE;
}


/*******************************************************************************
*功能:关GPS,发送休眠指令,关闭GPRS链接
*******************************************************************************/
uint8 Comm_PowerDown()
{
 	static  char * GPRS_cmd[]={  "\r\nAT+AIPC=1\r\n\0", //关闭GPRS链路								//关闭链路1
			          		     "\r\nAT+CMGF=1\r\n\0", //短信状态
			          		     "\r\nAT+CNMI=1,1,0,0,1\r\n\0",
			          	      };
	
	
	if((Connect_OK==TRUE)&&(ReConnect_OK==2))
	{
		uint8	uiReviceBuf0[TRANSINFOLEN/2];
		uint16	uiNum=0;
		//发送休眠数据包     
		ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_DormancyComm);
		Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
		uartWrite(UART2,uiReviceBuf0,uiNum,NULL); 
		OSTimeDlyHMSM(0,0,0,300);					
		uartWrite(UART2,(uint8 *)GPRS_cmd[2],strlen(GPRS_cmd[2]),NULL);
		OSTimeDlyHMSM(0,0,0,300);
		uartWrite(UART2,(uint8 *)GPRS_cmd[1],strlen(GPRS_cmd[1]),NULL);
		OSTimeDlyHMSM(0,0,0,300);
		uartWrite(UART2,(uint8 *)GPRS_cmd[0],strlen(GPRS_cmd[0]),NULL);
		OSTimeDlyHMSM(0,0,0,300);
		
		
		//GPRS关机
		P0_GPIOSet((1 << 24));	//输出高电平   GPRS
		OSTimeDly(200*3);	//3S
		P0_GPIOClr((1 << 24));	//输出低电平
		
		P0_GPIOSet((1 << 17));	//输出高电平//设置P0.17为低,关GPS模块	
		
		return TRUE;
	}
	
	return FALSE;
	
} 

 
/*******************************************************************************
*功能:关机省电模块
*******************************************************************************/
uint8 PowerOff(uint16 * poweroff_cou,uint16 *acc_closetime)
{   
	uint16 dly=*poweroff_cou;
	uint16 acc=*acc_closetime;
	if(bl_poweroff==0)//判断是否处于休眠状态,不是则进入休眠
	{
		if(Get_ACCIN()==0)
		{
			acc++;
			if(acc>=poweroff_settime)//ACC持续关时间是否满足中心设置时间
			{
			 	bl_poweroff=1;				//置休眠标志
			 	acc=0;
			 	
			}
		}
		else
		{
			acc=0;
			bl_poweroff=0;

		}
		if((Connect_OK==TRUE)&&(ReConnect_OK==2))
		{
		 	if(dly<=90)
		 		dly++;
		 	if(dly==90)	//延迟90秒(中心定位) 	
		 	{
				uint8	uiReviceBuf0[TRANSINFOLEN/2];
				uint16	uiNum=0;
					
				ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_UploadPlaceComm);
				Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
				uartWrite(UART2,uiReviceBuf0,uiNum,NULL); 
				OSTimeDly(10); 
			}
			
		}
	}
	
	if(bl_poweroff==1)
	{//需上传关机指令信息
		
		if(bl_powerdown==1)
			bl_powerdown=0;
		
		if(Comm_PowerOff()) 		    //发送关闭模块指令(关闭GPRS通讯链路和GPS)将GPRS或CDMA的工作状态调整到短信状态
     	{
 	 		Connect_OK=FALSE;
 	 		ReConnect_OK=0;
 	 		
 	 		//RTC_InitDft2();
 	 		//PCONP  = 0x00;							// 关闭定时器、RTC、UART等功能部件
 	 		PCON = 0x02;   				// CPU进入掉电模式,此时CPU停止运行,只能通过外部中断或者RTC中断唤醒
 	 		/* 此时 CPU进入了掉电模式,等待RTC唤醒 */
			/* CPU被RTC唤醒了之后,需要清除掉RTC增量中断标志,以便下次再次产生中断 */
			//ILR  = 0x02;								// 清除RTC增量中断标志
 	 		//PCONP  = 0x03BE;
 	 		PLL_CFG();	// 重新连接PLL,因为掉电后关闭了PLL
 			
 			bl_poweroff=0;	//激活后更新此关机标志。
 			acc=0;
 	 		dly=0;
 			//GPRS开机
 			//P0_GPIOClr((1 << 24));	//输出低电平   开GPRS
			//OSTimeDly(60);	//300ms
			P0_GPIOSet((1 << 24));	//输出高电平
			OSTimeDly(60);	//300ms
			P0_GPIOClr((1 << 24));	//输出低电平   开GPRS
			
			P0_GPIOSet((1 << 17));	//输出高电平//设置P0.17为低,开GPS模块	
			
			
		}
		
		
	}
	
	*poweroff_cou=dly;
	*acc_closetime=acc;
	
	return TRUE;
	
}

uint8 Comm_PowerOff()
{
 	static  char * GPRS_cmd[]={  "\r\nAT+AIPC=1\r\n\0", //关闭GPRS链路								//关闭链路1
			          		     "\r\nAT+CMGF=1\r\n\0", //短信状态
			          		     "\r\nAT+CNMI=1,1,0,0,1\r\n\0",
			          	      };
	
	if((Connect_OK==TRUE)&&(ReConnect_OK==2))
	{
		uint8	uiReviceBuf0[TRANSINFOLEN/2];
		uint16	uiNum=0;
		//发送关机数据包     
		ParseCode_trans(uiReviceBuf0,&uiNum,UPLOAD,U_ShutComm);
		Send_data(uiReviceBuf0,sizeof(uiReviceBuf0),&uiNum);
		uartWrite(UART2,uiReviceBuf0,uiNum,NULL); 
		
		OSTimeDlyHMSM(0,0,0,300);
		uartWrite(UART2,(uint8 *)GPRS_cmd[0],strlen(GPRS_cmd[0]),NULL);
		OSTimeDlyHMSM(0,0,0,300);
		
		//GPRS关机
		P0_GPIOSet((1 << 24));	//输出高电平   GPRS
		OSTimeDly(200*3);	//3S
		P0_GPIOClr((1 << 24));	//输出低电平
		
		P0_GPIOClr((1 << 17));	//输出低电平//设置P0.17为低,关GPS模块	
		
		return TRUE;
	}
	
	return FALSE;
	
} 




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -