?? gps.c
字號(hào):
/*----------------------------------------------------------------
GPS采集控制單元
1.GPS模塊初始化采集, 串口1 19200,需要先進(jìn)行喚醒操作,然后定期接收(中斷)位置信息
------------------------------------------------------------------*/
#include<iom162v.h>
#include <macros.h>
//帶有可選回車換行符輸出的MEGA162的雙UART程序
//發(fā)送采用查詢方式,接收采用中斷方式。晶振7.3728M,無分頻。
unsigned char gpsbuf[100];
unsigned char uartrbuffer[100]; //uart接受緩存100字節(jié)
unsigned char uarttbuffer[50]; //uart發(fā)送緩存50字節(jié)
int stringlon=0;
unsigned char urflag;
unsigned char tmpchar;
//UART0 initialisation
// desired baud rate:1200
// actual baud rate:1200 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00; //disable while setting baud rate
UBRR0L =0x03; //set baud rate
UBRR0H=0x00;
UCSR0C =(1<<URSEL0)|0b00000110;
UCSR0B=0b10011000; //enable
}
#pragma interrupt_handler uart0_rx_isr:20
void uart0_rx_isr(void)
{
//uart has received a character in UDR
uartrbuffer[stringlon]=UDR0;
stringlon++;
urflag=1;
if(stringlon>=100)
stringlon=0;
}
unsigned char recgpsstate; //GPS 接收狀態(tài)字,初始化為0
unsigned char recgpsP; //接收緩沖區(qū)指針
unsigned char recgpslen;
//UART1 initialisation
// desired baud rate: 19200
// actual: baud rate:19200 (0.0%)
// char size: 8 bit
// parity: NONE
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00; //disable while setting baud rate
UBRR1L =0x17; //set baud rate
UBRR1H = 0x00;
UCSR1C = (1<<URSEL1)|0b00000110;;
UCSR1A = 0x00; //enable
UCSR1B = 0x98; //enable
urflag = 0;
recgpsstate = 0;
recgpsP = 0;
recgpslen = 0;
}
#pragma interrupt_handler uart1_rx_isr:21
void uart1_rx_isr(void)
{
//uart has received a character in UDR
tmpchar=UDR1;
switch(recgpsstate)
{
case 0: //檢查$字符,為一句開始
if(tmpchar=='$'){
recgpsstate=1;
recgpsP=0;
uartrbuffer[recgpsP++]=tmpchar;
}
else recgpsstate=0;
break;
case 1: //檢查GPRMC
uartrbuffer[recgpsP++]=tmpchar;
if(recgpsP>6){
if((uartrbuffer[3]=='R')&&(uartrbuffer[4]=='M')&&(uartrbuffer[5]=='C'))
recgpsstate=2;
else recgpsstate=0;
}
break;
case 2:
uartrbuffer[recgpsP++]=tmpchar;
if((tmpchar==0x0a)&&(uartrbuffer[recgpsP-2]==0x0d)){
recgpslen=recgpsP;
for(recgpsP=0;recgpsP<recgpslen;recgpsP++)
gpsbuf[recgpsP]=uartrbuffer[recgpsP];
urflag=1;
recgpsstate=0;
}else{
if(recgpsP>120) recgpsstate=0;
}
break;
default:
recgpsstate=0;
break;
}
}
//*******************************************uart字符輸出***************************
void putchar(int upart,unsigned char charx)
//upart表示UART標(biāo)號(hào),0表示UART0,其他表示UART1;char0表示要發(fā)出的數(shù)據(jù);
{
int i=0;
if(upart==0)
{
while(!(UCSR0A & 0x20));
UDR0 = charx;
}
else
{
while(!(UCSR1A & 0x20));
UDR1 = charx;
}
}
//******************************************uart字符輸出函數(shù)結(jié)束***************
//*******************************帶可選回車換行的字符串輸出函數(shù)******
//upart表示發(fā)出數(shù)據(jù)使用的端口號(hào)0表示使用UART0,其他表示使用UART1;
//*s表示要發(fā)出數(shù)據(jù)的指針
//senter0表示結(jié)尾是否使用0x0d,0表示使用,其他表示不使用
//senter1表示結(jié)尾是否使用0x0a,0表示使用,其他表示不使用
//stringl表示所要輸出的字符串長度,0表示無限制
void puts(unsigned char *s,int upart,int senter0,int senter1,int stringl)
{
unsigned char outchar;
stringlon=0;
if(upart==0)
{
if(stringl==0)
{
while(*s)
{
outchar=*s;
putchar(0,outchar);
s++;
}
if(senter0==0)
putchar(0,0x0d);
if(senter1==0)
putchar(0,0x0a);
}
else
{
while(stringlon<=(stringl-1))
{
outchar=*(s+stringlon);
putchar(0,outchar);
stringlon++;
}
if(senter0==0)
putchar(0,0x0d);
if(senter1==0)
putchar(0,0x0a);
}
}
else
{
if(stringl==0)
{
while(*s)
{
outchar=*s;
putchar(1,outchar);
s++;
}
if(senter0==0)
putchar(1,0x0d);
if(senter1==0)
putchar(1,0x0a);
}
else
{
while(stringlon<=(stringl-1))
{
outchar=*(s+stringlon);
putchar(1,outchar);
stringlon++;
}
if(senter0==0)
putchar(1,0x0d);
if(senter1==0)
putchar(1,0x0a);
}
}
}
/******************************************************
SPI 雙機(jī)通信
*******************************************************/
#define SIZE 100
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsigned char tx_wr_index,tx_rd_index,tx_counter,SPI_ok;
#pragma interrupt_handler spi_stc_isr:19
void spi_stc_isr(void)
{
SPI_rx_buff[rx_wr_index] = SPDR; //從ISP口讀出收到的字節(jié)
SPI_ok = 1; // SPI 空閑
if (++rx_wr_index == SIZE) rx_wr_index = 0; //放入接收緩沖區(qū),并調(diào)整隊(duì)列指針
if (++rx_counter == SIZE)
{
rx_counter = 0;
rx_buffer_overflow = 1;
}
if (tx_counter) //如果發(fā)送緩沖區(qū)中有待發(fā)的數(shù)據(jù)
{
--tx_counter;
SPDR = SPI_tx_buff[tx_rd_index]; //發(fā)送一個(gè)字節(jié)數(shù)據(jù),并調(diào)整指針
if (++tx_rd_index == SIZE) tx_rd_index = 0;
SPI_ok = 0;
}
}
unsigned char getSPIchar(void)
{
unsigned char data;
while (rx_counter == 0); //無接收數(shù)據(jù),等待
data = SPI_rx_buff[rx_rd_index]; //從接收緩沖區(qū)取出一個(gè)SPI收到的數(shù)據(jù)
if (++rx_rd_index == SIZE) rx_rd_index = 0; //調(diào)整指針
CLI();
--rx_counter;
SEI();
return data;
}
void putSPIchar(char c)
{
while (tx_counter == SIZE);//發(fā)送緩沖區(qū)滿,等待
CLI();
if (tx_counter || SPI_ok==0 ) //發(fā)送緩沖區(qū)已中有待發(fā)數(shù)據(jù)
{ //或SPI正在發(fā)送數(shù)據(jù)時(shí)
SPI_tx_buff[tx_wr_index] = c; //將數(shù)據(jù)放入發(fā)送緩沖區(qū)排隊(duì)
if (++tx_wr_index == SIZE) tx_wr_index = 0; //調(diào)整指針
++tx_counter;
}
else
{
SPDR = c; //發(fā)送緩沖區(qū)中空且SPI口空閑,直接放入SPDR由SIP口發(fā)送
SPI_ok = 0; //
}
SEI();
}
void spi_init(void)
{
unsigned char temp;
DDRB |= (1<<PB6); //MOSI 設(shè)置為輸出,MISO and SCK,SS = input
SPCR = 0xC5; //1101 0101 SPI允許,從機(jī)模式,MSB,允許SPI中斷,極性方式01,1/16系統(tǒng)時(shí)鐘速率
/***************************************************
SPCR
0
SPIE SPE DORDER MSTR CPOL CPHAP SPR1 SPR0
中斷允許 1LSB,0 MSB 時(shí)鐘方式選擇
允許SPI 主從
***************************************************/
SPSR = 0x00; //2x 0x01
temp = SPSR;
temp = SPDR; //清空SPI,和中斷標(biāo)志,使SPI空閑
SPI_ok = 1; // SPI 空閑
}
/**************************************************
SPI END
***************************************************/
void delayms(int nsec)
{
int i=0;
int k=0;
for(k=0;k<nsec;k++)
for(i=0;i<2000;i++) asm("nop");
}
const unsigned char InitGPSBUF1[8]={0x07,0x40,0x40,0x4f,0x69,0x26,0x0d,0x0a};
const unsigned char InitGPSBUF2[32]={0x1f,0x40,0x40,0x4f,0x46,0x00,0x00,0x02,0x00,0x00,0x00,
0x01,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0a,0x0d,0x0a};
const unsigned char InitGPSBUF3[31]={0x1e,0x40,0x40,0x4f,0x6a,0x00,0x00,0x0a,0x03,0x70,0x07,
0x3c,0xff,0x11,0x92,0x07,0x0a,0x8b,0x07,0x00,0x00,
0x1e,0x00,0x1e,0x00,0x12,0x00,0x12,0x9a,0x0d,0x0a};
const unsigned char InitGPSBUF4[19]={0x12,0x40,0x40,0x4f,0x61,0x04,0x00,0x05,0x00,0x05,0x14,
0x7f,0x00,0x01,0x01,0x01,0x40,0x0d,0x0a};
const unsigned char InitGPSBUF5[14]={0x0d,0x40,0x40,0x4f,0x74,0xff,0xff,0x10,0x01,0x00,0x00,
0x2a,0x0d,0x0a};
//const unsigned char InitGPSBUF5[14]={0x0d,0x40,0x40,0x4f,0x74,0x01,0x00,0x00,0x01,0x00,0x01,
// 0x3a,0x0d,0x0a};
const unsigned char InitGPSBUF6[31]={0x14,0x24,0x50,0x4d,0x4f,0x54,0x47,0x2c,0x47,0x47,0x41,
0x2c,0x30,0x30,0x30,0x31,0x2a,0x30,0x31,0x0d,0x0a};
const unsigned char InitGPSBUF7[31]={0x14,0x24,0x50,0x4d,0x4f,0x54,0x47,0x2c,0x52,0x4d,0x43,
0x2c,0x30,0x30,0x30,0x31,0x2a,0x31,0x43,0x0d,0x0a};
const unsigned char InitGPSBUF8[31]={0x14,0x24,0x50,0x4d,0x4f,0x54,0x47,0x2c,0x56,0x54,0x47,
0x2c,0x30,0x30,0x30,0x31,0x2a,0x30,0x35,0x0d,0x0a};
const unsigned char InitGPSBUF9[31]={0x14,0x24,0x50,0x4d,0x4f,0x54,0x47,0x2c,0x47,0x53,0x41,
0x2c,0x30,0x30,0x30,0x31,0x2a,0x31,0x35,0x0d,0x0a};
const unsigned char InitGPSBUF10[31]={0x14,0x24,0x50,0x4d,0x4f,0x54,0x47,0x2c,0x47,0x53,0x56,
0x2c,0x30,0x30,0x30,0x31,0x2a,0x30,0x32,0x0d,0x0a};
void init_FCOnOre(void)
{
unsigned char buflen=0;
unsigned char j=0;
buflen=InitGPSBUF1[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF1[j+1]);
delayms(1500);
buflen=InitGPSBUF2[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF2[j+1]);
delayms(100);
buflen=InitGPSBUF3[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF3[j+1]);
delayms(100);
buflen=InitGPSBUF4[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF4[j+1]);
delayms(100);
buflen=InitGPSBUF5[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF5[j+1]);
delayms(100);
buflen=InitGPSBUF6[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF6[j+1]);
delayms(100);
buflen=InitGPSBUF7[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF7[j+1]);
delayms(100);
buflen=InitGPSBUF8[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF8[j+1]);
delayms(100);
buflen=InitGPSBUF9[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF9[j+1]);
delayms(100);
buflen=InitGPSBUF10[0]; for(j=0;j<buflen;j++) putchar(1,InitGPSBUF10[j+1]);
delayms(100);
}
void main()
{
int i;
char recinfo[64];
char singlech;
char recch;
char reccounter=0;
//stop errant interrupts until set up
delayms(200);
CLI(); //disable all interrupts uart0_init();
uart1_init();
uart0_init();
spi_init();
SEI(); //re-enable interrupts
init_FCOnOre();
while(1)
{
if(urflag==1){
for(i=0;i<recgpslen;i++) putchar(0,gpsbuf[i]);
putSPIchar(0x7e);
putSPIchar(0x7e);
putSPIchar(0x7e);
putSPIchar(0x7f);
for(i=0;i<recgpslen;i++) putSPIchar(gpsbuf[i]);
putSPIchar(0x7f);
putSPIchar(0x7e);
putSPIchar(0x7e);
putSPIchar(0x7e);
urflag=0;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -