Board logo

标题: 智能GPS控制器 [打印本页]

作者: 我是MT    时间: 2015-3-16 19:18     标题: 智能GPS控制器

[导读] 此项目是基于SLH单片机的一个GPS定位程序。
关键词:GPS

  一、项目设计背景及概述
  此项目是基于SLH单片机的一个GPS定位程序。通过GPS提供的位置坐标,除了定位之外,还可以计算出日出日落时间。然后利用此时间来作为一些定时控制器的控制依据。比如路灯,日落时开启,日出时关闭。这样可以省去人工开关灯的麻烦,也可以节省不必要的用电。同时我们还在其中加入了NRF24LO1无线模块,可以通过无线将位置坐标,模式等数据传给其他匹配好地址的设备。这样就可以达到一机多用的目的,也节省了系统的总成本。为了方便使用,显示采用了12864显示,在程序中加入了各种菜单,模式选择。和参数设置功能。使其功能更加强大。
  二、项目设计原理
  1、 原理概述
  本项目原理即是基于SLH单片机的串口通讯与IO控制功能,将GPS,RF,DS1302,LCD等模集合成一体。从而实现地理定位。无线通信。实时时钟。和液晶显示器等功能。
  2、 硬件设计原理
  硬件原理图如下所示。


图1.单片机及GPS


  图1中为了给RF及LCD供电,使用了LDO将5V电压转成3.3V。GPS那里用了一个4P的插头,方便电脑串口调试。排阻是后面说的DS1302拉位用。高电平复位,晶振用的是11.0592MHz的。


  图2.DS1302及NRF24L01


  图3.LCD


  图4.按钮


  注意的是DS1302的IO最好有上拉电阻,不然时不时小坑一下。

  3、 软件设计原理
  软件是本项目的重点,编译器是Keil uVision4。整个程序主要是用于实现获取GPS信息、RF通信、实时时钟显示,另外增加了数据保存和恢复的功能。其中GPS是通过串口接收的,其接收方法如下程序所示:
  uart_data[uart_data[59]] = SBUF;
  if(on_uart){
  if(uart_data[uart_data[59]]==0x2a){
  uart_updata=1;
  uart_data[0]=0;
  on_uart=0;
  }
  if(uart_data[0]==0x24){uart_data[59]++;if(uart_data[59]》55)uart_data[59]=0;}
  起初,串口接收到数据后。产生中断。如果on_uart标志位为1,程序将数据写入串口接收缓冲数组。因为GPS协议的开始字符都为0x24,所以在判断接收到此数据后才往下接收。计数放在数组的最后一位,当uart_data[uart_data[59]]==0x2a成立时,一组数据接收完成,更新标志位 uart_updata=1GPS,C内的函数即可读出数据。然后判断是否定位好等操作。
  RF则更容易一些,因为协议可以自己定义,如下函数所示:
  if(model==1)addr=TS_ADDRESS0;
  if(model==2)addr=TS_ADDRESS1;
  if(model==3)addr=TS_ADDRESS2;
  if(model==4)addr=TS_ADDRESS3;
  dis_char(0,2,0,“ Sending.。. ”);
  dis_char(0,0,0,“ Cancel to Exit ”);
  LOOP0:delay(0xffff);delay(0xffff);delay(0xffff);delay(0xffff);
  temp[0]=0xa1;
  if(longitude》0){ dd=longitude;temp[1]=0;
  }else{
  dd=(-1)*longitude;temp[1]=1;
  }
  temp[2]=dd;temp[3]=(dd-temp[2])*100;
  temp[4]=ontime[model-1][0];temp[5]=ontime[model-1][1];
  nRF24L01_TxPacket(temp,addr);delay(0xfff);
  if(Close_rf()){;
  // dis_char(0,2,0,“ Send Success ”);delay(100);
  }else{
  ajsm();
  if(key!=0){
  if(key==9){key=0;goto LOOP4;}
  } else{goto LOOP0;}
  }
  函数是发送数据的其中一度,开始判断发送的地址,然后将其他类型的数据转换成char类型的,写入一个数组,然后就逐个发送出去数组的第一位存放协议。此处为Oxa1表示第一段数据。不是地址,也不是第二段,最后用了NRF24l01自带的校验功能判断是否发送成功,成功则发送第二段,不成功则重复发送,直至按下取消按钮。

  三、项目设计框图
  1、硬件设计框图
  设计框图如下所示


  图5.硬件设计框图


  2、软件设计框图
  其实软件才是本项目的亮点,PROJECT视图如下:


  图6.Keil 4 PROJECT视图


  Main.C是主函数,然后每个外设有一个头文件,包涵后给其他C的功能实现源文件继承。从头文件可以看出,除了各个外设的功能外,我们还加入了SLH单片机SSP、EPPROM数据存储功能使项目更加完美。GPS.C/用于实现与GPS的串口通信,数据转换以及GPS电源控制,RF.C/用于发送和接收RF传输数据,TIME.C/ 用于DS1302时间设置,SET./用于工作模式设置和日出日落时间计算,所有xxx_W1.C的文件都是用于写界面显示的。如此说明不知您理解没有呢?然后再每个功能函数都有一个入口函数,如下图7所示,命名为XXX_ MAIN():


  图7.MAIN函数部分程序截图


  通过按键即可选择进入各个功能。带界面显示的哦!很好很强大。
  其主要流程如下图所示。


  图8.


  因为所以实现的功能较多,所以这个项目程序就有点大。不进行较合理的分类的话就乱了。所以在主函数之后其他功能都通过入口函数提供跳转。跳转至其他C源文件的函数后相对于又建立了一个main函数。完成功能后可以退出,然后进入其他功能。这样不但有利于程序书写逻辑。而且极大方便了分步调试。
  由上述说明可知。项目的外设有GPS模块、RF模块、时间模块、所以源程序,就有了这三个的控制.C文件。然后因为要有设置功能,所以再增加一个SET.C。对于LCD模块,因为每入一个功能就有一个界面,所以显示函数应该给每个功能设置一个独立的.C文件。如此,一个项目就清晰了。

  四、测试结果


图9.实物图







欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0