前段時間受朋友影響,決定買個GPS模塊學習一下這東西怎么用,寫這帖子是為了和大家共同學習這模塊,為了控制這模塊搭建了一套簡單的測試電路,希望能給也想了解這模塊的朋友來個參考,廢話不多說,有圖有真相;在使用12864的時候發現點問題,請教高人,12864檢測忙的時候就是不好使,總忙為啥呢?無奈換套路用延時,我每次給12864送指令都需要延時;還有個問題就是我在12864顯示的時候 最早用STC89C58正常,但是換STC12C5A60S2的時候,屏幕會閃的很厲害(相應延時已由12T的調整為1T的),調整延時后還是閃,最后在main里添加延時后好多了,但是程序一變化相應的延時也得變,有啥辦法能讓屏幕不閃呢,是因為1T的單片機太快了,12864跟不上節奏嗎? 請高人指點 謝謝
應大家要求 做下說明:
本系統初衷是本人為了 了解GPS模塊而做的測試,GPS模塊用的是上文提到的REB3571,其實我覺得市面上賣的GPS模塊基本都遵循NMEA0183協議,所以在整體設計的時候只要為單片機留出串口就行了,一般的GPS模塊都會引出TTL電平的TXD和RXD引腳,我用的GPS模塊采用5V供電,跟51供電相同所以不用電壓轉換;單片機其實最早我用的是AT89S52,但是因為程序編譯后大概20K左右,所以放棄了52選用STC的89C58,買芯片的時候發現STC89C58和STC12C5A60S2一個價,所以就一樣買了一片(在電子市場買的,賣家比較黑一片要我12塊錢),源程序在58上進行的測試,后來移植到1T的STC12C5A60S2上,因為STC12C5A60S2有倆串口,以后可以擴展,所以果斷棄掉58轉投STC12C5A60S2;液晶方面用的是12864(控制器芯片 ST7920 ),我也是剛知道LCD還有控制器芯片;最初的測試是用的USB供電,但是做完之后只能在電腦旁測試也沒速度;就想了個招用4節5號電池的電池盒(一般的1元錢4節的電池,4節加一起都能達到6.8V,為了供電穩定可以考慮串1n4007,或是上7805穩壓,我覺得1117的5V芯片挺好使,其間也試過LM317),最后還是采用了18650(這就是筆記本的電芯,一般都2000mh以上),加個一個升壓模塊(模塊上有可調的電位器,自己調整電壓感覺需要比5V高點,因為測試的時候沒接負載呢,也不知道這么想對不?哈哈希望高人指點謝謝);我整理一下 回頭上傳電路圖。
各位論壇的好朋友實在抱歉,由于一些原因好長、好長時間都沒碰單片機了,差點就放棄這個專業了,
附上解碼的程序 大家共同學習研究,有需要電路圖的朋友請留言,我得好好找找都不知道放哪里了。
int GPS_RMC_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status, tmp;
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
ch = buf[5];
status = buf[GetComma(2, buf)];
if (ch == 'C') //如果第五個字符是C,($GPRMC)
{
if (status == 'A') //如果數據有效,則分析
{
GPS -> NS = buf[GetComma(4, buf)];
GPS -> EW = buf[GetComma(6, buf)];
GPS->latitude = Get_Double_Number(&buf[GetComma(3, buf)]);
GPS->longitude = Get_Double_Number(&buf[GetComma( 5, buf)]);
GPS->latitude_Degree = (int)GPS->latitude / 100; //分離緯度
lati_cent_tmp = (GPS->latitude - GPS->latitude_Degree * 100);
GPS->latitude_Cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - GPS->latitude_Cent) * 60;
GPS->latitude_Second = (int)lati_second_tmp;
GPS->longitude_Degree = (int)GPS->longitude / 100; //分離經度
long_cent_tmp = (GPS->longitude - GPS->longitude_Degree * 100);
GPS->longitude_Cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - GPS->longitude_Cent) * 60;
GPS->longitude_Second = (int)long_second_tmp;
speed_tmp = Get_Float_Number(&buf[GetComma(7, buf)]); //速度(單位:海里/時)
GPS->speed = speed_tmp * 1.85; //1海里=1.85公里
GPS->direction = Get_Float_Number(&buf[GetComma(8, buf)]); //角度
GPS->D.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //時間
GPS->D.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
GPS->D.second = (buf[11] - '0') * 10 + (buf[12] - '0');
tmp = GetComma(9, buf);
GPS->D.day = (buf[tmp + 0] - '0') * 10 + (buf[tmp + 1] - '0'); //日期
GPS->D.month = (buf[tmp + 2] - '0') * 10 + (buf[tmp + 3] - '0');
GPS->D.year = (buf[tmp + 4] - '0') * 10 + (buf[tmp + 5] - '0')+2000;
UTC2BTC(&GPS->D);
return 1;
}
}
return 0;
}
int GPS_GGA_Parse(char *line,GPS_INFO *GPS)
{
uchar ch, status;
char *buf = line;
ch = buf[4];
status = buf[GetComma(2, buf)];
if (ch == 'G') //$GPGGA
{
if (status != ',')
{
GPS->height_sea = Get_Float_Number(&buf[GetComma(9, buf)]);
// GPS->height_ground = Get_Float_Number(&buf[GetComma(11, buf)]);
GPS->height_ground = Get_Float_Number(&buf[GetComma(10, buf)]); //要的是大地水平高度,應該解析第10個逗號之后的數據
return 1;
}
}
return 0;
}
093821gdxsgoqg020dgdsg.jpg.thumb.jpg (40.09 KB, 下載次數: 267)
下載附件
2014-12-17 16:54 上傳
液晶部分 焊個電位器 調對比度
094002p4wljxo9vlxo8zoa.jpg.thumb.jpg (38.04 KB, 下載次數: 257)
下載附件
2014-12-17 16:54 上傳
電源部分 為了到戶外測試方便 加個18650和升壓模塊
094040ohzzrry0coiy0rbr.jpg.thumb.jpg (36.38 KB, 下載次數: 295)
下載附件
2014-12-17 16:54 上傳
初始化狀態
094313y7xf7k7ggrxtexz7.jpg.thumb.jpg (49.69 KB, 下載次數: 254)
下載附件
2014-12-17 16:54 上傳
測試的結果
0943462ubo2pwobob03c9c.jpg.thumb.jpg (48.31 KB, 下載次數: 254)
下載附件
2014-12-17 16:54 上傳
0944066v71kz89rs9kx2v7.jpg.thumb.jpg (48.7 KB, 下載次數: 284)
下載附件
2014-12-17 16:54 上傳
|