• 基于80C51单片机的经纬度定位显示装置设计


    目 录
    摘要.....................................................................Ⅰ
    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
    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;
    					}
    			}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    【python】类方法、property类属性、单例模式
    部署vue element-ui admin报错(vue2)
    【java算法专场】双指针(上)
    Android 12 WiFi Scan 流程 [3]
    基于Yolov8的中国交通标志(CCTSDB)识别检测系统
    教你如何求职找工作
    高校邮箱账号盗用监控及钓鱼邮件检测-上海交通大学
    微信小程序的缓存、跳转与请求
    myabtis的缓存级别
    response.setHeader的各种用法
  • 原文地址:https://blog.csdn.net/newlw/article/details/127933224