色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

GPS模塊與ATmega16接口查找位置坐標的方式

科技觀察員 ? 來源:circuitdigest ? 作者:薩達姆 ? 2022-08-24 15:19 ? 次閱讀

GPS 模塊廣泛用于電子應用中,以根據經度和緯度坐標跟蹤位置。車輛跟蹤系統、 GPS 時鐘、 事故檢測警報系統、交通導航、監控系統等是 GPS 功能必不可少的幾個例子。GPS 提供海拔、緯度、經度、UTC 時間和有關特定位置的許多其他信息,這些信息來自多顆衛星。要從 GPS 讀取數據,需要一個微控制器,因此我們將GPS 模塊與 AVR 微控制器Atmega16 連接,并在16x2 LCD 顯示屏上打印經度和緯度。

所需組件

Atmega16/32

GPS 模塊(uBlox Neo 6M GPS)

長線天線

16x2 液晶

2.2k電阻

1000uf電容

10uF電容

連接線

LM7805

直流插孔

12v 直流適配器

小貼士

PCB或通用PCB

Ublox Neo 6M 是一個串行 GPS 模塊,通過串行通信提供位置詳細信息。它有四個引腳。

poYBAGMFz5qADR-JAAANUuzQlaw213.png

pYYBAGMFz5aAe776AASEYC2YTxs225.png

Ublox neo 6M GPS 模塊與 TTL 兼容,其規格如下。

pYYBAGMFz5KAR1jAAAATN2wb8yU524.png

從 GPS 獲取位置數據

GPS 模塊將以 9600 波特率在多個字符串中傳輸數據。如果我們使用波特率為 9600 的 UART 終端,我們可以看到 GPS 接收到的數據。

這是以 9600 波特率連接時 GPS 接收到的數據。

$GPRMC,141848.00,A,2237.63306,N,08820.86316,E,0.553,,100418,,,A*73 
$GPVTG,,T,,M,0.553,N,1.024,K,A*27 
$GPGGA,141848.00, 2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2, M,,*74 
$GPGSA,A,2,06,02,05,,,,,,,,,,2.75, 2.56,1.00*02 
$GPGSV,1,1,04,02,59,316,30,05,43,188,25,06,44,022,23,25,03,324,*76 
$GPGLL,2237.63306,N,08820.86316,E,141848.00 ,A,A*65

當我們使用 GPS 模塊跟蹤任何位置時,我們只需要坐標,我們可以在 $GPGGA 字符串中找到它。只有 $GPGGA(全球定位系統固定數據)字符串主要用于程序中,其他字符串被忽略。

$GPGGA,141848.00,2237.63306,N,08820.86316,E,1,03,2.56,1.9,M,-54.2,M,,*74

所以我們需要 5 號和 6 號來收集有關模塊位置或它所在位置的信息。在這個項目中,我們使用了一個 GPS 庫,它提供了一些函數來提取緯度和經度,所以我們不必擔心這一點。

電路原理

GPS與AVR Atemga16微控制器接口的電路圖如下:

poYBAGMF0F-AMQokAAFGaL7_f6Y614.png

整個系統由 12v 直流適配器供電,但電路工作在 5v 上,因此電源由 LM7805 穩壓器調節至 5v。16x2 LCD 配置為 4 位模式 ,其引腳連接如電路圖所示。GPS 也由 5v 供電,其 tx 引腳直接連接到Atmega16 微控制器的 Rx 。一個 8MHz 晶體振蕩器用于為微控制器提供時鐘。

pYYBAGMF0FuAEvkUAATThw4d-Ec447.png

將 GPS 與 AVR 微控制器連接的步驟

設置微控制器的配置,包括振蕩器配置。

設置 LCD 的所需端口,包括 DDR 寄存器

使用 USART 將 GPS 模塊連接到微控制器。

在 ISR 模式下初始化系統 UART,波特率為 9600,LCD 為 4 位模式。

根據緯度和經度的長度取兩個字符數組。

每次接收一個字符位,并檢查它是否從 $ 開始。

如果接收到$,那么它是一個字符串,我們需要檢查$GPGGA,這6個字母包括$。

如果是 GPGGA,則接收完整的字符串并設置標志。

