单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 342|回复: 7
收起左侧

GPS+GSM跟踪定位的单片机程序求助

[复制链接]
bajidage 发表于 2020-1-11 17:10 | 显示全部楼层 |阅读模式
100黑币
要求:系统由单片机最小系统、GPS定位模块、GSM短信模块、LCD1602液晶显示模块组成,实现如下功能。当主人发现小车丢失时,主人发送“查找定位”短信给小车,小车将实时液晶显示GPS定位信息,并将GPS定位信息回复到主人的手机上。


硬件STC89C52LCD1602SIM800C

目前问题:LCD可以实时显示定位信息,但是短信发送不回复。求各位帮忙看一下程序是否出错。

单片机程序代码:
  1. #include <REG52.h>
  2. #include "uart.c"

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

  7. //1602的控制脚
  8. sbit lcd1602_rs=P3^5;
  9. sbit lcd1602_rw=P3^6;
  10. sbit lcd1602_en=P3^4;
  11. sbit LED=P1^0;
  12. #define RsBuf_N               800

  13. //全局变量
  14. unsigned char TxBuf[20];
  15. unsigned char xdata RsBuf[RsBuf_N];    //定义串口接收数据缓冲区
  16. uchar code sousuo[]="GPSSearching...";
  17. uint RsPoint;
  18. bit dis_flag=0;
  19. unsigned char timer0_count;
  20. unsigned char flag_fasong;
  21. unsigned long weidunum=0;
  22. unsigned long jingdunum=0;


  23. uchar code PhoneNO[]              ="00310038003800360032003400390036003500310031"; //接受号码,这是转码后的电话号码

  24. //================LCD1602=========
  25. //----------------延时函数,后面经常调用----------------------
  26. void delay(uint xms)//延时函数,有参函数
  27. {
  28.          uintx,y;
  29.          for(x=0;x<xms;x++)
  30.           for(y=0;y<10;y++);
  31. }

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

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

  54. //-------------------------初始化-------------------------
  55. void lcd_init(void)
  56. {
  57.          uchari;

  58.          delay(1000);
  59.          write_1602com(0x80);
  60.          for(i=0;i<16;i++)
  61.          write_1602dat(sousuo[i]);
  62. }

  63. void write_string(uchar dat,uchar *str)
  64. {
  65. if(dat)
  66. write_1602com(dat);
  67. while(*str)
  68. {
  69. write_1602dat(*str);
  70. str++;
  71. }
  72. }
  73. //  通讯中断接收程序   中断函数无返回值
  74. void uart_rx(void)  interrupt 4   using 3      
  75. {
  76.   
  77.      if(RI) //必须判断RI是否为1

  78.     {
  79.             
  80.               RI=0;
  81.                            
  82.                     if(SBUF=='+') //读取gsm模块回应是+开头的,则短信回复
  83.                    {
  84.                    flag_fasong=10;
  85.                    RsBuf[0]='0';
  86.                    }
  87.                   
  88.                    if(SBUF=='

  89. &&RsPoint<72)//读取gps信号,开头$则接收定位信息
  90.                    RsPoint=0;
  91.                    if(RsPoint<74)
  92.              RsBuf[RsPoint++]=SBUF;
  93.     }

  94. }
  95. charTransmitText()   //发送号码       发送内容,字母或数字
  96. {
  97.          uchari=5,j=5;

  98.           LED=0;   
  99.              SendString("AT+CMGD=0,4\r\n");
  100.                     delay(20000);
  101.                    SendString("AT+CMGS=\"+8615862480761\"\r\n");      //信息发送指令 AT+CMGS=//
  102.                      

  103.                             SendString(PhoneNO);//先发送接收短信的号码
  104.             
  105.                    SendString("\"\r\n");        
  106.                    delay(20000);
  107.              SendString("53177eacff1a");//北纬:
  108.                    for(i=0;i<9;i++)
  109.                    {
  110.                     if(i==2)
  111.                     {
  112.                      SendString("002e");//小数点
  113.                     }
  114.                     else
  115.                     {
  116.                      SendString("003");
  117.                      SendASC(TxBuf[i]);
  118.                     }
  119.                    }
  120.                    SendString("000d000a");
  121.                    SendString("4e1c7ecfff1a");//东经:
  122.                    for(i=0;i<10;i++)
  123.                    {
  124.                     if(i==3)
  125.                     {
  126.                      SendString("002e");//小数点
  127.                     }
  128.                     else
  129.                     {
  130.                      SendString("003");
  131.                      SendASC(TxBuf[i+9]);
  132.                     }
  133.                    }
  134.                    delay(10000);  
  135.                    SendASC(0x1a);
  136.        SendASC('\r');
  137.                     SendASC('\n');
  138.   // SendASC(0x1b);
  139.                   delay(20000);
  140.                     
  141.          RsPoint=0;                 LED=1;
  142.          return0;   
  143. }
  144. void GSM_init()
  145. {
  146.    uchar i;
  147.    LED=0;
  148.          write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  149.          write_1602com(0x0c);//开显示不显示光标
  150.          write_1602com(0x06);//整屏不移动,光标自动右移
  151.          write_1602com(0x01);//清显示
  152.    write_string(0x80,"       GSMInit ");
  153.        REN=0;

  154.    SendString("AT+CMGF=1\r\n");//设置短信输入发送格式,1为文本格式
  155.    delay(5000);
  156.          SendString("AT+CNMI=2,1,0,0,0\r\n");//新短信指示
  157.    delay(5000);
  158.          SendString("ATH\r\n");//通过本地TE挂断当前呼叫链接

  159.          delay(5000);      
  160.          SendString("AT+CSCS=\"UCS2\"\r\n");   //选择TE字符集,UCS2:16位通用8字节倍数编码字符集(ISO/IEC10646);UCS2字符串转换为从0000到FFFF的16进制数。   
  161.          delay(10000);  
  162.          SendString("AT+CSMP=17,0,2,25\r\n");//设置短信文本模式参数,            
  163.          delay(10000);
  164.          for(i=0;i<10;i++)
  165.          delay(20000);
  166.          SendString("ATE0\r\n");//设置命令回显模式,0-回显模式关闭
  167.    delay(5000);
  168.          SendString("AT+CMGDA=\"DELALL\"\r\n");//删除所有短信
  169.          LED=1;
  170.          REN=1;
  171. }
  172. //==============================主函数===============================
  173. void main(void)
  174. {
  175.         uint i;
  176.          lcd_init();
  177.          Uart_init();
  178.         GSM_init();
  179.          for(i=0;i<RsBuf_N;i++)
  180.          RsBuf[i]='0';
  181.          flag_fasong=0;
  182.          
  183.          while(1)
  184.          {                 delay(100);
  185.                
  186.                             if(timer0_count==100)//定时读取新短信
  187.                             {
  188.                                      SendString("AT+CMGL=\"RECUNREAD\",1\r\n");//读取已收到未读的短信,1-不改变指定消息记录状态
  189.                                      delay(10000);
  190.                                      timer0_count=0;
  191.                             }
  192.                            
  193.              if(RsPoint>=74)
  194.                                      RsPoint=0;
  195.                            
  196.                     if(RsBuf[0]=='

  197. &&RsBuf[1]=='G'&&RsBuf[2]=='P'&&RsBuf[3]=='G'&&RsBuf[4]=='G'&&RsBuf[5]=='A'&&RsBuf[44]!='0')
  198.                      {
  199.                                      if(((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))>=0&&((RsBuf[30]-48)*100+(RsBuf[31]-48)*10+(RsBuf[32]-48))<=180)
  200.                               {
  201.                                                weidunum=      ((RsBuf[17]-48)*10000000+(RsBuf[18]-48)*1000000)
  202.                                                                            +(((((RsBuf[19]-48)*10)+(RsBuf[20]-48))*100000)/6)
  203.                                                                            +(((((RsBuf[22]-48)*1000)+((RsBuf[23]-48)*100)+((RsBuf[24]-48)*10)+(RsBuf[25]-48))*10)/6);      
  204.                                                write_1602com(0x80);
  205.                                                write_1602dat('W');
  206.                                                write_1602dat('D');
  207.                                                write_1602dat(':');
  208.                                                write_1602dat('');
  209.                                                write_1602dat(RsBuf[17]);
  210.                                                write_1602dat(weidunum%10000000/1000000+0x30);
  211.                                                write_1602dat('.');
  212.                                                write_1602dat(weidunum%1000000/100000+0x30);
  213.                                                write_1602dat(weidunum%100000/10000+0x30);
  214.                                                write_1602dat(weidunum%10000/1000+0x30);
  215.                                                write_1602dat(weidunum%1000/100+0x30);
  216.                                                write_1602dat(weidunum%100/10+0x30);
  217.                                                write_1602dat(weidunum%10+0x30);   
  218.                                                write_1602dat(RsBuf[28]);
  219.                                                write_1602dat('');
  220.                                                write_1602dat('');
  221.                                                TxBuf[0]=RsBuf[17];
  222.                                                TxBuf[1]=weidunum%10000000/1000000+0x30;
  223.                                                TxBuf[2]='.';
  224.                                                TxBuf[3]=weidunum%1000000/100000+0x30;
  225.                                                TxBuf[4]=weidunum%100000/10000+0x30;
  226.                                                TxBuf[5]=weidunum%10000/1000+0x30;
  227.                                                TxBuf[6]=weidunum%1000/100+0x30;
  228.                                                TxBuf[7]=weidunum%100/10+0x30;
  229.                                                TxBuf[8]=weidunum%10+0x30;
  230.                                                jingdunum=      (((RsBuf[30]-48)*100000000)+((RsBuf[31]-48)*10000000)+((RsBuf[32]-48)*1000000))
  231.                                                                            +(((((RsBuf[33]-48)*10)+(RsBuf[34]-48))*100000)/6)
  232.                                                                            +(((((RsBuf[36]-48)*1000)+((RsBuf[37]-48)*100)+((RsBuf[38]-48)*10)+(RsBuf[39]-48))*10)/6);         
  233.                                                write_1602com(0xc0);
  234.                                                write_1602dat('J');
  235.                                                write_1602dat('D');
  236.                                                write_1602dat(':');
  237.                                                write_1602dat(jingdunum/100000000+0x30);
  238.                                                write_1602dat(jingdunum%100000000/10000000+0x30);
  239.                                                write_1602dat(jingdunum%10000000/1000000+0x30);
  240.                                                write_1602dat('.');
  241.                                                write_1602dat(jingdunum%1000000/100000+0x30);
  242.                                                write_1602dat(jingdunum%100000/10000+0x30);
  243.                                                write_1602dat(jingdunum%10000/1000+0x30);
  244.                                                write_1602dat(jingdunum%1000/100+0x30);
  245.                                                write_1602dat(jingdunum%100/10+0x30);
  246.                                                write_1602dat(jingdunum%10+0x30);            
  247.                                                write_1602dat(RsBuf[42]);
  248.                                                TxBuf[9]=RsBuf[30];
  249.                                                TxBuf[10]=RsBuf[31];
  250.                                                TxBuf[11]=RsBuf[32];
  251.                                                TxBuf[12]='.';
  252.                                                TxBuf[13]=jingdunum%1000000/100000+0x30;
  253.                                                TxBuf[14]=jingdunum%100000/10000+0x30;
  254.                                                TxBuf[15]=jingdunum%10000/1000+0x30;
  255.                                                TxBuf[16]=jingdunum%1000/100+0x30;
  256.                                                TxBuf[17]=jingdunum%100/10+0x30;
  257.                                                TxBuf[18]=jingdunum%10+0x30;
  258.                                                write_1602dat('');
  259.                                                write_1602dat('');
  260.                                                
  261.                                        for(i=0;i<RsBuf_N;i++)
  262.                                                  RsBuf[i]='0';
  263.                                                
  264.                                              if(flag_fasong>=3)
  265.                                                {
  266.                                                 TR0=0;
  267.                                                 TransmitText();
  268.                                                 TR0=1;
  269.                                                 flag_fasong=0;
  270.                                                 delay(5000);
  271.                                                 SendString("AT+CMGDA=\"DELALL\"\r\n"); //删除所有短信
  272.                                                }
  273.                                                elseif(flag_fasong>=1)
  274.                                                flag_fasong=0;
  275.                                              
  276.                             }
  277.                    }
  278.          }
  279. }

  280. void trimer0() interrupt 1 //定时读取短信
  281. {
  282. TH0=0xdc;
  283. TL0=0x00;
  284. timer0_count++;
  285. if(timer0_count>=100)
  286. timer0_count=100;
  287. }












  288. //============================串口=================
  289. #ifndef       _UART_C_
  290. #define         _UART_C_

  291. #include"reg52.h"

  292. #define uchar unsigned char
  293. #define uint unsigned int


  294. void Uart_init()
  295. {
  296.         
  297.         TMOD= 0X21;                //T1  方式2  ,8位   自动重装   
  298.         TH0=0xdc;
  299.         TL0=0x00;
  300.         ET0=1;
  301.         TR0=1;
  302.         TH1=0Xfd;
  303.         TL1=0Xfd;            //9600
  304.         TR1=1;                     // 定时器1启动  
  305.         SM0=0;            // 设置串口的工作模式
  306.         SM1=1;             //方式1
  307.         REN=1;                  // 允许串口接收数据         


  308.         ES=1;              // 串口中断应许
  309.         EA=1;                 // 开启中断
  310.         
  311. }
  312. void SendASC(uchar d)
  313. {
  314.         
  315.         SBUF=d;
  316.         while(!TI);

  317.         TI=0;
  318. }
  319. void SendString(uchar *str)        
  320. {
  321.         while(*str)
  322.         {
  323.                 SendASC(*str) ;
  324.                 str++;
  325.                 //delay_uart(1);
  326.         }
  327. }


  328. #endif
复制代码


开发板原理图V3.pdf

161.66 KB, 下载次数: 7

回复

使用道具 举报

51hei**1140 发表于 2020-1-11 20:55 | 显示全部楼层
你好!
这个软件调试,是需要硬件来配合的
回复

使用道具 举报

飞云居士 发表于 2020-1-13 20:18 | 显示全部楼层
GSM短信模块需要手机SIM卡。按AT命令格式发短信没问题
回复

使用道具 举报

man1234567 发表于 2020-1-14 07:25 | 显示全部楼层
先试试你的设备能否接收到短信(显示)测试模块是否正常工作,一步步调试。
回复

使用道具 举报

 楼主| bajidage 发表于 2020-1-18 13:31 | 显示全部楼层
一步一步调试即可
回复

使用道具 举报

lele5211314 发表于 2020-1-20 11:37 | 显示全部楼层
GPS用的什么模块,记得SIM800C模块不支持GPS定位功能
回复

使用道具 举报

杨兮兮 发表于 2020-2-18 15:58 | 显示全部楼层
有仿真图嘛
回复

使用道具 举报

lyl44 发表于 2020-2-19 09:06 来自手机 | 显示全部楼层
检查硬件
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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