基于C3-370C的GPS定位及軌跡記錄儀!
在51hei買了C3-370C的GPS,準備做GPS軌跡記錄,因為我一直想在旅游的照片上加上坐標信息……
開始用M48作控制MCU,結果寫著寫著,發現Flash空間不足,想換個M8或M88的,在常州還不好買,手上正好還有兩塊STC90C52,8K的,于是就換上C52了。
C52不帶AD,那電池檢測又成問題,于是從壞的萬用表上拆下一個2904運放,做了個簡單的電池電壓檢測。
現在整個設備的供電都由鋰電池直接提供,配一塊880mah的手機電池,可以用6小時左右;
我用24C64記錄軌跡信息,包括日期時間、經緯度在內的一組信息,可存儲512條,按1min/條,可存8小時。
數據通過串口傳給上位機,上位機軟件轉換數據,也可直接輸出KML文件,在Goole earth中打開。
按鍵0: 短按(可見衛星信息|坐標數據); 長按(運行|暫停);
按鍵1: 短按(記錄當前坐標數據); 長按(暫停時長按刪除所有數據);
按鍵2: 短按(背光燈); 長按(記錄模式切換H/A90s/A60s/A30s/A10s);
視圖1
背光燈開啟
界面說明
液晶背后的主控板
30S自動記錄模式
可見衛星信息
連接電腦上傳數據
PC端接收數據
刪除數據
背面
左側
右側
在GooleEarth打開
運放低電壓指示電路
最近想著給它加個殼,費了一些時間,找到了一個東東,感覺做外殼不錯,就是ADSL的分頻器,不過體積小了不少, 尺寸只有60X44X21!
于是想做就做吧,為了減小體積,能用貼片的元件都換成貼片的,幸好最近出了Atmega8a這個價格還算合理的AVR片子, 上位機軟件也做了調整,將照片匹配軟件與上位機軟件合成。 主程序文件:
#include "_STC90.h"
#include "_GPS.h"
sbit C_LED = P0^4; //數據通訊指示
sbit Key0 = P3^3;
sbit Key1 = P1^2;
sbit Key2 = P1^0;
bit flg_gsv=0;
bit flg_mode=0;
bit flg_upload=0;
bit flg_rx=0;
bit flg_rxf=0;
uchar flg_rmcgga=0; //1rmc 2gga
void get_gpsmode(void)
{
if(!flg_mode){
if(buf_gps[3]=='M' && buf_gps[4]=='C') flg_rmcgga = 1; //RMC
else{
if(buf_gps[3]=='G' && buf_gps[4]=='A') flg_rmcgga = 2; //GGA
else flg_rx = 0;
}
}
else{
if(buf_gps[3]=='S' && buf_gps[4]=='V') flg_rmcgga = 3; //GGA
else flg_rx = 0;
}
}
void UART_RX(void) interrupt 4
{
uchar tp_rx;
while(!RI);
tp_rx = SBUF;
if(!flg_rxf){
if(flg_rx){
buf_gps[count_gps] = tp_rx;
if(count_gps==4) get_gpsmode();
if(tp_rx=='*'){ flg_rx = 0; flg_rxf = 1;}
else count_gps++;
}
else{
if(tp_rx=='$'){ flg_rx = 1; count_gps = 0; flg_rmcgga = 0;}
}
}
if(tp_rx=='#') flg_upload = 1;
RI = 0;
}
void UART_TX(uchar tp_tx)
{
SBUF = tp_tx;
while(!TI);
TI = 0; _nus(100);
}
uchar var_js7=36;
uchar var_js5=0;
uchar var_js4=0;
uint var_jsrec=0;
//60ms
void TIMER2_SEV(void) interrupt 5
{
TF2 = 0;
if(var_js7>0) var_js7--;
if(var_js5>0) var_js5--;
if(var_js4>0) var_js4--;
if(var_jsrec>0) var_jsrec--;
}
void initial(void)
{
C_LED = 0;
GPS_EN = 0;
EA = 0;
AUXR = 0x01;
IPH = 0x0c; IP = 0x14;
SCON = 0x50;
PCON = 0x00;
RI = 0; TI = 0; ES = 1;
TCON = 0x00;
TMOD = 0x21;
TH1 = 256-6; TL1 = 256-6; ET1 = 0; TR1 = 1;
T2CON = 0x00; T2MOD = 0x00;
RCAP2H = (65536-55296)/256; RCAP2L = (65536-55296)%256;
ET2 = 1; TR2 = 1;
I2C_Init();
L5_init();
L5_wrstr_cn(24,2,0,4,4); //衛星定位
L5_wrstr_cn(24,4,4,4,4); //軌跡記錄
EA = 1;
while(var_js7>0);
Lgps_disp_init();
C_LED = 1;
}
void Key_deal(void)
{
uchar jk=255;
C_LED = 0; EA = 0; flg_rx = 0; flg_rxf = 0;
if(!Key0){
do{ _nms(8); jk--;}while(!Key0 && jk>0);
if(jk>0){
flg_mode = !flg_mode;
L5_setxy(0,1); ofs = 0; line = 0x00; Lwr_icob(336);
if(!flg_mode) Lgps_disp_dt();
}
else{
flg_sata = !flg_sata; L5_SATA();
GPS_EN = flg_sata;
}
do{ while(!Key0); _nms(5);}while(!Key0);
}
if(!Key1){
do{ _nms(20); jk--;}while(!Key1 && jk>0);
if(jk>0){ at_onewr('H'); var_js4 = 10;}
else at_format();
do{ while(!Key1); _nms(5);}while(!Key1);
}
if(!Key2){
do{ _nms(8); jk--;}while(!Key2 && jk>0);
if(jk>0) L5_LED = !L5_LED;
else{
while(!Key2){
rec_add();
_nms(255); _nms(255); _nms(255); _nms(255);
}
var_jsrec = var_rec*50; var_jsrec/=3;
}
}
C_LED = 1; EA = 1;
}
void main(void)
{
initial();
while(1){
if(flg_rxf){
if(flg_sign) C_LED = 0;
L5_ComData(1); var_js5 = 6;
get_cama();
if(!flg_mode){
if(flg_rmcgga==1) L5_RMC();
else if(flg_rmcgga==2) L5_GGA();
}
else{
if(flg_rmcgga==3){
if(!flg_gsv){
L5_GSV();
if(buf_gps[8]=='3') flg_gsv = 1;
}
else{
if(buf_gps[8]=='2'){ L5_GSV(); flg_gsv = 0;}
}
}
}
for(count_gps=0;count_gps<96;count_gps++)
buf_gps[count_gps]=0;
C_LED = 1; flg_rxf = 0;
}
if(var_js5==1){ L5_ComData(0); var_js5 = 0;}
if(var_js7==0){ L5_BAT(); var_js7 = 16;}
if(!(Key0&Key1&Key2)){ _nms(5); Key_deal();}
if(var_js4==1){ L5_AtWr(0); var_js4 = 0;}
if(!flg_sata){
if(var_rec>0){
if(var_jsrec==0){
at_onewr('A'); var_js4 = 10;
var_jsrec = var_rec*50; var_jsrec/=3;
}
}
}
if(flg_upload){
if(flg_sata){
uint k; uchar r;
C_LED = 0; EA = 0; flg_rx = 0; flg_rxf = 0;
for(k=0;k UART_TX(k/256); UART_TX(k%256); for(r=0;r<16;r++) UART_TX(C64_buf[r]); L5_sch(1,1,k,at_id); } EA = 1; L5_sch(0,0,0,0); C_LED = 1; } flg_upload = 0; } } } _gps.h 文件: #include "_STC90.h" #include "_LCD5110.h" #include "_AT24C64.h" #define Bat_full 10 //電量滿 #define Bat_empt 11 //電量空 #define Signal 12 //信號 #define NoSignal 13 //信號 #define file 14 //文件 #define Sata_run 15 //狀態運行 #define Sata_pause 16 //狀態暫停 #define Ico_gps 17 //GPS #define Ico_com 18 //數據通訊 #define Ico_del 19 //刪除 #define Ico_upload 20 //上傳 #define Ico_wait 21 //等待 #define chr_point 22 //大'.' #define chr_degree 23 //度 #define chr_min 24 //分 #define Ico_point 25 //小度 #define Ico_degree 26 //小度 sbit Bat_Low = P1^4; //電池0低 sbit GPS_EN = P3^5; //GPS使能 uchar buf_gps[96]={0}; uchar count_gps=0; bit flg_sign=0; uchar var_seg[20]={0}; uchar ofs=0; uchar line=0x00; void get_cama(void) { uchar tp_c=0,cj; for(cj=0;cj<20;cj++) var_seg[cj] = 0; for(cj=0;cj } void Lwr_icob(uint nb){ for(;nb>0;nb--) L5_wrbyte(1,line);} void Lwr_ico(uchar ic) { uchar i0,i1; switch(ic){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': i0 = (ic-48)*4; i1 = i0+4; break; case 10: i0 = 65; i1 = 75; break; //電量滿 case 11: i0 = 75; i1 = 85; break; //電量空 case 12: i0 = 40; i1 = 50; break; //信號有 case 13: i0 = 50; i1 = 60; break; //信號無 case 14: i0 = 60; i1 = 65; break; //文件 case 15: i0 = 137; i1 = 143; break; //運行圖標 case 16: i0 = 143; i1 = 149; break; //暫停圖標 case 17: i0 = 85; i1 = 105; break; //GPS case 18: i0 = 164; i1 = 173; break; //數據傳輸 case 19: i0 = 173; i1 = 180; break; //刪除× case 20: i0 = 180; i1 = 187; break; //上傳 case 21: i0 = 187; i1 = 194; break; //等待 case 'D': i0 = 131; i1 = 137; break; //'D' case ':': i0 = 115; i1 = 117; break; //':' case '/': i0 = 105; i1 = 109; break; //'/' case '.': i0 = 109; i1 = 111; break; //'.' case '-': i0 = 111; i1 = 115; break; //'-' case '%': i0 = 194; i1 = 202; break; //'%' case 'k': i0 = 117; i1 = 131; break; //'kmh' case 'm': i0 = 121; i1 = 127; break; //'m' case 's': i0 = 159; i1 = 164; break; //'s' case 'A': i0 = 202; i1 = 207; break; //'A' case 'H': i0 = 207; i1 = 212; break; //'H' case 'N': i0 = 212; i1 = 217; break; //'N' case 'S': i0 = 217; i1 = 222; break; //'S' case 'E': i0 = 222; i1 = 227; break; //'E' case 'W': i0 = 227; i1 = 232; break; //'N' case 22: i0 = 149; i1 = 152; break; //大'.' case 23: i0 = 152; i1 = 156; break; // ° case 24: i0 = 156; i1 = 159; break; //' case 25: i0 = 232; i1 = 235; break; //中點 case 26: i0 = 235; i1 = 238; break; //小度 default: i0 = ic*4; i1 = i0+4; break; //數字 } for(;i0 void Lwr_icos(uchar cs,uchar cl) { uchar k; for(k=0;k void Lwr_icoh(uchar *hs){ while(*hs){ Lwr_ico(*hs); hs++;}} void L5_wr_chr(uchar nc) { uchar l,n; switch(nc){ case 'N': n = 19; break; case 'S': n = 22; break; case 'E': n = 16; break; case 'W': n = 24; break; case 'H': n = 18; break; case 'A': n = 14; break; case 'G': n = 17; break; case 'P': n = 20; break; case 'R': n = 21; break; case 'M': n = 18; break; case 'C': n = 15; break; case ',': n = 11; break; case '.': n = 13; break; case '-': n = 12; break; case '*': n = 10; break; case 'V': n = 23; break; default: n = nc-48; break; } for(l=0;l<6;l++) L5_wrbyte(1,ASCII326[n][l]); } void L5_wr_chrs(uchar ch,uchar lc) { uchar k; for(k=0;k void L5_wr_chrh(uchar *hr){ while(*hr){ L5_wr_chr(*hr); hr++;}} uchar chrtodec(uchar cd){return buf_gps[cd]-48;} uchar chr_dec(uchar cf){ return chrtodec(cf)*10+chrtodec(cf+1);} /void Lwr_dec(uchar dec){ Lwr_ico(dec/10); Lwr_ico(dec%10);} void L5_RMC(void) { uchar tp_h,tp_y,tp_m,tp_d; bit flg_d=0; L5_setxy(56,5); ofs = 3; line = 0x02; tp_h = chr_dec(6)+8; if(tp_h>23){ tp_h%=24; flg_d = 1;} Lwr_dec(tp_h); Lwr_ico(':'); Lwr_icos(8,2); Lwr_ico(':'); Lwr_icos(10,2); L5_CE = 1; C64_buf[3] = tp_h; C64_buf[4] = chr_dec(8); C64_buf[5] = chr_dec(10); L5_setxy(32,5); tp_m = chr_dec(var_seg[8]+3); tp_d = chr_dec(var_seg[8]+1); if(flg_d){ switch(tp_m){ case 4: case 6: case 9: case 11:
上一篇:51單片機驅動CT1642數碼管顯示源程序
下一篇:L298N+AT89C52+BT-04A藍牙控制遙控小車
推薦閱讀
史海拾趣
Ampire Co., Ltd. 是一家總部位于中國深圳的汽車電子產品制造商,專注于汽車安全、娛樂和舒適性電子產品的研發、生產和銷售。以下是關于 Ampire 公司發展的五個相關故事:
成立與初創階段:Ampire 公司成立于 2002 年,起初主要從事汽車電子產品的貿易業務。公司的創始人致力于在汽車行業提供高品質的電子產品,以提升駕駛體驗和車輛安全性。在公司初期,他們主要進口和銷售一些汽車音響和影音產品。
技術創新與產品升級:隨著市場需求的不斷變化和技術的進步,Ampire 公司開始注重技術創新和產品升級。公司加大了對汽車安全和行車輔助系統的研發投入,推出了一系列高品質的后視攝像頭、倒車雷達、行車記錄儀等產品,以提高車輛的安全性和駕駛便利性。
品牌建設與市場拓展:Ampire 公司通過不斷提升產品質量和服務水平,逐漸樹立起了良好的品牌形象,并在國內外市場上獲得了良好的口碑和知名度。公司積極參加國內外汽車電子展會和行業活動,拓展了國際市場,產品出口至歐美、東南亞等多個國家和地區。
生產基地建設與產能提升:為滿足不斷增長的市場需求,Ampire 公司逐步擴大了生產基地,并引進了先進的生產設備和技術。公司建立了完善的生產制造體系,實現了規模化生產和產能提升,保障了產品質量和交貨期。
持續發展與未來規劃:Ampire 公司持續致力于技術創新和產品升級,不斷推出符合市場需求的新品。未來,公司計劃進一步加大在汽車安全、智能駕駛和車載娛樂等領域的研發投入,積極探索人工智能、互聯網車聯網等新技術的應用,為客戶提供更加智能、安全和便捷的汽車電子產品。
這些故事展示了 Ampire 公司從創立初期到如今在技術創新、產品升級、品牌建設、生產基地建設以及未來規劃等方面取得的重要進展。
在電子行業快速發展的背景下,E. Dold & S?hne KG公司始終緊跟科技潮流,致力于技術創新。公司投入大量資源研發新型電子元件和系統,以滿足市場對于高性能、高可靠性產品的需求。通過不斷的技術創新,E. Dold & S?hne KG公司在行業內樹立了良好的口碑,成為眾多知名企業的合作伙伴。
Bay Linear Inc公司一直注重人才培養和團隊建設。公司建立了完善的人才培養和激勵機制,吸引了一批批優秀的研發人才和管理人才。同時,公司還積極營造團結協作、創新進取的企業文化,使團隊成員能夠充分發揮自己的才能和潛力,共同推動公司的發展。
在激烈的市場競爭中,CEI深知品質管理的重要性。公司建立了完善的質量管理體系,從原材料采購到產品制造、檢驗、包裝等各個環節都進行嚴格把關。同時,CEI還注重持續改進和優化生產流程,提高生產效率和產品質量。這些措施使得CEI的產品在市場上具有更高的競爭力和口碑。
邁翔科技(COILMX)的創始人看到了電子行業,特別是電感器市場的巨大潛力。1996年,公司正式成立,初期主要專注于SMD電感的設計、制造和銷售。公司從香港起步,逐步在深圳設立工廠,引進先進的生產設備和技術,為未來的發展奠定了堅實的基礎。
邁翔科技(COILMX)的創始人看到了電子行業,特別是電感器市場的巨大潛力。1996年,公司正式成立,初期主要專注于SMD電感的設計、制造和銷售。公司從香港起步,逐步在深圳設立工廠,引進先進的生產設備和技術,為未來的發展奠定了堅實的基礎。
a)程序硬件復位或者軟件復位 b)判斷mp/mc是否為0,微計算機模式(為1,當為微處理器模式時,2812內部的bootrom被禁止,通過zone7從外部調引導程序啟動。) c)為0則從boot rom啟動,否則從外部啟動(0x3F FC00) d)到bo ...… 查看全部問答∨ |
|
轉:http://www.mydigit.net/read.php?tid=152081 周末閑閑的,做了一塊開關板。 用到料簡單,也沒幾個零件,電子城全可以買得到,成本也不高。祥見圖片 功能:按下開關S 555第3角輸出5V電壓驅動繼電器,繼電器有常開常閉觸點跟據 ...… 查看全部問答∨ |
3-2.地線對EMC的影響 很多人都認為,電路中的地線或接地電路都是不帶電的,實際上,這種認為是錯誤的。在一般的直流電路或低頻電路中,當不考慮電磁感應時,可以認為電路中的地線或接地電路是不帶電的,但在存在電磁感應的電路中,就不要輕易認為 ...… 查看全部問答∨ |
常見的 PCL 打印機指令 http://www.icare.hp.com.cn/TechCenter_StaticArticle/16956/16956.html 如何按照上面的PCL打印機指令打印文字?… 查看全部問答∨ |
|
In-Sight 5605 視覺系統為德國 Continental 公司提供了超高速代碼識別功能 摘要 位于德國法蘭克福市的 Continental 公司是一家國際化的汽車供應商,該公司采用成千上萬套運輸托盤運送其大部分組件。標 ...… 查看全部問答∨ |