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

下載本文檔

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

文檔簡介

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

溫馨提示

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

評論

0/150

提交評論