基于單片機的GPS時間校準設計_第1頁
基于單片機的GPS時間校準設計_第2頁
基于單片機的GPS時間校準設計_第3頁
基于單片機的GPS時間校準設計_第4頁
基于單片機的GPS時間校準設計_第5頁
已閱讀5頁,還剩130頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

基于單片機的GPS時間校準設計[請輸入學校名稱][請輸入專業(yè)]基于單片機的GPS時間校準設計姓名:[請輸入姓名]學號:[請輸入學號]指導教師:[請輸入指導教師] Time\@"yyyy年M月d日"2016年9月23日TOC\o"1-3"\h\u7084摘要: 2719Abstract 46369第一章概述 5203251.1實時時鐘研究的背景及意義 5287031.2論文主要研究內(nèi)容 5301591.2.1系統(tǒng)設計實現(xiàn)的目標 5202401.2.2系統(tǒng)的總體設計 524203第二章硬件電路設計 740512.1單片機控制部分 721812.2DS1302時鐘芯片部分 10137602.3LCD1602液晶顯示部分 12290042.5.21602引腳功能說明 1264942.5.31602LCD的指令說明及時序 13255282.5.41602LCD的RAM地址映射及標準字庫表 1412562.5.51602LCD的一般初始化(復位)過程 1622592.4.61602LCD的電路連接 16199852.4GPS模塊VK2828U7G5LF部分 1713579第三章軟件部分設計 2179193.1按鍵程序流程圖 2131735結束語 3028468致謝詞 3110032參考文獻 3230740附錄 3320752硬件原理圖與PCB圖 33146源程序: 35

摘要:本文介紹了基于STC89C52單片機的多功能電子萬年歷的硬件結構和軟硬件設計方法。本設計由數(shù)據(jù)顯示模塊、GPS模塊、時間處理模塊和按鍵輸入模塊四個模塊組成。系統(tǒng)以STC89C52單片機為控制器,以DS1302時鐘日歷芯片DS1302記錄日歷和時間,它可以對年、月、日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能。GPS模塊采用了VK2828U7G5LF,萬年歷采用直觀的數(shù)字顯示,數(shù)據(jù)顯示采用1602液晶顯示模塊,可以在LCD1602上同時顯示年、月、日、周日、時、分、秒,和GPS模塊的工作模式。此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,具有廣闊的市場前景。關鍵字:單片機,時鐘芯片,溫度傳感器,1602液晶顯示器

Abstract

ThispaperintroducesthehardwarestructureoftheelectroniccalendarbasedonSTC89C52single-chipmicrocomputerandthehardwareandsoftwaredesignmethod.ThisdesignbythedSTCadisplaymodule,GPSmodule,timeprocessingmoduleandkeyinputmoduleoffourmodules.SystemwithSTC89C52single-chipmicrocomputerasthecontroller,withDS1302clockchipDS1302calendarcalendarandtime,itcanbeforyears,months,days,hours,minutes,secondstime,alsohasaleapyearcompensSTCionandother.Keywords:singlechip,theclockchip,temperSTCuresensor,1602liquidcrystaldisplay

第一章概述1.1實時時鐘研究的背景及意義在現(xiàn)實我們生活中每個人都可能有自己的時鐘,光陰在永不停息的流逝,有了時鐘人們就能隨著時間有計劃的過著每一天。然而現(xiàn)在絕大部分的時鐘有的需要不斷地跟換電池,有些時鐘需要外接電源,如果一旦電池沒電或者外接電源無法供電,時鐘就會停止計時了。而美國DALLAS公司的新型時鐘日歷芯片DS1302就能解決這一問題。該器件能提供實時時鐘(RTC)/日歷、定時鬧鐘。少于31天的月份,月末日期可自動調(diào)整,其中包括閏年補償。該器件還可以工作于24小時貨代/PM指示的12小時格式。一個精密的溫度補償電路用來監(jiān)視Vcc的狀態(tài)。還有就是一旦時間數(shù)據(jù)出現(xiàn)錯誤,我們總是手動的進行調(diào)整時間數(shù)據(jù),比較麻煩,那么,一款不用手動調(diào)整,自動校準的實時時鐘勢必在行。本時鐘還具有環(huán)保、走時無噪音、低功耗等非實時時鐘不具有的功能。該實時時鐘不但可以作為家用,而且更可以在公共場合使用,如車站、碼頭、商場等場所。1.2論文主要研究內(nèi)容1.2.1系統(tǒng)設計實現(xiàn)的目標本文是以實時時鐘芯片DS1302和STC89C52單片機為主要研究對象,著重進行51單片機控制系統(tǒng)的設計研究和如何讀取DS1302內(nèi)部時鐘信息的研究。以及運用GPS模塊進行時間數(shù)據(jù)與衛(wèi)星的自動同步。主要內(nèi)容包括:1.年月日星期時分秒顯示;2.手動年月日星期時分秒調(diào)整;3.自動年月日星期時分秒調(diào)整;1.2.2系統(tǒng)的總體設計采用STC89C52作為主控單片機,時鐘模塊選用DS1302作為時鐘芯片,溫度模塊選用DS18B20作為溫度傳感器,顯示模塊選用LCD1602,設置部分選用按鍵電路。STC89C52與MCS-51單片機產(chǎn)品兼容、8K字節(jié)在系統(tǒng)可編程Flash存儲器、1000次擦寫周期、全靜態(tài)操作:0Hz~33Hz、三級加密程序存儲器、32個可編程I/O口線、三個16位定時器/計數(shù)器八個中斷源、全雙工UART串行通道、低功耗空閑和掉電模式、掉電后中斷可喚醒、看門狗定時器、雙數(shù)據(jù)指針、掉電標識符。DS1302實時時鐘芯片功能豐富,可以用來直接代替IBMPC上的時鐘日歷芯片DS12887,同時,它的管腳也和MC146818B、DS12887相兼容。由于DS1302能夠自動產(chǎn)生世紀、年、月、日、時、分、秒等時間信息,其內(nèi)部又增加了世紀寄存器,從而利用硬件電路解決子“千年”問題;DS1302中自帶有鋰電池,外部掉電時,其內(nèi)部時間信息還能夠保持10年之久;對于一天內(nèi)的時間記錄,有12小時制和24小時制兩種模式。用戶還可對DS1302進行編程以實現(xiàn)多種方波輸出,并可對其內(nèi)部的三路中斷通過軟件進行屏蔽。GPS模塊就是集成了RF射頻芯片、基帶芯片和核心CPU,并加上相關外圍電路而組成的一個集成電路。目前GPS模塊的GPS芯片大部分還是采用全球市占率第一的SiRFIII系列為主。由于GPS模塊采用的芯片組不一樣,性能和價格也有區(qū)別,采用SIRF三代芯片組的GPS模塊性能最優(yōu),價格也要比采用MTK或者MSTAR等GPS芯片組的貴很多。

