目 录
摘要.....................................................................Ⅰ
Abstract..................................................................Ⅱ
1 前言 1
1.1 课题目的和来源 1
1.1.1定位和导航业务需求发展的趋势 1
1.1.2卫星定位和导航的作用 3
1.2开发系统及工具的选择 4
1.2.1 51单片机简介 4
1.2.2 proteus开发工具介绍 5
1.2.3 Keil uVision3 5
2 系统设计 5
2.1 系统结构 5
2.2 电源模块设计 6
2.3 GPS数据模块设计 7
2.3.1数据采集方案 7
2.3.2数据接收和处理 8
2.4 控制模块 9
2. 5显示模块 9
3 软件设计 10
3.1 主程序设计 10
3.2 显示驱动程序 11
3.3 硬件连接设置 12
3.4 LCD显示工作模式 12
3.5 系统主程序 12
3.6 数据接收程序 13
结束语 19
参考文献 20
附录A:NMEA 0183格式资料...............................................22
附录B:程序清单........................................................23
致谢 32
2 系统设计
本设计是一个LCD1602电子液晶显示屏显示动画的设计。整机以ATMEL 公司生产的40脚单片机AT89C52为核心,介绍了以它为控制系统的LCD电子液晶显示屏的动态设计和开发过程。该电子显示屏内部自带了ASCII码识别显示控制电路部分,如果需要显示一个西文字符,只需要让单片机给他输入这个西文字符的ASCII码即可。文中详细介绍了LCD显示的硬件设计思路、硬件电路各个部分的功能及原理、相应软件的程序设计。
2.1系统结构
系统硬件部分电路大致上可以分成稳压电源、单片机小系统及外围电路和LCD显示屏电路三部分。
电路为单片机89C52控制的GPS器件,实现定位系统数据的采集和现实。其中所使用的器件主要是3个,单片机89C52、GPS模块GARMIN GPS25以及LCD显示模块MGLS-12032A。在这里仅列出单片机和LCD接口部分电路的器件名称和相关的主要功能。
89C52:LCD的控制器,控制字符的发送和点阵显示的时序。
MAX202:TTL电平和RS-232电平的转换芯片。
LCD:液晶显示模块。在单片机的控制下,按照要求的格式显示接受到的数据。
#include<header.h>
unsigned char Num_comma=0;//逗号纪录数
bit read_start=0;//开始接收数据标志位
unsigned char *data_temp=" ";//数据缓存区
unsigned char *dis_temp="0139250056.25680014.256901203.5";//显数据
unsigned char i,igps=0;//igps纪录接收次数,以表示存储在数组中的位置
bit flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;//接收标志位:GPGGA
#define START '$'//字符串开始
#define END '*'//字符串结束
void LCD_show( )
{ unsigned char i;
LCD_set_position(0);
LCD_prints("Time-> ");
for(i=0;i<2;i++) LCD_printc(dis_temp[i]);
LCD_printc(':');
for(i=2;i<4;i++) LCD_printc(dis_temp[i]);
LCD_printc(':');
for(i=4;i<6;i++) LCD_printc(dis_temp[i]);
LCD_set_position(0x40);
LCD_prints("Latit:");
for(i=6;i<15;i++) LCD_printc(dis_temp[i]);
LCD_printc('*');
delay(200);delay(200);
LCD_cls();
LCD_set_position(0);
LCD_prints("Longi:");
for(i=15;i<24;i++) LCD_printc(dis_temp[i]);
LCD_printc('*');
LCD_set_position(0x40);
LCD_prints("High : ");
for(i=24;i<31;i++) LCD_printc(dis_temp[i]);
LCD_prints("M");
delay(255);delay(200);
}
/*****************串行口中断子程序**************************/
void serial() interrupt 4
{
RI=0;//软件清除中断标志位
//判断是否接收到字符“$”,ASCII码为0x24,收到后开始继续数据并置标志//record=1;
if(SBUF=='$')//判断是不是'$'符号
{ flag1=1;
//开始接收数据,计数变量初始化(清零);
igps=0;//记录纬度数据字符数量的变量
Num_comma=0;//记录逗号数量的变量
}
else flag1=0;
//判断读取格式是不是GPGGA格式
if((SBUF=='G')&(flag1==1))flag2=1;
else flag2=0;
if((SBUF=='P')&(flag2==1))flag3=1;
else flag3=0;
if((SBUF=='G')&(flag3==1))flag4=1;
else flag4=0;
if((SBUF=='G')&(flag4==1))flag5=1;
else flag5=0;
if((SBUF=='A')&(flag5==1))read_start=1;
else read_start=0;
if(read_start==1)//开始处理GPRMC中的数据信息,
{
if(SBUF==',')//利用GPGGA数据中的逗号间隔,判断数据信息
{
Num_comma++;//记录逗号个数,标志数据的意义
}
if(Num_comma==1)//接收时间,时分秒格式
{
data_temp[igps]=SBUF;//将字符放入字符串
//“data_temp”中
igps++;
}
if(Num_comma==2)//接收接收纬度,ddmm.mmmm格式
{ data_temp[igps]=SBUF;
igps++;
}
if(Num_comma==4)//接收精度,ddmm.mmmm格式
{
data_temp[igps]=SBUF;
igps++;
}
if(Num_comma==10)//海拔高度:0—99999.9
{
if(SBUF!='M')//不接受M单位数据,节省资源
data_temp[igps]=SBUF;
igps++;
}
if(SBUF=='*')//判断是否收到字符“*”,是,则结束接收,//开始处理
{
for(i=0;i<igps;i++)
{
data_temp[igps]=dis_temp[igps];
}
//返回初值;标识结束一次接收完毕
Num_comma=0;
read_start=0;
igps=0;
}
}
}