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

📄 gpsrx.c

📁 AVR系列单片机通过
💻 C
字号:
#include<iom8v.h>
//#include<string.h>    
// #include "string.h"
// #include "intrins.h"
#define fosc 8000000              //晶振8mhz
#define baud 4800                 //通信波特率
#define th0  40
#pragma interrupt_handler timer_handler1:10    
#pragma interrupt_handler rxd_handler:12    
extern unsigned char  trdata_buff[90];
extern unsigned char  rxd_count=0;               //作为接收数据的计算值
//bit rxdyesorno=0                               //准许接收数据否?
extern unsigned rxdcheck_fla=0x0;                //作为gps的具体数据的检测
extern unsigned txdcheck_do=0x0;                 //作为接收完gps数据后要发送数据的标记
extern unsigned rxdcheck_s=0x0;                  //作为gps的数据接收标记的检测
extern unsigned rxdcheck_g=0x0;
extern unsigned rxdcheck_p=0x0;
extern unsigned rxdcheck_r=0x0;
extern unsigned rxdcheck_m=0x0;
extern unsigned rxdcheck_c=0x0;


/*        异步通信中断初始化         */
void USART_Init(void)
{
  UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//|(1<<TXCIE);      //允许中断发送和接收
  UBRRL=(fosc/16/(baud+1))%256;                            //设置波特率寄存器低位字节
  UBRRH=(fosc/16/(baud+1))/256;                            //设置波特率寄存器高位字节
  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                  //8位数据+1位STOP位
}
/*     设置定时器0中断的初始化      */
void TC0_Init(void)
{
  TCCR0=(1<<CS00)|(1<<CS01);                           //设置了系统时钟64分频后的时间源
  TCNT0=th0;                                           //设置了10MS的初始值
  TIMSK=(1<<TOIE0);
}
/*    异步通信中断处理程序     */
void rxd_handler()
{
 if (RXC==1)
   {
     if(txdcheck_do==0)
	   {
	 
	  
	   
     if(rxdcheck_fla==0xff)                    //所有gps的标记都检测完了,可以接收数据了
      {
	    ++rxd_count;
       trdata_buff[rxd_count]=UDR;
	   
	   if(UDR==0X0D)                           //判断gps末尾的数据符号
	   txdcheck_do=0xff;                       //当检测到结束的标记,置发送数据的标记
	  }
	  else if(rxdcheck_s==0)                   //以下就是检测gps数据的开始标记
	      {
		  if (UDR=='$')
		     { 
			 rxdcheck_s=0xff;
			 rxd_count=0x0;
			 trdata_buff[rxd_count]=UDR;
		     //goto  later;
			 }
			 else 
			{  
		     rxd_count=0x0;
			 rxdcheck_s=0;
			// break;
			//goto  late;
			 }
		  }
	  else if(rxdcheck_g==0)
	      {
		  if  ( UDR=='G')
		      {
			  rxdcheck_g=0xff;
			  ++rxd_count;
			  trdata_buff[rxd_count]=UDR;
			  //break;
			 // goto  later;
			 }
			 else 
			{  
		     rxd_count=0x0;
			 rxdcheck_s=0x0;
			 rxdcheck_g=0x0;
			 //break;
			 //goto  later;
			}
		 }	
	  else if(rxdcheck_p==0)
	      {
		  if (UDR=='P')
		     {
			 rxdcheck_p=0xff;
			 ++rxd_count;
			 trdata_buff[rxd_count]=UDR;		 
             //break;
		   }
		   else 
			{  
		     rxd_count=0x0;
			 rxdcheck_s=0x0;
			 rxdcheck_g=0x0;
			 rxdcheck_p=0x0;
			 //break;
			 }
			}
	   else if(rxdcheck_r==0)
	       {
		   if (UDR=='R')
		      {
			  rxdcheck_r=0xff;
			  ++rxd_count;
			  trdata_buff[rxd_count]=UDR;
			  //break;
			  }
			else 
			{  
		     rxd_count=0x0;
			 rxdcheck_s=0x0;
			 rxdcheck_g=0x0;
			 rxdcheck_p=0x0;
			 rxdcheck_r=0x0;
			 //break;
		     }
			}
		else if(rxdcheck_m==0)
		    {
			if (UDR=='M')
			  {
			  rxdcheck_m=0xff;
			  ++rxd_count;
			  trdata_buff[rxd_count]=UDR;
			  //break;
			  }
			  else
			  {
			   rxd_count=0x0;
			   rxdcheck_s=0x0;
			   rxdcheck_g=0x0;
			   rxdcheck_p=0x0;
			   rxdcheck_r=0x0;
			   rxdcheck_m=0x0;
			   //break;
		       }                                  } 
	     else if(rxdcheck_c==0)
		      {
			  if(UDR=='C')
			    {
				rxdcheck_c=0xff;
				++rxd_count;
				trdata_buff[rxd_count]=UDR;
				//break;
				}
				else
				{
				 rxd_count=0x0;
				 rxdcheck_s=0x0;
				 rxdcheck_g=0x0;
			     rxdcheck_p=0x0;
			     rxdcheck_r=0x0;
			     rxdcheck_m=0x0;
				 rxdcheck_c=0x0;
		         //break;
				 
				 }
			  } 
           else		   
		  {
		   rxdcheck_fla=0xff;
		   ++rxd_count;	
		   trdata_buff[rxd_count]=UDR;
	   	   rxdcheck_s=0x0;
		   rxdcheck_g=0x0;
	       rxdcheck_p=0x0;
	       rxdcheck_r=0x0;
	       rxdcheck_m=0x0;
    	   rxdcheck_c=0x0;
	
	       }
		  
  
    	}
	 
	 }
}
/*      定时器0作为定时工作     */		
void timer_handler1()  
{ 

  if (txdcheck_do==1)
  {
   unsigned char i;
   SREG=(~(1<<7));
   i=rxd_count;
  
   for(rxd_count=1;rxd_count<=i;rxd_count++)
   {   
   while(!(UCSRA&(1<<UDRE)))
   UDR=trdata_buff[rxd_count];
	}
	SREG=(1<<7);
    txdcheck_do=0x0;
	rxd_count=0x0;
    }
	TCNT0=th0;                                           //设置了10MS的初始值
}
		   
		   
/*           主程序              */   
void main(void)
{
  //unsigned char i,j;
  USART_Init();
  TC0_Init();  
  SREG=(1<<7);
  
   while(1)
 ;
//    _nop();
    
}

⌨️ 快捷键说明

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