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

📄 car_sim300.c

📁 GPRS-GPS车载机控制源码
💻 C
📖 第 1 页 / 共 5 页
字号:
{
  u8 bTemp;
  u16 wTemp;	
	
	wTemp = wAddr;
	wTemp >>= 8;
	I2CStart();
	I2CSendByte(0xa0);
	I2CSendByte((u8)wTemp);
	I2CSendByte((u8)wAddr);
	SomeNOP();
	
	I2CStart();
	I2CSendByte(0xa1);
	bTemp = I2CReceiveByte();
	I2CStop();
	return bTemp;
}

void vISP_IAP_ByteProgram(u8 bTemp,u16 wAddr)
{
  u16 wTemp;	
  
	wTemp = wAddr;
	wTemp >>= 8;
	I2CStart();
	I2CSendByte(0xa0);
	I2CSendByte((u8)wTemp);
	I2CSendByte((u8)wAddr);
	I2CSendByte(bTemp);
	I2CStop();
	Delay_l0ms();
}


//==============================================================================

u16 wTimer0Ccount(void)
{
  u16  wT;

	wT = W_TimeCount;
	return(wT);
}


void vDelayTime(u16 wCount)
{
  u16  wStartCount;

	wStartCount = wTimer0Ccount(); /* get the start count */
	while ((wTimer0Ccount() - wStartCount) <= wCount)   /* wait for count "ticks" */
	{
 	 	IWDG_ReloadCounter();//喂狗
  	}
}

/********************************************************************************************
**函数名:      vTurnOnGsm
**功能简介:    硬件控制SIM508开机
**参数说明:    无
**调用函数:    无
**全局变量:    无
**函数返回:    无
**最后修改时间:2007-02-09
**********************************************************************************************/
void vTurnOnGsm(void)
{
	GPIOB->ODR &= 0xfffffffd;
	vDelayTime(250);
	GPIOB->ODR |= 0x00000002;
	vDelayTime(300);
}

void vRestGPS(void)
{
	GPIOB->ODR &= 0xfffffffe;//低电平
	vDelayTime(50);
	GPIOB->ODR |= 0x00000001;//高电平
	vDelayTime(50);
	GPIOB->ODR &= 0xfffffffe;//低电平
	vDelayTime(300);
	vIinitGps();
	vIinitGps();
	
}

/********************************************************************************************
**函数名:      vTurnOffGsm
**功能简介:    硬件控制SIM508关机
**参数说明:    无
**调用函数:    无
**全局变量:    无
**函数返回:    无
**最后修改时间:2007-02-09
**********************************************************************************************/
void vTurnOffGsm(void)
{
	GPIOB->ODR &= 0xfffffffd;
	vDelayTime(70);
	GPIOB->ODR |= 0x00000002;
}


/******************************************************************************
**函 数 名  :     vMcuTimer0Intr
**功能简介  :     定时器0中断服务函数
**参数说明  :     无
**调用函数  :     无
**被调用函数:     无
**全局变量  :     W_TimeCount
**返 回 值  :     无
**函数版本  :     V1.00.00
**修改时间  :     2007-01-27
******************************************************************************/

/* SysTick interrupt happens every 10 ms                                      */
void SysTick_Handler (void) 
{
	W_TimeCount++;
	if(GPS_V_F)B_GpsVFTimer++;
	if(B_OverBeepStart)B_OverBeepTimer++;
   
}

/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
  BYTE bTByte2;
  WORD wTPsn2;

  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
	bTByte2 = (USART_ReceiveData(USART1));
	wTPsn2  =  W_InSerial2;
	if(++wTPsn2 ==  MAX_SERIAL_LEN2) wTPsn2  =  0;//修改指针边界
    if(wTPsn2  !=  W_OutSerial2)//队列没有满的情况下
    {
        B_SerialQueue2[W_InSerial2]  =  bTByte2;
        W_InSerial2  =  wTPsn2;
    }    
    /* Clear the USART1 Receive interrupt */
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  }


}

