📄 gpsrx.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 + -