W77E58在GPS远程定位的应用(源代码)

发布时间:2024-07-31  

前段时间做测试写的程序,现在贴出来,供有兴趣的朋友参考交流。毕竟下来的程序里的部分代码也是来源于网络。所有现在贴出来回报网络。正因为有了网络,我才能进步。


硬件要求: GPS模块、GSM短信模块(TC35/TC35i)或者兼容AT指令的其他模块、W77E58单片机(或者具备双串口的单片机)


/*
 说明:Winbond W77E58 双串口单片机
 串口0 采用9600波特率
 串口1 采用4800波特率
*/
#include "w77e58.h"
#include "string.h"

static int flag_1,flag_0;
//char c1[]="hello china";  //串口0
//char c2[]="hello World";  //串口1
//串口0 9600   8 N 1
//串口1 4800   8 N 1

//GSM 数据存储数组
unsigned char PhoneNum[12]; //手机号码
unsigned char smsCmd[2];    //短信命令
unsigned char smsPWD[8];       //密码(在绑定指定号码时,需要)
unsigned char sms_count;     //短信长度
unsigned char sms[25];        //短信内容 "*SZ12345678#13577062679#";
unsigned char sms_mode;       //当前短信接收,=1 正在接收 =0 命令语句接收是否完毕

//unsigned char CNMI[]="AT+CNMI=2,2,0,0/r/n";//每次接收短信后,再设置,不然不会再有短信进取
//unsigned char CMGF[]="AT+CMGF=1/r/n"; //是以TEXT格式发送
//GPS ----

//GPS数据存储数组
unsigned char JD[10];            //经度
unsigned char JD_a;            //经度方向
unsigned char WD[9];            //纬度
unsigned char WD_a;            //纬度方向
unsigned char time[6];        //时间
unsigned char speed[5];        //速度
unsigned char high[6];        //高度
unsigned char angle[5];        //方位角
unsigned char use_sat[2];        //使用的卫星数
unsigned char total_sat[2];    //天空中总卫星数
unsigned char lock;            //定位状态

//串口中断需要的变量
unsigned char seg_count;        //逗号计数器
unsigned char dot_count;        //小数点计数器
unsigned char byte_count;        //位数计数器
unsigned char cmd_number;        //命令类型
unsigned char mode;                //0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full;            //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[5];            //命令类型存储数组

//------
//状态指示灯
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
//-----------------
void Delay400Ms(void)
{
   unsigned char TempCycA = 5;
   unsigned int TempCycB;
   while(TempCycA--)
  {
   TempCycB=7269;
   while(TempCycB--);
  };
}
//向串口发送一个字符
void send_char_com0(unsigned char ch)
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

void init_GSM(void)
{
 
  //系统初始化
  //初始化 GSM
  // AT+CMGF=1是以TEXT格式发送 
  send_char_com0('A');
  send_char_com0('T');
  send_char_com0('+');
  send_char_com0('C');
  send_char_com0('M');
  send_char_com0('G');
  send_char_com0('F');
  send_char_com0('=');
  send_char_com0('1');
  send_char_com0('/r');
  send_char_com0('/n');
  Delay400Ms();
  Delay400Ms();
  Delay400Ms();
  //Delay400Ms();
  //Delay400Ms();
  //AT+CNMI=2,2,0,0  //每次接收短信后,再设置,不然不会再有短信进取
  send_char_com0('A');
  send_char_com0('T');
  send_char_com0('+');
  send_char_com0('C');
  send_char_com0('N');
  send_char_com0('M');
  send_char_com0('I');
  send_char_com0('=');
  send_char_com0('2');
  send_char_com0(',');
  send_char_com0('2');
  send_char_com0(',');
  send_char_com0('0');
  send_char_com0(',');
  send_char_com0('0');
  send_char_com0('/r');
  send_char_com0('/n');  
}

void SendSM(char *s)
{
int i=0;
  do{
     if(s[i]!='$')
  {
       send_char_com0(s[i]);
  }
  i++;
  }while(s[i]!='$');
}

