基于51單片機(jī)的定位系統(tǒng)設(shè)計(jì)


1、基于51單片機(jī)GPS定位系統(tǒng)設(shè)計(jì)
基于51單片機(jī)GPS定位系統(tǒng)設(shè)計(jì)
GPS(Global Positioning System,全球定位系統(tǒng)),是一個(gè)由24顆衛(wèi)星組成的衛(wèi)星系統(tǒng)??梢员WC在任意時(shí)刻,任何地點(diǎn)都同時(shí)檢測到4顆衛(wèi)星,以保證衛(wèi)星可以采集到該觀測點(diǎn)的經(jīng)緯度和高度,從而實(shí)現(xiàn)導(dǎo)航、定位、授時(shí)等功能。現(xiàn)在在很多領(lǐng)域都有用到GPS技術(shù),比如可以用來引導(dǎo)汽車、飛機(jī)、船舶以及個(gè)人準(zhǔn)確的到達(dá)目的地,本文就是以保證個(gè)人的安全、準(zhǔn)確出行研究的GPS定位系統(tǒng),設(shè)計(jì)制作一個(gè)單片機(jī)系統(tǒng),單片機(jī)系統(tǒng)由電源電路、晶振電路、復(fù)位電路、LCD驅(qū)動(dòng)電路等組成,此系統(tǒng)用以讀取GPS模塊的數(shù)據(jù)并處理,最后顯示在LCD12864上面,用戶可以實(shí)時(shí)通過讀取12864顯示的內(nèi)容了解自己的位置以及當(dāng)前時(shí)間,同時(shí)由于用到有單片機(jī),以后還可以在上面加很多想要的功能,是一個(gè)可擴(kuò)展、很具有使用價(jià)值的系統(tǒng)。
1、 系統(tǒng)方案選擇和論證
1.1、引言
GPS 是英文Global Positioning System(全球定位系統(tǒng))的簡稱,而其中文簡稱為“球位系”。GPS起始于1958年美國軍方的一個(gè)項(xiàng)目,1964年投入使用。是20世紀(jì)70年代由美國陸??杖娐?lián)合研制的新一代空間衛(wèi)星導(dǎo)航定位系統(tǒng) 。其主要目的是為陸、海、空三大領(lǐng)域提供實(shí)時(shí)、 全天候和全球性的導(dǎo)航服務(wù),并用于情報(bào)收集、核爆監(jiān)測和應(yīng)急通訊等一些軍事目的。經(jīng)過20余年的研究實(shí)驗(yàn),耗資300億美元,到1994年,全球覆蓋率高達(dá)98%的24顆GPS衛(wèi)星星座己布設(shè)完成。隨著人民生活水平的發(fā)展,GPS技術(shù)被越來越多的應(yīng)用在個(gè)人PDA、個(gè)人車載終端、手機(jī)等設(shè)備上。人們通過GPS,能準(zhǔn)確知道自己所在的位置,從實(shí)現(xiàn)到導(dǎo)航、確定旅游路線、獲取地理信息等功能。本文介紹的GPS導(dǎo)航系統(tǒng),以單片機(jī)作為主控芯片,配以GPS、12864顯示屏,構(gòu)建了一個(gè)GPS信息顯示的系統(tǒng)。本系統(tǒng)在一定程度上推動(dòng)了GPS導(dǎo)航設(shè)備研究的發(fā)展。
1.2 方案說明
1.2.1、 總體設(shè)計(jì)方案
個(gè)人手持設(shè)備要求是功耗要足夠低、操作簡單、界面美觀、方便觀看。
為完成相應(yīng)功能,本設(shè)計(jì)提出的方案如圖1.1所示。系統(tǒng)包括以下幾個(gè)基本模塊:電源模塊、主控模塊、顯示模塊、GPS定位模塊。GPS模塊負(fù)責(zé)接收衛(wèi)星信息,單片機(jī)模塊負(fù)責(zé)讀取GPS模塊數(shù)據(jù)并處理,顯示模塊主要負(fù)責(zé)將GPS模塊接收到的數(shù)據(jù)顯示出來供用戶隨時(shí)觀看。
1.2.2、 系統(tǒng)功能說明
(1).定位功能
GPS通過接收衛(wèi)星信號(hào),可以準(zhǔn)確地定出其所在的位置,位置誤差小于10米。利用GPS,在12864上面顯示當(dāng)前位置。
(2).查詢時(shí)間功能
GPS還可以接收衛(wèi)星發(fā)下來的時(shí)間信息,利用單片機(jī)控制12864顯示出當(dāng)前時(shí)間,用戶可以很方便的了解時(shí)間。
1.3、 部分模塊設(shè)計(jì)方案
1.3.1、 控制模塊設(shè)計(jì)方案
單片機(jī)最小系統(tǒng)由晶振電路、復(fù)位電路、電源電路等組成
1.3.2、 顯示電路設(shè)計(jì)方案
本項(xiàng)目選用LCD12864作為顯示屏,電路簡單,選用并行通信方式
1.3.3、 GPS模塊選擇方案
方案一:采用串口接口GPS模塊。優(yōu)點(diǎn):便于驅(qū)動(dòng),程序簡單,價(jià)格便宜。缺點(diǎn):體積較大。
方案二:采用usb接口GPS模塊。優(yōu)點(diǎn):便于攜帶。缺點(diǎn):驅(qū)動(dòng)相對(duì)較難、價(jià)格相對(duì)較貴。
1.4、總體方案確定
1.4.1、系統(tǒng)硬件方案
表1.1系統(tǒng)硬件方案
2、 系統(tǒng)的硬件設(shè)計(jì)與實(shí)現(xiàn)
系統(tǒng)硬件特性如下圖:
該系統(tǒng)是用手工做的腐蝕板,成本很低,性能穩(wěn)定,同時(shí)用LCD12864作為顯示屏顯示位置及時(shí)間等信息,顯示的容量大數(shù)據(jù)量小,一個(gè)頁面可以顯示8*4個(gè)漢字或16*4個(gè)字符。
2.1、 主控芯片電路
主控芯片為AT89S52,該芯片性能穩(wěn)定、工藝精良。
圖2.1為主控芯片電路,AT89S52是一種低功耗、高性能CMOS 8位微控制器,具有8K 在系統(tǒng)可編程Flash 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52在眾多嵌入式控制應(yīng)用系統(tǒng)中得到廣泛應(yīng)用,這里采用AT89S52單片機(jī)作為控制芯片,實(shí)現(xiàn)了成本低,開發(fā)簡單等特點(diǎn)。
2.2、 復(fù)位電路
圖2.2為系統(tǒng)復(fù)位電路,為確保系統(tǒng)中電路穩(wěn)定可靠工作,復(fù)位電路是必不可少的一部分,復(fù)位電路的第一功能是上電復(fù)位。一般單片機(jī)電路正常工作需要供電電源為5V±5%,即4.75~5.25V。由于單片機(jī)電路是時(shí)序數(shù)字電路,它需要穩(wěn)定的時(shí)鐘信號(hào),因此在電源上電時(shí),只有當(dāng)VCC超過4.75V低于5.25V以及晶體振蕩器穩(wěn)定工作時(shí),復(fù)位信號(hào)才被撤除,單片機(jī)電路開始正常工作。這種復(fù)位電路的工作原理是:VCC上電時(shí),C1充電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位;幾個(gè)毫秒后,C1充滿,10K電阻上電流降為0,電壓也為0,使得單片機(jī)進(jìn)入工作狀態(tài)。工作期間,按下S1,C1放電。S1松手,C1又充電,在10K電阻上出現(xiàn)電壓,使得單片機(jī)復(fù)位。幾個(gè)毫秒后,單片機(jī)進(jìn)入工作狀態(tài)
2.3、 晶振電路
圖2.3為震蕩電路,每個(gè)單片機(jī)系統(tǒng)里都有晶振,全稱叫晶體震蕩器,在單片機(jī)系統(tǒng)里晶振的作用非常大,它結(jié)合單片機(jī)內(nèi)部的電路,產(chǎn)生單片機(jī)所必須的時(shí)鐘頻率,單片機(jī)的一切指令的執(zhí)行都是建立在這個(gè)基礎(chǔ)上的,晶振的提供的時(shí)鐘頻率越高,那單片機(jī)的運(yùn)行速度也就越快,如圖,在晶振兩邊添加兩個(gè)30pF(27--33pF)電容,使震蕩更加穩(wěn)定。震蕩電路接在AT89S52單片機(jī)的18、19兩個(gè)引腳上,給單片機(jī)提供震蕩信號(hào)
2.4、 電源電路
圖2.3為電源電路,用的是六腳開關(guān)控制電源通斷,同時(shí)控制了電源的正負(fù)極,安全方便,同時(shí)有一個(gè)電源指示燈,上面加有一個(gè)1K的限流電阻。該電路實(shí)現(xiàn)了對(duì)系統(tǒng)的電源控制,同時(shí)顯示了電路的狀態(tài),方便大家操作。
2.5、 顯示電路
圖2.4為12864顯示電路,該12864的數(shù)據(jù)口用的AT89S52的P0口,由于P0口內(nèi)部沒有加上拉電阻,需外接10K的上拉電阻,才能保證數(shù)據(jù)的正常傳輸。12864的3腳為背光調(diào)節(jié)的引腳,當(dāng)3腳的電壓不同時(shí)背光的亮度就不同,這里設(shè)計(jì)了一個(gè)電路來調(diào)節(jié)3腳的電壓,就是利用一個(gè)滑動(dòng)變阻器一個(gè)腳接電源電壓,一個(gè)腳接地,調(diào)節(jié)滑動(dòng)變阻器就可以改變中間那個(gè)引腳的電壓,我們只需將中間那個(gè)引腳和12864的3腳相連接就行了。
2.7 電路圖的打印
由于采用的是曝光顯影法制作電路板,故打印電路圖前,要先對(duì)電路圖進(jìn)行打印設(shè)置。
由于我們是制作單面板,多余的線路可用跳線連接。打印前,先進(jìn)行頁面設(shè)置,具體設(shè)置參數(shù)如圖2.6.1所示,在Mechanical層放置填充方塊,覆蓋整個(gè)電路圖。然后進(jìn)行打印設(shè)置:
點(diǎn)擊文件,打印設(shè)置,然后點(diǎn)擊高級(jí)選項(xiàng),在高級(jí)選項(xiàng)中選擇將要打印的層,本系統(tǒng)中需打印的層如圖2.6.2所示:
然后點(diǎn)擊左下角的特性設(shè)置各層的打印顏色。Bottom Layer 設(shè)置為白色,Mechanical層設(shè)置為黑色,Multi-Layer設(shè)置成白色。設(shè)置好后,將打印比例設(shè)置為1.0即可進(jìn)行打印,打印時(shí)要注意用硫酸紙或菲林紙,我們是將線布在底層,打印可以選擇鏡像打印,就是將圖2.6.2中Mirror這個(gè)選項(xiàng)勾上,到時(shí)候正面曝光,也可以將就按照?qǐng)D2.6.2設(shè)置,曝光時(shí)就背面曝光。
3、 系統(tǒng)的軟件設(shè)計(jì)
3.1、系統(tǒng)概述
本系統(tǒng)的所有程序均采用C語言編寫,開發(fā)工具為keil,開發(fā)環(huán)境為windows。應(yīng)用軟件開發(fā)的模塊化思想來開發(fā)這個(gè)項(xiàng)目,程序定義了許多子程序來分別管理各個(gè)模塊,通過對(duì)各個(gè)子程序的操作,來構(gòu)建整個(gè)程序框架。各個(gè)子程序即可單獨(dú)提取出作為獨(dú)立的一個(gè)有機(jī)代碼,大大增加了項(xiàng)目的健壯性及可移植性。
3.2、軟件詳細(xì)設(shè)
3.2.1 頭文件
本系統(tǒng)寫了很多頭文件,里面包含了很多子模塊的信息,各個(gè)子模塊相互分開,加大了項(xiàng)目的可移植性,如在其它的項(xiàng)目中要使用這些子模塊,只需要將C文件和H文件復(fù)制過去就行了。包含的頭文件如下:
#include
#include
#include
#include "GPS.h"
#include "LCD.h"
#include "display.h"
3.2.2、系統(tǒng)IO定義
整個(gè)系統(tǒng)用到了很多獨(dú)立的IO,在控制12864的讀寫中要定義幾個(gè)IO,在控制GPS模塊的數(shù)據(jù)傳輸中都要用到單片機(jī)IO,具體定義IO情況如下:
3.2.3、主函數(shù)
主函數(shù),項(xiàng)目入口,用于啟動(dòng)其他模塊,并在屏幕上顯示主界面窗口,主函數(shù)具體如下:
/****************************************
主函數(shù)
/****************************************/
void main(void)
{
uchar error_num = 0;
Uart_Init(); //初始化串口
Lcd_Init(); //初始化LCD
GPS_Init(); //初始化GPS
rev_stop=0;
REV_NO;
while(1)
{
if (rev_stop) //如果接收完一行
{
TR0 = 1; //開啟定時(shí)器
REV_YES;
if (change_page % 2 == 1) //換頁
{
if (GPS_GGA_Parse(rev_buf, &GPS)) //解析GPGGA
{
GGA_YES;
GPS_DisplayTwo(); //顯示第二頁信息
error_num = 0;
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
else
{
error_num++;
if (error_num >= 20) //如果數(shù)據(jù)無效超過20次
{
GGA_NO;
error_num = 20;
GPS_Init(); //返回初始化
}
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
}
else
{
if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC
{
RMC_YES;
GPS_DisplayOne(); //顯示GPS第一頁信息
error_num = 0;
gps_flag = 0;
rev_stop = 0;
led1 = 1;
}
else
{
error_num++;
if (error_num >= 20) //如果數(shù)據(jù)無效超過20次
{
RMC_NO;
error_num = 20;
GPS_Init(); //返回初始化
}
gps_flag = 0;
rev_stop = 0;
REV_NO;
}
}
}
}
}
由于GPS與單片機(jī)通信是選用的串口,在程序中首先初始化了串口,在初始化了LCD12864,然后初始化GPS,做好了準(zhǔn)備工作后,就一直等待從GPS接收數(shù)據(jù)。
3.2.4、延時(shí)子函數(shù)
在整個(gè)系統(tǒng)中都要用到延時(shí)函數(shù),這個(gè)時(shí)間的取定決定這整個(gè)系統(tǒng)的工作效率,如果延時(shí)時(shí)間短了就會(huì)造成LCD12864顯示不正常,還有就是GPS數(shù)據(jù)傳輸不成功;但是延時(shí)時(shí)間過長又會(huì)導(dǎo)致系統(tǒng)的效率低下,所以一個(gè)準(zhǔn)確的延時(shí)函數(shù)是很重要的,具體的延時(shí)函數(shù)如下:
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}
void timer0(void) interrupt 1
{
static uchar count = 0;
TH0 = 0x3c;
TL0 = 0xb0;
count++;
if (count == 200) //2*5秒鐘
{
count = 0;
change_page++; //換頁
if (change_page == 10)
change_page = 0;
}
}
上面是一個(gè)延時(shí)1ms(晶振為11.0592M)的函數(shù)下面是一個(gè)中斷函數(shù),用于12864顯示用的。
3.2.5、12864子模塊
12864的顯示函數(shù),先要寫地址,然后在寫數(shù)據(jù),在這個(gè)過程前還要檢測12864是否忙,就是是否在接收上次的數(shù)據(jù),具體的函數(shù)如下:
#ifndef __LCD_H_
#define __LCD_H_
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define LCD_data P2 //數(shù)據(jù)口
sbit LCD_RS = P0^7; //寄存器選擇輸入
sbit LCD_RW = P0^6; //液晶讀/寫控制
sbit LCD_EN = P0^5; //液晶使能控制
sbit LCD_PSB = P0^4; //串/并方式控制
#define DelayNOP(); {_nop_();_nop_();_nop_();_nop_();};
void clr_screen();
void delay(uint z);
void Lcd_WriteCmd(uchar cmd);
void Lcd_WriteDat(uchar dat);
void Lcd_Init(void);
void Lcd_SetPos(uchar X,uchar Y);
void Lcd_DispLine(uchar line, uchar pos, uchar *str);
#endif //__LCD_H_
#include "LCD.h"
void delay(uint z)
{
uint x, y;
for (x = z; x > 0; x--)
for(y = 110; y > 0; y--);
}
void clr_screen()
{
Lcd_WriteCmd(0x34); //擴(kuò)充指令操作
delay(5);
Lcd_WriteCmd(0x30); //基本指令操作
delay(5);
Lcd_WriteCmd(0x01); //清屏
delay(5);
}
static bit Lcd_Busy(void)
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
DelayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
void Lcd_WriteCmd(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
LCD_data = cmd;
DelayNOP();
LCD_EN = 1;
DelayNOP();
LCD_EN = 0;
}
void Lcd_WriteDat(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
LCD_data = dat;
DelayNOP();
LCD_EN = 1;
DelayNOP();
LCD_EN = 0;
}
void Lcd_Init(void)
{
LCD_PSB = 1; //并口方式
Lcd_WriteCmd(0x34); //擴(kuò)充指令操作
delay(5);
Lcd_WriteCmd(0x30); //基本指令操作
delay(5);
Lcd_WriteCmd(0x0C); //顯示開,關(guān)光標(biāo)
delay(5);
Lcd_WriteCmd(0x01); //清除LCD的顯示內(nèi)容
delay(5);
}
void Lcd_SetPos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
Lcd_WriteCmd(pos); //顯示地址
}
void Lcd_DispLine(uchar line, uchar pos, uchar *str)
{
int i = 0;
Lcd_SetPos(line, pos);
while (str[i] != 'XX性欧美肥妇精品久久久久久,51精品国自产在线,国产欧美日韩,日韩中文字幕