找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4744|回复: 1
收起左侧

GPS定位程序 用51单片机+1602实现

[复制链接]
ID:719206 发表于 2020-3-31 15:54 | 显示全部楼层 |阅读模式
          大二的时候学单片机没事做搞得,现在快工作了,做个 纪念。。
     用到的器件:
           1、89c52
           2、gps
           3、1602显示器

51hei.png

单片机源程序如下:
  1. //包含头文件
  2. #include <REG52.h>
  3. #include "uart.c"

  4. //宏定义
  5. #define LCM_Data  P0                  //将P0口定义为LCM_Data
  6. #define uchar unsigned char
  7. #define uint  unsigned int

  8. //1602的控制脚
  9. sbit lcd1602_rs=P2^5;
  10. sbit lcd1602_rw=P2^6;
  11. sbit lcd1602_en=P2^7;

  12. #define RsBuf_N                800

  13. unsigned char xdata RsBuf[RsBuf_N];        //定义串口接收数据缓冲区
  14. uchar code sousuo[]="GPS Searching...";
  15. uint RsPoint;
  16. bit dis_flag=0;
  17. unsigned long weidunum=0;
  18. unsigned long jingdunum=0;
  19. //==================================================================================================
  20. //=======================================LCD1602====================================================
  21. //==================================================================================================
  22. //----------------延时函数,后面经常调用----------------------
  23. void delay(uint xms)//延时函数,有参函数
  24. {
  25.         uint x,y;
  26.         for(x=xms;x>0;x--)
  27.          for(y=10;y>0;y--);
  28. }

  29. //--------------------------写指令---------------------------
  30. void write_1602com(uchar com)//****液晶写入指令函数****
  31. {
  32.         lcd1602_rs=0;//数据/指令选择置为指令
  33.         lcd1602_rw=0; //读写选择置为写
  34.         P0=com;//送入数据
  35.         delay(1);
  36.         lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备
  37.         delay(1);
  38.         lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
  39. }

  40. //-------------------------写数据-----------------------------
  41. void write_1602dat(uchar dat)//***液晶写入数据函数****
  42. {
  43.         lcd1602_rs=1;//数据/指令选择置为数据
  44.         lcd1602_rw=0; //读写选择置为写
  45.         P0=dat;//送入数据
  46.         delay(1);
  47.         lcd1602_en=1; //en置高电平,为制造下降沿做准备
  48.         delay(1);
  49.         lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
  50. }

  51. //-------------------------初始化-------------------------
  52. void lcd_init(void)
  53. {
  54.         uchar i;
  55.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  56.         write_1602com(0x0c);//开显示不显示光标
  57.         write_1602com(0x06);//整屏不移动,光标自动右移
  58.         write_1602com(0x01);//清显示
  59.         delay(1000);
  60.         write_1602com(0x80);
  61.         for(i=0;i<16;i++)
  62.         write_1602dat(sousuo[i]);
  63. }

  64. //  通讯中断接收程序   中断函数无返回值
  65.   void uart_rx(void)  interrupt 4        using 3         
  66. {
  67.          EA=0;
  68.            if((RsPoint<RsBuf_N)&&RI) //必须判断RI是否为1

  69.     {
  70.             RI=0;
  71.                 if(SBUF=='

  72. )
  73.                 RsPoint=0;
  74.             RsBuf[RsPoint++]=SBUF;
  75.     }
  76.         EA=1;
  77. }
  78. //==============================主函数===============================
  79. void main(void)
  80. {
  81.          uint i;
  82.         uchar shi;
  83.          lcd_init();
  84.         Uart_init();
  85.         for(i=0;i<RsBuf_N;i++)
  86.         RsBuf[i]='0';
  87.         while(1)
  88.         {
  89.                    if(RsBuf[0]=='

  90. &&RsBuf[1]=='G'&&RsBuf[2]=='P'&&RsBuf[3]=='G'&&RsBuf[4]=='G'&&RsBuf[5]=='A'&&RsBuf[44]!='0')
  91.                    {
  92.                         if(RI==0&&((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))>=0&&((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))<=180)
  93.                         {
  94.                                 TR0=1;
  95.                                 if(dis_flag==0)
  96.                                 {        
  97.                                         write_1602com(0x80);
  98.                                         write_1602dat('T');
  99.                                         write_1602dat('i');
  100.                                         write_1602dat('m');
  101.                                         write_1602dat('e');
  102.                                         write_1602dat(':');
  103.                                         shi=((RsBuf[7]-0x30)*10+(RsBuf[8]-0x30)+8)%24;
  104.                                         write_1602dat(shi/10+0x30);
  105.                                         write_1602dat(shi%10+0x30);
  106.                                         write_1602dat('-');
  107.                                         write_1602dat(RsBuf[9]);
  108.                                         write_1602dat(RsBuf[10]);
  109.                                         write_1602dat('-');
  110.                                         write_1602dat(RsBuf[11]);
  111.                                         write_1602dat(RsBuf[12]);
  112.                                         write_1602dat(' ');
  113.                                         write_1602dat(' ');
  114.                                         write_1602dat(' ');
  115.                
  116.                                         write_1602com(0xc0);
  117.                                         write_1602dat('W');
  118.                                         write_1602dat('X');
  119.                                         write_1602dat(':');
  120.                                         write_1602dat(RsBuf[46]);
  121.                                         write_1602dat(RsBuf[47]);  
  122.                                         write_1602dat(' ');
  123.                                         write_1602dat(' ');

  124.                                         write_1602com(0xc7);
  125.                                         write_1602dat('J');
  126.                                         write_1602dat('D');
  127.                                         write_1602dat(':');
  128.                                         write_1602dat(RsBuf[49]);
  129.                                         write_1602dat(RsBuf[50]);
  130.                                         write_1602dat(RsBuf[51]);
  131.                                         write_1602dat(RsBuf[52]);
  132.                                         write_1602dat(' ');
  133.                                         write_1602dat(' ');
  134.                                 }
  135.                                 else
  136.                                 {
  137.                                         weidunum=        ((RsBuf[17]-48)*10000000+(RsBuf[18]-48)*1000000)
  138.                                                                 +(((((RsBuf[19]-48)*10)+(RsBuf[20]-48))*100000)/6)
  139.                                                                 +(((((RsBuf[22]-48)*1000)+((RsBuf[23]-48)*100)+((RsBuf[24]-48)*10)+(RsBuf[25]-48))*10)/6);         
  140.                                         write_1602com(0x80);
  141.                                         write_1602dat('W');
  142.                                         write_1602dat('D');
  143.                                         write_1602dat(':');
  144.                                         write_1602dat(' ');
  145.                                         write_1602dat(weidunum/10000000+0x30);
  146.                                         write_1602dat(weidunum%10000000/1000000+0x30);
  147.                                         write_1602dat('.');
  148.                                         write_1602dat(weidunum%1000000/100000+0x30);
  149.                                         write_1602dat(weidunum%100000/10000+0x30);
  150.                                         write_1602dat(weidunum%10000/1000+0x30);
  151.                                         write_1602dat(weidunum%1000/100+0x30);
  152.                                         write_1602dat(weidunum%100/10+0x30);
  153.                                         write_1602dat(weidunum%10+0x30);        
  154.                                         write_1602dat(RsBuf[28]);
  155.                                         write_1602dat(' ');
  156.                                         write_1602dat(' ');
  157.                
  158.                
  159.                                         jingdunum=        (((RsBuf[30]-48)*100000000)+((RsBuf[31]-48)*10000000)+((RsBuf[32]-48)*1000000))
  160.                                                                 +(((((RsBuf[33]-48)*10)+(RsBuf[34]-48))*100000)/6)
  161.                                                                 +(((((RsBuf[36]-48)*1000)+((RsBuf[37]-48)*100)+((RsBuf[38]-48)*10)+(RsBuf[39]-48))*10)/6);           
  162.                                         write_1602com(0xc0);
  163.                                         write_1602dat('J');
  164.                                         write_1602dat('D');
  165.                                         write_1602dat(':');
  166.                                         write_1602dat(jingdunum/100000000+0x30);
  167.                                         write_1602dat(jingdunum%100000000/10000000+0x30);
  168.                                         write_1602dat(jingdunum%10000000/1000000+0x30);
  169.                                         write_1602dat('.');
  170.                                         write_1602dat(jingdunum%1000000/100000+0x30);
  171.                                         write_1602dat(jingdunum%100000/10000+0x30);
  172.                                         write_1602dat(jingdunum%10000/1000+0x30);
  173. ……………………

  174. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
882-GPS定位1602显示.rar (1.66 MB, 下载次数: 109)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:261025 发表于 2021-8-26 17:00 | 显示全部楼层
为什么纬度和手机导航软件手机卫星地图软件不一样   
手机导航上小数是078531  这个程序显示068181
根据坐标在卫星地图上看误差1000多米
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表