久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9031|回復: 10
打印 上一主題 下一主題
收起左側

GPS定位LCD1602顯示的單片機源碼與實物制作

  [復制鏈接]
跳轉到指定樓層
樓主
ID:260806 發(fā)表于 2017-12-21 12:18 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
以51單片機為主控制器,LCD1602顯示,通過GPS定位模塊收發(fā)信息,在LCD上顯示經緯度。
還加了溫濕度DHT11模塊,可以在經緯度旁邊顯示溫濕度。

實物圖:


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include "delay.h"
  5. #include "1602.h"

  6. /**The UART1 stage1**/
  7. #define STAGE_SOHE  0x01
  8. #define STAGE_TYPE  0x02
  9. #define STAGE_NONE  0x03
  10. #define STAGE_DATA  0x04

  11. unsigned char Lin0_No[16]="N:000.000000 ";//顯示北緯
  12. unsigned char Lin1_Ea[16]="E:000.000000 ";//顯示東經
  13. unsigned long xdata time_20ms=0;

  14. unsigned char xdata        devide_flag;                        //GPS數據逗號分隔符
  15. unsigned char xdata        speed_end;                        //收速度數據結束標志
  16. unsigned char xdata        dir_end;                        //收方向角數據結束標志
  17. unsigned char xdata  sysmode_GPS=0;                    //gps有效無效標志
  18. unsigned char  xdata ew_flag;                        //東西標志
  19. unsigned char  xdata ns_flag;                        //南北標志

  20. unsigned char xdata        gps_infor_weijing[17];    //暫存經緯度 格式是以度分秒的是形式
  21. unsigned char xdata        gps_infor_speed[4];       //暫存速率
  22. unsigned char xdata        gps_infor_time[6];        //時間暫存
  23. unsigned char xdata        gps_infor_date[6];        //日期暫存
  24. unsigned char xdata        gps_infor_dir[3];         //方向暫存

  25. unsigned char xdata recv1_step=STAGE_SOHE;                       //串口1接收指令步驟
  26. unsigned char xdata uart1_r_buf;                       //串口的緩存
  27. unsigned char xdata rev1_buf_busy;                    //串口接收忙碌標志
  28. unsigned char xdata temp1_buf[85];                   //串口接收數組
  29. unsigned int xdata record1=0;   
  30. unsigned  char times = 0;                //延時計數
  31. void Init_Timer0(void);//定時器初始化
  32. void UART_Init(void);

  33. void main (void)
  34. {
  35.         unsigned char num=0;
  36.         unsigned long Mid_Du;       //中間變量 暫存經緯度的整數部分 即度
  37.         unsigned long Mid_Fen;      //中間變量 暫存經緯度的小數部分 即分  gps原始數據是度分秒格式
  38.         unsigned long Mid_Vale;     ////中間變量 暫存經緯度 并將其擴大了10000000倍
  39.         unsigned char i ;

  40.         Init_Timer0();        //定時器0初始化
  41.         
  42.         UART_Init();
  43.                
  44.         LCD_Init();           //初始化液晶
  45.         DelayMs(20);          //延時有助于穩(wěn)定
  46.         LCD_Clear();          //清屏

  47.         DelayMs(120);

  48.         while(1)         //主循環(huán)
  49.         {
  50.                 if(sysmode_GPS==1)                //檢測gps是否有效數據
  51.                         {
  52.                                 sysmode_GPS=0;                        //清除有效位
  53.                                 times = 0;        //防止gps數據未更新就誤判斷數據無效
  54.                         Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000;    //處理緯度 暫存整數部分擴大10000000
  55.                         
  56.                         Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+
  57.                           (gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+
  58.                             (gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100;        //處理緯度 暫存小數部分擴大10000000      
  59.                         Mid_Fen=Mid_Fen/60;                                                     //分秒換算為小數位
  60.                         Mid_Vale=Mid_Du+Mid_Fen;        //最終緯度 格式為000.00000000 非度分秒格式
  61.                         Lin0_No[0]='N';                  
  62.                                 Lin0_No[1]=':';                  
  63.                                 Lin0_No[2]='0';                  
  64.                         Lin0_No[3]=Mid_Vale/10000000+0x30;                  //將處理后的緯度填入字符串 并打印顯示
  65.                         Lin0_No[4]=(Mid_Vale/1000000)%10+0x30;
  66.                         Lin0_No[5]='.';
  67.                         Lin0_No[6]=(Mid_Vale/100000)%10+0x30;
  68.                         Lin0_No[7]=(Mid_Vale/10000)%10+0x30;
  69.                         Lin0_No[8]=(Mid_Vale/1000)%10+0x30;
  70.                         Lin0_No[9]=(Mid_Vale/100)%10+0x30;
  71.                         Lin0_No[10]=(Mid_Vale/10)%10+0x30;
  72.                         Lin0_No[11]=Mid_Vale%10+0x30;
  73.                         
  74.                         Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //處理經度 暫存整數部分擴大10000000
  75.                         
  76.                         Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+
  77.                           (gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+
  78.                             (gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; //處理經度 暫存小數部分擴大10000000      
  79.                         Mid_Fen=Mid_Fen/60;                                                //分秒換算為小數位
  80.                         Mid_Vale=Mid_Du+Mid_Fen;                                          //最終經度 格式為000.00000000 非度分秒格式
  81.                         Lin1_Ea[0]='E';                  
  82.                                 Lin1_Ea[1]=':';     
  83.                         Lin1_Ea[2]=Mid_Vale/100000000+0x30;                            //將處理后的經度填入字符串 并打印顯示
  84.                         Lin1_Ea[3]=(Mid_Vale/10000000)%10+0x30;
  85.                         Lin1_Ea[4]=(Mid_Vale/1000000)%10+0x30;
  86.                         Lin1_Ea[5]='.';
  87.                         Lin1_Ea[6]=(Mid_Vale/100000)%10+0x30;
  88.                         Lin1_Ea[7]=(Mid_Vale/10000)%10+0x30;
  89.                         Lin1_Ea[8]=(Mid_Vale/1000)%10+0x30;
  90.                         Lin1_Ea[9]=(Mid_Vale/100)%10+0x30;
  91.                         Lin1_Ea[10]=(Mid_Vale/10)%10+0x30;
  92.                         Lin1_Ea[11]=Mid_Vale%10+0x30;
  93.                        
  94.                         }
  95.                         else
  96.                         {         
  97.                                 times++;
  98.                                 if(times>4)                   //防止gps數據未更新就誤判斷數據無效
  99.                                 {
  100.                                         times = 0;                 //清零計數
  101.                                 Lin1_Ea[0]='G';               //無gps信號情況下 打印正在連接
  102.                                         Lin1_Ea[1]='P';                  
  103.                                         Lin1_Ea[2]='S';                  
  104.                                 Lin1_Ea[3]=' ';                  //將處理后的緯度填入字符串 并打印顯示
  105.                                 Lin1_Ea[4]='L';
  106.                                 Lin1_Ea[5]='I';
  107.                                 Lin1_Ea[6]='N';
  108.                                 Lin1_Ea[7]='K';
  109.                                 Lin1_Ea[8]='I';
  110.                                 Lin1_Ea[9]='N';
  111.                                 Lin1_Ea[10]='G';
  112.                                 Lin1_Ea[11]='.';
  113.                                         for(i=0;i<12;i++)         //數組重新填充
  114.                                         {
  115.                                                 Lin0_No[i]=Lin1_Ea[i];
  116.                                         }
  117.                                 }

  118.                         }
  119.                         LCD_Write_String(0,0,Lin0_No);//顯示第一行
  120.                         LCD_Write_String(0,1,Lin1_Ea);//顯示第二行
  121.                 }

  122.         }


  123. void Init_Timer0(void)
  124. {
  125. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  126. TH0=(65536-20000)/256;                  //重新賦值 20ms
  127. TL0=(65536-20000)%256;
  128. EA=1;            //總中斷打開
  129. ET0=1;           //定時器中斷打開
  130. TR0=1;           //定時器開關打開
  131. }

  132. void Timer0_isr(void) interrupt 1
  133. {
  134. TH0=(65536-20000)/256;                  //重新賦值 20ms
  135. TL0=(65536-20000)%256;

  136. time_20ms++;
  137. }

  138. void UART_Init(void)
  139. {
  140.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  141.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  142.     TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
  143.     TR1   = 1;                  // TR1:  timer 1 打開                        
  144.     EA    = 1;                  //打開總中斷
  145.     ES    = 1;                  //打開串口中斷
  146. }

  147. void UART_SER (void) interrupt 4 //串行中斷服務程序
  148. {
  149.     if(RI)                        //判斷是接收中斷產生
  150.     {
  151.           RI=0;                      //標志位清零
  152.           uart1_r_buf=SBUF;                      //提取buf中的值
  153.           rev1_buf_busy=0x00;                         //判別 放置break問題
  154.           switch(recv1_step)
  155.           {
  156.           case STAGE_SOHE: if(uart1_r_buf == '')     //判斷接收到了  具體原因參考GPS標準協議NMEA0183
  157.           {
  158.             rev1_buf_busy=0x01;
  159.             if(uart1_r_buf == '')              //再次查看接收的是否是
  160.             {
  161.               recv1_step=STAGE_TYPE;            //跳轉到下一步
  162.               record1=0;                        //計數清零
  163.             }
  164.             else
  165.             {
  166.               recv1_step=STAGE_SOHE;        //恢復初始化
  167.               record1=0;
  168.             }
  169.           }
  170.           break;
  171.           case STAGE_TYPE: if(rev1_buf_busy == 0x00)
  172.           {

  173.             rev1_buf_busy=0x01;
  174.             temp1_buf[record1]=uart1_r_buf;
  175.             record1++;
  176.             if(record1 == 0x05)
  177.             {                                                 //查看$GPRMC開頭的命令行
  178.               if((temp1_buf[0] == 'G') && (temp1_buf[1] == 'P') && (temp1_buf[2] == 'R') && (temp1_buf[3] == 'M') && (temp1_buf[4] == 'C'))
  179.               {
  180.                 recv1_step=STAGE_NONE;    //跳轉到下一步
  181.                 record1=0;
  182.               }
  183.               else
  184.               {
  185.                 recv1_step=STAGE_SOHE;//恢復初始化
  186.                 record1=0;
  187.               }
  188.             }
  189.           }
  190.           break;
  191.           case STAGE_NONE: if(rev1_buf_busy == 0x00)//接收命令格式:$GPRMC,054347.00,A,3202.04770,N,11846.23632,E,0.000,0.00,221013,,,A*67
  192.           {
  193.             rev1_buf_busy=0x01;
  194.             record1++;
  195.             if((record1 > 0x01) && (record1 < 0x08))                                                                                    
  196.             {
  197.               gps_infor_time[record1-2]=uart1_r_buf;                        //時間存儲                                                
  198.             }
  199.             if((uart1_r_buf == ',') && (record1 > 0x07) && (record1 < 0x010))   //||((uart1_r_buf == ',') && (record1==0x02))
  200.             {
  201.               record1=0xcc;
  202.             }
  203.             if(record1 ==  0xcd)
  204.             {
  205.               record1=0;
  206.               devide_flag=2;
  207.               speed_end=0x00;
  208.               dir_end=0x00;
  209.               if(uart1_r_buf == 'A')  //gps收到數據 且有效
  210.               {
  211.                 recv1_step=STAGE_DATA;    //跳轉到下一步
  212.               }
  213.               else
  214.               {
  215.                 sysmode_GPS=0;
  216.                 recv1_step=STAGE_SOHE;    //無效恢復初始化
  217.                 record1=0;
  218.               }
  219.             }
  220.           }
  221.           break;
  222.           case STAGE_DATA:  if(rev1_buf_busy == 0x00)
  223.           {
  224.             rev1_buf_busy=0x01;
  225.             record1++;
  226.             if(uart1_r_buf == ',')    //判斷逗號
  227.             {
  228.               devide_flag++;      //逗號次數記錄
  229.               record1=0;
  230.             }
  231.             if(devide_flag == 3)
  232.             {
  233.               if((record1 > 0) && (record1 < 5))
  234.               {
  235.                 gps_infor_weijing[record1-1]=uart1_r_buf;            //存儲經緯度 此處為緯度                                                        
  236.               }
  237.               if((record1 > 5) && (record1 < 10))             //跳過小數點的存儲
  238.               {
  239.                 gps_infor_weijing[record1-2]=uart1_r_buf;           //存儲經緯度 此處為緯度                                                                                                                        
  240.               }
  241.             }
  242.             if(devide_flag == 4)
  243.             {
  244.               if(record1 > 0)
  245.               {
  246.                 ns_flag=uart1_r_buf;            //接收緯度NS標志
  247.               }
  248.             }
  249.             if(devide_flag == 5)
  250.             {
  251.               if((record1 > 0) && (record1 < 6))
  252.               {
  253.                 gps_infor_weijing[record1+7]=uart1_r_buf;          //存儲經緯度 此處為緯度                                                                                
  254.               }
  255.               if((record1 > 6) && (record1 < 11))                //跳過小數點的存儲
  256.               {
  257.                 gps_infor_weijing[record1+6]=uart1_r_buf;       //存儲經緯度 此處為經度                                                                                                                                                        
  258.               }
  259.             }
  260.             if(devide_flag == 6)
  261.             {
  262.               if(record1 > 0)
  263.               {
  264.                 ew_flag=uart1_r_buf;            //經度度 EW標志
  265.               }
  266.             }
  267.             if(devide_flag == 7)
  268.             {
  269.               if(speed_end == 0x00)
  270.               {
  271.                 if((record1 > 0) && (uart1_r_buf != '.'))
  272.                 {
  273.                   gps_infor_speed[record1-1]=uart1_r_buf;   //接收速率
  274.                 }
  275.                 else if(uart1_r_buf == '.')
  276.                 {
  277.                   record1--;
  278.                   speed_end=0xff;
  279.                 }
  280.               }
  281.               else if(speed_end == 0xff)
  282.               {
  283.                 speed_end=0xfe;
  284.                 gps_infor_speed[record1-1]=uart1_r_buf;
  285.                 gps_infor_speed[3]=gps_infor_speed[record1-1];
  286.                 gps_infor_speed[2]=gps_infor_speed[record1-2];
  287.                 if(record1 > 2)
  288.                 {
  289.                   gps_infor_speed[1]=gps_infor_speed[record1-3];
  290.                 }
  291.                 else
  292.                 {
  293.                   gps_infor_speed[1]=0x30;
  294.                 }
  295.                 if(record1 > 3)
  296.                 {
  297.                   gps_infor_speed[0]=gps_infor_speed[record1-4];
  298.                 }
  299.                 else
  300.                 {
  301.                   gps_infor_speed[0]=0x30;
  302.                 }
  303.               }
  304.             }
  305.             if(devide_flag == 8)
  306.             {
  307.               if(dir_end == 0x00)
  308.               {
  309.                 if((record1 > 0) && (uart1_r_buf != '.'))
  310.                 {
  311.                   gps_infor_dir[record1-1]=uart1_r_buf;   //存儲方向
  312.                 }
  313.                 else if(uart1_r_buf == '.')
  314.                 {
  315.                   record1--;
  316.                   dir_end=0xff;
  317.                 }
  318.               }
  319. ……………………

  320. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
程序.rar (71.15 KB, 下載次數: 122)







分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:243700 發(fā)表于 2017-12-24 10:31 | 只看該作者
樓樓有沒有proteus仿真圖或者原理圖啊
回復

使用道具 舉報

板凳
ID:102963 發(fā)表于 2017-12-29 22:09 | 只看該作者
缺少電路圖!
回復

使用道具 舉報

地板
ID:193148 發(fā)表于 2018-1-1 23:07 | 只看該作者
HTGNSS不僅銷售GPS模塊,最重要是強大的技術支持。HTGNSS承諾GPS模塊終身保修
回復

使用道具 舉報

5#
ID:260806 發(fā)表于 2019-3-27 11:38 | 只看該作者
虓尨 發(fā)表于 2017-12-24 10:31
樓樓有沒有proteus仿真圖或者原理圖啊

沒有仿真圖
原理圖有
回復

使用道具 舉報

6#
ID:260806 發(fā)表于 2019-3-27 11:39 | 只看該作者

下次發(fā)帖定會注意
回復

使用道具 舉報

7#
ID:260806 發(fā)表于 2019-3-28 10:35 | 只看該作者
#在這里快速回復#GPS定位LCD1602液晶顯示經緯度海拔及時間日期的實物制作 http://www.zg4o1577.cn/bbs/dpj-154514-1.html (出處: 單片機論壇)
回復

使用道具 舉報

8#
ID:260806 發(fā)表于 2019-3-28 10:36 | 只看該作者

RE: GPS定位LCD1602顯示的單片機源碼與實物制作

GPS定位LCD1602液晶顯示經緯度海拔及時間日期的實物制作
http://www.zg4o1577.cn/bbs/dpj-154514-1.html
(出處: 單片機論壇)

回復

使用道具 舉報

9#
ID:505326 發(fā)表于 2019-4-5 14:54 | 只看該作者
我想問問你用的GPS模塊傳感器型號是什么?
回復

使用道具 舉報

10#
ID:399475 發(fā)表于 2019-4-12 14:09 來自手機 | 只看該作者
沒有原理圖不好做呀
回復

使用道具 舉報

11#
ID:64053 發(fā)表于 2020-6-8 00:06 | 只看該作者
這款能顯示衛(wèi)星數嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产电影 | 亚洲成av人影片在线观看 | 爱草在线 | 91在线视频一区 | 日韩欧美日韩在线 | 成人av免费网站 | 免费观看一级特黄欧美大片 | 免费视频成人国产精品网站 | 亚欧洲精品在线视频免费观看 | 国产免费自拍 | 一区二区高清不卡 | 亚洲精品一区在线观看 | 日日操视频 | 欧美一级视频免费看 | 亚洲人成人一区二区在线观看 | 国产精品a久久久久 | 国产aⅴ精品 | 久久99视频这里只有精品 | 国产h视频 | 狠狠干五月天 | 久久香蕉网 | 天天干夜夜操 | 国产成人小视频 | 久久久免费| 天堂三级 | 在线观看黄色电影 | 欧美 日韩 中文 | 日韩在线视频精品 | 欧美日韩久久精品 | 97久久精品午夜一区二区 | 国精产品一区一区三区免费完 | 手机看片在线播放 | 欧美一区二区三区 | 免费观看成人性生生活片 | 久久久久久久久国产精品 | 成年人视频在线免费观看 | av网站免费 | 久久国产欧美日韩精品 | 久久男人 | 免费看国产片在线观看 | 成人深夜福利网站 |