一、项目设计背景及概述
此项目是基于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.实物图
评论
查看更多