然后用兩個數組中的方向提取緯度和經度。

最后在 LCD 中打印經緯度數組。

poYBAGMF0FeAFMT6AASpFAtumz8141.png

代碼說明

最后給出了完整的代碼和演示視頻,這里解釋了代碼的一些重要部分。

首先在代碼中包含一些必需的標頭,然后為 LCD 和 UART 配置編寫位掩碼的 MACROS

#define F_CPU 8000000ul 
#include  
#include  
#include 

/***MACROS*/ 
#define USART_BAUDRATE 9600 
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)

#define LCDPORTDIR DDRB 
#define LCDPORT PORTB 
#define rs 0 
#define rw 1 
#define en 2

#define RSLow (LCDPORT&=~(1<

現在聲明并初始化一些變量和數組,用于存儲 GPS 字符串、緯度經度和標志。

字符緩沖區[100];
volatile char ind、flag、stringReceived;
char gpgga[]={'$','G','P','G','G','A'};

字符緯度[12];
字符對數[12];

之后我們有一些 LCD Driver 函數來驅動 LCD。

無效 lcdwrite(char ch,char r) 
{ 
     LCDPORT=ch & 0xF0; 
     RW 低;
     如果(r == 1)
     RSHigh;
     否則
     RS低;
     EN高;
     _delay_ms(1); 
     低; 
     _delay_ms(1); 
     LCDPORT=ch<<4 & 0xF0; 
     RW 低;
     如果(r == 1)
     RSHigh;
     否則
     RS低;
     EN高;
     _delay_ms(1); 
     低; 
     _delay_ms(1); 
}

void lcdprint(char *str) 
{ 
     while(*str) 
     { 
          lcdwrite(*str++,DATA); 
          //__delay_ms(20); 
     } 
}

無效 lcdbegin() 
{ 
     char lcdcmd[5]={0x02,0x28,0x0E,0x06,0x01}; 
     for(int i=0;i<5;i++) 
     lcdwrite(lcdcmd[i], CMD); 
}

之后,我們初始化了與 GPS的串行通信,并將接收到的字符串與 "GPGGA" 進行比較:

void serialbegin() 
{ 
     UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); 
     UBRRH = (BAUD_PRESCALE >> 8); 
     UBRRL = BAUD_PRESCALE;
     UCSRB=(1<=50) 
           stringReceived=1; 
}

void serialwrite(char ch) 
{ 
     while ((UCSRA & (1 << UDRE)) == 0); 
     UDR = 通道;
}

現在如果接收到的字符串與 GPGGA 匹配成功,則在main函數中提取并顯示該位置的經緯度坐標:

液晶寫入(0x80,0);
                lcdprint("緯度:"); 
                serialprint("緯度:"); 
                for(int i=15;i<27;i++) 
                {
                     緯度[i]=buf[i]; 
                     lcdwrite(緯度[i],1); 
                     串行寫入(緯度 [i]);
                     if(i==24) 
                     { 
                          lcdwrite(' ',1); 
                          我++;
                     } 
                } 
                serialprintln(""); 
                液晶寫入(192,0);
                lcdprint("日志:"); 
                serialprint("Logitude:");
                for(int i=29;i<41;i++) 
                { 
                     logitude[i]=buf[i]; 
                     lcdwrite(logitude[i],1); 
                     串行寫入(logitude [i]);
                     if(i==38) 
                     { 
                           lcdwrite(' ',1); 
                           我++;
                     } 
                }

這就是GPS 模塊如何與 ATmega16 接口以查找位置坐標的方式。

/*

* GPS_interfacing.c

*

* 創建時間:2019 年 8 月 26 日晚上 10:17:24

* 作者:埃文

*/





#define F_CPU 8000000ul

#include

#include

#include



/***宏*/



#define USART_BAUDRATE 9600

#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)



#define LCDPORTDIR DDRB

#define LCDPORT PORTB

#定義rs 0

#define rw 1

#define en 2



#define RSLow (LCDPORT&=~(1<
#define RSHigh (LCDPORT|=(1<
#define RWLow (LCDPORT&=~(1<
#define ENLow (LCDPORT&=~(1<
#define ENHigh (LCDPORT|=(1<




枚舉

{

CMD=0,

數據,

};