/*******************************************************************************
* Function Name  : USART2_IRQHandler
* Description    : This function handles USART2 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART2_IRQHandler(void)
{
  BYTE bTByte;
  WORD wTPsn;

  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    /* Read one byte from the receive data register */
	bTByte = (USART_ReceiveData(USART2));
	wTPsn  =  W_InSerial;
	if(++wTPsn ==  MAX_SERIAL_LEN) wTPsn  =  0;//修改指针边界
    if(wTPsn  !=  W_OutSerial)//队列没有满的情况下
    {
        B_SerialQueue[W_InSerial]  =  bTByte;
        W_InSerial  =  wTPsn;
    }    
    /* Clear the USART1 Receive interrupt */
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  }

}




/******************************************************************************
**函 数 名  :     vInitSoftTimer
**功能简介  :     软定时器初始化
**参数说明  :     无
**调用函数  :     无
**被调用函数:     main
**全局变量  :     REC_A_SoftTimers
**返 回 值  :     无
**函数版本  :     V1.00.00
**修改时间  :     2007-01-27
******************************************************************************/
void  vInitSoftTimer(void)
{
  WORD wI;
	
	//初始化A类软定时器
	for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)
	{
		REC_A_SoftTimers[wI].bStartFb = 0;
		REC_A_SoftTimers[wI].wOverValue = 0;
		REC_A_SoftTimers[wI].pfTimerFunction = NULL;
	}
}


/******************************************************************************
**函 数 名  :    vSoftTimerSum
**功能简介  :    用于查询软定时器计时
**参数说明  :    无
**调用函数  :    无
**被调用函数:    main
**全局变量  :    W_TimeCount,REC_A_SoftTimers
**返 回 值  :    无
**函数版本  :    V1.00.00
**修改时间  :    2007-01-27
******************************************************************************/
void vSoftTimerSum(void)
{
  WORD wI;
	
	if(B_GpsVFTimer>2)//gps状态灯指示
	{
		B_GpsVFTimer = 0;
		//LED = 0;
		ClrLED();
	}
	
	if(B_OverBeepTimer > 10)
	{
		B_OverBeepTimer = 0;
		//驱动封鸣器
		if(beep)ClrBeep();
		else    SetBeep();
	}
	
	if(W_TimeCount<MIN_TIME_PERIOD)return;
	W_TimeCount = 0;                        //一秒钟时间到
	
    for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)//检测A类定时器
    {
    	if(REC_A_SoftTimers[wI].bStartFb == 1)//只有启动了的定时器才作检测
		{	
			if(REC_A_SoftTimers[wI].wOverValue>0)
			{	
				if(--REC_A_SoftTimers[wI].wOverValue == 0)
				{
					REC_A_SoftTimers[wI].bStartFb = 0;
					REC_A_SoftTimers[wI].pfTimerFunction();//溢出处理
				}
			}
			
		}
	}
	
	if(++B_NoCsqTimer > 120)
	{
		B_NoCsqTimer = 0;
		GPIOB->ODR &= 0xffffefff;//power//低电平
		vDelayTime(500);
		GPIOB->ODR |= 0x00001000;//power//高电平
		vDelayTime(500);
		vTurnOnGsm();//开GSM508时序
		EN_CommandStatus = NO_COMMAND_WAIT;
		DW_SetAtCmdFlag = MAC_SET_AT_CMD;
		vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
		B_AtCmdTimes = 0;
		B_AtCommandItem = 0xff;//最后赋值成无意义值
		W_InSerial  = 0;
		W_OutSerial = 0;
	}
	
	if(++W_PowerSwitchTimer > 28800)//8个小时
	{
		W_PowerSwitchTimer = 0;
		GPIOB->ODR &= 0xffffefff;//power//低电平
		vDelayTime(500);
		GPIOB->ODR |= 0x00001000;//power//高电平
		vDelayTime(500);
		vTurnOnGsm();//开GSM508时序
		EN_CommandStatus = NO_COMMAND_WAIT;
		DW_SetAtCmdFlag = MAC_SET_AT_CMD;
		vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
		B_AtCmdTimes = 0;
		B_AtCommandItem = 0xff;//最后赋值成无意义值
		W_InSerial  = 0;
		W_OutSerial = 0;
	}
	
	
	if(FB_AtdDelayStart)//ATD电话拨打延时准备
	{ 
		if(++B_AtdDelayTimer >= 30)//延时到
		{
			FB_AtdDelayStart = 0;
			B_AtdDelayTimer = 0; 
			vStartAtCommand(MAC_ATD_ITEM);//拨打电话
			FB_AtdReg = 1;
		}
	}
	
	vRelayOut();

	vKeyCheck();//按键检测,一秒钟检测一次
	
	if(B_NetStatus == 1)//网络标志值为'1'不许时间太长
	{
		if(++B_NetValue_1_Cnt > 60)
		{
			B_NetValue_1_Cnt = 0;
			vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
		}
	}
	else    B_NetValue_1_Cnt = 0;
	
}


