一、項目設計背景及概述
此項目是基于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.實物圖
評論