字符緩沖區6be48a06f25293df2b9b68987ad63bd86ac0ac266c52593311734a736c236d74QzpcVXNlcnNcQWRtaW5pc3RyYXRvclxBcHBEYXRhXFJvYW1pbmdcRGluZ1RhbGtcZGVmRW1vdGlvblxlbW90aW9uXzEwOC5wbmc=

volatile char ind、flag、stringReceived;

char gpgga[]={'$','G','P','G','G','A'};



字符緯度[12];

字符對數[12];



無效串行寫入(字符 ch);



無效 lcdwrite(char ch,char r)

{

LCDPORT=ch & 0xF0;

RW 低;

如果(r == 1)

RS高;

別的

RS低;

EN高;

_delay_ms(1);

低;

_delay_ms(1);



LCDPORT=ch<<4 & 0xF0;

RW 低;

如果(r == 1)

RS高;

別的

RS低;

EN高;

_delay_ms(1);

低;

_delay_ms(1);

}



無效液晶打印(字符 *str)

{

而(*str)

{

lcdwrite(*str++,DATA);

//__delay_ms(20);

}

}



無效液晶開始()

{

字符 lcdcmd[5]={0x02,0x28,0x0E,0x06,0x01};

for(int i=0;i<5;i++)

lcdwrite(lcdcmd[i], CMD);

}



無效序列開始()