第二章硬件電路設計本次設計主要有單片機主控部分、DS1302時鐘芯片部分、LCD1602液晶顯示部分、GPS模塊、按鍵輸入部分。整體硬件框圖如下:本系統(tǒng)以STC89C52單片機為核心,本系統(tǒng)選用11.0592MHZ的晶振,,使得單片機有合理的運行速度。起振電容30pF對振蕩器的頻率高低、振蕩器的穩(wěn)定性和起振的快速性影響較合適,復位電路為按鍵高電平復位。下面簡單的介紹一下單片機控制部分、DS1302部分、LCD1602部分以及GPS模塊。2.1單片機控制部分STC89C52是一個低功耗,高性能CMOS8位單片機,片內(nèi)含8kBytesISP(In-systemprogrammable)的可反復擦寫1000次的Flash只讀程序存儲器,器件采用STC公司的高密度、非易失性存儲技術制造,兼容標準MCS-51指令系統(tǒng)及80C51引腳結構,芯片內(nèi)集成了通用8位中央處理器和ISPFlash存儲單元,功能強大的微型計算機的STC89C52可為許多嵌入式控制應用系統(tǒng)提供高性價比的解決方案。STC89C52具有如下特點:40個引腳,8kBytesFlash片內(nèi)程序存儲器,256bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套中斷,2個16位可編程定時計數(shù)器,2個全雙工串行通信口,片內(nèi)時鐘振蕩器。另外,STC89C52可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、串口、中斷繼續(xù)工作。掉電保護方式下,RAM內(nèi)容被保存,振蕩器被凍結,單片機一切工作停止,直到下一個中斷或硬件復位為止。STC89C52共有四個8位的并行I/O口:P0、P1、P2、P3端口,對應的引腳分別是P0.0~P0.7,P1.0~P1.7,P2.0~P2.7,P3.0~P3.7,共32根I/O線。每根線可以單獨用作輸入或輸出。P0口:P0口是一個8位漏極開路的雙向I/O口。作為輸出口,每位能驅動8個TTL邏輯電平。對P0端口寫“1”時,引腳用作高阻抗輸入。當訪問外部程序和數(shù)據(jù)存儲器時,P0口也被作為低8位地址/數(shù)據(jù)復用。在這種模式下,P0不具有內(nèi)部上拉電阻。在flash編程時,P0口也用來接收指令字節(jié);在程序校驗時,輸出指令字節(jié)。程序校驗時,需要外部上拉電阻。P1口:P1口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,p1輸出緩沖器能驅動4個TTL邏輯電平。對P1端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。此外,P1.0和P1.1分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和定時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX)。在flash編程和校驗時,P1口接收低8位地址字節(jié)。此外,P1.0和P1.1分別作定時器/計數(shù)器2的外部計數(shù)輸入(P1.0/T2)和定時器/計數(shù)器2的觸發(fā)輸入(P1.1/T2EX)。P2口:P2口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,P2輸出緩沖器能驅動4個TTL邏輯電平。對P2端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。作為輸入使用時,被外部拉低的引腳由于內(nèi)部電阻的原因,將輸出電流(IIL)。在訪問外部程序存儲器或用16位地址讀取外部數(shù)據(jù)存儲器時,P2口送出高八位地址。在這種應用中,P2口使用很強的內(nèi)部上拉發(fā)送1。在使用8位地址訪問外部數(shù)據(jù)存儲器時,P2口輸出P2鎖存器的內(nèi)容。在flash編程和校驗時,P2口也接收高8位地址字節(jié)和一些控制信號。P3口:P3口是一個具有內(nèi)部上拉電阻的8位雙向I/O口,p3輸出緩沖器能驅動4個TTL邏輯電平。對P3端口寫“1”時,內(nèi)部上拉電阻把端口拉高,此時可以作為輸入口使用。P3口亦作為STC89C52特殊功能使用,在flash編程和校驗時,P3口也接收一些控制信號。單片機的引腳圖如圖3.3所示。圖3.3STC89C52單片機引腳圖單片機最小系統(tǒng),是指用最少的元件與單片機組成的可以工作的系統(tǒng)。對52單片機來說,最小系統(tǒng)一般應該包括:單片機、晶振電路、復位電路。單片機接口電路主要用來連接計算機和其他外部設備,各功能模塊及原理如下:復位電路:單片機最小系統(tǒng)復位電路的極性電容C3的大小直接影響單片機的復位時間,一般采用10-30μF,51單片機最小系統(tǒng)容值越大需要的復位時間越短。單片機工作之后,只要在RST引線上加載10ms以上的高電平,單片機就能有效地復位。CS-51單片機通常采用自動復位和按鍵復位兩種方式。這里采用按鍵復位和上電復位兩種電路結合。晶振電路:典型的晶振取11.0592MHZ或者12MHZ,晶振越大,則單片機的處理速度越快,考慮到本次設計的通信問題,采用了11.0592MHZ晶振。單片機的最小起振電容C1,C2一般采用15-33pF,并且電容離晶振越近越好。單片機最小系統(tǒng)的設計電路如圖3.4所示。圖3.4單片機最小系統(tǒng)的設計電路2.2DS1302時鐘芯片部分DS1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),。SCLK始終是輸入端。DS1302的引腳圖如圖5.4所示:圖5.4DS1302引腳圖調(diào)試中問題說明:DS1302與微處理器進行數(shù)據(jù)交換時,首先由微處理器向電路發(fā)送命令字節(jié),命令字節(jié)最高位MSB(D7)必須為邏輯1,如果D7=0,則禁止寫DS1302,即寫保護;D6=0,指定時鐘數(shù)據(jù),D6=1,指定RAM數(shù)據(jù);D5~D1指定輸入或輸出的特定寄存器;最低位LSB(D0)為邏輯0,指定寫操作(輸入),D0=1,指定讀操作(輸出)。在DS1302的時鐘日歷或RAM進行數(shù)據(jù)傳送時,DS1302必須首先發(fā)送命令字節(jié)。若進行單字節(jié)傳送,8位命令字節(jié)傳送結束之后,在下2個SCLK周期的上升沿輸入數(shù)據(jù)字節(jié),或在下8個SCLK周期的下降沿輸出數(shù)據(jù)字節(jié)。DS1302與RAM相關的寄存器分為兩類:一類是單個RAM單元,共31個,每個單元組態(tài)為一個8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;再一類為突發(fā)方式下的RAM寄存器,在此方式下可一次性讀、寫所有的RAM的31個字節(jié)。要特別說明的是備用電源B1,可以用電池或者超級電容器(0.1F以上)。雖然DS1302在主電源掉電后的耗電很小,但是,如果要長時間保證時鐘正常,最好選用小型充電電池??梢杂美鲜诫娔X主板上的3.6V充電電池。如果斷電時間較短(幾小時或幾天)時,就可以用漏電較小的普通電解電容器代替。100μF就可以保證1小時的正常走時。DS1302在第一次加電后,必須進行初始化操作。初始化后就可以按正常方法調(diào)整時間。原理圖如圖3-9所示:2.3LCD1602液晶顯示部分字符型液晶顯示模塊是一種專門用于顯示字母、數(shù)字、符號等點陣式LCD,本設計采用16列*2行的字符型LCD1602帶背光的液晶顯示屏。1602LCD主要技術參數(shù):顯示容量:16×2個字符芯片工作電壓:4.5—5.5V工作電流:2.0mA(5.0V)模塊最佳工作電壓:5.0V字符尺寸:2.95×4.35(W×H)mm2.3.21602引腳功能說明各引腳接口說明如表所示:表2-1編號符號引腳說明編號符號引腳說明1VSS電源地9D2數(shù)據(jù)2VDD電源正極10D3數(shù)據(jù)3VL液晶顯示偏壓11D4數(shù)據(jù)4RS數(shù)據(jù)/命令選擇12D5數(shù)據(jù)5R/W讀/寫選擇13D6數(shù)據(jù)6E使能信號14D7數(shù)據(jù)7D0數(shù)據(jù)15BLA背光源正極8D1數(shù)據(jù)16BLK背光源負極表2-1:引腳接口說明:第1腳:VSS為地電源。第2腳:VDD接5V正電源。第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15腳:背光源正極。第16腳:背光源負極。2.3.31602LCD的指令說明及時序1602液晶模塊內(nèi)部的控制器共有11條控制指令,如表2-2所示:表2-2序號指令RSR/WD7D6D5D4D3D2D1D01清顯示00000000012光標返回000000001*3置輸入模式00000001I/DS4顯示開/關控制0000001DCB5光標或字符移位000001S/CR/L**6置功能00001DLNF**7置字符發(fā)生存貯器地址0001字符發(fā)生存貯器地址8置數(shù)據(jù)存貯器地址001顯示數(shù)據(jù)存貯器地址9讀忙標志或地址01BF計數(shù)器地址10寫數(shù)到CGRAM或DDRAM)10要寫的數(shù)據(jù)內(nèi)容11從CGRAM或DDRAM讀數(shù)11讀出的數(shù)據(jù)內(nèi)容表2-2字符控制命令說明:1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。(說明:1為高電平、0為低電平)指令1:清顯示,指令碼01H,光標復位到地址00H位置。指令2:光標復位,光標返回到地址00H。指令3:光標和顯示模式設置I/D:光標移動方向,高電平右移,低電平左移S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。指令4:顯示開關控制。D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示C:控制光標的開與關,高電平表示有光標,低電平表示無光標B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設置命令DL:高電平時為4位總線,低電平時為8位總線N:低電平時為單行顯示,高電平時雙行顯示F:低電平時顯示5x7的點陣字符,高電平時顯示5x10的點陣字符。指令7:字符發(fā)生器RAM地址設置。指令8:DDRAM地址設置。指令9:讀忙信號和光標地址BF:為忙標志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙。指令10:寫數(shù)據(jù)。指令11:讀數(shù)據(jù)。芯片時序表如下:讀狀態(tài)輸入RS=L,R/W=H,E=H輸出D0—D7=狀態(tài)字寫指令輸入RS=L,R/W=L,D0—D7=指令碼,E=高脈沖輸出無讀數(shù)據(jù)輸入RS=H,R/W=H,E=H輸出D0—D7=數(shù)據(jù)寫數(shù)據(jù)輸入RS=H,R/W=L,D0—D7=數(shù)據(jù),E=高脈沖輸出無表2-3基本操作時序表讀寫操作時序如圖2-7和2-8所示:圖2-7讀操作時序圖2-8寫操作時序2.3.41602LCD的RAM地址映射及標準字庫表液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認模塊的忙標志為低電平,表示不忙,否則此指令失效。要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符,圖2-9是1602的內(nèi)部顯示地址。圖2-9液晶內(nèi)部顯示地址例如第二行第一個字符的地址是40H,那么是否直接寫入40H就可以將光標定位在第二行第一個字符的位置呢?這樣不行,因為寫入顯示地址時要求最高位D7恒定為高電平1所以實際寫入的數(shù)據(jù)應該是01000000B(40H)+10000000B(80H)=11000000B(C0H)。在對液晶模塊的初始化中要先設置其顯示模式,在液晶模塊顯示字符時光標是自動右移的,無需人工干預。每次輸入指令前都要判斷液晶模塊是否處于忙的狀態(tài)。1602液晶模塊內(nèi)部的字符發(fā)生存儲器(CGROM)已經(jīng)存儲了160個不同的點陣字符圖形,如圖10-58所示,這些字符有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。圖2-10字符代碼與圖形對應圖2.3.51602LCD的一般初始化(復位)過程延時15mS寫指令38H(不檢測忙信號)延時5mS寫指令38H(不檢測忙信號)延時5mS寫指令38H(不檢測忙信號)以后每次寫指令、讀/寫數(shù)據(jù)操作均需要檢測忙信號寫指令38H:顯示模式設置寫指令08H:顯示關閉寫指令01H:顯示清屏寫指令06H:顯示光標移動設置寫指令0CH:顯示開及光標設置2.3.61602LCD的電路連接圖2-111602的電路連接2.4GPS模塊VK2828U7G5LF部分GPS模塊就是集成了RF射頻芯片、基帶芯片和核心CPU,并加上相關外圍電路而組成的一個集成電路。在本次設計采用了設計要求的VK2828U7G5LF模塊,這個模塊主芯片是UBX-G7020-KT,通過串口通信與單片機相連接,當使他工作的時候,就會開始定位,并將數(shù)據(jù)通過串口送給單片機,數(shù)據(jù)遵守NMEA0183協(xié)議,里面有時間、位置、地面速度信息等,我們可以直接對送過來的數(shù)據(jù)進行解讀,就可以獲取我們所先要的時間信息。1.正常工作條件:RF射頻屬性:NMEA0183協(xié)議NMEA0183輸出GGA:時間、位置、定位類型GLL:經(jīng)度、緯度、UTC時間GSA:GPS接收機操作模式,定位使用癿衛(wèi)星,DOP值GSV:可見GPS衛(wèi)星信息、仰角、方位角、信噪比(SNR)RMC:時間、日期、位置、速度VTG:地面速度信息MSS:信號強度等注意:輸出癿信息、頻率不設置有關樣例數(shù)據(jù):$GPGGA,060826.00,2236.91284,N,11403.24705,E,2,08,1.03,107.8,M,-2.4,M,,0000*4A$GPGSA,A,3,24,22,14,12,15,25,18,42,,,,,2.20,1.03,1.95*01$GPGSV,3,1,11,12,31,117,47,14,30,290,46,15,19,060,42,18,70,010,45*78$GPGSV,3,2,11,21,47,207,,22,40,326,43,24,44,036,43,25,24,159,42*70$GPGSV,3,3,11,31,03,218,,42,51,128,35,50,46,122,45*4E$GPGLL,2236.91284,N,11403.24705,E,060826.00,A,D*66$GPRMC,060827.00,A,2236.91267,N,11403.24701,E,0.001,,130214,,,D*79$GPVTG,,T,,M,0.029,N,0.054,K,D*2C4.樣例數(shù)據(jù)詳解GGA樣例數(shù)據(jù):

