`
insertyou
  • 浏览: 908657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

/*
说明:Winbond W77E58 双串口单片机
时间:2008年7月3日
程序:张建波
串口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('"');//经度

send_char_com0('#');
send_char_com0(WD_a);//纬度方向
for(i=0;i<9;i++)
{
send_char_com0(WD[i]);//纬度
}
send_char_com0('#');
send_char_com0('#');
send_char_com0('#');
send_char_com0('M');
send_char_com0('i');
send_char_com0('o');
send_char_com0('S');
send_char_com0('M');
send_char_com0('S');
send_char_com0('#');

/**/
SBUF=0x1A;
while(TI==0);
TI=0;

}

void sz(void)
{
//绑定手机号码
int i;
for(i=0;i<10;i++)
{
P0_4=~P0_4;
P0_5=~P0_5;
P0_6=~P0_6;
P0_7=~P0_7;
Delay400Ms();
Delay400Ms();
//---
smsPWD[0]=sms[3];
smsPWD[1]=sms[4];
smsPWD[2]=sms[5];
smsPWD[3]=sms[6];
smsPWD[4]=sms[7];
smsPWD[5]=sms[8];
smsPWD[6]=sms[9];
smsPWD[7]=sms[10];
//--
PhoneNum[0]=sms[12]; //1
PhoneNum[1]=sms[13]; //3
PhoneNum[2]=sms[14]; //5
PhoneNum[3]=sms[15]; //7
PhoneNum[4]=sms[16]; //7
PhoneNum[5]=sms[17]; //0
PhoneNum[6]=sms[18]; //6
PhoneNum[7]=sms[19]; //2
PhoneNum[8]=sms[20]; //6
PhoneNum[9]=sms[21]; //7
PhoneNum[10]=sms[22]; //9
//--
}

//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('B');
send_char_com0('D');
for(i=0;i<12;i++)
{
send_char_com0(PhoneNum[i]);
}
send_char_com0('#');
for(i=0;i<8;i++)
{
send_char_com0(smsPWD[i]);
}
send_char_com0('#');
//SendSM("SYSTEM$");

SBUF=0x1A;
while(TI==0);
TI=0;
// sms_mode=-1;
// init_GSM();//复位GSM MODEM
}
void serial_0(void)interrupt 4
{
// GSM
unsigned char tmp;
if(RI)
{
tmp=SBUF;
switch(tmp)
{
//忽略 +CMT: "+8613577062697",,"08/07/04,21:26:44+32"
case '+':
sms_count=0;
sms_mode=0;
break;
case '"':
sms_count=0;
sms_mode=0;
break;
case '>': //短信发送模式
sms_count=0;
sms_mode=-1;
break;
case '*':
sms_count=0; //接收位清空
sms_mode=1;
break;
case 'O': //OK
{
if(sms_mode==-1)
{
//段信发送成功
sms_mode=0;
sms_count=0;
}
break;
}
default:
if(sms_mode==1)
{
sms[sms_count++]=tmp;
if(tmp=='%')
{
sms_mode=2; //命令语句接收完毕
//开始处理
switch(sms[0])
{
case 'D': //DW 进行GPS定位
sms_mode=-1;
dw();
break;
case 'S': //SZ 进行手机号码绑定
sms_mode=-1;
sz();
break;
default:
fw(); //复位GSM
break;
}
}

}
break;
}
RI=0;
}
// if(TI)
// {
// TI=0;
// }
}

void serial_1(void)interrupt 7
{
unsigned char tmp;

if(RI_1)
{
P0_7=~P0_7;
tmp=SBUF1;
switch(tmp)
{
case '$':
cmd_number=0; //命令类型清空
mode=1; //接收命令模式
byte_count=0; //接收位数清空
break;
case ',':
seg_count++; //逗号计数加1
byte_count=0;
break;
case '*':
switch(cmd_number)
{
case 1:
buf_full|=0x01;
break;
case 2:
buf_full|=0x02;
break;
case 3:
buf_full|=0x04;
break;
}
mode=0;
break;
default:
if(mode==1)
{
//命令种类判断
cmd[byte_count]=tmp; //接收字符放入类型缓存
if(byte_count>=4)
{ //如果类型数据接收完毕,判断类型
if(cmd[0]=='G')
{
if(cmd[1]=='P')
{
if(cmd[2]=='G')
{
if(cmd[3]=='G')
{
if(cmd[4]=='A')
{
cmd_number=1;
mode=2;
seg_count=0;
byte_count=0;
}
}
else if(cmd[3]=='S')
{
if(cmd[4]=='V')
{
cmd_number=2;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
else if(cmd[2]=='R')
{
if(cmd[3]=='M')
{
if(cmd[4]=='C')
{
cmd_number=3;
mode=2;
seg_count=0;
byte_count=0;
}
}
}
}
}
}
}
else if(mode==2)
{
//接收数据处理
switch (cmd_number)
{
case 1: //类型1数据接收。GPGGA
switch(seg_count)
{
case 2: //纬度处理
if(byte_count<9)
{
WD[byte_count]=tmp;
}
break;
case 3: //纬度方向处理
if(byte_count<1)
{
WD_a=tmp;
}
break;
case 4: //经度处理
if(byte_count<10)
{
JD[byte_count]=tmp;
}
break;
case 5: //经度方向处理
if(byte_count<1)
{
JD_a=tmp;
}
break;
case 6: //定位判断
if(byte_count<1)
{
lock=tmp;
}
break;
case 7: //定位使用的卫星数
if(byte_count<2)
{
use_sat[byte_count]=tmp;
}
break;
case 9: //高度处理
if(byte_count<6)
{
high[byte_count]=tmp;
}
break;
}
break;
case 2: //类型2数据接收。GPGSV
switch(seg_count)
{
case 3: //天空中的卫星总数
if(byte_count<2)
{
total_sat[byte_count]=tmp;
}
break;
}
break;
case 3: //类型3数据接收。GPRMC
switch(seg_count)
{
case 1:
if(byte_count<6)
{ //时间处理
time[byte_count]=tmp;
}
break;
case 7: //速度处理
if(byte_count<5)
{
speed[byte_count]=tmp;
}
break;
case 8: //方位角处理
if(byte_count<5)
{
angle[byte_count]=tmp;
}
break;
}
break;
}
}
byte_count++; //接收数位加1
break;
}
}
RI_1=0;
}

注意:相应的图纸,可以在我的博客中找到。欢迎有兴趣的朋友一起学习交流。

分享到:
评论

相关推荐

    w77e58中文资料手册

    ### W77E58中文资料手册知识点概览 ...综上所述,W77E58是一款功能强大的8位微控制器,它不仅继承了8051系列的传统优势,还在性能、功耗等方面进行了显著提升,非常适合应用于需要高性能、低功耗的各种嵌入式系统中。

    w77e58单片机的双串口 的操作,寄存器的设置和 串口读写等.rar

    在嵌入式系统开发中,单片机扮演着至关重要的角色,而W77E58是一款常见的8位单片机,以其高效能和广泛应用而受到工程师的青睐。该压缩包文件主要涉及W77E58单片机的双串口操作、寄存器设置以及串口读写等核心功能。...

    w77e58英文资料

    它在原有的8051基础上进行了核心处理器的重新设计,摒弃了无效的时钟周期和内存周期,从而实现了所有8051指令的执行速度比原版8051快,具体而言,在相同的晶体振荡频率下,W77E58的指令执行时间比传统8051快1.5到3倍...

    w77e58中文资料

    W77E58单片机凭借其卓越的性能和丰富的功能,在工业控制、自动化设备等领域得到了广泛应用。通过对上述关键特性和技术细节的了解,开发人员能够更好地利用这款单片机的优势,开发出高效稳定的嵌入式系统解决方案。

    W77E58 W77E516

    标题中的"W77E58"和"W77E516"是华邦电子(Winbond)推出的两款微控制器,它们属于8位单片机系列。这些微控制器以其高效能和灵活的特性在嵌入式系统设计中广泛应用。下面我们将深入探讨这两款MCU的关键特性、功能以及...

    W77E58单片机控制电路原理图

    W77E58单片机是一款广泛应用在嵌入式系统中的微控制器,它集成了CPU、RAM、ROM、I/O端口以及其他外围设备,使得它成为实现各种电子设备控制功能的理想选择。本文将深入探讨W77E58单片机的控制电路原理图,帮助读者...

    W77E58单片机+MAX232+MAX485接口板AD设计硬件原理图+PCB文件.zip

    在W77E58、MAX232和MAX485组成的系统中,W77E58通过SPI或UART接口与MAX232交互,将数字信号转换为RS-232信号,然后通过MAX485发送到远程设备,或者接收远程设备的数据。同时,W77E58的ADC端口用于采集模拟信号,经过...

    W77E58头文件

    Keil C51中不自带W77E58 的头文件。自己做了一个,还是很久以前做得。希望有用。

    W77E58

    ### W77E58 8位微控制器详细介绍 #### 概述 W77E58是一款基于经典8051架构的高性能8位微控制器。它通过优化内部架构来提升指令执行效率,使该微控制器能在相同时钟频率下实现更快的指令处理速度。与传统的8051系列...

    GPS远程定位程序

    GPS远程定位程序,基于W77E58单片机,EX_NET原创,欢迎来电交流学习。

    编了一段华邦77e58扩展ram的代码.rar_w77e58_winbond

    7. **代码示例**:“编了一段华邦77e58扩展ram的代码.txt”很可能是包含具体编程实现的文本文件,通过阅读和分析这段代码,可以学习到如何实际操作W77E58芯片进行RAM扩展的具体步骤和技巧。 另一个文件...

    W77E58/W77E516 看门狗操作方法(C51)

    **看门狗定时器在微控制器中的应用及W77E58/W77E516的操作** 看门狗定时器(Watchdog Timer,简称WDT)是微控制器中的一种重要安全机制,用于防止程序因为意外的故障或无限循环而无法正常运行。在W77E58和W77E516这...

    W77E58 在RTU 遥信单元中的应用

    ### W77E58在RTU遥信单元中的应用详解 #### 一、引言 随着电力系统自动化水平的不断提高,远程终端单元(RTU)作为电力系统中的关键设备之一,其性能对于整个系统的稳定性和可靠性至关重要。本文将详细介绍如何利用W...

    W77E58B中文手册

    此外,W77E58B还具有低功耗特性,特别是在低频时钟条件下,这使得它成为嵌入式应用的理想选择。 W77E58B的主要特性包括: 1. 高速结构:每个机器周期由四个时钟周期组成,支持最高40MHz的外部时钟频率。 2. 兼容性...

    参考资料-W77E58单片机在遥测数据采编器中的应用.zip

    标题中的“参考资料-W77E58单片机在遥测数据采编器中的应用”表明,这个压缩包文件包含了关于W77E58单片机在遥测数据采集和处理系统中的具体应用信息。W77E58是一款微控制器,常用于嵌入式系统设计,尤其在数据采集...

    w77e58 毕业设计 外文翻译

    W77E58是一款高速8051兼容型微控制器,具有重新设计的处理器核心,消除了空闲时钟周期和内存周期浪费,因此在相同晶振频率下能够比原版8051更快地执行每一条指令。根据指令类型的不同,W77E58的指令执行时间通常比...

    W77E58知识和GPRS一些相关代码

    标题中的"W77E58知识和GPRS一些相关代码"指的是基于W77E58微控制器进行GPRS通信的编程实践。W77E58是一款8位单片机,常用于嵌入式系统设计,特别是对于需要低功耗、高性能的应用。GPRS(General Packet Radio ...

    W77E58双串口原理图

    W77E58双串口单片机原理图,笔者原创,欢迎有兴趣的朋友交流学习。QQ:281451020

    tanchishe.rar_keil w77e_w77e58_华邦_贪吃蛇_贪吃蛇游戏

    标题中的“tanchishe.rar_keil w77e_w77e58_华邦_贪吃蛇_贪吃蛇游戏”表明这是一个与微控制器编程相关的项目,具体是使用Keil开发工具来编写的一个基于华邦(Winbond)W77E58芯片的贪吃蛇游戏。这个压缩包包含了完整...

Global site tag (gtag.js) - Google Analytics