OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4975|回复: 3

求楼主帮忙看一下基于430的GPS程序

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-17
在线时间
0 小时
发表于 2014-5-17 11:32:38 | 显示全部楼层 |阅读模式
5金钱

[mw_shl_code=c,true] #include "msp430g2553.h" #include <stdio.h> #include <string.h> #include "GPS.h" #include "LCD.h" #include "display.h" char rev_buf[80]; //接收缓存 uchar rev_start = 0; //接收开始标志 uchar rev_stop = 0; //接收停止标志 uchar gps_flag = 0; //GPS处理标志 uchar change_page = 0; //换页显示标志 uchar num = 0; // extern GPS_INFO GPS; //在display.c中定义,使用时要加extern void Uart_Init(void) { UCA0CTL1|=UCSWRST; UCA0CTL0&=~UC7BIT;//字符长度为8 UCA0CTL1 |= UCSSEL_2; // CLK = mCLK=1Mhz UCA0BR0 = 208; // 4800 UCA0BR1 = 0x00; // UCA0MCTL = UCBRS1+ UCBRS0; // Modulation UCBRSx = 3 UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能 P1SEL2|=BIT1+BIT2; // _BIS_SR(LPM3_bits + GIE); TA0CCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 TA0CTL = TASSEL_2+MC_1; // 设置定时器A控制寄存器,TA0CTL = MC_1; TA0CCR0 =10000; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1s _EINT();//开总中断 } /*void TimerA_init(void) { CCTL0|= CCIE; //设置捕获/比较控制寄存器,CCIE=0x0010,使能捕获比较中断 CCR0 =7200; //设置捕获/比较寄存器,初始值为12000,对于ACLK时钟频率为12khz的频率,相当于1s TA0CTL = TASSEL_2+MC_1; // 设置定时器A控制寄存器,TA0CTL = MC_1; }*/ #pragma vector=TIMER0_A0_VECTOR//固定的格式 __interrupt void Timer_A (void) //定时器A的CC0中断处理程序 必须是没有返回值的 { change_page++; //换页 if (change_page == 10) change_page = 0; // _EINT(); } #pragma vector=USCIAB0RX_VECTOR __interrupt void usart0_rx(void) { char ch; IE2&=~UCA0RXIE; if((IFG2&UCA0RXIE) ) { //a=UCAORXBUF; //i++;C ch=UCA0RXBUF; P1OUT ^= 0x01; if ((ch == '$') && (gps_flag == 0)) //如果收到字符'$',便开始接收 { rev_start = 1; rev_stop = 0; } if (rev_start == 1) //标志位为1,开始接收 { rev_buf[num++] = ch; //字符存到数组中 if (ch == '\n') //如果接收到换行 { rev_buf[num] ='\0'; rev_start = 0; rev_stop = 1; gps_flag = 1; num = 0; } } } IFG2&=~UCA0RXIFG; IE2 |=UCA0RXIE; } void delay11(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=20;y>0;y--); } /**************************************** 主函数 ****************************************/ void main(void) { P1DIR = 0XFF1OUT = 0XFF; P2DIR = 0XFF2OUT = 0XFF; WDTCTL = WDTPW + WDTHOLD; BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; uchar error_num = 0; Uart_Init(); //初始化串口 lcdinit(); //初始化LCD GPS_Init(); //初始化GPS rev_stop=0; _EINT(); while(1) { if (rev_stop==1) //如果接收完一行 { TA0CCTL0|= CCIE;//开启定时器0 if(change_page%2==1)//换页 { if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPGGA { GPS_DisplayTwo(); //显示第二页信息 error_num = 0; gps_flag = 0; rev_stop = 0; } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { error_num = 20; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; } } else { if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPGGA { GPS_DisplayOne(); //显示第一页信息 error_num = 0; gps_flag = 0; rev_stop = 0; } else { error_num++; if (error_num >= 20) //如果数据无效超过20次 { error_num = 20; GPS_Init(); //返回初始化 } gps_flag = 0; rev_stop = 0; } } } } } [/mw_shl_code]




老是运行到if (rev_stop==1)   //如果接收完一行   就不在运行,是GPRMC信号,lcd翻页显示

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-17
在线时间
0 小时
 楼主| 发表于 2014-5-17 11:34:55 | 显示全部楼层
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-5-17
在线时间
0 小时
 楼主| 发表于 2014-5-17 11:41:03 | 显示全部楼层
很急,求帮忙。。。。。
gps模块用的是AN130 AN130 3 ATKATK -NEO NEO-6M GPS 6M GPS6M GPS模
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-5-17 21:08:22 | 显示全部楼层
你先搞好串口收发,和串口助手联调一下试试先.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 18:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表