$GPGGA,060826.00,2236.91284,N,11403.24705,E,2,08,1.03,107.8,M,-2.4,M,,0000*4A序號名稱樣例單位描述0消息ID$GPGGAGGA協(xié)議頭1UTC時間060826.00hhmmss.ss2緯度2236.91284ddmm.mmmmm3N/S指示NN=北,S=南4經(jīng)度11403.24705dddmm.mmmmm5E/W指示EW=西,E=東6定位指示20:未定位1:SPS模式,定位有效2:差分,SPS模式,定位有效3:PPS模式,定位有效7衛(wèi)星數(shù)目08范圍0到128HDOP1.03水平精度9MSL幅度107.8米平均海平面高度10單位M米單位:米11大地-2.4米平均海平面12單位M單位:米13差分時間秒當沒有DGPS時,無效14差分ID0000當沒有DGPS時,無效15校驗和*4A$不*之間所有字符ASCII碼癿校驗和16<CR><LF>消息結束GSA樣例數(shù)據(jù):

$GPGSA,A,3,24,22,14,12,15,25,18,42,,,,,2.20,1.03,1.95*01序號名稱樣例單位描述0消息ID$GPGSAGSA協(xié)議頭1模式1AM=手勱(強制操作在2D或3D模式),A=自動2模式231:定位無效2:2D定位3:3D定位3衛(wèi)星使用24通道14衛(wèi)星使用22通道25衛(wèi)星使用14通道36衛(wèi)星使用12通道47衛(wèi)星使用15通道58衛(wèi)星使用25通道69衛(wèi)星使用18通道710衛(wèi)星使用42通道811,,,,,,,,,,,,12衛(wèi)星使用通道1213PDOP2.20位置精度14HDOP1.03水平精度15VDOP1.95垂直精度16校驗和*01$不*之間所有字符ASCII碼癿校驗和17<CR><LF>消息結束GSV樣例數(shù)據(jù):$GPGSV,3,1,11,12,31,117,47,14,30,290,46,15,19,060,42,18,70,010,45*78$GPGSV,3,2,11,21,47,207,,22,40,326,43,24,44,036,43,25,24,159,42*70$GPGSV,3,3,11,31,03,218,,42,51,128,35,50,46,122,45*4E序號名稱樣例單位描述0消息ID$GPGSVGSV協(xié)議頭1消息數(shù)目3范圍1到32消息編號1范圍1到33衛(wèi)星數(shù)目11衛(wèi)星的數(shù)目4衛(wèi)星ID12衛(wèi)星ID5仰角31度仰角(范圍0°到90°)6方位角117度方位角(范圍0°到359°)7載噪比(C/No)47dBHz信號強度(范圍0到99)沒有跟蹤時為空8衛(wèi)星ID14衛(wèi)星ID9仰角30度仰角(范圍0°到90°)10方位角290度方位角(范圍0°到359°)11載噪比(C/No)46dBHz信號強度(范圍0到99)沒有跟蹤時為空12衛(wèi)星ID15衛(wèi)星ID13仰角19度仰角(范圍0°到90°)14方位角060度方位角(范圍0°到359°)15載噪比(C/No)42dBHz信號強度(范圍0到99)沒有跟蹤時為空16,,,,,,,,,,,,17校驗和*78$不*之間所有字符ASCII碼癿校驗和18<CR><LF>消息結束GLL樣例數(shù)據(jù):$GPGLL,2236.91284,N,11403.24705,E,060826.00,A,D*66序號名稱樣例單位描述0消息ID$GPGLLGLL協(xié)議頭1緯度2236.91284ddmm.mmmmm2N/S指示NN=北,S=南3經(jīng)度11403.24705dddmm.mmmm4E/W指示EW=西,E=東5UTC位置060826.00hhmm.mmmm6狀態(tài)AA=數(shù)據(jù)有效;V=數(shù)據(jù)無效7模式指示DA=自主定位,D=差分,E=估算,N=數(shù)據(jù)無效8校驗和*18$不*之間所有字符ASCII碼癿校驗和9<CR><LF>消息結束RMC樣例數(shù)據(jù):$GPRMC,060827.00,A,2236.91267,N,11403.24701,E,0.001,,130214,,,D*79序號名稱樣例單位描述0消息ID$GPRMCRMC協(xié)議頭1UTC時間060827.00hhmmss.ss2狀態(tài)AA=數(shù)據(jù)有效;V=數(shù)據(jù)無效3緯度2236.91267ddmm.mmmmm4N/S指示NN=北,S=南5經(jīng)度11403.24701dddmm.mmmmm6E/W指示EW=西,E=東7地面速度0.001Knot(節(jié))地面速度8方位度地面航線9日期130214日,月,年癿格式日期10磁變量磁場變化值(空白-丌支持)11模式指示DA=自主定位,D=差分,E=估算,N=數(shù)據(jù)無效12校驗和*79$不*之間所有字符ASCII碼癿校驗和13<CR><LF>消息結束VTG樣例數(shù)據(jù):$GPVTG,,T,,M,0.029,N,0.001,K,D*2C序號名稱樣例單位描述0消息ID$GPVTGVTG協(xié)議頭1方位度地面航線2參考T真北3參考-地面航線(磁癿),丌輸出4參考M磁5速度0.029Knots(節(jié))地面速度6單位N固定字節(jié)7速度0.001公里/小時地面速度8單位K公里/小時9模式指示DA=自主定位,D=差分,E=估算,N=數(shù)據(jù)無效10校驗和*2C$不*之間所有字符ASCII碼癿校驗和11<CR><LF>消息結束