main()
{
//    int i;
 int j=0;
    flag_1=1;
    flag_0=1;

    for(j=0;j<5;j++)
 {
    P0_0=~P0_0;
 P0_1=~P0_1;
 P0_2=~P0_2;
 P0_3=~P0_3;
 P0_4=~P0_4;
 P0_5=~P0_5;
 P0_6=~P0_6;
 P0_7=~P0_7;
 Delay400Ms();
 Delay400Ms();
 }

 P0_0=1;
 P0_1=1;
 P0_2=1;
 P0_3=1;
 P0_4=1;
 P0_5=1;
 P0_6=1;
 P0_7=1;

     //其中串口0用定时器2,串口1用定时器1   
     //串口1的设置
     IE=0x90;      //允许总中断和串口0的中断
     TMOD=0x20;      //定时器1工作在模式1
     TL1=0xfa;      //baud rate=4800
     TH1=0xfa;
     SCON=0x58;      //工作在模式1,接收允许
     PCON=0x00; // SM0=0 SM1=1 在10位异步收发模式 SMOD=0 溢出速率/32    
     ES1=1;    //串口1中断允许    

     //串口0设置
     T2CON=0x30;  //用定时器2做串口0的波特率发生器
  RCAP2H=0xff;   // 11.0592M晶振下,baud rate=9600  //2400
     RCAP2L=0xdc;   //0x70;
  SCON1=0x58;   //工作在模式1,允许接收
    
     TR2=1;
     TR1=1;

      Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
  init_GSM(); //初始化GSM 猫

      Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
        Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
    for(j=0;j<5;j++)
 {
    P0_0=~P0_0;
 P0_1=~P0_1;
 P0_2=~P0_2;
 P0_3=~P0_3;
 P0_4=~P0_4;
 P0_5=~P0_5;
 P0_6=~P0_6;
 P0_7=~P0_7;
 Delay400Ms();
 Delay400Ms();
 }
     while(1)
     {
      
      //查询新短信
   //AT+CMGL
   if(sms_mode!=-1){
   send_char_com0('A');send_char_com0('T');send_char_com0('+');send_char_com0('C');send_char_com0('M');send_char_com0('G');send_char_com0('L');
         send_char_com0('/r');send_char_com0('/n');
   Delay400Ms();
         Delay400Ms();
   Delay400Ms();
         Delay400Ms();
   }

   Delay400Ms();
        Delay400Ms();
   Delay400Ms();
        Delay400Ms();
   Delay400Ms();
   Delay400Ms();  

    if(buf_full==0)                //无GPS信号时
        {
          P0_0=1;  //1表示没有信号
        }else
  {
          P0_0=0; //有信号
     if(buf_full|0x01)
     {
        //GGA语句
      if(lock=='0')
      {
        //如果未定位
     P0_0=1;
      }else
      {
       //如果已定位
    P0_0=0;
      }
     }
  }
     }
}
void fw(void)
{
  //复位GSM
  //init_GSM();//复位GSM MODEM
}

void dw(void)
{
   //GPS 定位
   int i;
   for(i=0;i<10;i++)
   {
    P0_0=~P0_0;
 P0_1=~P0_1;
 P0_2=~P0_2;
 P0_3=~P0_3;
 Delay400Ms();
 Delay400Ms();
 }
    //init_GSM();//复位GSM MODEM
    //sms_mode=-1;  //定位
   //SendSM("AT+CMGS=/"+8613577062697/"/r/n$");

 SendSM("AT+CMGS=/"+86$");
 for(i=0;i<11;i++)
 {
  send_char_com0(PhoneNum[i]);
 }
 SendSM("/"/r/n$");
 
    Delay400Ms();
 Delay400Ms();
   
 /*定位数据*/
    /*
    send_char_com0(JD_a);//经度方向
    for(i=0;i<10;i++)
 {
 send_char_com0(JD[i]);//经度
 }
    send_char_com0(WD_a);//纬度方向
    for(i=0;i<9;i++)
 {
 send_char_com0(WD[i]);//纬度
 }
 send_char_com0('T');  //时间
 for(i=0;i<6;i++)
 {
 send_char_com0(time[i]);//纬度
 }
 send_char_com0('S');  //速度
 send_char_com0('P');  //速度
 for(i=0;i<5;i++)
 {
 send_char_com0(speed[i]);//速度
 }
 send_char_com0('^');  //方位角
 for(i=0;i<5;i++)
 {
 send_char_com0(angle[i]);//速度
 }
    */
 /*定位数据*/
    /*----------------------*/
    send_char_com0('M');
    send_char_com0('i');
    send_char_com0('o');
    send_char_com0('_');
    send_char_com0('C');
    send_char_com0('H');
    send_char_com0('S');
    send_char_com0('#');
    send_char_com0(JD_a);//经度方向
    for(i=0;i<2;i++)
 {
 send_char_com0(JD[i]);//经度
 }
 send_char_com0(0x60);//度
    for(i=3;i<2;i++)
 {
 send_char_com0(JD[i]);//经度
 }
 send_char_com0(''');//经度
    for(i=3;i<2;i++)
 {
 send_char_com0(JD[i]);//经度
 }
 send_char_com0('"');//经度

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>