找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9111|回复: 18
收起左侧

51单片机GPS+sim800c GSM定位短信LCD1602液晶显示程序

  [复制链接]
ID:490777 发表于 2019-10-24 19:45 | 显示全部楼层 |阅读模式
sim800c+GPS芯片
一个练手的小设计,有点丑哈。附上程序和原理PcB图。
51hei图片_20191024193907.jpg 51hei截图_20191024194435.png 51hei截图_20191024194454.png

第一次发帖,做的不好烦请原谅哈

按键功能一个按键报警,蜂鸣器响,另外一个按键发送短信到指定的手机上,手机号码程序里面写好就行了

单片机源程序如下:
  1. #include "common.h"
  2. #include "uart.h"
  3. #include "gps.h"
  4. #include "gsm.h"


  5. #include "lcd.h"

  6. #define GPS_STR_LEN 48

  7. uchar ess_inc;

  8. //char xdata GPS_SEND_STR[GPS_STR_LEN];

  9. sbit key = P1^3;
  10. sbit key1 = P1^4;
  11. sbit GPS_EN=P3^4;
  12. sbit led1 = P3^3;
  13. #define   RMC_YES    led1 = 0
  14. #define   RMC_NO     led1 = 1

  15. GPS_INFO   GPS;  //GPS信息结构体

  16. bit GPS_rx_flag = 0;
  17. bit GPS_Have_flag = 0;

  18. #define SEND_NUMBER "AT+CMGS=\"13420106297\"\r\n"

  19. char xdata send_data[37]="N:     ',E:     ',2000-00-00,00:00\r\n";
  20. unsigned char send_len= 0;

  21. bit dis_flag = 1;
  22. bit sendflag=0;


  23. /****************************************
  24. 显示时间
  25. /****************************************/
  26. void GPS_DispTime(void)
  27. {
  28.     uchar i = 0;
  29.     uchar ch;
  30.     char time[5];

  31.           Int_To_Str(GPS.D.year,time);//年

  32.     LCD1602_Set_AC(0, 1);
  33.     i = 0;
  34.           send_len = 18;
  35.     while(time[i] != '\0')
  36.     {
  37.         ch = time[i++];

  38.         LCD1602_write_data(ch);

  39.                     send_data[send_len++] = ch;
  40.     }
  41.     LCD1602_write_data('-');
  42.                
  43.                 Int_To_Str(GPS.D.month,time);//月
  44.     LCD1602_Set_AC(5, 1);
  45.     i = 0;
  46.           send_len = 23;
  47.     while(time[i] != '\0')
  48.     {
  49.         ch = time[i++];

  50.         LCD1602_write_data(ch);

  51.                     send_data[send_len++] = ch;
  52.     }
  53.     LCD1602_write_data('-');
  54.                
  55.                 Int_To_Str(GPS.D.day,time);//日
  56.     LCD1602_Set_AC(8, 1);
  57.     i = 0;
  58.           send_len = 26;
  59.     while(time[i] != '\0')
  60.     {
  61.         ch = time[i++];

  62.         LCD1602_write_data(ch);

  63.                     send_data[send_len++] = ch;
  64.     }
  65.     LCD1602_write_data(',');
  66.        
  67.     Int_To_Str(GPS.D.hour,time);//时
  68.     LCD1602_Set_AC(11, 1);
  69.     i = 0;
  70.           send_len = 29;
  71.     while(time[i] != '\0')
  72.     {
  73.         ch = time[i++];

  74.         LCD1602_write_data(ch);

  75.                     send_data[send_len++] = ch;
  76.     }
  77.     LCD1602_write_data(':');

  78.     Int_To_Str(GPS.D.minute,time);//分
  79.     LCD1602_Set_AC(14, 1);
  80.     i = 0;
  81.           send_len = 32;
  82.     while(time[i] != '\0')
  83.     {
  84.         ch = time[i++];

  85.         LCD1602_write_data(ch);

  86.                     send_data[send_len++] = ch;
  87.     }
  88. }


  89. void GPS_DisplayOne(void)
  90. {
  91.     uchar len,ch, i;
  92.     char info[10];

  93.     ess_inc = 0;
  94. //    memset(GPS_SEND_STR, 0, GPS_STR_LEN);

  95.     if (GPS.NS == 'N')              //判断是北纬还是南纬
  96.     {
  97.                           if(dis_flag)
  98.         LCD1602_DisplayChar(0, 0, 'N');
  99.                                 else
  100.                                 LCD1602_DisplayChar(0, 0, ' ');
  101. //        GPS_SEND_STR[ess_inc ++] = 'N';
  102.         len = 0;
  103.         Int_To_Str(GPS.latitude_Degree,info);  //纬度

  104.         LCD1602_Set_AC(1, 0);
  105.         i = 0;
  106.                     send_len = 2;
  107.         while(info[i] != '\0')
  108.         {
  109.             ch = info[i++];
  110.                                           if(dis_flag)
  111.             LCD1602_write_data(ch);
  112.                                                 else
  113.                                     LCD1602_write_data(' ');
  114.                               send_data[send_len++] = ch;
  115. //            GPS_SEND_STR[ess_inc ++] = ch;
  116.             len ++;
  117.         }
  118.                     send_data[send_len++] = 'd';
  119.                                 if(dis_flag)
  120.         LCD1602_write_data(0xDF);
  121.                                 else
  122.                                  LCD1602_write_data(' ');
  123. //        GPS_SEND_STR[ess_inc ++] = 'd';

  124.         len ++;
  125.         Int_To_Str(GPS.latitude_Cent,info);  //纬分
  126.         i = 0;
  127.         while(info[i] != '\0')
  128.         {
  129.             ch = info[i++];
  130.                                           if(dis_flag)
  131.             LCD1602_write_data(ch);
  132.                                                 else
  133.                                     LCD1602_write_data(' ');
  134.                               send_data[send_len++] = ch;
  135. //            GPS_SEND_STR[ess_inc ++] = ch;
  136.             len ++;
  137.         }
  138.                                 if(dis_flag)
  139.         LCD1602_write_data(0x27);
  140.                                 else
  141.                                     LCD1602_write_data(' ');
  142. //        GPS_SEND_STR[ess_inc ++] = 'm';

  143.         Int_To_Str(GPS.latitude_Second,info);  //纬秒
  144.         i = 0;
  145.         while(info[i] != '\0')
  146.         {
  147.             ch = info[i++];
  148. //            GPS_SEND_STR[ess_inc ++] = ch;
  149.         }
  150. //        GPS_SEND_STR[ess_inc ++] = 's';

  151.         len ++;
  152.         while(7 - len)
  153.         {
  154.             len ++;
  155.             LCD1602_write_data(' ');
  156.         }

  157.     }

  158. //    GPS_SEND_STR[ess_inc] = ',';
  159.     ess_inc += 1;

  160.     if (GPS.EW == 'E')                                //判断是东经还是西经
  161.     {
  162.                           if(dis_flag)
  163.         LCD1602_DisplayChar(8, 0, 'E');
  164.                                 else
  165.                                     LCD1602_write_data(' ');
  166. //        GPS_SEND_STR[ess_inc ++] = 'E';

  167.         len = 0;
  168.         Int_To_Str(GPS.longitude_Degree,info);  //经度
  169.         LCD1602_Set_AC(9, 0);
  170.         i = 0;
  171.                     send_len = 11;
  172.         while(info[i] != '\0')
  173.         {
  174.             ch = info[i++];
  175.                                           if(dis_flag)
  176.             LCD1602_write_data(ch);
  177.                                                 else
  178.                                     LCD1602_write_data(' ');
  179.                               send_data[send_len++] = ch;
  180. //            GPS_SEND_STR[ess_inc ++] = ch;
  181.             len ++;
  182.         }
  183.                     send_data[send_len++] = 'd';
  184.                                 if(dis_flag)
  185.         LCD1602_write_data(0xDF);
  186.                                 else
  187.                                     LCD1602_write_data(' ');
  188. //        GPS_SEND_STR[ess_inc ++] = 'd';

  189.         len ++;

  190.         Int_To_Str(GPS.longitude_Cent,info);  //经分
  191.         i = 0;
  192.         while(info[i] != '\0')
  193.         {
  194.             ch = info[i++];
  195.                                           if(dis_flag)
  196.             LCD1602_write_data(ch);
  197.                                                 else
  198.                                     LCD1602_write_data(' ');
  199.                               send_data[send_len++] = ch;
  200. //            GPS_SEND_STR[ess_inc ++] = ch;
  201.             len ++;
  202.         }
  203.                                 if(dis_flag)
  204.         LCD1602_write_data(0x27);
  205.                                 else
  206.                                  LCD1602_write_data(' ');
  207. //        GPS_SEND_STR[ess_inc ++] = 'm';

  208.         Int_To_Str(GPS.longitude_Second,info);        //经秒
  209.         i = 0;
  210.         while(info[i] != '\0')
  211.         {
  212.             ch = info[i++];

  213. //            GPS_SEND_STR[ess_inc ++] = ch;
  214.         }
  215. //        GPS_SEND_STR[ess_inc ++] = 's';

  216.         len ++;
  217.         while(7 - len)
  218.         {
  219.             len ++;
  220.             LCD1602_write_data(' ');
  221.         }
  222.     }

  223.     GPS_DispTime();

  224. //    GPS_SEND_STR[ess_inc] = ' ';
  225.     ess_inc += 1;

  226.                 if(sendflag==1)
  227.                 {                       
  228.                           sendflag = 0;
  229.                                 gsm_send_englishmsg(SEND_NUMBER,send_data);//发送位置短信                               
  230.                                 delay_ms(1000);
  231.                                 delay_ms(1000);
  232.                                 LCD1602_DisplayString(0,0,"    SEND OK     ");
  233.                                 delay_ms(1000);
  234.                                 LCD1602_DisplayString(0,0,"                ");
  235.                 }
  236.                
  237. //    GPS_DispSpeed(GPS.speed, 10, 1);

  238. //    if (GPS.D.second == 0)
  239. //    {
  240. //        if (GPS_Have_flag)
  241. //        {
  242. //            gsm_send_englishmsg(phonenum,GPS_SEND_STR);//发送位置短信
  243. //        }
  244. //        else
  245. //        {
  246. //            //gsm_send_englishmsg(phonenum,"GPS No Signal");//发送短信
  247. //        }
  248. //    }
  249. }

  250. void main(void)
  251. {
  252.     uchar error_num = 0;
  253.                 uint count = 0;

  254.     GPS_EN = 0;
  255.     GPS_rx_flag = 0;
  256.     LCD1602_Initialize();//LCD1602显示屏初始化
  257.     uart_init(UART_B9600);
  258.     GPS_EN = 1;
  259.     GPS_rx_flag = 1;
  260.                 BG = 0;
  261.     LCD1602_DisplayString_Center(0,"GPS SCAN...");
  262.     LCD1602_ClearLine(1);

  263.     while(1)
  264.     {
  265.         if (rev_stop)   //如果接收完一行
  266.         {
  267.             if (GPS_RMC_Parse(RX1_Buffer, &GPS)) //解析GPRMC
  268.             {
  269.                 RMC_YES;
  270.                 GPS_DisplayOne();          //显示GPS第一页信息
  271.                 error_num = 0;
  272.                 gps_flag = 0;
  273.                 rev_stop  = 0;
  274.                 GPS_Have_flag = 1;
  275. ……………………

  276. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
14GPS GSM定位短信.zip (636 KB, 下载次数: 513)

评分

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

查看全部评分

回复

使用道具 举报

ID:349345 发表于 2019-11-4 15:18 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:64053 发表于 2020-2-14 20:51 | 显示全部楼层
谢楼主分享资料
回复

使用道具 举报

ID:64053 发表于 2020-2-14 20:52 | 显示全部楼层
谢谢楼主分享资料
回复

使用道具 举报

ID:708882 发表于 2020-3-24 16:59 来自手机 | 显示全部楼层
你好,附件里面有原理图吗?
回复

使用道具 举报

ID:224006 发表于 2020-3-26 09:19 | 显示全部楼层
附件里有完整源码吗?
回复

使用道具 举报

ID:517216 发表于 2020-4-16 20:43 | 显示全部楼层
请问一下,gps模块连在芯片的哪个引脚上
回复

使用道具 举报

ID:315554 发表于 2020-5-4 16:13 | 显示全部楼层
学习了,谢谢分享,不知SIM800L可不可以?
回复

使用道具 举报

ID:747903 发表于 2020-5-10 22:51 | 显示全部楼层
两个串口分别连哪?
TXD和TXD1分别连哪?
RXD和RXD1分别连哪?
回复

使用道具 举报

ID:703927 发表于 2020-5-11 07:56 | 显示全部楼层
谢楼主分享资料
回复

使用道具 举报

ID:66915 发表于 2020-5-12 09:15 | 显示全部楼层
貌似很强大哟
回复

使用道具 举报

ID:315554 发表于 2020-10-7 17:19 | 显示全部楼层
很强,有一个GSM模块,正学习怎样驱动它,谢谢分享
回复

使用道具 举报

ID:813553 发表于 2021-4-4 22:28 | 显示全部楼层
有protues图吗
回复

使用道具 举报

ID:813553 发表于 2021-4-8 18:33 | 显示全部楼层
为啥我打不开Protel文件呢
回复

使用道具 举报

ID:899219 发表于 2021-4-10 09:53 | 显示全部楼层
ak333 发表于 2020-5-4 16:13
学习了,谢谢分享,不知SIM800L可不可以?

L的供电电压低,可以仔细查一下
回复

使用道具 举报

ID:745563 发表于 2021-4-10 23:33 | 显示全部楼层
谢谢楼主的资料,最近正好做gsm的设计,学习一下
回复

使用道具 举报

ID:28992 发表于 2021-4-12 03:24 | 显示全部楼层
very good, thank you Sir!
回复

使用道具 举报

ID:899219 发表于 2021-4-12 21:41 | 显示全部楼层
东西不错,除了GSM都测试了一下,没问题
回复

使用道具 举报

ID:1063315 发表于 2023-2-17 13:23 | 显示全部楼层
东西不错,除了GSM都测试了一下,没问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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