51单片机毕业设计
STC12C5A60S2
DS12887
單片機畢業設計
51單片機項目
數碼管顯示的合成出租車計價器設計
Synthetic taxi meter digital display design
學生姓名:
學生學號: 10700121
專業名稱: 電子信息工程
指導教師:
計算機與信息工程學院
2014年6月13日
獨創性聲明
本人聲明所呈交的畢業設計(論文)是本人在指導教師指導下進行的研究工作和取得的研究成果,除了文中特別加以引用標注之處外,論文中不包含其他人已經發表或撰寫過的研究成果,沒有偽造數據的行為。
畢業設計(論文)作者簽名: 簽字日期:2014年6月13日
畢業設計(論文)版權使用授權書
本畢業設計(論文)作者完全了解學校有關保留、使用論文的規定。同意學校保留并向有關管理部門或機構送交論文的復印件和電子版,允許論文被查閱和借閱。本人授權天津城建大學可以將本論文的全部或部分內容編入有關數據進行檢索,可以采用影印、縮印或掃描等復制手段保存和匯編本論文。
(保密的畢業設計(論文)在解密后適用本授權說明)
畢業設計(論文)作者簽名: 指導教師簽名:
簽字日期:2014年6月13日 簽字日期: 2014年6月13日
摘 要
本次設計為的我的畢業設計,我主要為大家介紹一種快速而省錢的乘車方式。在本次設計中,我將會詳細的講解這種介于公交車與現在出租車之間的乘車方式的設計背景、設計思路、實現原理、設計的原理圖及其程序的要點部分。本次設計主要以單片機為控制芯,控制四片MAX7219,使32個數碼管顯示不同的數據來得到自己想要的數據,這就是本次設計的主體思路。
關鍵詞:合乘出租車、單片機、MAX7219、數碼管
Abstract
The design is my graduation project,I mainly introduce a fast and economical way to travel.In this design,I will explain this design that between the bus ride and now the taxi way in detail and explain the design background, design ideas, realization of the principle point of the design schematics and procedures. The design of the main control core is SCM, which control four MAX7219, making 32 digital display different data to get the data that we want. This is the main idea of this design .
Keywords: Car、SCM、MAX7219、Digital
目 錄
第一章 緒論 1
第二章 方案設計 2
2.1 設計原理 2
2.2 設計實現的功能 2
2.3 方案選擇 2
2.3.1 單片機的選擇 3
2.3.2 外圍電路的方案設計 3
2.4 總設計流程圖及其說明 4
2.4.1 總設計流程圖 4
2.4.2 總設計流程圖分析 5
第三章 硬件電路設計 6
3.1 控制主電路設計 6
3.2 按鍵掃描電路 7
3.3 時鐘電路 7
3.4 數據顯示模塊 8
3.4.1 電路原理圖 8
3.4.2 工作原理 9
3.5 原理圖設計軟件 9
第四章 程序的編寫 10
4.1 編譯環境 11
4.2 燒寫軟件 11
4.3 程序的編寫 11
4.3.1 頭文件 11
4.3.2 擴展I/O口P4的寄存器設置 12
4.3.3 MAX7219.H文件 12
4.3.4 DS12887.H文件 13
4.4 主程序 16
4.4.1 主程序流程圖 16
4.4.2 主程序分析 16
4.4.3 主程序代碼分析 17
4.5 程序運行結果 18
第五章 設計實物的測試和調試 18
5.1 測試目的 19
5.2 測試項目 19
5.2.1 功能測試 19
5.2.2 穩定性測試 19
5.3 測試并調試結果 20
5.4 測試與調試后的總結 21
第六章 總 結 22
6.1 設計開發流程總結 23
6.2 自我認識 23
致 謝 24
參考文獻 25
附 錄 26
第一章 緒論
自2013年北京市出臺規定后,同時也興起了以合乘為運營業務的優秀企業。自2013年北京出臺政策后合乘的形式以及種類也是多種多這樣,五花八門的拼車工具也是層出不窮,主要是以無錫打的寶科技有限公司為代表的自主合乘微信平臺等合乘成功率很高的工具。
隨著中國城市化進程的飛速發展以及城市人口的密集增長,在很多大中型城市,尤其是以北京、上海、廣州、深圳為代表的城市,打車困難并且在上下班時間交通壓力大的問題,2012年3月份,北京出臺相關政策,鼓勵乘客合乘出租車,并對合乘的分攤費用及發票做出了規定。特別是在早晚高峰時段,合乘者各付共同路段車費的60%,并可打印多份發票
隨著人們生活水平質量的提高,人們對交通工具的最求也越來越高。既希望交通工具實惠,又希望交通工具快捷。現在的公交車雖然實惠,但是公交車在很多方面給人們的生活帶來不便:人們做公交車時必須到公交站牌區等公交車;坐公交車必須做自己要到的那條路線上經過的公交車,這個原因往往會造成人們等一個小時甚至更長的時間的車;錯過了一輛公交車,一般就必須等下一輛相同型號的車。
與公交車相比,出租車有很多優點:任意一輛出租車可以到達任何地方,非常快捷;還可以電話叫出租車,現在甚至還可以通過網絡查找距離自己最近的出租車;當你不知道自己的目的地址在什么地方時,坐出租車是一種跟好的選擇。這時我們往往不用查找自己的目的地的具體路線,出租車司機比我們更加了解地圖,會將我們送到目的地。雖然出租車快捷舒適,但是現在人們大多數還是坐公交車,公交車價格實惠,出租車的乘車費用是公交車的十幾倍甚至幾十倍。這就是本次設計將要改善人們對出租車看法的地方。
第一章,本次設計將講解設計的方案,工作原理,要實現的功能。
第二章,這一章詳細的講解設計的電路原理圖及其各個部分功能的具體實現的方法。
第三章,這一章是設計實物的具體實現。在這一章,我詳細的介紹程序編寫的關鍵點的實現及程序調試的環節等。
最后的幾章是對本次設計的參考文獻,致謝詞等。這是我第一次做這樣的比較正式的設計,有不到位的地方,希望各位老師多多包涵。
第二章 方案設計
2.1 設計原理
現在城市的出租車的要求都是單人付費,很少有幾個人共同付費或者出租車司機在車上已有乘客時搭載其他的顧客的情況。這些情況導致出租車的個人一次乘車費用比公交車貴上幾十倍。
本次設計,即數碼管顯示的合成出租車計價器可以使個人一次乘車費用降低的同時,增加出租車司機的一次駕車收入。
數碼管顯示的合成出租車計價器的計費方式與普通的出租車的計費方式不同。在乘車付費人數為一人時,數碼管上顯示的該顧客需要支付的乘車費,其計費方式與現在乘出租車的是一樣的。當乘車付費人數為兩人甚至更多時,數碼管上將會同時顯示不同的乘客需要支付的乘車費。這時出租車的計費方式將會有所變化:首先計價器會自動的降低出租車的起步價,其次所有需要付費的乘客的起步費用加在一起所得到的起步費用比單人付費時的起步價高,甚至是單人付費時的起步價的幾倍。這樣既減少了個人乘車時的費用,又增加了司機在行駛同樣一段路程上的錢數。
2.2 設計實現的功能
數碼管顯示的合成出租車計價器主要是為了顯示不同的顧客同一輛出租車時各自的費用。它的要求有以下幾點:
數碼管顯示的合成出租車計價器最多可以顯示四個付費顧客的乘車費用,即出租車上最多可以承載四人。
顯示的付費人數是根據實際的將要付費的人數來定的,而不是車上乘客的人數定的。
顯示每一位顧客的乘車時間,起步價及單價。
④起步價和單價可以由出租車公司修改(起步價和單價的修改需要密碼),以防止出租車乘車標準有所改變時需要從新設計出租車計價器。
2.3 方案選擇
數碼管顯示的合成出租車計價器主要是以單片機為主控芯片,單片機通過控制四個MAX7219將傳輸數據到三十二個數碼管,使這些數碼管在不同的情況下顯示不同的數據。
2.3.1 單片機的選擇
本次設計選擇STC12C5A60S2型號的單片機作為控制芯片。其主要有以下幾個原因:
本次設計共需要32個引腳(包括電源端和接地端)的控制芯片,單片機當為首選。
去掉電源端和接地端,需要30個引腳來控制外圍電路。一般的單片機雖然有四路I/O口共32個引腳,但是本次設計需要五路I/O口,使不同的模塊數據通過不同的I/O口輸入和輸出。不同I/O口間數據的輸入和輸出影響小,既便于程序的編寫,有可以防止電路的不穩定性造成數據的顯示出現亂碼。STC12C5A60S2型號的單片機其內部有自帶的第五路I/O口P4,編寫程序的時候只需設置相應的寄存器就可以用相應的第五路I/O口的引腳了。
STC12C5A60S2型號的單片機為增強型的單片機,它的每個時鐘就是一個機器周期,運行速度是普通單片機的8到12倍。
④STC12C5A60S2型號的單片機價格實惠,同時其內部還用各種寄存器可以做一些其它的用途,與一般的單片機相比,他的功能非常強大,使人在設計電路的時候可以減少很多外圍電路的設置來達到節約PCB板的成本。
⑤我經常使用STC12C5A60S2型號的單片機做課設,對其內部的寄存器的設置非常熟悉。
2.3.2 外圍電路的方案設計
本次設計的外圍電路主要涉及到數據顯示和按鍵控制。其中數據顯示必須用數碼管,這是設計任務書中要求的。
數碼管顯示數據,其中數碼管有三十二個。合成出租車最多可以乘載四個顧客,即最多有四個顧客同時付費。需要四個指示付費顧客的數碼管及每個顧客需要顯示價錢的數碼管四個,這樣需要二十個可以顯示數據的普通數碼管。除此以外還需要顯示時間和出租車在單人乘車時的起步價及單價:這里我用可以顯示時間的數碼管三排(每排四個數碼管),一排顯示時間(小時和分鐘),一排顯示起步價,最后一排顯示單價。
用三排可以顯示時間的數碼管是在需要顯示年月日時分秒的時候直接編寫程序就可以了,不必要重新制作PCB。
三十二個數碼管,需要32個選擇控制引腳,至少8個數據引腳,這樣就需要四十個引腳的控制芯片了。為了節省控制芯片的引腳資源,我用四個MAX7219芯片來控制這些數碼管。每個MAX7219芯片控制八個數碼管數據的顯示。一個MAX7219芯片可以由三個單片機引腳控制,四個MAX7219芯片只占用單片機的六個引腳資源。
2.4 總設計流程圖及其說明
2.4.1 總設計流程圖
下面是本次設計的具體實施步驟,每一步實施完成后才能去完成下一個步驟。有一個步驟沒有完成或著出現錯誤將導致整個流程無法進行下去,甚至會造成設計無法完成。
圖2-1 總設計流程圖
2.4.2 總設計流程圖分析
根據任務書所要實現的各個功能設計不同的電路模塊(畫電路原理圖)。我焊接了時鐘電路模塊、按鍵控制模塊和數碼管顯示模塊。在設計這三個模塊時,我查找了相關的資料(DS12887的存儲地址,MAX7219的寄存器的操作方法等)。檢測各個不同的模塊,測試這些模塊所對應得功能都可以正常實現時,再將各個模塊連接到一起檢測,看看不同的模塊是否能夠正常運行。能夠正常運行才能說明自己的電路原理圖及自己的元器件選擇沒有問題,才能夠根據這個設計原理圖來做PCB板。
關于畫電路原理圖,這一點我沒有在總設計流程圖中特意的顯示出來。但是從上面的分析中可以看出來,我將各個模塊連接在一起運行成功時,電路原理圖就自己出來了。
焊接電路板是做好設計的第一個關鍵點,其次才是程序的編寫及運行。PCB上元器件焊接完成后,根據上面各個模塊原理圖合成的總原理圖來檢查焊接元器件是否正確,同時檢查電路板個元器件之間的連線是否和自己的原理圖上的一樣。假如元器件焊接不正確,將焊接錯誤的元器件去掉,重新焊接正確的元器件;若是電路板連線錯誤就要重新制作電路板。
④電路板焊接正確后就可以開始編寫程序了。程序的編寫是本次設計中最不浪費資源的部分。電器元件焊接錯誤,電路板制作錯誤等都會造成資金的浪費,而程序的編寫失誤則不會。程序編寫錯誤只會導致程序運行的結果不是自己希望的得到的最終結果。但是編寫正確的程序并且使程序實現自己所需要的功能不僅需要很長時間,還需要在編寫前仔細的思考程序編寫的流程圖。關于程序的流程圖及程序的關鍵點我將后在后面做詳細介紹。
第三章 硬件電路設計
3.1 控制主電路設計
控制主電路采用STC12C5A60S2型號的單片機作為主控制芯片。它的主體原理圖如下所示:
圖3-1 主控芯片
本次課程設計需要用到主控芯片五路I/O口,從上圖中可以看出,我用到STC12C5A60S2型號的單片機第五路I/O口的第六引腳(P4.5)。這個引腳的應用只需設置寄存器P4SW就可以了。
其次,本次設計我沒有用到單片機的復位功能。當單片機本的復位引腳的電平變化有持續兩個時鐘周期的高電平時,單片機復位。由于本次設計是個小型設計,不涉及到單片機中的看門狗等涉及到復位的程序編寫,更不存在死機等問題。所以沒有設置復位按鍵,直接將復位引腳接地使其永不復位。這樣做節省了資源。
單片機的P1口的前六個引腳接按鍵設置,P0口各個引腳和DS12887的八個數據引腳一一對應。P2口的前四個引腳分別連接四路MAX7219的片選信號角,當該引腳輸入低電平時,選中該MAX7219芯片;P2口的第五腳同時連接四路MAX7219的數據輸入腳,第六腳同時連接四路MAX7219的時鐘輸入腳。關于寄存器的設置我將在程序的編寫部分做詳細的介紹。
3.2 按鍵掃描電路
按鍵掃描電路用I/O口P1的前六個引腳控制按鍵的掃描。這種掃描設計用較少的引腳資源,掃描較多的按鍵。按鍵掃描電路只需掃描九個按鍵就可以了,六個引腳剛好可以設置六個按鍵的掃描。由于掃描按鍵的時候,I/O口P1的前六個引腳數值在不斷地變化,所以在不影響其它顯示數據的時候,按鍵掃描電路所對應的引腳最好設置為單獨的I/O口。這樣做為自己程序的編寫帶來方便。下圖是按鍵掃描電路:
圖3-2 按鍵掃描
從上圖可以看出,控制I/O口P1的輸出,使P1的輸出腳的數值為十六進制數0xfe,即P1的第一腳輸出低電平,其它七個引腳輸出高電平。當按下按鍵S0時,P13被拉為低電平,使相應的I/O口引腳被拉低。當在程序中檢測到P1^3的數值為0時,就可以判定按下的時按鍵S0。同樣的道理判斷其它八個按鍵。這就是按鍵掃描的原理。
最后,在每個引腳接一個10K歐姆的電阻并連接到電源端是為了初始化這些引腳的初始狀態,防止這些引腳的狀態任意選擇,導致電路的不穩定和程序結果運行的不穩定。
3.3 時鐘電路
在時候模塊,我用DS12887來設置并接受時間信號。DS12887與主控芯片的連接圖與下圖所示:
圖3-3 時鐘電路
在上圖中,DS12887的數據輸入輸出引腳與單片機的P0口連接。引腳P27與DS12887的片選信號腳連接,通過控制引腳P27來控制DS12887的開通。在合成出租車計價器的最終結果,時間是一直在顯示的,所以引腳P2^7輸出低電平,使DS12887一直處于工作狀態。
在這里需要注意的是DS12887的AS數據讀寫控制信號腳與單片機的ALE腳相連接。這個腳是擴展I/O口P4的第六個引腳,在電路上用到該引腳時,需要在編寫程序時設置相應的寄存器。關于寄存器的設置我將在程序的編寫部分做詳細的介紹。
3.4 數據顯示模塊
數據顯示部分是本次設計中的關鍵部分,在這里我會詳細的介紹。
3.4.1 電路原理圖
數據顯示模塊一共用到32個數碼管來顯示時間、乘客需要支付的乘車費,起步價和單價。為了節省引腳資源,用四個MAX7219來控制這些數碼管。每個MAX7219芯片控制八個數碼管。四個MAX7219的工作原理是一樣的,所以在這里我只介紹一個MAX7219芯片控制八個數碼管。其原理圖與下圖所示:
圖3-4 數據顯示
3.4.2 工作原理
由圖2-4可以看出MAX7219的DIG所對應的八個引腳分別對應八個數碼管的共陰極。控制這八個引腳的電平的變化可以控制八個數碼管的開和關(DIG某一腳輸出低電平時,相應的數碼管亮;輸出高電平時,相應的數碼管滅)。
數碼管的的數據端與MAX7219的數據端分別對應連接,SEG A到SEG G用來控制數碼管上顯示不同的數,SEG DP控制數碼管上的小數點。每個數碼管在MAX7219中有相應的數據地址,將要在數碼管中顯示的數據寫在這些地址里。通過單片機打開相應的MAX7219芯片,向MAX7219芯片的數據地址寫相應的數據,MAX7219芯片就會控制不同的數碼管顯示不同的數據。
用同一個數據單口在不同的數碼管上顯示不同的數據是動態掃描的結果。數據輸出端口在一個時間點只能輸出一個數據并將這個數據送到相應的數碼管上顯示。每個數碼管從控制芯片中得到數據到顯示數據所用的時間非常短,八個數碼管顯示不同的數據所用的總時間也非常短。這就在我們的視覺上造成一個誤差。
在第一個數碼管顯示數據后,我們將數據輸入到第二個數碼管時,第一個數碼管已經關了。后面的數據的顯示也是這樣的。這樣一來我們看到的理論情況應該是這樣的:八個數碼管不同時顯示數據,最多只有一個數碼管顯示數據。事實上,八個數碼管確實是理論上這樣顯示數據的,但是在第一個數碼管關掉到第二個數碼管實現數據的時間間隔非常短,小于千分之一秒,人眼不能分辨。正是這個原因,我們才可以看到32個數碼管顯示不同的數據。
對于MAX7219的寄存器的設置我將在程序的編寫部分做詳細的介紹。
3.5 原理圖設計軟件
在畫電路原理圖的時候,我用的是Cadence軟件,而不是DXP軟件。和DXP軟件相比,Cadence軟件具有以下幾點優勢;
(1)Cadence軟件中的工具比DXP軟件中的多。Cadence軟件是現在軍工業做PCB設計時用的主流軟件,它可以設置各種設計師能夠想到的問題。
(2)在Cadence軟件中建立庫文件的時候,可以在一個庫中同時建立幾個元器件而不需要將設計的元器件保存后再設計其它的元器件。
(3)在Cadence軟件中畫元器件的封裝的時候,我們可以根據元器件的文檔資料來設置電子元器件的各個信息,可以使元器件的各個引腳的信息明確。在DXP軟件中,只有元器件的引腳類型只有幾種選擇。
(4)當一個電路原理圖非常大而不能在一個界面將原理圖畫完時,DXP軟件需要畫一個總原理圖框架;而Cadence軟件只需建立一個原理圖工程,然后在各個頁面畫不同部分的原理圖即可。就這點而言,Cadence軟件更加實用,更加方便。
(5)在DXP軟件中畫完電路原理圖后,需要操作若干步驟后才能夠讓軟件檢查自己的電路圖是否有出錯的地方;而Cadence軟件只需在一個界面選擇自己將要檢查的項目,Cadence軟件就會在自己出錯的地方用亮色顯示,甚至會檢查出原理圖中不正確的連線。
(6)在Cadence軟件中,我們可以通過將電子元器件的各個屬性填寫在表格中來畫引腳較多的芯片。
(7)Cadence軟件中表示電子元器件的封裝信息,我們通過這些信息生成該電路原理圖的網表。這個網表將會在畫PCB板時自動的選擇電子元件并且自動的布線,我們所要做的就是將這些電子元件排版就可以了。
第四章 程序的編寫
4.1 編譯環境
本次設計的程序編寫是在KEIL中進行的。單片機版的KEIL軟件自帶了多種單片機的頭文件,在這些頭文件中定義了單片機的各個寄存器。這些寄存器包括單片機的I/O 口的地址指示;特殊寄存器的地址指示,中斷寄存器的地址指示,中斷優先級的設置等。
KEIL軟件中有連接路徑設置,可以將程序的頭文件和各個子文件與程序的主文件相連接,使主文件能夠調用這些文件中的函數及變量。KEIL軟件的編寫語言為C語言和匯編語言。
用C語言或者匯編語言寫完一個程序后,只需點擊檢測按鈕KEIL軟件就會檢測出程序中除邏輯外的錯誤,并指出出錯的地方所在的位置。同時KEIL軟件還會將程序中檢測到的沒有用到的變量和函數設置為警告,這些沒有用到的變量和函數會占用程序的空間資源,將這些沒有用到的變量和函數去掉后,會提高最終生成的文件的運行速度和程序的穩定性。
KEIL軟件的連接器件所組成的按鈕將程序的所有文件連接在一起生成可以燒入單片機的HEX文件。
除此之外,KEIL軟件還有仿真功能。在仿真功能中,我們可以設置單片機的晶振頻率。通過單片機的晶振頻率,我們可以比較精確的設置程序的每一個步驟執行時所用的時間。仿真功能中還可以顯示單片機各個I/O口引腳在不同時刻電平的高低情況。通過這些I/O口引腳電平的變化情況,我們既可以在將程序燒入單片機中之前,檢測程序的結果,又能夠在自己分析不出自己的錯誤原因時,快速的找到自己邏輯錯誤點。最重要的一點,我們可以利用這個功能在硬件電路沒有完成前開始編寫程序。
4.2 燒寫軟件
STC_ISP_V480是我這次設計所用到的燒寫軟件。這款軟件提供了將HEX文件燒入STC系列的單片機中的時所需要的STC芯片類型。
4.3 程序的編寫
4.3.1 頭文件
一般用KEIL軟件編寫程序時,選擇的都是ATMEL公司的51系列的單片機芯片。51系列的單片機的結構大體上都是一樣的,所以它的頭文件的設置的主體都是一樣的,即使有不一樣的地方,只需再重新在主文件中加載設置就可以了。
但是本次設計所用到的單片機型號是STC12C5A60S2,這個單片機不僅包含了AT89S51頭文件中的一些設置,同時它自己還有很多寄存器設置。所以本次程序編寫的頭文件為STC12C5A60S2.H。
4.3.2 擴展I/O口P4的寄存器設置
訪問STC12C5A60S2單片機的P4口,需要一些特殊的設置。這種型號的單片機的P4口的位地址為0XC0H,在STC12C5A60S2單片機的頭文件中的定義為P4為0xC0。定義了P4口的位地址后還需要設置P4SW寄存器才能夠同使用一般I/0的方法那樣使用P4口。P4SW的寄存器的位地址為0XBBH。關于這兩個寄存器我們所用到的只有P4口的第六位P4.5及P4SW寄存器的第六位ALE_P4.5,其設置于下所述:
ALE_P4.5的值為0時,ALE_P4.5的作用和一般的單片機是一樣的,為ALE信號腳,只有訪問片外擴展器件時,ALE信號腳才會出現高低電平的變化。
ALE_P4.5的值為1時,ALE信號腳被設置成單片機擴展I/O口P4的P4.5。在原理圖中P4.5用來控制DS12887的AS信號腳。
4.3.3 MAX7219.H文件
在 MAX7219文件中,我定義了六個引腳,兩個函數。六個引腳用來控制MAX7219芯片的選擇和數據的傳輸。前四個引腳為MAX7219芯片的片選信號,定義為:ml1為P20;ml2為P21;ml3為P22;ml4為P23;這四個引腳定義是用來選擇MAX7219芯片的,當選擇一個MAX7219芯片時,這個MAX7219芯片對應的片選信號引腳值為0。同時這四個芯片的片選信號引腳值在一個時間點最多一個為0。例如單片機選中第一個MAX7219芯片時, ml1值為0,ml2為1,ml3為1,ml4為1。最后兩個引腳定義為 dinP24;clk為P25。din是四個MAX7219芯片共同的串行數據輸入輸出端。clk為時鐘頻率輸入端,輸入的頻率為單片機的主頻率。
兩個函數的定義分別為: void write_address(unsigned char address,unsigned char data1,unsigned char number); void init_max7219();
這兩個函數都是無返回值的函數。第一個函數用三個功能:(1)選擇MAX7219芯片,這是由該函數中的參數number來實現的。number的值只有四個:1,2,3,4。number的值為1時,在第一個函數中就會選中第一個MAX7219芯片,其在函數中的實現為 ml1為0,ml2為1,ml3為1,ml4為1。當number為其它值時,會選擇相應的MAX7219芯片。除此以外,第二個函數的第一個參數為寄存器的地址,第二個參數為第一個參數地址寄存器的輸入的數據。
第二個函數用來初始化MAX7219芯片。MAX7219芯片內部有很多寄存器,只有了解這些寄存器的作用及其設置,才能夠正確無誤的使用MAX7219芯片。
MAX7219芯片的寄存器及其設置:
(1)掉電模式下的寄存器的地址為0XOCH,其輸入數據有兩個,0X01H和0X00H。當輸入數據位0X00H時,MAX7219芯片會將數碼管全部關閉;當輸入數據0X01H時,MAX7219芯片將掃描限制控制寄存器所選擇的數碼管打開。
(2)譯碼模式寄存器的地址為0X09。譯碼模式寄存器用來設置數據的現實方式。當輸入數據為0X01H時,譯碼器對數據寄存器的低四位進行譯碼(BCD碼),此時數據寄存器的最高位為小數點位。當輸入的數據為0X00H時,譯碼模式寄存器選擇不譯碼,此時MAX7219芯片控制數碼管的方式與單片機直接控制數碼管的方式相同。
(3)亮度控制寄存器的地址為0X0AH。數碼管的亮度是通過電流脈沖的寬度來調節的,亮度控制寄存器將數碼管的亮度由強到弱分為十六個等級,輸入的數據從0X0FH到0X00H。輸入的數據越大,數碼管的亮度越強。
(4)掃描控制寄存器的地址為0X0BH。掃描控制寄存器用來控制數碼管顯示的個數,若八個數碼管同時顯示,掃描控制寄存器將以800HZ頻率對這八個數碼管進行數據掃描。在本次設計中需要八個數碼管同時顯示,所以這里就在掃描控制寄存器中輸入數據0X07H。
(5)顯示檢測寄存器的地址為0X0FH。其輸入數據有兩種,對應著兩種狀態。 輸入數據0X00H,顯示檢測寄存器的工作狀態為正常,此時可以開始向數碼管中寫數據了。 輸入數據0X01H,顯示檢測寄存器的工作狀態為檢測,只點亮數碼管而不能向MAX7219芯片的其它寄存器中輸入數據。
(6)0X01H到0X08H所在的數據寄存器分別對應著八個數碼管。在這些數據寄存器中輸入OXOOH到0X09H,其相應的數碼管中將顯示數據0到9;在這些數據寄存器中輸入0XFFH,將會關閉相應的數碼管。
(7)MAX7219芯片的初始化: 打開掉電模式寄存器,設置其工作狀態為正常模式,即在掉電模式寄存器中輸入數據0X01H; 設置顯示檢測寄存器的工作模式為顯示模式,即在顯示檢測寄存器中輸入數據0X00H; 設置譯碼模式寄存器的狀態為譯碼模式,即在譯碼模式寄存器中輸入數據0XFFH;④ 設置亮度控制寄存器,設置數碼管的亮度;⑤ 設置掃描控制寄存器,使寄存器能夠同時掃描八個數碼管。
4.3.4 DS12887.H文件
DS12887為時鐘顯示芯片。DS12887自帶晶振和電池,可以在掉電的時候自動的運行10年,還可以將時間信號保存到其內部的存儲器中。DS12887顯示時間的模式有很多種。例如,其顯示小時的模式可以為12小時制的也可以是24小時制的,當小時的計算模式為12小時制的時候,有AM和PM提示。
DS12887芯片內部有多個寄存器用來存儲或設置DS12887芯片的現實模式,下面來介紹各個寄存器的地址及該寄存器存儲的數據范圍:
(1)秒寄存器地址為0X00H,這個寄存器中存儲的是當前的時間秒,數據模式為BCD模式和二進制模式。
(2)秒鬧鐘寄存器地址為0X01H。這個寄存器中設置的是鬧鐘的秒。這個寄存器的數據模式和秒寄存器的一樣。
(3)分鐘寄存器的地址為0X02H。這個寄存器中存儲的是分鐘的信息,當秒寄存器的數據從0X3BH或者二進制數111011變為0X00H或者0時,分鐘寄存器中的數據自動加一。
(4)分鐘鬧鐘寄存器的地址為0X03H。這個寄存器中存儲的時鬧鐘的分鐘信息,其用法和秒鬧鐘寄存器的用法是一樣的。
(5)小時寄存器的地址為0X04H。在這個存儲小時信息的寄存器中,數據的存儲模式有兩種: 12小時模式; 24小時模式。當寄存器B的第二為的值為1時,小時寄存器存儲模式為24時制;當寄存器B的第二為的值為0時,小時寄存器存儲模式為12時制。
(6)小時鬧鐘寄存器的地址為0X06H。該寄存器存儲的是鬧鐘的小時信息,小時的設置模式與小時寄存器的一樣。
(7)星期寄存器的地址為0X07H。該寄存器中存儲的是星期信息,當寄存器中的數據值為0時,表示今天是星期天;數值為2表示今天是星期一,其它幾天的顯示以此類推。
(8)日期寄存器的地址為0X07H。日期寄存器中存儲的是日期信息。它的取值范圍受月份寄存器和年份寄存器共同的的影響。例如,月份寄存器中的數值為0X01H時,該寄存器的數值最大為0X1F;年寄存器存儲的數值為0X00H,月份寄存器中的數值為0X02H時,該寄存器數值最大為0X1CH。
(9)月份寄存器的地址為0X08H。寄存器中存儲的為月份信息,取值范圍為0X01H到0X0BH。
(10)年份寄存器的地址為0X09H。寄存器中存儲的為年份信息,取值范圍為0X00H到0X63H。在顯示器上顯示年份的時候,我們會自己將本世紀的數加到年份數的前面。
(11)寄存器A的地址為0X0AH。 其最高位為UIP,更新標志位。當寄存器A的最高位的值為1時,表示DS12887芯片即將進行更新。當期數值為0時,表示至少244微秒內芯片不會更新。當芯片不更新時,我們可以讀各個寄存器中的數據,也可以將數據寫入各個寄存器匯中進行設置。 寄存器A的第五、六、七位時用來啟動和關閉晶體振蕩器和復位分頻器的。當寄存器A的第五、六、七位的值分別為0,1,0時,晶體振蕩器打開,同時保持時鐘運行;當寄存器A的第五、六、七位的值分別為1,1,X(X值可以是0,也可以是1)時,晶體振蕩器打開,復位分頻器保持復位狀態。 寄存器A的低四位是用來設置其它寄存器的。
(12)寄存器B的地址為0X0BH。對于程序的編寫,熟練掌握寄存器B用法,將會為調試工作帶來很多便利。 寄存器B的最高位SET用來設置DS12887芯片是否更新,當該位的值為0時,DS12887芯片可以更新;當該位的值為1時,禁止DS12887芯片更新。在寫程序的時候一般設置該位的值為0; 寄存器B的第七位PIE為周期中斷輸出控制,當該位的值為0時,周期中斷將不會輸出;當該位的值為1時,周期中斷可以輸出到IRQ。 寄存器B的第六位控制鬧鐘中斷,當該位的值為0時,鬧鐘中斷將不會輸出;當該位的值為1時,鬧鐘中斷可以輸出到IRQ。④ 寄存器B的第五位控制更新結束中斷,當該位的值為0時,更新結束中斷將不會輸出;當該位的值為1時,更新結束中斷可以輸出到IRQ。⑤ 寄存器B的第四位SQWE值為0時,SQW腳輸出低,當該位值為1時,SQW腳輸出設定頻率的方波。⑥ 寄存器B的第三位DM位的值為0時,時、分、秒、年、月、日等寄存器中的數據格式為二進制;DM值為1時,這些寄存器中的數據格式為BCD碼。⑦ 寄存器B的第二位24/12,當寄存器B的第二位值為1時,小時寄存器和小時鬧鐘寄存器的小時模式為24時制;當該位值為0時,小時寄存器和小時鬧鐘寄存器的小時模式為12時制。 ⑧ 其余的幾個寄存器主要是用來控制一些中斷的,在本次設計中沒用到,在這里就不做介紹了。
(13)DS12887芯片內部有兩段RAM可以用來存儲數據。這兩段RAM地址范圍為0X0EH到0X30H和0X33H0X7EH。可以將掉電情況下需要保存的數據存儲到這兩段地址中。
在DS12887.H文件中,我一共定義了四個引腳,四個函數。它們分別為: 引腳定義,dds為P37;drw為P36;dcs為P27;das為P45; 函數定義,第一個函數,void write_ds12887(unsigned char add,unsigned char date);第二個函數,unsigned char read_ds12887(unsigned char add);第三個函數,void init_ds12887();第四個函數,void set_time()。
dcs為片選信號腳,該腳的電平為低時,選中DS12887芯片。dds為總線數據輸入輸出控制角,當dds的值為1時,表示DS12887芯片正在輸出數據,即單片機從DS12887芯片中讀出數據。das為地址鎖存引腳。drw為讀寫控制引腳,drw值為1時,從DS12887芯片中讀出數據;drw的值為0時,將數據寫入DS12887芯片中。
void write_ds12887(unsigned char add,unsigned char date)作用是向相應的寄存器或者地址寫數據:函數的第一個參數為將要寫入數據的地址,第二個參數為將要寫入的數據。該函數無返回值
unsigned char read_ds12887(unsigned char add)的作用是從一個地址中讀取數據,該函數的參數為將要讀取數據的地址。該函數的返回值為參數地址所保存的數據。
void init_ds12887()為DS12887芯片的初始化函數,無返回值。在該函數中先設置寄存器A的值為0X20H,此時開啟了晶體振蕩器,保持時鐘芯片的運行。然后設置寄存器B的值為0X26H,使DS12887芯片正常更新運行的同時禁止DS12887芯片的各個中斷的輸出,最重要的是設置小時的模式為24時制,各個寄存器數據輸出模式為BCD碼。
第一次使用一個DS12887芯片時,不僅要初始化DS12887芯片,還要將DS12887芯片中的時、分、秒、年、月、日等信息設置為現在時刻的數據。void set_time()為無返回值函數,沒有輸入參數。這是我在時鐘模塊中留下的一個擴展模塊,防止以后需要修改時間用。我以前編寫過DS12887芯片的時間設置程序,我用這個程序來設置本次設計中DS12887芯片的第一次時間顯示。
4.4 主程序
按鍵控制模塊的工作原理我在前面已經詳細的介紹了,在這里就不做介紹了。由于主程序不僅涉及函數和引腳的定義,還涉及到程序的流程及各個功能的實現,所以我將主程序部分獨立的作為一節。
4.4.1 主程序流程圖
圖4-1 程序流程圖
4.4.2 主程序分析
上面的流程圖是我設計將我的第一個流程圖修改多次并驗證得到的。我將這個流程圖寫成具體的程序,程序運行的結果為自己想要的結果的。下面將來分析流程圖的功能實現。
(1)合成出租車的起步價、單價和時間的修改。合成出租車的初始化信息一般由出租車公司統一管理,所以在數碼管顯示的合乘出租車計價器中設置了密碼權限,同時這個密碼只有出租車公司自己知道。 當出租車的起步價、單價有變化時,出租車公司只需輸入密碼修改起步價和單價和不需要從燒寫程序到單片機中,也不需要將計價器從車上卸下來,更不需要重新修改計價器的PCB板。 不同地方的出租車的顯示時間也不相同,當出租車公司需要修改出租車的時間時,其修改方式和修改出租車的起步價和單價的方式一樣。 由程序流程圖可以看出,當出租車公司修改這些信息時,出租車上沒有乘客,數碼管不顯示,程序可以自動的得到這些信息而進入信息修改部分。
(2)乘客的費用顯示和計算。當有乘客上車時,出租車司機按下計費開始按鍵,表示上來了一個乘客,開始計費。在顯示該乘客費用的數碼管部分顯示起步價,之后每過五分鐘,乘客的數碼管的費用會自動加上單價。
(3)出租車上乘客人數的判斷。出租車上最多可以承載四個人,當車上的人數不到四人時,有人上車,上車的人的計費方式與(2)中的計費方式類似;當車上的人數超過四人時,出租車將不在搭載新的乘客。
(4)當有乘客下車時,出租車司機按下該乘客所對應的計費結束鍵,使該乘客所對應的顯示費用的數碼管停止計費。同時,關閉該乘客的所對應的數碼管。
(5)出租車上的乘車人數與出租車的付費人數有時是不一致的。出租車上的付費人數有二極管指定,二極管的亮起的個數為需要付費乘客的人數。
(6)當出租車上沒有乘客時,從流程圖上可以看出,程序將判斷是否修改起步價、單價等信息,若不修改這些信息,出租車上的數碼管只顯示時間。
4.4.3 主程序代碼分析
主程序中連接了其它程序塊外,還定義了一些函數和變量。下面我將詳細的介紹這些函數和變量的作用。
(1)我在主程序中定義了很多變量。 字符型的數組有mima[4],shuzu[4]:mima[4]用來設定原始密碼,shuzu[4]用來存儲修改起步價、單價等信息時輸入的密碼。在主程序中將這兩個密碼相比較,若兩個數組對應的數據相等,則可以修改起步價、單價等信息,否則不可以。字符型的變量有miao0,miao1,fen0,fen1,d1,change,
qibujia,danjia。miao0和miao1用來判斷時間是否過了一秒,時間顯示數碼管上的小數點閃爍的時間間隔為一秒。fen0和fen1用來判斷時間是否過了五分鐘。若過了五分鐘,每位乘客需要需支付的乘客費自動加上出租車單價,相應的數碼管也會顯示現在的乘車費;否則數碼管上顯示的需要支付的費用不變。change用來標識是否需要修改起步價、單價等信息。change的數值為1時,修改信息,為0時,不修改信息。
(2)主程序中定義的函數有:第一個函數為void close_deng(),這個函數是用來關閉指示付費乘客的二極管。第二個函數為void display_time(unsigned char number),這個函數用來顯示時間。第三個函數void display_guke(unsigned int a[]),這個無返回值函數用來點亮指示付費乘客的二極管。第四個函數為void
display_danjia(unsigned char danjia,unsigned char address,unsigned char number),這個函數用來顯示各個需付費乘客需要支付的費用。
(3)根據上面幾個函數和變量的介紹,再加上前面幾個模塊函數及其各引腳的定義,主程序就很容易理解了。這里就不做深入的介紹了。
4.5 程序運行結果
經過我多次的修改修改程序,程序的運行結果不經可以實現任務書中的基本功能,還為本次的設計在未來的使用中留下來很多可以擴展的部分。這樣做的目的是,當合成出租車的起步價、單價等信息出現變動時,我既不需要編寫程序,也不需要修改電路板,可以節省很多的成本。
至此,本次設計已完成了一大半,接下來要測試數碼管顯示的合乘出租車計價器的整體穩定性。
第五章 設計實物的測試和調試
5.1 測試目的
從一個用產品的角度看,我認為一個好的設計,它最重要的地方不是它能夠實現設計的基本要求,也不是它的成本比一同類設計低很多甚至低很多倍,更不是它的創意的目光獨特,而是這個設計的質量。檢測設計的質量就是測試最重要的測試項目。
5.2 測試項目
5.2.1 功能測試
不同的人完成同一個設計,其結果是不同的。所以在測量設計的功能時,不僅要測量設計任務書上的基本要求的功能,還要測量擴展的功能。在這里,任務書上的基本功能要著重測量。
5.2.2 穩定性測試
今年我在一家電腦設計及生產公司實習了三個月,第一個月我主要是測試、維修電腦主板等電子產品。我所實習的單位的產品都是工業級別,產品的要求非常嚴格。參照其要求,我對自己的設計也做了的相關的要求。
本次設計是我第一次設計的產品,我非常希望有一天它可以用到人們的日常生活中。所以我希望我的設計實物有非常強的穩定性。
對于本次設計的穩定性,我有以下幾點要求:在突然斷電后再上電時,產品顯示正常;設計說明書上的每一個操作,我的設計都能夠準確無誤的實現;我的設計在運行的過程中不會出現錯誤。
對于設計的第一點,我將會不停地斷電和上電,每一次上電時我將會記錄顯示的數據,看起是否顯示正常。若有一次顯示不正常,我將會檢查修改電路和程序,直到數碼管顯示的合乘出租車計價器每一次的顯示的數據都準確無誤。
測試項目的第一點通過之后才可以檢測測試項目的第二項。在這一項,我做的有兩點。第一點,按照設計說明書上的步驟,先自己檢測操作十遍。顯示的結果準確無誤后,找十個不同的人操作一遍,若顯示的結果正確,進行下一項;否則,需要重新修改自己的程序。第二點,按照設計說明書上的操作步驟,在不同的操作步驟中執行錯誤的操作。若無論執行任何錯誤操作,數碼管都只顯示時間,說明設計無問題,否則需要重新修改設計程序。
最后一項關系到人們生活的利益。從出租車司機的角度和乘客的角度看,沒有人會希望自己某一次乘車時,數碼管顯示錯誤的數據。當數碼管顯示出現錯誤時,將會造成一系列不良的后果。首先,司機和乘客之間不能夠正確的收取或支付乘車費;其次,司機和乘客不知道在路上行駛的時間。測試最后一項:我將按照工業的標準,是我的數碼管顯示的合乘出租車計價器在所有的數碼管顯示的情況下運行48小時,若運行的過程中數碼管顯示正常,則表示數碼管運行正常。否則需要修改電路板。
每一次測試結果出現錯誤數據顯示時,都需要確定出現錯誤的原因,確定不是程序和電路板出現問題時需要重新測試該項。否則修改程序或者電路板。
5.3 測試并調試結果
完成一個設計的程序和電路板使人的自信心得到增強,但是當檢測到這個設計出現問題時,作為設計本人,我將感覺到設計就像一只刺猬,無處下手。
在測試的過程中,我發想了一些電路板和程序上的問題。根據這些問題,我做了一些相關的修改。由于這是我第一次做設計,所以在測試的時候發現了很多問題。在這里,我會詳細的介紹幾個給我留下深刻印象的問題。
(1)我沒有拿到我的電路板時,我根據設計原理圖將主程序寫完了。但是當我將這個程序生成HEX文件燒進電路板時,數碼管不顯示時間,也沒有顯示小數點。當時,我做的第一件是接了一個萬用表。我先按照電路原理圖將電路板的各個元器件測量一遍,發現元器件焊接無問題;之后,我測量這些元器件各個引腳的與那些現在同一條線上,發現也沒有問題。
發現電路板無問題后,我開始檢查我寫的程序。最后我發現我在芯片MAX7219的初始化中少加了一行代碼。這段代碼的作用是用來打開MAX7219芯片的。
(2)打開芯片MAX7219后,數碼管開始顯示數據。但是時間不能夠正確的顯示。我查了以下DS12887芯片在電路圖上的連接線,發現DS12887的地址鎖存引腳連接與單片機的擴展I/O口P4的地第六腳相連接。我做相關的設置后,時間可以正常顯示。
截止到目前,各個基本功能調試成功,接下來將會正式的開始測試。
(3)在不斷地開關電路板的電源時,我發現電路板的時間顯示極不穩定,經常在上電時顯示時間的部分數碼管出現亂碼,有時其實現實時間,數字也會閃爍。但是當我將合乘出租車計價器固定時,這些情況也都消失了。本次設計的實物時兩塊電路板連接起來的,在電路板的連接部分,電路板有時會接觸不良。只要在上電前檢查兩塊電路板是否連接牢固就可以了。
(4)調試上面一項的出現的問題的過程中,我有一次將DS12887芯片從電路板上取下來。然后我重新插上DS12887芯片時,數碼管不顯示時間了,也不現實亂碼。只顯示我初始化的時間。我摸了一下芯片DS12887,發現該芯片發熱,我意識到時芯片插錯了。
(5)在執行我自己寫的操作說明書上的步驟的過程中,我發現了很多問題。根據這些問題,我對程序做了相關的改動:
我第一次按下乘客的開始計費按鍵時,相應的數碼管開始計費;但是該乘客對應的指示二極管亮。在本次設計中,指示二極管代替數碼管中不需要用到數碼管的小數點,所以這些小數點由芯片MAX7219控制。我檢查程序時發現自己在上次調試時間的時候將指示功能關掉了。
數碼管顯示的合成出租車計價器的計費方式與一般的出租車不同。合乘出租車的起步價將隨著出租車上的付費人數變化而變化。同一時間,出租車上的付費人數越多,起步價越低。
在出租車上有乘客的情況下,每上一個付費乘客,出租車上付費乘客將要支付的費用作出相應的變化,但是這個變化是有個底線的。正是沒有設置這個底線,我的出租車的起步價有出現負數的情況。
數碼管現實的合乘出租車計價器可以同時顯示四個乘客乘車費用,有四個按鈕來停止計費。表示這些乘客下車了。操作的過程中,我發現但我按下停止計費按鈕時,對應的數碼管不停止計費,而另一組數碼管停止計費關掉了。這是程序邏輯問題,我已修改過來。
④關于本次設計,我所做的擴展部分:出租車公司可以輸入密碼來修改出駐車的起步價、單價等操作,沒有發現問題。至此,程序的操作完成了,即完成了測試項目的前兩項。
⑤在程序的運行48并顯示檢測其運行結果的測試項目中,我沒有運行連續運行48小時。我連續運行了6小時,并且連續運行了一個星期。第一天的我發現數碼管只顯示起步價,是程序出錯。修改了程序后,連續運行一個星期,每次數碼管的顯示結果都是126.4(按出租車的平均行駛速度為每小時12千米),其中起步價為4元,路程費為122.4元。至此,完成數碼管顯示的合乘出租車計價器的調試和測試項目,即完成數碼管顯示的合乘出租車計價器的實物。
5.4 測試與調試后的總結
測試出設計的錯誤地方,然后修改程序,調試結果顯示。測試和調試是密不可分的。上面我介紹的我在測試問題后的修改程序或者檢查電路等其實就是在做調試。所以我就不在獨立的介紹調試部分了。
從電路圖的設計到實物的合格,發費時間最多的部分就是設計實物的測試和調試。這一部分我一共發了三周的時間。若我現在重新設計一個類似的項目,我將能夠大大的縮短自己測試和調試部分的時間。下面是縮短這部分時間的一些總結:
每一次將程序生成的HEX文件燒入到單片機中,都要查看自己燒入的HEX文件是否為自己剛剛編譯生成的文件。
當確認程序出現問題時,做的第一件事應該是看看自己是否正確的燒入HEX文件。若正確燒入HEX文件,就沒有必要反復地編譯未修改的程序代碼,更沒有必要反復的重新生成HEX文件。只需編譯一次,重新生成一個HEX文件就可以了。
重新燒入編譯生成的HEX文件后,若程序運行的結果不變,則說明需要修改程序。
當發現一個不知道為什么出錯的問題時,做的第一件事就是再次檢查自己的電路板,看其是否出錯。若不出錯,用其它的開發板檢查自己的程序。
④不同模塊實現的功能是不同的函數隔離開。同時,不同的函數之間不存在數據相互影響的問題,以防止出現亂碼。
第六章 總 結
通過制作數碼管顯示的合乘出租車計價器,我不僅了解了類似的電子產品的設計開發過程,還認識到自己的一些不足之處。
6.1 設計開發流程總結
(1)我們拿到一個類似于數碼管顯示的合乘出租車計價器的設計時,我們所要做的第一件事不是去買材料。我很多同學拿到設計后就去買材料去了,結果浪費了一天時間還不知道沒什么電子元器件。電子元器件和設計要實現的功能是聯系在一起的,不同的功能需要不同的元器件。只有確定了電子元器件后,我們才能夠確定需要買什么元器件。
(2)在買電子元器件時,還需要注意幾點問題:首先確定控制芯片,查看工作頻率,工作電壓等是否是自己需要的;選擇元器件的時候,要查看改元器件是否能夠工作在自己所選擇控制芯片的工作頻率下工作;若要買電路模塊,一定要有電路模塊的詳細資料。這樣不僅為程序的編寫帶來便利,還能夠避免因為連接錯誤而導致電路模塊燒壞或者損壞電路主板。
(3)選擇完電子元器件后,就是設計電路原理圖了。畫電路原理圖的時候,先將各個模塊的原理圖分別畫出并焊接到不同的動動板上,主控制芯片模塊也單獨焊接在一塊動動板上。分別將各個功能模塊與主程序模塊相連接,并燒入測試程序,檢查該功能是否正常。無論模塊的檢測結果是否正常,都將檢測下一個模塊。
所有的模塊檢查完后,分析檢查結果。若所有的功能模塊的檢測結果都不正常,則說明主控制模塊很可能出現問題。否則就是檢測不正常的功能模塊有問題。維修檢測不正常的模塊,直到所有模塊的功能都正常為止。
當所有的模塊功能都檢測正常后,將所有的功能模塊都連接到主控制模塊上。分別在主控制模塊上燒寫各模塊的測試程序。若有不能夠正常運行程序的模塊,修改該模塊與主模塊之間的連接。當所有的模塊都能夠使主控制模塊正常的運行其相對應的程序時,就可以按照模塊間的連接將電路圖畫出來。
(4)畫好電路圖后,就可以根據電路圖畫PCB板了。畫PCB板的時候一定需注意電子元器件的實際封裝。
(5)只有了解了一個電子元器件,才能夠知道怎么通過程序來控制這個芯片。
(6)關于調試和測試部分,我在上一章已經具體的介紹了。
6.2 自我認識
通過設計數碼管顯示的合乘出租車計價器,我更加深刻的認識到自己的一些不足:
(1)在編寫MAX7219芯片模塊的程序的時候,我將MAX7219芯片仔細認真的看了三遍,編寫的程序不能夠使MAX7219芯片控制數碼管。當我看我同學的MAX7219芯片的程序后,我發現自己少設置了一個寄存器。這個問題讓我對自己的自信心產生了懷疑。但是當我用兩個小時幫助一個畫完一個同學的設計仿真圖和寫完相應的程序時,我發現自己可以完成別人一個星期也可能完成不了的問題。當別人對自己或者自己對自己的能力產生懷疑時,我們要做的就是積極的鍛煉提高自己的能力。
(2)除此之外,我發現自己有時不能夠徹底的解決一件事。
在寫本本次設計的程序的時候,我用到了我大三的時候編寫的程序子文件DS12887.H和SKY.H。但是我發現這兩個子文件中的一些函數不具備移植性。
我以前也遇到過這樣的問題,但是我自己覺得調用子文件中的函數時,只需稍微修改一下,不會浪費很多時間的。這個問題不僅使我編寫的程序出現問題,還浪費時間。
(3)在編寫數碼管顯示的合乘出租車計價器的程序的時候,我做過幾次大的改動。每一次大的改動都是我在講自己設計的結果演示我的指導老師查看后,指導老師要求下我才我修改。
每一次我的指導老師指出的問題,我提前已經注意到了,但是我不想修改。最開始的時候,我覺得自己已經實現了任務書中的功能,沒有必要再做修改,或者我覺得自己所發現的問題不影響設計的結果。直到我將程序大改動兩次后,我覺得自己與其浪費時間去修改發現的問題或者需要加上功能,還不與將數碼管顯示的合乘出租車計價器按照其實際的作用完美的設計出來。
致 謝
數碼管的合乘出租車計價器雖然是我自己的畢業設計,但是沒有劉老師的指導和幫助,我將無法完成我的畢業設計。我改寫過很多次程序,也改動過程序的流程圖設計。我的每一次改動都是在劉老師的指導下完成的。
劉老師先從設計的基本功能來檢驗我的設計,然后檢查我的程序的基本操作是否出現亂碼的情況,接著從操作簡便的角度來指導我該向那些方面修改我的設計實物,最后劉老師從實物運行功率的角度考慮我的設計。經過上面的一些指導,我的畢業設計完美完成!
再次感謝劉老師,您辛苦了!
參考文獻
[1]劉和平.單片機C語言編譯及其應用.2006.
[2]馬忠梅.單片機的C語言應用程序設計.2006.
[3]曹國華,單片機原理及接口技術. 西安:西安電子科技大學出版社.2000.
[4]周向紅,范偉. DS12887實時時鐘芯片及應用研究.2006.
[5]陳洪財.基于單片機的模塊化教學研究.電氣電子教學學報.2010.
[6]譚浩強,C程序設計.北京:清華大學出版社.2003.
[7]譚博學.集成電路原理與應用.北京:電子工業出版社.2003.
[8]范立南,李雪飛,尹授遠.單片微型計算機控制系統設計.北京:人民郵電出版社.2004.
[9]郝文化.電路原理圖與PCB設計.機械工業出版社.2004.
[10] 李伯成.基于MCS-51單片機的嵌入式系統設計.電子工業出版社.2004.7.
[11]謝斌.Proteus與Keil在單片機開放性實驗中的應用.電子測量技術.2008.
[12] 沈紅衛.單片機應用系統設計實例與分析.北京航空航天大學出版社.2003.
[13] 張毅剛.單片機原理及應用.北京:高等教育出版社.2003.
[14]郭天祥.51單片機C語言教程.北京:電力工業出版社.2010.
[15]MAX7219顯示驅動芯片中文資料.電子發燒友.
[15]MAX7219顯示驅動芯片外文資料.元器件交易網.
附 錄
1 電路原理圖
附錄 整體設計電路圖
2 程序
2.1 主程序文件
#include “STC12C5A60S2.H”
#include “sky_hechengche.h”
#include “max7219.h”
#include “ds12887.h”
void close_deng();
void display_time(unsigned char number);
void display_guke(unsigned int a[]);
void display_danjia(unsigned char danjia,unsigned char address,unsigned char number);
void main()
{
unsigned char mima[4]={2,0,1,4},shuru[4];
unsigned char miao0,miao1,fen0,fen1,d1=0;
unsigned char change=0,danjia=17,qibujia=80;
unsigned int sky,a[4]={0,0,0,0},b[4]={0,0,0,0},i=0,j=0;
P4SW|=0x20;
init_ds12887();
init_max7219();
fen0=read_ds12887(0x02);
miao0=read_ds12887(0x00);
danjia=read_ds12887(0x30);
qibujia=read_ds12887(0x0e);
display_danjia(danjia,0,2);
display_danjia(qibujia,4,2);
close_deng();
while(1)
{
display_danjia(danjia,0,2);
display_danjia(qibujia,4,2);
fen1=read_ds12887(0x02);
//display_time(d1);
if(fen1==(fen0+5))
{
fen0=fen1;
for(i=0;i<4;i++)
{
if(a[i]1)
{
b[i]+=danjia;
}
else
{
b[i]=0;
}
}
}
//display_time(d1);
miao1=read_ds12887(0x00);
sky=sky_he();
if(sky0)
{
change=1;
for(i=0;i<4;i++)
{
change=sky_he();
write_address(i+1,0x80,1);
while(change==224)
{
change=sky_he();
shuru[i]=change;
}
write_address(i+1,shuru[i],1);
if(shuru[i]!=mima[i])
{
change=0;
close_deng();
return;
}
}
void display_time(unsigned char number)
{
unsigned int time,i;
time=read_ds12887(0x04);
i=time%10;
if(number==1)
{
i=0x80+i;
}
write_address(7,i,1);
i=time/10;
write_address(8,i,1);
time=read_ds12887(0x02);
i=time%10;
write_address(5,i,1);
i=time/10;
write_address(6,i,1);
}
void display_danjia(unsigned char danjia,unsigned char address,unsigned char number)
{
unsigned char i,j;
i=danjia;
j=i%10;
//j=j+0x80;
write_address(address+1,j,number);
j=i/10;
j=j%10;
j=j+0x80;
write_address(address+2,j,number);
j=i/100;
j=j%10;
write_address(address+3,j,number);
j=i/1000;
j=j%10;
write_address(address+4,j,number);
}
void close_deng()
{
write_address(1,0x00,1);
write_address(2,0x00,1);
write_address(3,0x00,1);
write_address(4,0x00,1);
}
void display_guke(unsigned int a[])
{
unsigned int sum=0;
if(a[0]!=0)
{
write_address(4,0x81,1);
display_danjia(a[0],4,3);
}
else
{
write_address(4,0,1);
display_danjia(a[0],4,3);
}
if(a[1]!=0)
{
write_address(3,0x82,1);
display_danjia(a[1],4,4);
}
else
{
write_address(3,0,1);
display_danjia(a[1],4,4);
}
if(a[2]!=0)
{
write_address(2,0x83,1);
display_danjia(a[2],0,3);
}
else
{
write_address(2,0,1);
display_danjia(a[2],0,3);
}
if(a[3]!=0)
{
write_address(1,0x84,1);
display_danjia(a[3],0,4);
}
else
{
write_address(1,0,1);
display_danjia(a[3],0,4);
}
}
2.2 按鍵掃描文件
#ifndef SKYHECHENGCHE
#define SKYHECHENGCHE
//按鍵初始化
sbit d0=P1^0;
sbit d1=P1^1;
sbit d2=P1^2;
sbit d3=P1^3;
sbit d4=P1^4;
sbit d5=P1^5;
void delaySky(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++);
}
unsigned int sky_he()
{
unsigned int returnData=224;
P1|=0x3f;
delaySky(2);
d3=0;
if(d00)
{
delaySky(2);
returnData=0;
while(!d0);
}
if(d10)
{
delaySky(2);
returnData=1;
while(!d1);
}
if(d2==0)
{
delaySky(2);
returnData=2;
while(!d2);
}
}
#endif
2.3 時鐘芯片文件
#ifndef ds12887
#define ds12887
sbit dds=P3^7;
sbit drw=P3^6;
sbit dcs=P2^7;
sbit das=P4^5;
//sbit p45=P4SW^5;
void write_ds12887(unsigned char add,unsigned char date)
{
dcs=0;
das=1;
dds=1;
drw=1;
P0=add;
das=0;
drw=0;
P0=date;
das=1;
drw=1;
dcs=1;
}
unsigned char read_ds12887(unsigned char add)
{
unsigned char aa;
dcs=0;
das=1;
drw=1;
dds=1;
P0=add;
das=0;
dds=0;
P0=0xff;
aa=P0;
dcs=1;
das=1;
dds=1;
return aa;
}
void init_ds12887()
{
write_ds12887(0x0a,0x20);
write_ds12887(0x0b,0x26);
}
void set_time()
{
unsigned char i;
for(i=0;i<10;i++)
write_ds12887(i,0);
}
#endif
2.4 MAX7219芯片文件
#ifndef MAX7219
#define MAX7219
//引腳定義
sbit ml1=P2^0;
sbit ml2=P2^1;
sbit ml3=P2^2;
sbit ml4=P2^3;
sbit din=P2^4;
sbit clk=P2^5;
void write_address(unsigned char address,unsigned char data1,unsigned char number)
{
unsigned char i,address1;
address1=address;
if(number1)
{
ml1=0;
ml2=1;
ml3=1;
ml4=1;
}
else if(number2)
{
ml1=1;
ml2=0;
ml3=1;
ml4=1;
}
else if(number3)
{
ml1=1;
ml2=1;
ml3=0;
ml4=1;
}
else if(number4)
{
ml1=1;
ml2=1;
ml3=1;
ml4=0;
}
for(i=0;i<8;i++)
{
}
void init_max7219()
{
unsigned char i;
for(i=1;i<5;i++)
{
write_address(0x0c,0x01,i);
write_address(0x0f,0x00,i);
write_address(0x09,0xff,i);
write_address(0x0b,0x07,i);
write_address(0x0a,0x05,i);
}
}
#endif
AD0–AD7 (Multiplexed Bidirectional Address/Data Bus)
Multiplexed buses save pins because address information and data information time-share the same signal paths. The addresses are present during the first portion of the bus cycle and the same pins and signal paths are used for data in the second portion of the cycle. Address/data multiplexing does not slow the access time of the DS12887 since the bus change from address to data occurs during the internal RAM access time. Addresses must be valid prior to the falling edge of AS/ ALE, at which time the DS12887 latches the address from AD0 to AD6. Valid write data must be present and held stable during the latter portion of the DS or WR pulses. In a read cycle the DS12887 outputs 8 bits of data during the latter portion of the DS or RD pulses. The read cycle is terminated and the bus returns to a high impedance state as DS transitions low in the case of Motorola timing or as RD transitions high in the case of Intel timing.
AS (Address Strobe Input)
A positive-going address strobe pulse serves to demultiplex the bus. The falling edge of AS/ALE causes the address to be latched within the DS12887. The next rising edge that occurs on the AS bus will clear the address regardless of whether CS is asserted. Access commands should be sent in pairs.
DS (Data Strobe or Read Input)
The DS/RD pin has two modes of operation depending on the level of the MOT pin. When the MOT pin is connected to VCC, Motorola bus timing is selected. In this mode DS is a positive pulse during the latter portion of the bus cycle and is called Data Strobe. During read cycles, DS signifies the time that the DS12887 is to drive the bidirectional bus. In write cycles the trailing edge of DS causes the DS12887 to latch the written data. When the MOT pin is connected to GND, Intel bus timing is selected. In this mode the DS pin is called Read (RD ).RD identifies the time period when the DS12887 drives the bus with read data. The RD signal is the same definition as the Output Enable (OE ) signal on a typical memory.
R/W (Read/Write Input)
The R/ W pin also has two modes of operation. When the MOT pin isconnected to VCC for Motorola timing, R/ W is at a level which indicates whether the current cycle is aread or write. A read cycle is indicated with a high level on R/ W while DS is high. A write cycle isindicated when R/ W is low during DS.When the MOT pin is connected to GND for Intel timing, the R/ W signal is an active low signal calledWR. In this mode the R/W pin has the same meaning as the Write Enable signal ( WE ) on generic RAMs.
CS (Chip Select Input)
The Chip Select signal must be asserted low for a bus cycle in the DS12887 to be accessed. CS must be kept in the active state during DS and AS for Motorola timing and during RD and WR for Intel timing. Bus cycles which take place without asserting CS will latch addresses but no access will occur. When VCC is below 4.25 volts, the DS12887 internally inhibits access cycles by internally disabling the CS input. This action protects both the real time clock data and RAM data during power outages.
IRQ (Interrupt Request Output)
The IRQ pin is an active low output of the DS12887 that can beused as an interrupt input to a processor. The IRQ output remains low as long as the status bit causing theinterrupt is present and the corresponding interrupt–enable bit is set. To clear the IRQ pin the processorprogram normally reads the C register. The RESET pin also clears pending interrupts.When no interrupt conditions are present, the IRQ level is in the high impedance state. Multipleinterrupting devices can be connected to an IRQ bus. The IRQ bus is an open drain output and requires anexternal pullup resistor.
REGISTER A
UIP
The Update In Progress (UIP) bit is a status flag that can be monitored. When the UIP bit is a 1, the update transfer will soon occur. When UIP is a 0, the update transfer will not occur for at least 244 ms. The time, calendar, and alarm information in RAM is fully available for access when the UIP bit is 0. The UIP bit is read only and is not affected by RESET . Writing the SET bit in Register B to a 1 inhibits any update transfer and clears the UIP status bit.
DV0, DV1, DV2
These 3 bits are used to turn the oscillator on or off and to reset the countdown chain. A pattern of 010 is the only combination of bits that will turn the oscillator on and allow the RTC to keep time. A pattern of 11X will enable the oscillator but holds the countdown chain in reset. The next update will occur at 500 ms after a pattern of 010 is written to DV0, DV1, and DV2.
RS3, RS2, RS1, RS0
These four rate–selection bits select one of the 13 taps on the 15–stage divider or disable the divider output. The tap selected can be used to generate an output square wave (SQW pin) and/or a periodic interrupt. The user can do one of the following:
REGISTER B
SET
When the SET bit is a 0, the update transfer functions normally by advancing the counts once per second. When the SET bit is written to a 1, any update transfer is inhibited and the program can initialize the time and calendar bytes without an update occurring in the midst of initializing. Read cycles can be executed in a similar manner. SET is a read/write bit that is not modified by RESET or internal functions of the DS12887.
PIE
The periodic interrupt enable PIE bit is a read/write bit which allows the Periodic Interrupt Flag (PF) bit in Register C to drive the IRQ pin low. When the PIE bit is set to 1, periodic interrupts are generated by driving the IRQ pin low at a rate specified by the RS3–RS0 bits of Register A. A 0 in the PIE bit blocks the IRQ output from being driven by a periodic interrupt, but the Periodic Flag (PF) bit is still set at the periodic rate. PIE is not modified by any internal DS12887 functions, but is cleared to 0 on RESET .
AIE
The Alarm Interrupt Enable (AIE) bit is a read/write bit which, when set to a 1, permits the Alarm Flag (AF) bit in Register C to assert IRQ . An alarm interrupt occurs for each second that the three time bytes equal the three alarm bytes including a “don’t care” alarm code of binary 11XXXXXX. When the AIE bit is set to 0, the AF bit does not initiate the IRQ signal. The RESET pin clears AIE to 0. The internal functions of the DS12887 do not affect the AIE bit.
UIE
The Update Ended Interrupt Enable (UIE) bit is a read/ write that enables the Update End Flag (UF) bit in Register C to assert IRQ . The RESET pin going low or the SET bit going high clears to UIE bit.
SQWE
When the Square Wave Enable (SQWE) bit is set to a 1, a square wave signal at the frequency set by the rate–selection bits RS3 through RS0 is driven out on a SQW pin. When the SQWE bit is set to z0, the SQW pin is held low; the state of SQWE is cleared by the RESET pin. SQWE is a read/write bit.
DM
The Data Mode (DM) bit indicates whether time and calendar information is in binary or BCD format.
The DM bit is set by the program to the appropriate format and can be read as required. This bit is not modified by internal functions or RESET . A 1 in DM signifies binary data while a 0 in DM specifies Binary Coded Decimal (BCD) data.
24/12
The 24/12 control bit establishes the format of the hours byte. A 1 indicates the 24–hour mode and a 0 indicates the 12–hour mode. This bit is read/write and is not affected by internal functions of RESET .
DSE
The Daylight Savings Enable (DSE) bit is a read/write bit which enables two special updates when DSE is set to 1. On the first Sunday in April the time increments from 1:59:59 AM to 3:00:00 AM. On the last
Sunday in October when the time first reaches 1:59:59 AM it changes to 1:00:00 AM. These special updates do not occur when the DSE bit is a 0. This bit is not affected by internal functions or RESET .
TIME, CALENDAR AND ALARM LOCATIONS
The time and calendar information is obtained by reading the appropriate memory bytes. The time,calendar, and alarm are set or initialized by writing the appropriate RAM bytes. The contents of the 10 time, calendar, and alarm bytes can be either Binary or Binary–Coded Decimal (BCD) format. Before writing the internal time, calendar, and alarm registers, the SET bit in Register B should be written to a logic 1 to prevent updates from occurring while access is being attempted. In addition to writing the 10 time, calendar, and alarm registers in a selected format (binary or BCD), the data mode bit (DM) of Register B must be set to the appropriate logic level. All 10 time, calendar, and alarm bytes must use the same data mode. The set bit in Register B should be cleared after the data mode bit has been written to allow the real time clock to update the time and calendar bytes. Once initialized, the real time clock makes all updates in the selected mode. The data mode cannot be changed without reinitializing the 10 data bytes. Table 2 shows the binary and BCD formats of the 10 time, calendar, and alarm locations. The 24–12 bit cannot be changed without reinitializing the hour locations. When the 12–hour format is selected, the high order bit of the hours byte represents PM when it is a logic 1. The time, calendar, and alarm bytes are always accessible because they are double buffered. Once per second the 10 bytes are advanced by 1 second and checked for an alarm condition. If a read of the time and calendar data occurs during an update, a problem exists where seconds, minutes, hours, etc. may not correlate. The probability of reading incorrect time and calendar data is low. Several methods of avoiding any possible incorrect time and calendar reads are covered later in this text.
The three alarm bytes can be used in two ways. First, when the alarm time is written in the appropriate hours, minutes, and seconds alarm locations, the alarm interrupt is initiated at the specified time each day if the alarm enable bit is high. The second use condition is to insert a “don’t care” state in one or more of the three alarm bytes. The “don’t care” code is any hexadecimal value from C0 to FF. The two most significant bits of each byte set the “don’t care” condition when at logic 1. An alarm will be generated each hour when the “don’t care” bits are set in the hours byte. Similarly, an alarm is generated every minute with “don’t care” codes in the hours and minute alarm bytes. The “don’t care” codes in all three alarm bytes create an interrupt every second.
NONVOLATILE RAM
The 114 general purpose nonvolatile RAM bytes are not dedicated to any special function within the DS12887. They can be used by the processor program as nonvolatile memory and are fully available during the update cycle.
From:Translated text as part of the DS12887 data I find in the original manufacturer’s official website DS12887.
DS12887
AD0?AD7(雙向復用地址/數據總線)。復用總線節約引腳,因為 地址信息和數據信息的時間共享相同的信號路徑。地址存在 總線周期和相同的引腳和信號路徑的第一部分期間在第二用于數據 循環的一部分。地址/數據復用不慢,因為訪問的DS12887的時間 在內部RAM的訪問時間從地址總線改變數據時。地址必須是有效的 之前,AS / ALE,而在此時,DS12887鎖存從AD0的地址AD6的下降沿。 有效的寫數據必須存在,并且在DS或WR脈沖后部分保持穩定。在 讀周期的DS12887在DS或RD脈沖后部分輸出8位數據。讀 周期終止,總線返回到高阻抗狀態,DS變低的情況下 摩托羅拉的時間或RD變高在英特爾的時間的情況下。
AS(地址選通輸入) - 一個正向地址選通脈沖旨在解復用總線。該 AS / ALE的下降沿導致地址被該DS12887內部鎖存。發生在AS總線上的下一個上升沿將清除地址不論CS是否有效。訪問命令被發送。
DS(數據選通或讀輸入)- 在DS/ RD引腳有兩種操作取決于水平模式 的MOT引腳。當MOT引腳連接到VCC,摩托羅拉總線時機選擇。在此模式下 DS是在總線周期的后面部分提供一個正脈沖,稱為數據選通。在讀 周期,DS表示該DS12887是推動雙向總線的時間。在寫周期的結尾 DS的上升沿使DS12887鎖存寫入的數據。當MOT引腳連接到GND,英特爾 總線時機選擇。在這種模式下,DS端子被稱為讀(RD)。道標識的時間段時 該DS12887驅動總線讀取數據。在一個典型的存儲器,RD信號有相同的定義,即輸出使能(OE)信號。
R / W(讀/寫輸入) - R / W引腳也有兩種操作模式。當MOT引腳 連接到VCC為摩托羅拉時機,R / W是在一定的水平,指示當前周期是 讀或寫。一個讀周期是表示有高度上的讀/寫,而DS高。寫周期是 當R/ W為低的DS時表示。 當MOT引腳連接到GND為英特爾時機,R / W信號為低電平信號,稱為 WR。在這種模式下,R / W引腳具有相同的含義寫使能信號(WE)在通用的RAM。
CS(片選輸入) - 片選信號必須置低一個總線周期的DS12887到 被訪問。 CS必須保持在激活狀態時的DS和AS摩托羅拉時機和RD時 和WR為英特爾的時機。總線周期而發生不主張CS將鎖存地址,但沒有 會發生訪問。當VCC低于4.25伏,DS12887內部由抑制存取周期 在內部禁用CS輸入。在這個動作保護實時時鐘和數據RAM中的數據既停電。
IRQ(中斷請求輸出)- 該IRQ引腳是DS12887,可以是一個低電平有效輸出 用作中斷輸入到處理器。該IRQ輸出仍然很低,只要狀態位造成的 中斷是當前和相應的中斷使能位被置位。要清除IRQ引腳的處理器 程序正常讀取C寄存器。 RESET引腳也清除掛起中斷。 當沒有中斷條件都存在,IRQ水平處于高阻抗狀態。多種 中斷設備可以連接到一個IRQ總線。該IRQ總線是一個開漏輸出,需要一個 外部上拉電阻。
寄存器B
UIP
更新進行中(UIP)位是可以監控的狀態標志。當UIP位是1,則很快就會出現更新傳輸。當UIP是0,更新轉移不會發生,至少244毫秒。時間,日歷和RAM中的報警信息是完全可??供訪問時UIP位為0的UIP位是只讀的,并且不受復位的影響。寫在寄存器B的SET位到1抑制任何更新轉移和清除UIP狀態位。
DV0,DV1,DV2
這些3位被用來打開振蕩器或關閉和重置倒計時鏈。 010模式是位,將打開振蕩器,并允許RTC保持時間的唯一組合。的模式11X將使振蕩器,但擁有倒計時鏈在復位狀態。將發生在500的下一個更新010模式ms后寫入DV0,DV1,DV2和。
RS3,RS2,RS1,RS0
這些四個速率選擇位用于選擇13水龍頭上的15級分頻器的一個或禁用分頻器輸出。所選擇的抽頭可以被用來產生輸出方波(SQW引腳)和/或周期性的中斷。用戶可以執行下列操作之一:
1,啟用與PIE的位中斷;
2,啟用SQW輸出引腳SQWE位;
3,在相同的時間和相同的速度同時啟用;或
4,啟用兩者都不是。
寄存器B
SET
當SET位是0,則更新傳遞函數通常以每秒行進的計數一次。當SET位被寫入1,任何更新轉移抑制和程序可以初始化時間和日歷字節沒有在初始化之中發生的更新。讀周期可以被執行以類似的方式。 SET是不是由復位或內部功能修改的讀/寫位DS12887。
PIE
周期性的中斷使能PIE位是讀/寫位,它允許周期中斷標志(PF)位在寄存器C驅動IRQ引腳為低電平。當PIE位被設置為1,是將產生的周期性的中斷驅動IRQ引腳為低電平時由寄存器A A 0的RS3-RS0位在PIE位塊中指定的速度從推動著一個周期性的中斷輸出的IRQ,但定期標志(PF)位仍設置在定期利率。 PIE不受任何內部DS12887的功能修改,但被清零復位。
AIE
報警中斷允許(AIE)位是讀/寫位,當設置為1,允許報警標志在寄存器C(AF)位斷言IRQ。報警中斷發生的每一秒,這三個時間字節等于三個報警字節,包括一個“不關心”報警二進制11XXXXXX的代碼。當AIE位被設置為0時,AF位不啟動IRQ信號。 RESET引腳清除AIE到0。內部該DS12887的功能不影響AIE位。
UIE
結束中斷使能(UIE)位的更新是一個讀/寫,使在更新結束標志(UF)位寄存器C斷言IRQ。 RESET引腳變低或設置位要高,以清零UIE位。
SQWE
當方波使能(SQWE)位被設置為1,一個方波信號的頻率由設速率選擇位通過RS3 RS0被趕出在SQW引腳。當SQWE位被設置為Z0,則SQW引腳保持低電平; SQWE的狀態是由RESET引腳清零。 SQWE是一個讀/寫位。
DM
數據模式(DM)的位表示時間和日歷信息是二進制或BCD格式。的DM位由程序設置為適當的格式,可以根據需要進行閱讀。此位不通過內部函數或復位修改。在DM A 1表示二進制數據,而一個0在DM指定二進制編碼的十進制(BCD)的數據。
24/12
在24/12控制位確定了時間字節的格式。值為1表示24小時模式和0表示12小時模式。該位是讀/寫,并不受復位的內部功能。
DSE
夏令啟用(DSE)位是讀/寫位使兩個特殊的更新時DSE設置為1,在第一星期天到4月從上午1時59分59秒至上午03時00分00秒的時間增量。在最后星期天在10月份的時候1:59:59 AM跳回它的變化1:00:00 PM。當DSE位是0,該位不會受到內部功能或復位的更新不會發生。
時間,日歷和報警地址
通過讀取相應的內存字節獲得的時間和日歷信息。時間,日歷和鬧鐘設置或初始化,通過寫相應的內存字節。在10中的內容時間,日歷和鬧鐘字節可以是二進制或二進制編碼的十進制(BCD)格式。前寫內部時間,日歷和報警寄存器,寄存器B的SET位應寫入邏輯1,以防止訪問時正在嘗試發生更新。除了撰寫了10時間,日歷,并在選定的格式(二進制或BCD)的數據模式位(DM)的,報警寄存器寄存器B必須被設置到適當的邏輯電平。所有10時間,日歷和鬧鐘字節必須使用相同的數據模式。后的數據模式位已寫入的寄存器B組位應清零允許實時時鐘來更新時間和日歷字節。初始化后,實時時鐘使得在所選擇的模式的所有更新。數據模式不能沒有重新初始化10變字節的數據。表2示出的10個時間,日歷和報警位置的二進制和BCD格式。該24-12位不能沒有重新初始化小時的位置改變。當12小時格式選中,小時字節的高位表示PM當它是一個邏輯1,時間,日歷和報警字節總是可用,因為它們是雙緩沖。每秒一次的10個字節是前進1秒,并檢查報警條件。如果發生的時間和日歷數據的讀取在更新過程中,存在問題的地方秒,分鐘,小時等可能不相關。概率
讀數不正確的時間和日歷數據低。避免任何可能的不正確的幾種方法時間和日歷讀取該文本后面都包括在內。
這三個報警字節可以通過兩種方式使用。首先,當報警時間寫入相應 小時,分鐘和秒報警位置,報警中斷的每一天開始在指定的時間 如果報警使能位為高。第二使用條件,是在一個或多個插入一個“不關心”狀態 這三個報警字節。 “不關心”的代碼是任何十六進制值從C0到FF。兩個最 每個字節的顯著位設置了“不關心”狀態時為邏輯1。報警將產生 當“不關心”位在小時字節設置每個小時。同樣,一個報警產生的每 分鐘與“不關心”代碼小時和分鐘報警字節。在所有這三個“不關心”代碼 報警字節創建一個中斷每一秒。
非易失性RAM
114通用非易失性RAM字節不是專用于DS12887內的任何特殊功能 。它們可用于由處理器程序作為非易失性存儲器并且是完全可用在更新周期。
From:翻譯原文為我在DS12887生產商官網查找的DS12887資料原文的一部分。
天津城建大學
畢 業 設 計 任 務 書
計 算 機 與 信 息 工 程 學 院 電 子 信 息 工 程 專 業 1 班
姓 名 楊 亮 學 號 10700121
設計題目: 數碼管顯示的合乘出租車計價器設計
完成期限:自 2014 年 2 月 24 日至 2014 年 6 月 13 日止
指 導 教 師: 劉 毅
教研室/系主任:
院 長: 學 生 簽 字 :
批 準 日 期: 2013.12.20 接受任務日期: 2013.12.27
一、設計原始依據(資料):
[1].STC12C5A60S2系列單片機器件手冊,http://www.stcmcu.com/index.htm.
[2].張毅剛.單片機原理及應用,高等教育出版社,2006.
[3].李華,MCS-51系列單片機實用接口技術,北京航空航天大學出版社,1993.
[4].何立民,單片機應用系統設計,北京航空航天大學出版社,1990.
[5].高鵬、安濤等,電路設計與制版Protel99入門與提高,人民郵電出版社,2000.
[6].陳勇,DS12887實時時鐘芯片及其應用,電子世界,1998, 2: 39-40.
[7].MAX7219顯示驅動芯片資料.
[8].計價器相關資料.
二、設計內容和要求:(說明書、專題、繪圖、試驗結果等)
設計內容:
設計一種用于合乘計費的出租車計價器。能夠獨立實現每位乘客的行駛里程計算、低速計時時間累計、乘客付費金額計算。
設計要求單片機作為控制核心,外部擴展數碼管顯示單元、按鍵處理單元、方波檢測處理單元、歷史數據記錄等電路。在所設計的軟件程序下,能夠實現計費、顯示、查詢等功能。
設計要求:
設計(研究)進度計劃表
序號 起止日期 計劃完成內容 實際完成情況 檢查人簽名檢查日期
1
3月24日至4月6日 確定并熟悉自己畢業設計的題目及其要求。
2
4月7日至4月13日 分析本次設計的主要目的并將其分為由不同的功能共同實現,最后選擇實現各個功能的芯片。
3
4月14日至4月20日 根據本次設計要實現的功能設計其硬件原理圖。
4
4月21日至5月18日 拿到自己的硬件電路,開始編寫程序并調試來實現本次設計的功能。
5
5月19日至5月25日 完善自己的設計,最后確定自己的硬件電路及程序編寫無誤,使本次設計成品的運行結果達到本次設計的要求甚至完美。
6
5月26日至6月1日 根據自己的設計內容及設計要求開始寫畢業論文。
7
6月2日至6月8日 最后一次確認自己的設計成品和報告已經完成,不需要改動。
8
指導教師批準,并簽名: 年 月 日
總結
- 上一篇: Malthus模型预测人口增长
- 下一篇: LPWAN——Sigfox实战经验介绍