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

📄 main.c

📁 单片机c语言程序设计100例--基于PIC+PROTEUS
💻 C
字号:
//-----------------------------------------------------------------
//  名称: GPS全球定位系统仿真
//-----------------------------------------------------------------
//  说明: 本例运行时,LCD屏将显示出当前经纬度,时间,速度信息.
//
//        在PROTEUS环境下完成本实验时,需要运行程序:
//        1. Virtual Serial Port Driver(VSPD,虚拟串口驱动)
//        2. Virtual GPS(虚拟GPS软件)
//        建议在VSPD中将COM3和COM4设为对联端口.
//        PROTEUS中设COMPIM为COM3,在虚拟GPS软件中选择COM4
//        单片机程序将接收虚拟GPS软件通过串口发回来的信息
//        解析与显示在LCD上.
//
//-----------------------------------------------------------------
#include <pic.h>
#include <stdio.h>
#include "PG160128.h"
#include "PictureDots.h"

volatile INT8U rec_OK = 0;
volatile char time[] = "00:00:00";volatile char Longitude[] = "ddd\xA1\xE3mm.mmmm' X";//经度
volatile char Latitude[] =  " dd\xA1\xE3mm.mmmm' X";//纬度
volatile char Speed[12];                            //地面速度
const char p[] = "$GPRMC";
//-----------------------------------------------------------------
// 延时函数
//-----------------------------------------------------------------
void delay(INT8U x)
{
    while (--x) __delay_ms(100);
}

//-----------------------------------------------------------------
// 串口初始化
//-----------------------------------------------------------------
void Init_SerialPort()
{
    TRISC6 = 0;                            //TXD输出
    TRISC7 = 1;                            //RXD输入
    SYNC = 0;                              //选择异步通信模式
    BRGH = 1;                              //选择高速波特率发生模式
    TXEN = 1;                              //允许发送数据
    SPBRG = _XTAL_FREQ/16/4800 - 1;        //设置波特率为4800    
    SPEN = 1;                              //串行通信端口打开
    CREN = 1;                              //使能连续接收串行数据
}

//-----------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------
void main()
{ 
    ADCON1 = 6;                   //RA端口设为数字端口
    TRISC2 = TRISC3 = TRISC4 = 0; //液晶输出端口
    PORTD = TRISD = 0x00;     
    LCD_Initialise();             //初始化LCD
    Clear_Screen();               //清屏
    Draw_Image((INT8U*)Title_Image,0,0);  //显示GPS导航系统标题
    Draw_Image((INT8U*)Info4_Image,30,0); //显示GPS导航系统4项信息 
    Init_SerialPort();            //初始化串口    
    RCIE = 1;                     //使能接收中断
    GIE = 1;                      //开放全局中断
    PEIE = 1;                     //使能外部中断 
    while(1)
    {
       //处理$GPRMC,分解出时间,经纬度及速度信息并显示
       if (rec_OK == 1)
       {
          




       }    
    }
}
//------------------------------------------------------------------
// 串口接收中断程序
// 下面是接收的定位信息格式串示例:
// $GPRMC,161229.487,A,3723.247500,N,12158.341600,W,0.13,309.62,120598, ,*10
//------------------------------------------------------------------
void interrupt Serial_Port_Recv_ISR()
{
    static INT8U i = 0, end_flag = 0;
    if(RCIE && RCIF)
    {
       RCIF = 0;
       //读取接收到字符
       INT8U c = RCREG;       
       //未接收到完整的"$GPRMC"协议头时索引归0
       if (i < 6 && p[i] != c) { i = 0; return; } 
       //获取接收时间信息hh:mm:ss,忽略0.ssss
       if (i >= 7 && i <= 12) 
       {





       }
       //处理纬度信息
       else if (i == 20 || i == 21)  Latitude[i-19] = c;  //度存入1,2
       else if (i >= 22 && i <= 28)  Latitude[i-17] = c;  //分存入5~11
       else if (i == 32)             Latitude[14]   = c;
       //处理经度信息
       else if (i >= 34 && i <= 36)  Longitude[i-34] = c; //度存入0~2
       else if (i >= 37 && i <= 43)  Longitude[i-32] = c; //分存入5~11
       else if (i == 47 )            Longitude[14]   = c;
       //获取速度信息
       if (i >= 49)
       {







       }       
       if (++i > 60 || end_flag ==1 ) 
       {




       } 
    }
}

⌨️ 快捷键说明

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