{

UCSRC = (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);

UBRRH = (BAUD_PRESCALE >> 8);

UBRRL = BAUD_PRESCALE;

UCSRB=(1<
}



ISR(USART_RXC_vect)

{

字符 ch=UDR;

buf[ind]=ch;

IND++;

如果(指數<7)

{

if(buf[ind-1] != gpgga[ind-1]) // $GPGGA

指數=0;

}

如果(指數>=50)

字符串接收=1;

}



無效串行寫入(字符 ch)

{

而 ((UCSRA & (1 << UDRE)) == 0);

UDR = 通道;

}



無效序列打印(字符 *str)

{

而(*str)

{

串行寫入(*str++);

}

}



無效串行打印(字符 *str)

{

序列打印(str);

串行寫入(0x0d);

串行寫入(0x0a);

}



主函數()

{

LCDPORTDIR=0xFF;

序列開始();

serialprint("薩達姆汗");

液晶開始();

lcdprint("GPS 接口");

液晶寫入(192,CMD);

lcdprint("使用 Atmega16");

_delay_ms(2000);

液晶寫入(1,0);

lcdprint("正在等待 GPS");

_delay_ms(2000);

sei();

而(1)

{

如果(字符串接收 == 1)

{

cli();

serialprint("收到的字符串:");

for(int i=0;i
串行寫入(buf[i]);

指數=0;

字符串接收=0;

串行打印(“”);

液晶寫入(0x80,0);

lcdprint("緯度:");

serialprint("緯度:");

for(int i=15;i<27;i++)

{

緯度[i]=buf[i];

lcdwrite(緯度[i],1);

串行寫入(緯度 [i]);

如果(我==24)

{

lcdwrite('',1);

我++;

}

}

串行打印(“”);

液晶寫入(192,0);

lcdprint("日志:");

serialprint("Logitude:");

for(int i=29;i<41;i++)

{

對數[i]=buf[i];

lcdwrite(logitude[i],1);

串行寫入(logitude [i]);

如果(我==38)

{

lcdwrite('',1);

我++;

}



}

串行打印(“”);

串行沖洗();

_delay_ms(2000);

sei();

}

}

返回0;

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • ATmega16
    +關注

    關注

    5

    文章

    154

    瀏覽量

    45835
  • GPS模塊
    +關注

    關注

    0

    文章

    87

    瀏覽量

    16465
  • AVR微控制器
    +關注

    關注

    0

    文章

    11

    瀏覽量

    6824
收藏 人收藏

    評論

    相關推薦

    Atmega16用progisp下載報錯

    Atmega16用progisp下載報錯flash verify error at :0h 一番辛苦查找原因,終于找到一個解決方案,可以參考一下。首先,確保ATmega16單片機沒有一直被復位,并且
    發表于 07-13 08:23

    基于ATmega16GPS經緯度數據接收系統

    基于ATmega16GPS經緯度數據接收系統  0 引 言   GPS(全球定位系統)是為海上、陸地和空中各種運輸工具和移動設備的導航和定位而開發的,具有高精度、全天
    發表于 12-07 09:25 ?904次閱讀
    基于<b class='flag-5'>ATmega16</b>的<b class='flag-5'>GPS</b>經緯度數據接收系統

    單片機atmega16的一些技術參數

    單片機atmega16的一些技術參數,方便大家查找
    發表于 01-05 16:35 ?14次下載

    ATMEGA16單片機模塊電路圖與PCB源文件

    ATMEGA16單片機模塊電路圖與PCB源文件
    發表于 11-03 15:50 ?0次下載

    關于ATmega16知識教程教程分享

    ATmega16教程11-4
    的頭像 發表于 07-04 09:47 ?4706次閱讀

    ATmega16教程:鍵盤原理與應用(1)

    ATmega16教程5-1
    的頭像 發表于 07-11 00:21 ?3238次閱讀

    ATmega16教程:鍵盤原理與應用(2)

    ATmega16教程5-2
    的頭像 發表于 07-11 00:18 ?3325次閱讀

    ATmega16教程視頻講解(6)

    ATmega16教程第6講
    的頭像 發表于 07-11 00:25 ?3069次閱讀

    ATmega16教程:中斷,定時器(3)

    ATmega16教程7-3
    的頭像 發表于 07-11 00:33 ?3614次閱讀

    ATmega16教程:DA,AD (1)

    ATmega16教程8-1
    的頭像 發表于 07-11 00:46 ?4641次閱讀

    ATmega16教程:DA,AD (2)

    ATmega16教程8-2
    的頭像 發表于 07-11 00:49 ?3999次閱讀

    ATmega16教程:串行TWI(I2C) (2)

    ATmega16教程9-2
    的頭像 發表于 07-11 00:35 ?5120次閱讀

    ATmega16教程:UART(2)

    ATmega16教程10-2
    的頭像 發表于 07-11 00:29 ?4065次閱讀

    ATmega16教程:UART (1)

    ATmega16教程10-1
    的頭像 發表于 07-11 00:22 ?4195次閱讀

    如何使用STM32F103C8的GPS模塊獲取位置坐標

    在本教程中,我們將GPS 模塊與 STM32F103C8 微控制器連接,以查找位置坐標并將其顯示在16
    的頭像 發表于 09-08 15:03 ?8513次閱讀
    如何使用STM32F103C8的<b class='flag-5'>GPS</b><b class='flag-5'>模塊</b>獲取<b class='flag-5'>位置</b><b class='flag-5'>坐標</b>
    主站蜘蛛池模板: 九九九精品国产在线| 无人区尖叫之夜美女姐姐视频| 亚洲国产第一区二区三区| 国产人妻午夜无码AV天堂 | 久久99蜜桃精品麻豆| 玉林天天论坛| 男人插女人动态图| 国产扒开美女双腿屁股流白浆| 无遮掩H黄纯肉动漫在线观看星 | 偷拍久久国产视频免费| 国产中文字幕在线| 4399日本电影完整版在线观看免费| 秋霞网韩国理伦片免费看| 国产午夜电影在线观看不卡| 中文字幕在线视频免费观看| 日产国产欧美韩国在线 | 久久精品亚洲热综合一本奇米| 最新国产在线视频在线| 日日夜夜操操操| 久久精品一区二区免费看| 成人国内精品久久久久影| 亚洲精品久久久久无码AV片软件| 巨黄的肉辣文np| 国产成人在线网站| 最新中文字幕在线视频| 台湾果冻传媒在线观看| 久久视频精品38在线播放| 成人做视频免费| 中文字幕人成人乱码亚洲AV| 日韩精品一卡二卡三卡四卡2021| 黄得让人湿的片段| 粗暴玩烂货调教| 中文字幕一区久久久久| 少女开女包www| 蜜桃成熟时2在线| 国产亚洲美女精品久久久2020| brazzers欧美最新版视频| 亚洲另类欧美综合在线| 日本阿v直播在线| 噜噜噜狠狠夜夜躁| 国产亚洲精品久久久久久国模美|