[求助] 基于430单片机的GPS程序问题

nby817273   2012-5-15 20:59 楼主
说是下面的程序没有中断的程序,怎么写,求大神帮忙,多谢啊啊!!!

#include
#include "1602.h"
//GPGMC
unsigned char gps_time[10];              //时间数据
unsigned char gps_mode;                  //模式数据
unsigned char gps_longitude[9];     //经度数据
unsigned char gps_longitude_dir;    //经度方向N/S?
unsigned char gps_latitude[10];     //纬度数据
unsigned char gps_latitude_dir;     //纬度方向E/W?

#define   MAX_RX_BUF  12                        //长度
unsigned char gps_rx_mode;                           //模式
unsigned char rx_pointer;                              //指针
unsigned char com_rx_buf[MAX_RX_BUF];   //串口接收缓冲区
void Uart_Init1();
void  dis_jwdu();
void rx_gps_data(unsigned char com_rx_byte) ;
unsigned char gcount,k;
void delay_ns(unsigned int time) ;
void Jingzhen();
void usart1_rx ();

void main(void)
{

        WDTCTL = WDTPW + WDTHOLD;              //关闭看门狗
        P3SEL |= 0xc0;             //P3.6,7用作UTXD1/URXD1
        P3DIR |= 0x40;                       //P3.6输出
        P1DIR |= 0x40;            
   
          Uart_Init1();                     //串口初始化  
       // clear();
           P1OUT=0x00;
        P1OUT|=0x00;
           delay_ns(3);                  //延迟3秒
    while(1)
      {
        dis_jwdu();//1602显示经纬度
      }

}

void Jingzhen(void)                       //晶振初始化
{     
    unsigned int n;
        BCSCTL1 &= ~XT2OFF;             // 启动XT2,XT2上电后默认是关闭的
        do
        {
           IFG1 &= ~OFIFG;                         // 清除震荡器失效标志
           for (n = 0xFF; n > 0; n--);                 // 延时,待稳定
        }
        while ((IFG1 & OFIFG));            // 检查震荡器失效标志位       
        BCSCTL2 = 0x88 ;                 // MCLK = SMCLK = XT2 (safe)
}

void Uart_Init1(void)                     //串口1初始化
{
        ME2 |= UTXE1 + URXE1;                  // Enable USART1 TXD/RXD
        UCTL1 = CHAR;                          // 8-bit character
        UTCTL1 = SSEL1;                          // UCLK = SMCLK
        UBR01 = 0X41;                          // 波特率9600
           UBR11 = 0X03;                 
        UMCTL1 = 0X00;                          // modulation

        IE2 |= URXIE1;                          // Enable USART1 RX interrupt
        UCTL1 &= ~SWRST;                        // Initialize USART stat
}


void rx_gps_data(unsigned char com_rx_byte)  //读取经纬度
{
        unsigned char i;
        if(com_rx_byte=='$')
        {
                gps_rx_mode=0;
                rx_pointer=0;
                for(i=0;i                         com_rx_buf=0;
        }
        else
        {
                if(rx_pointer                 {
                        com_rx_buf[rx_pointer]=com_rx_byte;
                        rx_pointer++;
                }
        }
        switch(gps_rx_mode)
        {
        case 0:                                    //接收GPRMC字段  
                if(com_rx_byte==',')
                {
                        if((com_rx_buf[0]=='G')&&(com_rx_buf[1]=='P')&&(com_rx_buf[2]=='R')&&(com_rx_buf[3]=='M')&&(com_rx_buf[4]=='C'))      //GPRMC
                                gps_rx_mode=1;
                            rx_pointer=0;
                 }break;
        case 1:                       //接收时间字段  
                if(com_rx_byte==',')
                {
                        for(i=0;i<10;i++)
                        {
                                gps_time=com_rx_buf;
                        }
                        gps_rx_mode=2;
                        rx_pointer=0;
                }break;
        case 2:                           //接收定位状态字段  
                if(com_rx_byte==',')
                  {
                        gps_mode=com_rx_buf[0];
                          gps_rx_mode=3;
                        rx_pointer=0;
                  }break;
        case 3:                            //纬度ddmm.mmmm,度分格式
                if(com_rx_byte==',')
                {
                        for(i=0;i<9;i++)
                        {
                                gps_longitude=com_rx_buf;
                        }
                        gps_rx_mode=4;
                        rx_pointer=0;
                }break;
        case 4:                          //纬度N(北纬)或S(南纬)
                if(com_rx_byte==',')
                {
                        gps_longitude_dir=com_rx_buf[0];
                        gps_rx_mode=5;
                        rx_pointer=0;
                }break;
        case 5:                             //经度dddmm.mmmm,度分格式
                if(com_rx_byte==',')
                {
                        for(i=0;i<10;i++)
                        {
                                gps_latitude=com_rx_buf;
                        }
                        gps_rx_mode=6;
                        rx_pointer=0;
                }break;
        case 6:                            //经度E(东经)或W(西经)
                if(com_rx_byte==',')
                {
                        gps_latitude_dir=com_rx_buf[0];
                        gps_rx_mode=7;
                        rx_pointer=0;
                }break;
            default:
                  gps_rx_mode=0;
                  rx_pointer=0;
                  break;
    }
}


void  dis_jwdu(void)
{
        unsigned i;
        LCD_disp_char(1,0,gps_latitude_dir);
        for(i=0;i<9;i++)
        {       
         LCD_disp_char(4,0,gps_latitude);
        }
        LCD_disp_char(1,1,gps_longitude_dir);               
        for(i=0;i<10;i++)
        {
        LCD_disp_char(4,1,gps_longitude);
        }               
}

void delay_ns(unsigned int time)         //延时n秒
{
        unsigned int d1,d2,j;
        for(j=0;j         for(d1=0;d1<1020;d1++)
        for(d2=0;d2<1300;d2++)  
   {
              _NOP();                      //执行空操作
   }
}
void delay_nus(unsigned int time)        //延时n微秒
{
   unsigned int d1,d2,j;
   for(j=0;j    for(d1=0;d1<1020;d1++)
  {
    for(d2=0;d2<1030;d2++)  
    {
      _NOP();
    }
   
  }
}
void delay_nms(unsigned int time)         //延时n毫秒
{
        unsigned int d1,d2,j;
        for(j=0;j         for(d1=0;d1<1;d1++)
        for(d2=0;d2<1300;d2++)               
        {
              _NOP();
           }
}

void usart1_rx (void)
{
  if(gcount<200)
        {
          rx_gps_data(RXBUF1);
          gcount=gcount+1;
            clear();
     }
          else
          gcount=0;
       
}

回复评论 (2)

是的,你开了串口接收中断,但是没有中断服务函数
点赞  2012-5-16 10:21
参考附件中的范例 

    uart.zip (2012-5-16 10:24 上传)

    10.65 KB, 下载次数: 38

点赞  2012-5-16 10:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复