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