單片機論壇

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 302|回復: 5
收起左側

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, 下載次數: 5

回復

使用道具 舉報

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定位功能
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
全天计划时时彩