第三章軟件部分設計本系統(tǒng)主要包括五個模塊編程:1.時鐘芯片DS1302的編程2.液晶顯示屏1602的編程3.按鍵編程4.GPS模塊的編程首先單片機初始化讀取DS1302里面的時鐘信息,將其顯示到LCD1602上,然后通過按鍵模塊部分,一方面可以手動調(diào)整DS1302里面的時鐘信息。另一方面可以手動控制GPS模塊的工作與不工作。整體程序流程圖如下:3.1按鍵程序流程圖按鍵一共分為兩大塊,一塊用來手動設置DS1302的時間信息,一塊就是用來控制GPS模塊的工作狀態(tài)。一共有四個按鍵,前三個按鍵用來控制時間信息,第一個按鍵是進入設置界面的按鍵,并且在進入設置界面之后再次按下就是切換所選中的數(shù)據(jù),當按下7次時,退出設置界面。第二、三個按鍵是用來對選中的數(shù)據(jù)在設置界面分別進行加減。第四個按鍵就是來控制GPS模塊的工作狀態(tài)的,每一次按下都會改變GPS的工作狀態(tài)。另外額外增加了,每一次按鍵有效按下時,蜂鳴器短響提示。程序如下://****************鍵盤掃描有關函數(shù)**********************voidkeyscan(){ if(set==0)//set為功能鍵(設置鍵) { delay(9);//延時,用于消抖動 if(set==0)//延時后再次確認按鍵按下 { buzz=0;//蜂鳴器短響一次 delay(200); buzz=1; setn++; if(setn>=7) setn=0; //設置按鍵共有秒、分、時、日、月、年、返回,7個功能循環(huán) switch(setn) { case1:TR0=0;//關閉定時器 ES=0; //TR1=0; write_1602com(er+8);//設置按鍵按動一次,秒位置顯示光標//er+0x09; write_1602com(0x0f);//設置光標為閃爍// temp=(miao)/10*16+(miao)%10;//秒數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x00);// write_1302(0x80,0x80|temp);//miao write_1302(0x8e,0x80); break; case2: write_1602com(er+5);//按2次fen位置顯示光標//er+0x06 //write_1602com(0x0f); break; case3: write_1602com(er+2);//按動3次,shi //write_1602com(0x0f); break; // case4:write_1602com(yh+0x0e);//按動4次,week //write_1602com(0x0f); // break; case4:write_1602com(yh+0x0a);//按動4次,ri //write_1602com(0x0f); break; case5:write_1602com(yh+0x07);//按動5次,yue //write_1602com(0x0f); break; case6:write_1602com(yh+0x04);//按動6次,nian //write_1602com(0x0f); break; case0: write_1602com(0x0c);//按動到第7次,設置光標不閃爍 ES=1; TR0=1;//打開定時器 temp=(miao)/10*16+(miao)%10; write_1302(0x8e,0x00); write_1302(0x80,0x00|temp);//miao數(shù)據(jù)寫入DS1302 write_1302(0x8e,0x80); break; } while(!set); } }//加鍵add if(setn!=0)//當set按下以下。再按以下鍵才有效(按鍵次數(shù)不等于零) { if(add==0)//上調(diào)鍵 { delay(10); if(add==0) { buzz=0;//蜂鳴器短響一次 delay(200); buzz=1; switch(setn) { case1:miao++;//設置鍵按動1次,調(diào)秒 if(miao>=60) miao=0;//秒超過59,再加1,就歸零 write_sfm(0x07,miao);//令LCD在正確位置顯示"加"設定好的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x80,temp);//向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+8);//因為設置液晶的模式是寫入數(shù)據(jù)后,光標自動右移,所以要指定返回 //write_1602com(0x0b); break; case2:fen++; if(fen>=60) fen=0; write_sfm(0x04,fen);//令LCD在正確位置顯示"加"設定好的分數(shù)據(jù) temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+5);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置 break; case3:shi++; if(shi>=24) shi=0; write_sfm(0x01,shi);//令LCD在正確的位置顯示"加"設定好的小時數(shù)據(jù) temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+2);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case4:ri++; if(ri>=32) ri=1; Conver_week(nian,yue,ri); write_week(week); write_nyr(9,ri);//令LCD在正確的位置顯示"加"設定好的日期數(shù)據(jù) temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+10);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case5:yue++; if(yue>=13) yue=1; Conver_week(nian,yue,ri); write_week(week); write_nyr(6,yue);//令LCD在正確的位置顯示"加"設定好的月份數(shù)據(jù) temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+7);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case6:nian++; if(nian>=100) nian=0; Conver_week(nian,yue,ri); write_week(week); write_nyr(3,nian);//令LCD在正確的位置顯示"加"設定好的年份數(shù)據(jù) temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+4);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; } while(!add); } } //減鍵dec,各句功能參照'加鍵'注釋 if(dec==0) { delay(10);//調(diào)延時,消抖動 if(dec==0) { buzz=0;//蜂鳴器短響一次 delay(200); buzz=1; switch(setn) { case1: miao--; if(miao<0) miao=59;//秒數(shù)據(jù)減到-1時自動變成59 write_sfm(0x07,miao);//在LCD的正確位置顯示改變后新的秒數(shù) temp=(miao)/10*16+(miao)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x80,temp);//向DS1302內(nèi)寫秒寄存器80H寫入調(diào)整后的秒數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+8);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置 //write_1602com(0x0b); break; case2: fen--; if(fen<0) fen=59; write_sfm(4,fen); temp=(fen)/10*16+(fen)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x82,temp);//向DS1302內(nèi)寫分寄存器82H寫入調(diào)整后的分數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+5);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,在這里是寫回原來的位置 break; case3: shi--; if(shi<0) shi=23; write_sfm(1,shi); temp=(shi)/10*16+(shi)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x84,temp);//向DS1302內(nèi)寫小時寄存器84H寫入調(diào)整后的小時數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(er+2);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case4: ri--; if(ri<1) ri=31; Conver_week(nian,yue,ri); write_week(week); write_nyr(9,ri); temp=(ri)/10*16+(ri)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x86,temp);//向DS1302內(nèi)寫日期寄存器86H寫入調(diào)整后的日期數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+10);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case5: yue--; if(yue<1) yue=12; Conver_week(nian,yue,ri); write_week(week); write_nyr(6,yue); temp=(yue)/10*16+(yue)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x88,temp);//向DS1302內(nèi)寫月份寄存器88H寫入調(diào)整后的月份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+7);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; case6: nian--; if(nian<0) nian=99; Conver_week(nian,yue,ri); write_week(week); write_nyr(3,nian); temp=(nian)/10*16+(nian)%10;//十進制轉換成DS1302要求的DCB碼 write_1302(0x8e,0x00);//允許寫,禁止寫保護 write_1302(0x8c,temp);//向DS1302內(nèi)寫年份寄存器8cH寫入調(diào)整后的年份數(shù)據(jù)BCD碼 write_1302(0x8e,0x80);//打開寫保護 write_1602com(yh+4);//因為設置液晶的模式是寫入數(shù)據(jù)后,指針自動加一,所以需要光標回位 break; } while(!dec); } } } else { if(on==0) { delay(20); if(on==0) { buzz=0;//蜂鳴器短響一次 delay(200); buzz=1; GPS_EN=!GPS_EN; ES=GPS_EN; while(!on); } } } }

