基于單片機(jī)的數(shù)字萬年歷的設(shè)計(jì)_第1頁
基于單片機(jī)的數(shù)字萬年歷的設(shè)計(jì)_第2頁
基于單片機(jī)的數(shù)字萬年歷的設(shè)計(jì)_第3頁
基于單片機(jī)的數(shù)字萬年歷的設(shè)計(jì)_第4頁
基于單片機(jī)的數(shù)字萬年歷的設(shè)計(jì)_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

I第一章緒論在二十一世紀(jì)的現(xiàn)在,功能型萬年歷在我們?nèi)粘I钪斜容^常見,不僅僅在車站,醫(yī)院等公共區(qū)域,在人們的家中也經(jīng)??梢钥吹?。隨著技術(shù)的發(fā)展,各種電子產(chǎn)品也蓬勃更新,人們對(duì)于萬年歷已經(jīng)不僅僅滿足于單純的時(shí)間需求?,F(xiàn)實(shí)生活中人們對(duì)于萬年歷的擴(kuò)大需求刺激著萬年歷不斷創(chuàng)新。同時(shí),集成電路的迅速發(fā)展,先進(jìn)的石英技術(shù),電子表的報(bào)時(shí)較以往來說更加準(zhǔn)確和穩(wěn)定,電子鐘也因?yàn)楦鞣N時(shí)鐘芯片的發(fā)展,體積越來越小,十分便于攜帶,不光如此,耗能還低,既可以用于一般的時(shí)間顯示功能,同時(shí)也滿足各種拓展功能。本次設(shè)計(jì)中,我們圍繞單片機(jī),來做出一個(gè)完整的,可供正常使用的電子數(shù)字萬年歷,在熟悉各種萬年歷部件的同時(shí),我也會(huì)在各種方案中選擇一個(gè)更加適合我的,更加適合本課程設(shè)計(jì)的一個(gè)萬年歷。第二章方案的選擇2.1計(jì)時(shí)方案的選擇單片機(jī)的選擇對(duì)于萬年歷的系統(tǒng)性能有著重要的影響,以下有兩種方案可供選擇:方案一:利用89C51的芯片來作為萬年歷設(shè)計(jì)的硬件核心,它是美利堅(jiān)合眾國ATMEL公司的產(chǎn)品,是一種電壓低但是性能高的CMOS8位單片機(jī)。利用FlashROM,它能在3V的超級(jí)低壓環(huán)境下正常工作,并且同MCS-51系列的單片機(jī)兼容性良好,擁有三級(jí)機(jī)密程序的存儲(chǔ)器,它的RAM是128×8字節(jié),擁有六個(gè)中斷源,擁有1000次撰寫周期,甚至擁有低功耗空閑和掉電模式,但是它應(yīng)用在電路設(shè)計(jì)時(shí),不具備在線編程的功能,反復(fù)拔插對(duì)于芯片會(huì)造成損壞,此方案不可行。方案二:在設(shè)計(jì)中采用的控制芯片為低價(jià)且不影響使用的STC89C52,使用簡單,這款單片機(jī)顯然不是性能最好或者說是最適合做萬年歷產(chǎn)品的單片機(jī),但是針對(duì)本課題,和我們所學(xué)知識(shí)連接更為緊密,所以于我而言入手更簡單。STC89C52是一個(gè)低功耗但高性能的51內(nèi)核的CMOS8位單片機(jī),8K字節(jié)的程序存儲(chǔ)空間,512字節(jié)的數(shù)據(jù)存儲(chǔ)空間。另外它可以降至0HZ靜態(tài)邏輯操作,空閑模式的時(shí)候,cpu就會(huì)停止工作,允許RAM。串口、中斷以及計(jì)數(shù)器繼續(xù)工作,在掉電方式的保護(hù)下,RAM的內(nèi)容將會(huì)被保存,震蕩機(jī)的工作被強(qiáng)制性停止,單片機(jī)的所有的工作也就會(huì)停止。具有在線編程的功能,不需要上一種那樣的12V的VPP編程高壓,使用也很簡單并且價(jià)格更容易被人們結(jié)束,擁有8K字節(jié)FLASH和812字節(jié)的RAM,內(nèi)帶4K字節(jié)EEPROM存儲(chǔ)空間,可以直接使用串口下載。時(shí)鐘芯片為DS1302款,芯片獲得精準(zhǔn)的時(shí)鐘數(shù)據(jù),具有較高的精確度,整體出現(xiàn)的差是小于10ms/年,時(shí)間數(shù)據(jù)較為容易讀取,可直接知曉,模塊化程度比較高,對(duì)于編程來說相對(duì)較容易實(shí)現(xiàn),甚至在斷電條件下,仍可以保證時(shí)鐘正常運(yùn)作,倘若在外接一個(gè)3v的紐扣電池,甚至可以運(yùn)行一年的時(shí)間,規(guī)格小巧且價(jià)格親民。2.2顯示方案選擇方案一:液晶LCD1602顯示方案,它是一種工業(yè)字符型的液晶,顯示的原理是利用液晶本身的物理上地特質(zhì),借助電壓V對(duì)它的顯示板塊進(jìn)行管控,它能夠在同一時(shí)間內(nèi)顯示32個(gè)字符,接口是標(biāo)準(zhǔn)的16腳接口,由5×7或者5×11的點(diǎn)陣字符組成,每個(gè)點(diǎn)陣字符符位都可展示一個(gè)字符,位與位之間均有一個(gè)點(diǎn)陣的間隔,市面上的字符液晶大部分是利用HD44780液晶芯片來工作的,LCD1602也不例外,控制原理是完全相同的,1602液晶不光能顯示出來時(shí)鐘而且還能顯示漢字,滿足了數(shù)字電子萬年歷對(duì)功能方面的附加需求。并且,它有很明顯的有點(diǎn)就是自身是一種小耗電量,小體積,輕重量的液晶顯示,并且自身的顯示界面和顯示信息的種類都很多,該方案值得選擇。但也不是最完美的選擇,因?yàn)?602屏存在一個(gè)問題就是不能把萬年歷的全部功能一一展示出來,倘若執(zhí)意安排在一屏盡數(shù)顯示出來,就會(huì)顯得文字和數(shù)字?jǐn)D在一起。倘若是把信息分兩屏顯示或者設(shè)置專門的按鍵來進(jìn)行切換,顯示又使得萬年歷的操作又略微復(fù)雜。方案二:數(shù)碼管顯示。數(shù)碼管顯示的原理是:一個(gè)數(shù)碼管有八段,從A到H,通俗點(diǎn)來說就是由八個(gè)發(fā)光的二極管組成的,二極管的方向是固定的,一般的電壓取1.7V,公共端也僅僅只有兩個(gè),分別可以接+5V或者接地。在現(xiàn)實(shí)里,最常用的是七段式和八段式的LED數(shù)碼管,兩種相對(duì)比也只是差了一個(gè)小數(shù)點(diǎn),其他基本相同。所謂的段就是數(shù)碼管里含有的小LED發(fā)光二極管,它是通過控制不同的LED的明滅來進(jìn)行顯示。電子時(shí)鐘的設(shè)計(jì)中,最先被安排考慮的就應(yīng)該是數(shù)碼管。但在本次多功能萬年歷的制作來說,數(shù)碼管雖然比較節(jié)省I/O端口,靜態(tài)顯示比較簡單,有個(gè)很大的缺點(diǎn)就是它自身不具備顯示天干地支等時(shí)間的功能,我們的成果是要顯示出來漢字的,并且當(dāng)有較多的顯示位數(shù)的情況下,cpu要一次一次地輪著進(jìn)行掃描,被占用的時(shí)間要很長很長,由此看來,數(shù)碼管方案并不是最適合的。方案三:液晶LCD12864顯示方案。帶中文字庫的12864是一種4位或者8位并行,2線或者3線串行的多接口方式的顯示模塊,顯示方式有正顯、STN、半透,其內(nèi)置8192個(gè)16*16點(diǎn)漢字(有簡體有繁體)和128個(gè)16*8點(diǎn)的ASCII字符,顯示分辨率為128*64,顯示效果的解讀是利用二進(jìn)制,1表示著亮,0表示著滅。內(nèi)置DC-DC轉(zhuǎn)換電路,外無需加負(fù)壓,并且不借助片選信號(hào),簡化軟件設(shè)計(jì)。該模塊的接口方式非常靈活并且操作起來也很容易,操作指令也比較容易,可以更加簡單地構(gòu)造人機(jī)交互的界面,并且是全中文。不光如此,還有一個(gè)特點(diǎn)就是可以完成圖形顯示低電壓和低功耗,相對(duì)于1602來說,12864不光有它自身的優(yōu)點(diǎn),比如說低功耗,友好的價(jià)格,更為豐富的信息展示,并且12864是一種帶字庫的液晶顯示,這無疑就可以更加方便得顯示漢字,編程操作簡單。與1602還有一個(gè)不同是,12864可以用一屏將本設(shè)計(jì)需要用到的功能來進(jìn)行完美地呈現(xiàn),因此,12864顯示是最佳最優(yōu)的選擇毋庸置疑。2.3溫度傳感器方案選擇方案一:熱敏電阻方案。它是一種傳感器電阻,其阻值隨著溫度的變化而變化,溫度系數(shù)分為正溫度系數(shù)熱敏電阻和負(fù)溫度系數(shù)熱敏電阻,當(dāng)遇到正溫度,電阻就會(huì)隨著溫度的升高而增大,當(dāng)碰到負(fù)溫度時(shí),電阻隨溫度的升高而減小,是屬于半導(dǎo)體器件的一種。熱敏電阻的成本很低,但熱敏電阻在輸出電壓時(shí),必須將數(shù)據(jù)進(jìn)行分析,然后再轉(zhuǎn)變?yōu)闇囟?,并且其測量結(jié)果精確度不高。另外,熱敏電阻的外圍電路復(fù)雜,編程也有困難,顯示溫度范圍受熱敏電阻本身特性影響,誤差較大。方案二:數(shù)字測溫芯片DS18B20。就目前而言,該芯片在溫度傳感器這個(gè)板塊里應(yīng)用十分廣,其良好且可靠的性能得到業(yè)內(nèi)公認(rèn)。目前為止,性價(jià)比方面可以與它媲美的溫度傳感器并不多見。DS18B20抗干擾能力強(qiáng);精度可變,從0.0625到0.5攝氏度不等,且測溫范圍由-55℃到125℃;并且它還具有一個(gè)溫度預(yù)警的功能。該芯片所用的通信協(xié)議是總線協(xié)議,并與單片機(jī)通信,這種方式的優(yōu)點(diǎn)是在一條線上可連接多個(gè)芯片,有很好的擴(kuò)展性。并且由于DS18B20屬于一種數(shù)字芯片,編程起來難度也比較低。由此,我們本次設(shè)計(jì)就選用DS18B20作為溫度傳感器。2.4鍵盤方案選擇方案一:矩陣鍵盤。它是單片機(jī)外部中常用的一種類似矩陣的鍵盤組,它的使用和識(shí)別會(huì)比直接法均要復(fù)雜一些。它的列線通過電阻,接的是正電源,將單片機(jī)的I/O端來作為輸出端,列線所接的i/o則作為輸入端,作用是切換中控式矩陣信號(hào)源。在矩陣鍵盤中,每條水平和垂直的線在交叉處不會(huì)直接連通而是通過一個(gè)按鍵來進(jìn)行連接,并且線的數(shù)量越多,數(shù)量就越多,區(qū)別就越明顯。倘若在電子萬年歷中,一個(gè)單獨(dú)的按鍵只用作一個(gè)調(diào)節(jié)位,這樣算來,需要的按鍵的數(shù)量總體將近13個(gè),甚至超過這個(gè)數(shù)量。并且單片機(jī)被要求去不間斷地掃描端口才能讓這個(gè)鍵盤發(fā)揮作用,無疑,這個(gè)鍵盤方案將占用較多的資源。況且,這樣設(shè)計(jì)出來的萬年歷表面有太多的按鍵,操作不便且不符合人類的審美。方案二:獨(dú)立按鍵。相對(duì)于上一個(gè)鍵盤來說,獨(dú)立按鍵雖然整體上資源占用較少,但是對(duì)功能復(fù)用這一板塊要求較高。獨(dú)立按鍵配置靈活,并且互不干擾,結(jié)構(gòu)也較為簡單,雖然在按鍵數(shù)量多的時(shí)候,獨(dú)立按鍵會(huì)存在線程浪費(fèi)大,占用時(shí)間久的弊端。在本設(shè)計(jì)中,我們需要的按鍵并不是很多,相比較而言,獨(dú)立按鍵更適合。這種類型的復(fù)用設(shè)計(jì)大學(xué)生也可以完成,并且實(shí)現(xiàn)復(fù)用后,就代表著硬件電路可以簡單化,使得交互鍵盤外觀更加簡潔大方。因而,本設(shè)計(jì)采用獨(dú)立鍵盤,具體有換調(diào)節(jié)位鍵、增鍵、減鍵、確認(rèn)鍵。2.5時(shí)鐘芯片的選擇方案一:從簡單的角度來考慮,直接選擇單片機(jī)定時(shí)計(jì)數(shù)器,采用其來獲得信號(hào),使用一些代碼,來實(shí)現(xiàn)年月日時(shí)分秒和星期的計(jì)數(shù)。采用這個(gè)方案可以在一定程度上減少成本,因?yàn)椴徊捎眯酒?。但是這種方案使得在時(shí)間上,誤差會(huì)很明顯,所以我們不采用這個(gè)方案。方案二:這里我們考慮使用DS1302的時(shí)鐘芯片,這是DALLAS公司推出的一款時(shí)鐘芯片,被廣泛應(yīng)用在電話等產(chǎn)品,可以提供年月日時(shí)分秒的信息,還可以自動(dòng)調(diào)整閏年,并且借助配置AM/PM來決定是采用24小時(shí)制還是12小時(shí)制。芯片本身采用串行I/O的通信方式,相比較而言,串行比并行更節(jié)省I/O接口,擁有31字節(jié)數(shù)據(jù)存儲(chǔ)RAM,工作的電域很寬,大抵是2.0V-5.5V都不會(huì)影響它的正常使用。采用的是三線接口與COU進(jìn)行同步通信。不僅如此,它的功耗一般都很低,電壓為2V時(shí),電流通常情況下小于300nA,這款時(shí)鐘芯片共有八個(gè)引腳,有兩種封裝形式,一種是SOP-8封裝,一種是DIP-8封裝,下圖2.1為其八個(gè)引腳具體的功能,其中,第8個(gè)引腳VCC1為后備電源,第1種引腳VCC2為主電源,該時(shí)鐘芯片是相比較VCC1和VCC2兩種的電壓來挑選依靠誰來進(jìn)行工作,會(huì)選取較大值。第二種和第三種引腳分別是X1和X2,這兩個(gè)引腳是震蕩源,外接32.768kHz晶振。圖2.2是DS1302的控制字格式,第七位必須是1,如果為0就不能寫數(shù)據(jù)進(jìn)入DS1302中,位6如果0,就表示存取日歷時(shí)鐘數(shù)據(jù),如果為1,就表示存取RAM。DS1302用于數(shù)據(jù)記錄,尤其是在一些有特殊含義的數(shù)據(jù)上,能實(shí)現(xiàn)數(shù)據(jù)和數(shù)據(jù)出現(xiàn)的時(shí)間點(diǎn)同時(shí)予以記錄,相比較而言,我們自然而然選擇DS1302芯片。引腳編號(hào)引腳名稱引腳功能1Vcc2主電源引腳,當(dāng)Vcc2比Vcc1高0.2V以上時(shí),DS1302由Vcc2供電,當(dāng)Vcc2低于Vcc1時(shí),由Vcc1供電2X1這兩個(gè)引腳需要接一個(gè)32768K的晶振給DS1302提供一個(gè)基準(zhǔn)。特別注意,要求這個(gè)晶振的引腳負(fù)載電容必須時(shí)6pF,而不是要加6pF的電容。如果使用有源晶振的話,接X2到X1上即可,X2懸空3X24GND接地5CEDS1302的輸入引腳。當(dāng)讀寫DS1302的數(shù)據(jù)的時(shí)候,這個(gè)引腳必須時(shí)高電平,DS1302這個(gè)引腳I/O內(nèi)部含有一個(gè)40K的下拉電阻,該引腳有兩個(gè)功能,第一:CE開始控制字訪問移位寄存器的控制邏輯。第二:CE提供結(jié)束單字節(jié)或者多字節(jié)數(shù)據(jù)傳輸?shù)姆椒?I/O這個(gè)引腳是一個(gè)雙向通信引腳,即三線接口時(shí)的雙向數(shù)據(jù)線7SCLK輸入引腳,SCLK時(shí)用來作為通信的時(shí)鐘信號(hào)DS1302這個(gè)引腳的內(nèi)部含有一個(gè)40K的下拉電阻8Vcc1備用電源引腳圖2.1八個(gè)引腳的具體作用圖2.2DS1302的控制字格式2.6報(bào)時(shí)方案選擇方案一:揚(yáng)聲器。市場上的揚(yáng)聲器依據(jù)振膜形式可以大體分為兩類,分別是:球頂揚(yáng)聲器以及錐形揚(yáng)聲器,前者往往作為高音單元來使用,后者主要為中音低音或者寬頻揚(yáng)聲器的主要形態(tài)。兩種相比較而言,錐形揚(yáng)聲器的優(yōu)點(diǎn)是結(jié)構(gòu)比較簡單,轉(zhuǎn)換的效率比較高,但是正是由于這種結(jié)構(gòu),它的指向性并不能很好地滿足人們對(duì)于這款揚(yáng)聲器的期待,對(duì)于球頂揚(yáng)聲器來說,它是一個(gè)呈半球狀凸起的振動(dòng)板,使得球頂揚(yáng)聲器的指向性比前一種大大地提高了,比傳統(tǒng)地錐形揚(yáng)聲器具有更好地瞬態(tài),失真較小。它的工作原理是使用金屬細(xì)線,繞圈形成導(dǎo)線線圈,通電之后就會(huì)形成電磁體,和永磁體產(chǎn)生作用力,這個(gè)力就會(huì)影響到振膜,使得振膜發(fā)聲。在一開始,我們有考慮是不是用揚(yáng)聲器能使萬年歷更向商用產(chǎn)品靠攏,并且使用起來也更加人性化。但經(jīng)過再三實(shí)驗(yàn),發(fā)現(xiàn)揚(yáng)聲器方案存在一些缺點(diǎn),這將會(huì)導(dǎo)致整個(gè)程序無法正常運(yùn)作。因此揚(yáng)聲器方案在本設(shè)計(jì)中是不可行的。方案二:蜂鳴器。蜂鳴器式一體化結(jié)構(gòu)的電子設(shè)備,被廣泛應(yīng)用于計(jì)算器等電子產(chǎn)品中作為發(fā)生的部件,采用的式直流電壓供電的模式。目前在市場上蜂鳴器共有兩種,分別是有源和無源,這里的源并不是電源的意思,而是蜂鳴器的震蕩源。無源蜂鳴器本身不帶有震蕩源,直接用直流信號(hào)無法使其發(fā)出聲音,只能需要一定頻率的方波驅(qū)動(dòng),比如說2K到5K,而有源蜂鳴器在連同電路以后就會(huì)發(fā)聲,并且有源蜂鳴器還會(huì)有區(qū)別,分為連續(xù)聲和間斷聲的區(qū)別。顯然有源蜂鳴器能讓這個(gè)設(shè)計(jì)的編程更加簡單,其內(nèi)部有電路,只要給一個(gè)可以供起工作的電壓就可以出聲,在main程序的循環(huán)中只要設(shè)置好時(shí)間的標(biāo)志就可以完成定時(shí)的功能,并且發(fā)出報(bào)警聲。因此本課題采用了有源蜂鳴器方案。下圖2.3為單片機(jī)的系統(tǒng)功能框圖圖2.3單片機(jī)系統(tǒng)功能款圖第三章系統(tǒng)設(shè)計(jì)3.1模塊化程序設(shè)計(jì)學(xué)習(xí)完C,我學(xué)習(xí)到了一種新的編程技巧,名字是模塊化編程。較傳統(tǒng)的逐條程序輸入或者是把所有程序整體放進(jìn)一個(gè)文件的編程方法,模塊化程序設(shè)計(jì)具有更穩(wěn)定的性能,將不同功能分成一個(gè)個(gè)獨(dú)立的小個(gè)體,互相引用和借鑒,降低了程序整體的復(fù)雜度,編程的難度大大降低,使得程序整體具有很高的可移植性。模塊化編程就是把一整個(gè)程序分成主程序和各個(gè)子程序,主程序的作用是來串起整個(gè)流程,子程序是負(fù)責(zé)封裝好系統(tǒng)的各個(gè)功能,然后讓主程序來調(diào)用,并且子程序?qū)ν鈨H提供全局變量、要被調(diào)用的函數(shù)名稱和必要的接口信息,并且也只有這些信息對(duì)主程序可見。相對(duì)于白盒,這種黑盒模式的編程便于分工合作,極大的提高了編程的效率和安全性。3.2主程序流程描述首先是將單片機(jī)復(fù)位,然后系統(tǒng)的main函數(shù)開始執(zhí)行。并且對(duì)12864和DS1302進(jìn)行初始化。接下來是大循環(huán),在循環(huán)內(nèi)部中,先從DS1302中讀取時(shí)間數(shù)據(jù)(包括年月日時(shí)分秒)和從DS18B20中讀取溫度數(shù)據(jù)。將年月日的數(shù)據(jù)通過陰陽歷轉(zhuǎn)換函數(shù)來知曉出陰歷數(shù)據(jù),送到12864顯示RAM相應(yīng)位置,利用星期子函數(shù)得出星期的數(shù)據(jù)也發(fā)給相應(yīng)的位置,利用干支紀(jì)年法計(jì)算公式,即年干=N-3(N﹥3)或N-3+10(N≤3),N=年號(hào)/10的余數(shù)=年號(hào)個(gè)位數(shù)。年支=N-3(N﹥3)或N-3+12(N≤3),N=年號(hào)/12的余數(shù)。將得到的數(shù)據(jù)送到相應(yīng)位置。在這之后是掃描按鍵。在掃描過程中,若按鍵被按下,那么調(diào)整變量并將調(diào)整后的數(shù)據(jù)讀入DS1302,同時(shí)將數(shù)據(jù)也發(fā)送給12864。這個(gè)循環(huán)不斷進(jìn)行,以此保持時(shí)鐘的正常顯示。這里有一點(diǎn),大循環(huán)每完成一次的時(shí)間應(yīng)<1s,這樣秒數(shù)的變化才能正常顯示,如果一個(gè)循環(huán)中cpu過于繁忙,以至于超出1s,秒就會(huì)發(fā)生跳變。Main函數(shù)的流開始程圖如3.1所示開始讀取時(shí)間溫度讀取時(shí)間溫度陽歷轉(zhuǎn)陰歷、干支陽歷轉(zhuǎn)陰歷、干支掃描按鍵掃描按鍵按鍵修改變量按鍵修改變量報(bào)時(shí)功能報(bào)時(shí)功能顯示輸出顯示輸出結(jié)束結(jié)束圖3.1主程序流程圖3.3各子程序的分塊設(shè)計(jì)在3.3我將重點(diǎn)介紹每個(gè)子程序的調(diào)試過程,包括調(diào)試過程中發(fā)現(xiàn)的問題以及與之相對(duì)應(yīng)的解決辦法,按照模塊化編程的思想,這就要求先寫出子程序已經(jīng)預(yù)定義函數(shù),主函數(shù)只要包含系統(tǒng)里所有要用到的子程序的頭文件,即實(shí)現(xiàn)主函數(shù)對(duì)子函數(shù)的調(diào)用功能。并且為了防止編譯出錯(cuò),通常是子程序的編譯在主函數(shù)的上面。3.3.1DS1302時(shí)鐘子程序時(shí)鐘程序我將按照數(shù)據(jù)手冊(cè)的步驟來對(duì)DS1302進(jìn)行操作,該時(shí)鐘子程序共有兩種模式的讀寫,分別是突發(fā)模式以及字節(jié)模式。在本畢設(shè)中,我們采用singlebytetransfer的模式來傳輸這些數(shù)據(jù),命令指令均以1bit為單位,每次的讀寫操作之前,都要先定義一次控制命令。該時(shí)鐘共包含有12個(gè)寄存器,其中有7個(gè)寄存器與時(shí)間相關(guān),它存放的數(shù)據(jù)位為BCD碼形式,但美中不足的是,BCD碼只有轉(zhuǎn)為十進(jìn)制才能直接使用,倘若出現(xiàn)二進(jìn)制,系統(tǒng)就會(huì)報(bào)錯(cuò)。下圖是與時(shí)間相關(guān)的7個(gè)寄存器的數(shù)據(jù)范圍:圖3.2主要的寄存器以及讀寫命令從表上的數(shù)據(jù)可以知曉這7個(gè)寄存器的操作命令,其數(shù)據(jù)范圍由右側(cè)可知,其中的年份為00到99。在此基礎(chǔ)上,在本設(shè)計(jì)中,將電子萬年歷可顯示的年份定為2000年2099年。在年份這里也可以用跨世紀(jì)來顯示,即溢出操作。這里需要留意的是,星期的數(shù)據(jù)不可以通過讀取DS1302來知曉,數(shù)據(jù)結(jié)果需要用某種算法得出。本次軟件設(shè)計(jì)中,將年月日時(shí)分秒這六位寫到數(shù)組time_buf[]中,該數(shù)組還具有初始化時(shí)鐘的功能,就是用設(shè)置time_buf[]的2到6位來定義上電復(fù)位后顯示的年月日時(shí)分秒。實(shí)時(shí)時(shí)鐘英文描述為Real_TimeClock,可以采用它的縮寫RTC,存儲(chǔ)的順序是從秒開始,為秒分時(shí)日月星期年,存儲(chǔ)的格式用BCD碼。代碼類似下面ucharcodeREAD_RTC_ADDR[7]={0x81,0x83,0x87,0x89,0x8b,0x8d};ucharcodeWRITE_RTC_ADDR[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};UchaeTIME[7]={0,0,0x12,0x02,0x08,0x03,0x22};//將該時(shí)鐘芯片的時(shí)間初始化為2022年3月8號(hào)星期二12點(diǎn)0分0秒。3.3.212864液晶顯示子程序12864液晶一共有兩種類型,分為帶字庫型以及不帶字庫型。其中不帶字庫在本質(zhì)上和點(diǎn)陣的概念是一樣的,借助“點(diǎn)陣”中的點(diǎn)來表現(xiàn)出這個(gè)漢字。需要用到多少種漢字就“畫”多少種。與前一種不同的是,帶字庫的點(diǎn)陣是有自己的庫的,常用的8000多個(gè)漢字構(gòu)成一個(gè)漢字表,并放在液晶顯示的存儲(chǔ)器中,若需要用到某字時(shí),采用查表法就可以找到這個(gè)字。同時(shí),帶字庫12864也具有前一種的功能,即可以自己繪制“漢字”。簡而言之,帶字庫液晶更方便。帶字庫的12864每個(gè)漢字占16x16點(diǎn)陣,能顯示4x8個(gè)漢字。它在操作上,有2種:串行和并行。在這里我們選擇并行方法。按照數(shù)據(jù)手冊(cè)里的時(shí)序圖一步步地進(jìn)行,然后寫入命令和數(shù)據(jù),就可顯示出所需要的東西到12864操作時(shí)序。圖3.3即為時(shí)序圖圖3.312864的時(shí)序圖它可寫入的資料數(shù)據(jù)有兩類,分別是:數(shù)據(jù),命令。寫命令和寫數(shù)據(jù)有一些區(qū)別,需嚴(yán)格按照規(guī)定的方式來進(jìn)行實(shí)踐。需多加注意的一點(diǎn)是,如果將帶字庫的每一行分成16個(gè)位置,在每個(gè)特定位置都展示一個(gè)符號(hào),那么漢字只能出現(xiàn)在偶奇位置,而不能出現(xiàn)在奇偶位置。同樣查表法讀ASCII碼時(shí),雖然某個(gè)符號(hào)如阿拉伯?dāng)?shù)字“1”占用1/16個(gè)位置,但是依然服從漢字的規(guī)則,只能出現(xiàn)在偶奇位置,其中奇數(shù)位置什么也不顯示。這是由于帶字庫對(duì)顯示RAM的地址分配引起的。下表3-2即為RAM地址分配:表3-1帶字庫12864顯示RAM地址漢字顯示£E標(biāo)X坐標(biāo)Linel80H81H82H83H84H85H86H87HLine?90H9IH92H93H94H95H96H97HLine)88H89H8AH8BH8CH8DH8EH8FHLinel98H99H9AH9BH9CH9DH9EH9FH通過上面的表格可以知曉,用查表法來進(jìn)行單漢字的查詢。它往往是出現(xiàn)在RAM任一地址。倘若試圖實(shí)現(xiàn)將任意漢字顯示在隨意的一到兩個(gè)字符位置,這個(gè)方法就無法實(shí)現(xiàn),需要另作打算。本次設(shè)計(jì)我們用的方法是整行賦值,它的含義是哪怕一行只改動(dòng)了一個(gè)字符,也要重新掃描一整行,然后得到一個(gè)字符的變化,它的缺點(diǎn)就是掃描時(shí)間被很大程度得加長了,并且這個(gè)缺點(diǎn)不可以避免。關(guān)于12864的控制器接口信號(hào),我們這里提一下RS和R/W的配合選擇的四種模式:RSR/W功能說明LLMPU寫指令到指令暫存器(IR)LH讀出忙標(biāo)志(BF)及地址計(jì)數(shù)器(AC)的狀態(tài)HLMPU寫入數(shù)據(jù)到數(shù)據(jù)暫存器(DR)HHMPU從數(shù)據(jù)暫存器(DR)中讀出數(shù)據(jù)E信號(hào):E狀態(tài)執(zhí)行動(dòng)作結(jié)果高到低I/O緩沖?DR配合R/W進(jìn)行寫數(shù)據(jù)/指令高DR?I/O緩沖配合R進(jìn)行讀數(shù)據(jù)/指令低或者低到高無動(dòng)作本課題選用的主要函數(shù)是單行掃描函數(shù),舉例就像下述函數(shù)實(shí)現(xiàn)第一行的掃描:voiddplayl(void){inti;12864Writecommand(0x80,l);for(i=0;i<16;i++){12864WriteData(strl[i]);}}執(zhí)行代碼時(shí),首先輸入字符應(yīng)該在哪個(gè)位置顯示,從0x80開始,顯示在第一行,然后進(jìn)行16次的循環(huán),將strl[]數(shù)組中的值按順序輸出在相應(yīng)位置,連續(xù)兩個(gè)字符寬度顯示一個(gè)漢字。這樣一來,每次只改變strl[]數(shù)組的值(注意此值是相應(yīng)的ASCII型的字符),賦值方法可以是strl[]=“2022年1月7日2度”,而要改變的數(shù)字則給某個(gè)數(shù)組元素賦值再把數(shù)組放在特定行掃描即可。了解了12864的原理,就基本上完成了電子萬年歷的顯示部分。3.3.3DS18B20溫度子傳感器DS18B20的內(nèi)部里有兩種振蕩器,具體是低溫系數(shù)晶體振蕩器和高溫系數(shù)晶體振蕩器。操作也是參考手冊(cè)。系統(tǒng)會(huì)把其值給兩個(gè)計(jì)數(shù)器,然后將處理后的數(shù)值給溫度寄存器。溫度傳感器通過DQ數(shù)據(jù)端來對(duì)輸入輸出進(jìn)行控制。在這里我們只用到一個(gè)DS18B20,數(shù)值保留四位小數(shù)就可以,每個(gè)小數(shù)位表示0.0625℃,每一次溫度轉(zhuǎn)換需要時(shí)間750mso,默認(rèn)精度由十二位數(shù)據(jù)格式表示,字節(jié)是占用兩位,兩字節(jié)中高4位表示為符號(hào)位。倘若出現(xiàn)負(fù)數(shù),就用補(bǔ)碼形式來表示,要記得在數(shù)據(jù)輸出處理時(shí),需要把補(bǔ)碼進(jìn)行轉(zhuǎn)變。圖3-4溫度傳感器數(shù)據(jù)字節(jié)市面上的電子萬年歷的顯示精度往往到1攝氏度,因此溫度傳感器子程序?qū)⒑笏奈恍?shù)部分進(jìn)行了四位右移,由于不考慮四舍五入以及加減的進(jìn)位,因此最終程序可能會(huì)存在1左右的誤差,是正常的。溫度傳感器主要函數(shù)如下:unsignedintReadwendu(void){unsignedchara=0;unsignedintb=0,m=0;Init_DS18B20();Writeonechar(OxCC);//跳過讀取序號(hào)列號(hào)Writeonechar(0x44);//開始進(jìn)行轉(zhuǎn)換溫度DelayMs(lO);Init_DS18B2O();Writeonechar(OxCC);//跳過讀取序號(hào)列號(hào)Writeonechar(OxBE);//讀取前兩個(gè)溫度寄存器a=Readonechar();//先對(duì)低位進(jìn)行讀取b=Readonechar();//再讀高位B<<=8;m=a+b; //合為一個(gè)數(shù)據(jù)return(m);}需要提一下的是,此函數(shù)將被主函數(shù)反復(fù)調(diào)用,用來獲得此時(shí)的室內(nèi)溫度。3.3.4獨(dú)立按鍵子程序在本次設(shè)計(jì)種我們采用的是4個(gè)獨(dú)立按鍵,四個(gè)按鍵都是輕觸型開關(guān),具體的功能分別為加一K2、減一K3、選擇調(diào)整位K1以及確認(rèn)K4。需要調(diào)整的位包括當(dāng)前的日期和時(shí)間和鬧鐘開關(guān),鬧鐘的吋、分、秒共10位。這就表示某個(gè)計(jì)數(shù)值是調(diào)整為判斷的依據(jù),通俗點(diǎn)來說就是按1下,計(jì)數(shù)為1。按2下,計(jì)數(shù)為2,以此類推。計(jì)數(shù)值程序如下:voidkey_count()State_Set=l;if(State_Set==O)DelayMs(2);while(State_Set=O){if(count==11)count=0;elsecount++;break;}while(State_Set==O);//松手檢測邏輯}考慮到單片機(jī)準(zhǔn)雙向口的要讀先寫特性,選擇調(diào)整位K1定義為State_Set,首句"State_Set=l表示要讀取該位先寫入1。并且每按下K1,都會(huì)檢測一下K1的值,結(jié)果若為零,則增加計(jì)數(shù)。有關(guān)按鍵部分,需要說明的關(guān)鍵問題是按鍵的消抖方法,消抖有2種方法:第一種為先對(duì)鍵值進(jìn)行一波判斷,延時(shí)幾毫秒后再判斷鍵值,兩次判斷一致就認(rèn)為已消除抖動(dòng),但是這不僅是因?yàn)檠訁紖奸g難以把握,更致命的是,我們的程序循環(huán)時(shí)間較長,時(shí)間太久就有可能發(fā)生按鍵按下了但主程序沒到此處的情況,這樣按鍵就必須一直處于按下狀態(tài),但是如果一直處于按下狀態(tài)又可能會(huì)發(fā)生重復(fù)計(jì)數(shù)而不能走到正確的調(diào)整位的問題。另一種方法是松手檢測方法,即沒有松手時(shí)程序停止等待,松手后程序跳出按鍵程序,0狀態(tài)等待,1狀態(tài)跳出,這樣就解決了重復(fù)計(jì)數(shù)和忽視計(jì)數(shù)的問題。需要在每個(gè)按鍵程序中都加入松手檢測語句。按鍵加減和確認(rèn)與此函數(shù)相似,不再贅述。時(shí)鐘芯片讀取數(shù)據(jù),然后將改變后的年份數(shù)據(jù)傳給DS1302,并顯示即可。為了得到更好的顯示效果。在調(diào)整某位時(shí),如果想要讓某位閃爍,就需要改變顯示str[]的值,并進(jìn)行持續(xù)得掃描,直到調(diào)整程序退出時(shí)不再閃爍。即上述程序中strlfuzhi();完成賦值,dplayl();第一行顯示ok之后,然后通過strlfzkongy();以及dpalyl();顯示出來第一行年數(shù)據(jù)的位置,這個(gè)循環(huán)將繼續(xù)執(zhí)行,這樣一來,年位就可以閃爍起來。因?yàn)檎{(diào)整這一過程并不用三個(gè)時(shí)間來進(jìn)行實(shí)時(shí)的不斷變化,因此當(dāng)按鍵在按下的狀態(tài)時(shí),除了需亮燈的相關(guān)位置變化外,其他均不變。鬧鐘和整點(diǎn)報(bào)時(shí)功能此時(shí)也是無法生效的。3.4實(shí)驗(yàn)板仿真程序仿真一般情況下采用英國的protues軟件,但當(dāng)protues軟件中缺乏特定型號(hào)元件的仿真模型時(shí),protues仿真就很難實(shí)現(xiàn)了。Protues支持自建封裝和原理圖模型,但是建立仿真模型與前者不同,自建封裝或者原理圖只不過是“畫”一個(gè)像某個(gè)元件的元件,而仿真模型簡歷要求輸入輸出程序,往往涉及到高級(jí)語言編程。而本課題設(shè)計(jì)中釆用了帶中文字庫12864,帶字庫12864仿真模型在protues官網(wǎng)和12864廠商網(wǎng)站均不提供,因此無法用protues仿真,本課題的仿真應(yīng)用的是單片機(jī)實(shí)驗(yàn)板。實(shí)驗(yàn)板更接近硬件仿真,可以說在實(shí)驗(yàn)板上程序通過了,將來焊接成品就有了一定的保證。實(shí)驗(yàn)仿真效果在之后幾章會(huì)有圖示。第四章硬件設(shè)計(jì)部分4.1硬件設(shè)計(jì)整體框架由于電子萬年歷比較成熟,設(shè)計(jì)的難度也是適中,焊接也比較簡單,相對(duì)來說易于操作。因此我們選用9x15萬用板焊接,在設(shè)計(jì)的過程總,既鍛煉了動(dòng)手操作的實(shí)踐能力,也避免了一些不必要的過程。圖4-1為本設(shè)計(jì)的整體框架圖:圖4-1數(shù)字萬年歷整體框架4.2外圍電路設(shè)計(jì)4.2.1時(shí)鐘電路DS1302時(shí)鐘芯片是雙列直插8引腳,它的引腳必須外接晶振32768hz,雙電源來保證供電,圖4.2時(shí)其內(nèi)部結(jié)構(gòu)圖。同時(shí),備用3v電源接VCC2,為單片機(jī)斷電后時(shí)鐘繼續(xù)運(yùn)行提供能源。它在進(jìn)行讀寫操作的時(shí)候最少讀寫兩個(gè)字節(jié),第一個(gè)字符是一個(gè)控制字節(jié),負(fù)責(zé)命令的內(nèi)容,具體就是決定是讀操作還是寫操作,第二個(gè)用來承載數(shù)據(jù)。除此之外,一般單片機(jī)的I/O端口相連時(shí),要加上拉電阻,這樣才能提高接口的驅(qū)動(dòng)能力,并且信號(hào)也比較穩(wěn)定,,計(jì)時(shí)比較準(zhǔn)。功耗很低,外接工作電壓2V時(shí),電流是小于300nA的。其外部電路圖如4.3所示:圖4.2時(shí)鐘芯片的內(nèi)部結(jié)構(gòu)圖圖4.3時(shí)鐘電路圖4.2.2溫度傳感器電路DS18B20是一種常見的溫度傳感,體積小,硬件本身價(jià)格低,高性能,并且抗干擾能力強(qiáng),其還具有很高的精度。與DS1820比較類似,有一點(diǎn)不同即為DS18B20會(huì)因?yàn)榉直媛什煌?,?dǎo)致得到的溫度值的位數(shù)不同,它擁有獨(dú)特的單線接口方式,在與微處理器連接時(shí)僅需要一條口線就可以實(shí)現(xiàn)雙向通訊,在使用中,即使沒有外接任何外圍元件也可以正常使用,它適用于DN15-25,DN40-DN250的各種工業(yè)管道和狹小空間的設(shè)備測溫,使用的是直徑為Φ6的不銹鋼保護(hù)管。它共有六條控制指令,它的配置寄存器結(jié)構(gòu)為圖4.4所示TMR1R011111圖4.4DS18B20的配置寄存器結(jié)構(gòu)溫度分辨率設(shè)置表如圖4.5所示R1R0分辨率溫度最大轉(zhuǎn)換時(shí)間009位93.75ms0110位187.5ms1011位375ms1112位750ms圖4.5DS18B20的溫度分辨率設(shè)置表DS18B20暫存寄存器分布如圖4.6所示寄存器內(nèi)容字節(jié)地址溫度值低位(LSByte)0溫度值高位(MSByte)1高溫限值(TH)2低溫限值(TL)3配置寄存器4保留5保留6保留7CEC校驗(yàn)值8圖4.6DS18B20的暫存寄存器信息DS18B20的ROM指令表如圖4.7所示指令約定代碼功能讀ROM33H讀DS18B20溫度傳感器ROM中的編碼,通俗來說就是64位地址符合RMO55H發(fā)出此命令之后,接著發(fā)出64位ROM編碼,訪問單總線上與該編碼相對(duì)應(yīng)的DS18B20使之做讀寫準(zhǔn)備搜索ROMFOH用于確定掛接在同一總線上DS18B20的個(gè)數(shù)和識(shí)別64位ROM地址跳過ROMCCH忽略64位ROM地址,適用于單片工作搜索命令ECH執(zhí)行后只有當(dāng)溫度超過設(shè)定值上限或者下限的片子才做出響應(yīng)圖4.7DS18B20的ROM指令表DS18B20的傳感器的接線如下圖4.8:圖4.8傳感器電路圖4.2.3按鍵電路和蜂鳴器電路按鍵板塊的電路如下圖4.9:圖4.9獨(dú)立按鍵電路由于單片機(jī)的驅(qū)動(dòng)能量不足以直接驅(qū)動(dòng)蜂鳴器,因此我們可以把三極管與蜂鳴器配合起來,就可以實(shí)現(xiàn)目的。4.10就是電路示意圖圖4.10蜂鳴器電路4.2.412864的顯示電路在學(xué)校的學(xué)習(xí)課程中我們已經(jīng)學(xué)到過,12864與P0口連接,由于P0口為準(zhǔn)雙向口,所以外部接上拉排阻,然后接到12864。下圖4.11位位12864的3A接口說明表管腳號(hào)管腳電平說明1CSAH/L片選擇信號(hào),低電平時(shí)選擇前64列2CSBH片選擇信號(hào),低電平時(shí)選擇后64列3GNDOV邏輯電源地4VCC5V邏輯電源5VEE-10VLCD驅(qū)動(dòng)電源6D/IH/L數(shù)據(jù)/指令選擇,高電平時(shí),數(shù)據(jù)D0-D7將送入顯示RAM,低電平時(shí),數(shù)據(jù)D0-D7將送入指令寄存7R/WH/L讀/寫選擇,高電平時(shí)讀取數(shù)據(jù),低電平時(shí)寫入數(shù)據(jù)8EH.H./L讀寫時(shí)能,高電平有效,下降沿鎖定數(shù)據(jù)9DB0H/L數(shù)據(jù)輸入輸出引腳10DB1H/L數(shù)據(jù)輸入輸出引腳11DB2H/L數(shù)據(jù)輸入輸出引腳12DB3H/L數(shù)據(jù)輸入輸出引腳13DB4H/L數(shù)據(jù)輸入輸出引腳14DB5H/L數(shù)據(jù)輸入輸出引腳15DB6H/L數(shù)據(jù)輸入輸出引腳16DB7H/L數(shù)據(jù)輸入輸出引腳圖4.1112864的接口說明表在指令描述中,下圖4.12為12864顯示開或者關(guān)的設(shè)置下圖4.12為12864顯示開/關(guān)設(shè)置C0DE:R/WD/IDB7DB6DB5DB4DB3DB1DB0LLLLHHHHHH/L功能:決定屏幕的開關(guān)問題,DB0=H時(shí),此時(shí)為開的狀態(tài);DB0=L時(shí),此時(shí)為關(guān)的狀態(tài)。這個(gè)不會(huì)干涉到RAM。12864的時(shí)序參數(shù)表如下圖4.13所示圖名稱符號(hào)最小值典型值最大值單位E周期時(shí)間Tcyc1000nsE高電平寬度Pweh450nsE低電平寬度Pwel450nsE上升時(shí)間Tr25nsE下降時(shí)間Tf25ns地址建立時(shí)間Tas140ns地址保持時(shí)間Taw10ns數(shù)據(jù)建立時(shí)間Tdsw200ns數(shù)據(jù)延遲時(shí)間Tddr320ns寫數(shù)據(jù)保持時(shí)間Tdhw10ns讀數(shù)據(jù)保持時(shí)間Tdhr20ns圖4.1312864的時(shí)序參數(shù)表4.3硬件的焊接本設(shè)計(jì)中是需要做出來實(shí)體的物品的,因此焊接方面不可輕視,在電路系統(tǒng)中若出現(xiàn)一細(xì)小問題,結(jié)果就可能會(huì)導(dǎo)致電路無法正常的工作,在實(shí)際操作中,我發(fā)現(xiàn)有以下幾個(gè)問題:誤把DS1302晶振連接錯(cuò)誤電路焊接錯(cuò)誤電源電路設(shè)計(jì)不當(dāng),應(yīng)該在電池盒接口接一個(gè)5V的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論