/******************************************************************************
**函 数 名  :    vStartSoftTimer_A
**功能简介  :    启动一软定时器A
**参数说明  :    wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
                  wDelay--定时时间,pfTimerFun--时间到后执行的函数
**调用函数  :    无
**被调用函数:    暂无
**全局变量  :    REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
**函数返回  :    无
**修改时间  :    2007-01-27
******************************************************************************/
void vStartSoftTimer_A(WORD wIndex,WORD wDelay,void(*pfTimerFun)(void))
{
  	if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
	REC_A_SoftTimers[wIndex].wOverValue = wDelay;
	REC_A_SoftTimers[wIndex].bStartFb = 1;
	REC_A_SoftTimers[wIndex].pfTimerFunction = pfTimerFun;
}

/******************************************************************************
**函 数 名  :    vStopSoftTimer_A
**功能简介  :    停止一软定时器A
**参数说明  :    wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
**调用函数  :    无
**被调用函数:    暂无
**全局变量  :    REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
**函数返回  :    无
**修改时间  :    2006-04-11
******************************************************************************/
void vStopSoftTimer_A(WORD wIndex)
{
  	if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
	REC_A_SoftTimers[wIndex].wOverValue = 0;
	REC_A_SoftTimers[wIndex].bStartFb = 0;
	REC_A_SoftTimers[wIndex].pfTimerFunction = NULL;
}



/******************************************************************************
**函 数 名  :     vMcuSerialIntr
**功能简介  :     MCU串口1中断服务函数
**参数说明  :     无
**调用函数  :     无
**被调用函数:     无
**全局变量  :     W_InSerial, W_OutSerial
**返 回 值  :     无
**函数版本  :     V1.00.00
**修改时间  : 	   2007-01-27
******************************************************************************/
/*
void vMcuSerialIntr(void) interrupt  SERIAL_INT_NUM   //4 
{
  BYTE bTByte;
  WORD wTPsn;
    
	if(RI)        //接收中断服务函数
    {
		
		RI = 0;
		bTByte  =  SBUF;//最好先读一下
		wTPsn  =  W_InSerial;
		if(++wTPsn ==  MAX_SERIAL_LEN) wTPsn  =  0;//修改指针边界
        if(wTPsn  !=  W_OutSerial)//队列没有满的情况下
        {
            B_SerialQueue[W_InSerial]  =  bTByte;
            W_InSerial  =  wTPsn;
        }    
    }
}
*/


/******************************************************************************
**函 数 名  :     wReadSerial
**功能简介  :     读MCU串口1缓冲中的一个字节
**参数说明  :     无
**调用函数  :     vCloseINTR(),vOpenINT()
**被调用函数:     暂无
**全局变量  :     W_InSerial, W_OutSerial
**返 回 值  :     WORD类型,为读出一字节内容
**函数版本  :     V1.00.00
**修改时间  :     2007-01-27
******************************************************************************/
WORD  wReadSerial(void)
{
	BYTE	bTByte;
	
	//vCloseINTR();//关中断

⌨️ 快捷键说明

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