結束語在整個設計過程中學到了許多沒學到的知識,在電路焊接時雖然沒什么大問題,但從中也知道了焊接在整個作品中的重要性,電路工程量大,不能心急,一個個慢慢來不能急于求成。反而達到事半功倍的效果。對電路的設計、布局要先有一個好的構思,才顯得電路板美觀、大方。程序編寫中,由于思路不清晰,開始時遇到了很多的問題,經(jīng)過靜下心來思考,理清了思路,反而得心應手。在此次設計中,知道了做事要有一顆平常的心,不要想著走捷徑,一步一腳印。也練就了我的耐心,做什么事都要有耐心。在本次設計中學到了很多很多東西,這是最重要的。總之,此次畢業(yè)設計使我的能力得到了全方位的提高,次設計的萬年歷也存在的不足的地方,有待于以后的改進。

致謝詞這篇論文的完成在一定意義上也代表我大學生涯的結束,在此我要感謝學校為我?guī)淼囊磺?,沒有學校為我提供的平臺,我也不可能順利地完成大學的學習,更不可能完成本次畢業(yè)設計。這篇畢業(yè)論文是在我的導師張祥莉老師的親切關懷和悉心指導下完成的。沒有張老師的指導我想我不可能順利地完成此次畢業(yè)設計,在此我想對他表示由衷的感謝。最后,我想表達對所有任職老師的感謝,是你們在這大學四年時間里給了我們知識和力量,給了我們踏足社會的能力。在論文即將完成之際,我的心情無法平靜,從不知道畢業(yè)論文怎么寫,到開始進入課題到論文的完成,再到順利完成了畢業(yè)論文答辯稿,有很多老師,同學,朋友向我提供的幫助,在這里請接受我誠摯的謝意!參考文獻[1]余錫存,曹國華,單片機原理及接口技術.西安:西安電子科技大學出版社,2000[2]郭天祥,新概念51單片機c語言教程。北京:電子工業(yè)出版社,2009[3]楊拴科,模擬電子技術基礎.北京:高等教育出版社,2003。[4]

李光才,樓然笛.單片機課程設計實例指導.

北京:北京航空航天大學出版社,2004。[6]楊立民,單片機技術及應用.西安:西安電子科技大學出版社,1997.9~12。[7]馬忠梅,單片機的C語言應用程序設計.北京:北京航空航天大學出版社,1997。[8]王天曦,李洪儒.電子技術工藝基礎.北京:清華大學出版社,2000。[9]弘道工作室,融會貫通Protel99電路設計.北京:人民交通出版設,2000。[10]張偉,王力,趙晶,ProtelDXP入門與提高.北京:人民郵電出版社,2003.2。[11]李廣弟,朱月秀,王秀山.單片機基礎[M].

北京:北京航空航天大學出版社,

2001.7。[12]譚浩強,C程序設計(第二版)[M].北京:清華大學出版社,2003。[13]付家才,單片機控制工程實踐技術[M].

北京:化學工業(yè)出版社,2004.3。[14]W.Simpson,Editor,ThePoint-to-PointProtocol,RFC1661[EB/OL].July1994。[15]WAVECOM,ATCommandsInterfaceGuide,Revision002[EB/OL].6thNovember2003。

附錄硬件原理圖與PCB圖

源程序:#include<reg52.h>#include"uart.c"http://#include"DS18B20_3.H"#include<string.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedchar#defineyh0x80//LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)//液晶屏的與C51之間的引腳連接定義(顯示數(shù)據(jù)線接C51的P0口)sbiten=P2^7;sbitrw=P2^6;//如果硬件上rw接地,就不用寫這句和后面的rw=0了sbitrs=P2^5;//校時按鍵與C51的引腳連接定義sbitset=P3^4; //設置鍵sbitadd=P3^5; //加鍵sbitdec=P3^6; //減鍵sbiton=P3^7; //鍵sbitbuzz=P1^4;sbitGPS_EN=P2^0;//DS1302時鐘芯片與C51之間的引腳連接定義sbitIO=P1^1;sbitSCLK=P1^0;sbitRST=P1^2;chara,miao,shi,fen,ri,yue,nian,week,setn;charmiao_1,shi_1,fen_1,ri_1,yue_1,nian_1;uchartemp;bitstart=0,stop=0;#defineRsBuf_N 800unsignedcharxdataRsBuf[RsBuf_N]; //定義串口接收數(shù)據(jù)緩沖區(qū)uintRsPoint;uchardouhao=0;ucharqq=0,qq1=0;sbitACC0=ACC^0;sbitACC7=ACC^7;/************************************************************ACC累加器=AACC.0=E0HACC.0就是ACC的第0位。Acc可以位尋址。累加器ACC是一個8位的存儲單元,是用來放數(shù)據(jù)的。但是,這個存儲單元有其特殊的地位,是單片機中一個非常關鍵的單元,很多運算都要通過ACC來進行。以后在學習指令時,常用A來表示累加器。但有一些地方例外,比如在PUSH指令中,就必須用ACC這樣的名字。一般的說法,A代表了累加器中的內(nèi)容、而ACC代表的是累加器的地址。***************************************************************//*函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD星期數(shù)據(jù)(只允許1901-2099年)調(diào)用函數(shù)示例:Conver_week(c_sun,year_sun,month_sun,day_sun)如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);c_sun,year_sun,month_sun,day_sun均為BCD數(shù)據(jù),c_sun為世紀標志位,c_sun=0為21世紀,c_sun=1為19世紀調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀week得出陰歷BCD數(shù)據(jù)*/codeuchartable_week[12]={0,3,3,6,1,4,6,2,5,0,3,5};//月修正數(shù)據(jù)表/*算法:日期+年份+所過閏年數(shù)+月較正數(shù)之和除7的余數(shù)就是星期但如果是在閏年又不到3月份上述之和要減一天再除7星期數(shù)為0*/voidConver_week(ucharyear,ucharmonth,ucharday){//c=0為21世紀,c=1為19世紀輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)ucharp1,p2;year+=0x64;//如果為21世紀,年份數(shù)加100p1=year/0x4;//所過閏年數(shù)只算1900年之后的p2=year+p1;p2=p2%0x7;//為節(jié)省資源,先進行一次取余,避免數(shù)大于0xff,避免使用整型數(shù)據(jù)p2=p2+day+table_week[month-1];if(year%0x4==0&&month<3)p2-=1;week=p2%0x7;}/**************************************************************/ucharcodetab1[]={"20--"}; //年顯示的固定字符ucharcodetab2[]={"::"}; //時間顯示的固定字符ucharcodeqk[]={""}; //清空顯示//延時函數(shù),后面經(jīng)常調(diào)用voiddelay(uintxms)//延時函數(shù),有參函數(shù){ uintx,y; for(x=xms;x>0;x--) for(y=10;y>0;y--);}/********液晶寫入指令函數(shù)與寫入數(shù)據(jù)函數(shù),以后可調(diào)用**************//*在這個程序中,液晶寫入有關函數(shù)會在DS1302的函數(shù)中調(diào)用,所以液晶程序要放在前面*/voidwrite_1602com(ucharcom)//****液晶寫入指令函數(shù)****{ rs=0;//數(shù)據(jù)/指令選擇置為指令 rw=0;//讀寫選擇置為寫 P0=com;//送入數(shù)據(jù) en=1;//拉高使能端,為制造有效的下降沿做準備 delay(1); en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令}voidwrite_1602dat(uchardat)//***液晶寫入數(shù)據(jù)函數(shù)****{ rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù) rw=0;//讀寫選擇置為寫 P0=dat;//送入數(shù)據(jù) en=1;//en置高電平,為制造下降沿做準備 delay(1); en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令}voidlcd_init()//***液晶初始化函數(shù)****{ write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù) write_1602com(0x0c);//開顯示不顯示光標 write_1602com(0x06);//整屏不移動,光標自動右移 write_1602com(0x01);//清顯示 delay(300); write_1602com(yh+1);//日歷顯示固定符號從第一行第1個位置之后開始顯示 for(a=0;a<14;a++) { write_1602dat(tab1[a]);//向液晶屏寫日歷顯示的固定符號部分// delay(3); } write_1602com(er+1);//時間顯示固定符號寫入位置,從第2個位置后開始顯示 for(a=0;a<8;a++) { write_1602dat(tab2[a]);//寫顯示時間固定符號,兩個冒號// delay(3); }}/*********************over***********************//*和DS1302時鐘芯片有關的函數(shù)*//*************寫一個數(shù)據(jù)到對應的地址里***************/voidwrite_1302(ucharadd,uchardat){ uchari; RST=1; //把復位線拿高 for(i=0;i<8;i++) { //低位在前 SCLK=0; //時鐘線拿低開始寫數(shù)據(jù) IO=add&0x01; add>>=1; //把地址右移一位 SCLK=1; //時鐘線拿高 } for(i=0;i<8;i++) { SCLK=0; //時鐘線拿低開始寫數(shù)據(jù) IO=dat&0x01; dat>>=1; //把數(shù)據(jù)右移一位 SCLK=1; //時鐘線拿高 } RST=0; //復位線合低 SCLK=0; IO=0;}/*************從對應的地址讀一個數(shù)據(jù)出來***************/ucharread_1302(ucharadd){ ucharvalue,i; RST=1; //把復位線拿高 for(i=0;i<8;i++) { //低位在前 SCLK=0; //時鐘線拿低開始寫數(shù)據(jù) IO=add&0x01; add>>=1; //把地址右移一位 SCLK=1; //時鐘線拿高 } for(i=0;i<8;i++) { SCLK=0; //時鐘線拿低開始讀數(shù)據(jù) value>>=1; if(IO==1) value|=0x80; SCLK=1; //時鐘線拿高 } RST=0; //復位線合低 SCLK=0; IO=0; returnvalue; //返回讀出來的數(shù)據(jù)}ucharBCD_Decimal(ucharbcd)//BCD碼轉十進制函數(shù),輸入BCD,返回十進制{ ucharDecimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F));}//voidds1302_init()//1302芯片初始化子函數(shù)(2010-01-07,12:00:00,week4){ RST=0; SCLK=0; write_1302(0x8e,0x00);//允許寫,禁止寫保護 //write_1302(0x80,0x00);//向DS1302內(nèi)寫秒寄存器80H寫入初始秒數(shù)據(jù)00 //write_1302(0x82,0x00);//向DS1302內(nèi)寫分寄存器82H寫入初始分數(shù)據(jù)00 //write_1302(0x84,0x12);//向DS1302內(nèi)寫小時寄存器84H寫入初始小時數(shù)據(jù)12 //write_1302(0x8a,0x04);//向DS1302內(nèi)寫周寄存器8aH寫入初始周數(shù)據(jù)4 //write_1302(0x86,0x07);//向DS1302內(nèi)寫日期寄存器86H寫入初始日期數(shù)據(jù)07 //write_1302(0x88,0x01);//向DS1302內(nèi)寫月份寄存器88H寫入初始月份數(shù)據(jù)01 //write_1302(0x8c,0x10);//向DS1302內(nèi)寫年份寄存器8cH寫入初始年份數(shù)據(jù)10 write_1302(0x8e,0x80);//打開寫保護}////時分秒顯示子函數(shù)voidwrite_sfm(ucharadd,uchardat)//向LCD寫時分秒,有顯示位置加、現(xiàn)示數(shù)據(jù),兩個參數(shù){ uchargw,sw; gw=dat%10;//取得個位數(shù)字 sw=dat/10;//取得十位數(shù)字 write_1602com(er+add);//er是頭文件規(guī)定的值0x80+0x40 write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 }////年月日顯示子函數(shù)voidwrite_nyr(ucharadd,uchardat)//向LCD寫年月日,有顯示位置加數(shù)、顯示數(shù)據(jù),兩個參數(shù){ uchargw,sw; gw=dat%10;//取得個位數(shù)字 sw=dat/10;//取得十位數(shù)字 write_1602com(yh+add);//設定顯示位置為第一個位置+add write_1602dat(0x30+sw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 write_1602dat(0x30+gw);//數(shù)字+30得到該數(shù)字的LCD1602顯示碼 }//voidwrite_week(ucharweek)//寫星期函數(shù){ write_1602com(yh+0x0c);//星期字符的顯示位置 switch(week) { case1:write_1602dat('M');//星期數(shù)為1時,顯示 write_1602dat('O'); write_1602dat('N'); break; case2:write_1602dat('T');//星期數(shù)據(jù)為2時顯示 write_1602dat('U'); write_1602dat('E'); break; case3:write_1602dat('W');//星期數(shù)據(jù)為3時顯示 write_1602dat('E'); write_1602dat('D'); break; case4:write_1602dat('T');//星期數(shù)據(jù)為4是顯示 write_1602dat('H'); write_1602dat('U'); break; case5:write_1602dat('F');//星期數(shù)據(jù)為5時顯示 write_1602dat('R'); wr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論