版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《單片機原理與接口技術(shù)》課程設(shè)計</p><p> 題 目: 基于單片機的出租車計價器的設(shè)計</p><p> 學(xué) 院: 管理科學(xué)與工程學(xué)院 </p><p> 專 業(yè): 電子信息工程 </p><p> 學(xué) 號: </p>
2、<p> 姓 名: </p><p><b> 初始條件:</b></p><p> 運用所學(xué)的單片機原理與接口技術(shù)知識和數(shù)字電路知識;</p><p> 52單片機應(yīng)用開發(fā)系統(tǒng)一套;</p><p> PC機及相關(guān)應(yīng)用軟件。</p><p>
3、 要求完成的主要任務(wù):</p><p> 以目前生活中正在使用的出租車計價器為原型進(jìn)行設(shè)計,要求具有按時間和里程綜合計算車價的功能,能顯示時間、里程、單價、總車價等相關(guān)信息。</p><p> 完成出租車計價器的設(shè)計和調(diào)試。 </p><p> 撰寫課程設(shè)計說明書,說明書使用A4打印紙計算機打印,用Proteus等繪圖軟件繪制電子線路圖紙。</p&
4、gt;<p> 基于52單片機原理出租車計價器的設(shè)計</p><p><b> 摘要 </b></p><p> 本設(shè)計的是一個基于單片機AT89C52的出租車自動計費設(shè)計,附有復(fù)位電路,時鐘電路,鍵盤電路等。復(fù)位電路是單片機的初始化操作,除了正常的初始化外,為擺脫困境,通過復(fù)位電路可以重新開始。時鐘電路采用12MHz的晶振,作為系統(tǒng)的時鐘源,具有
5、較高的準(zhǔn)確性。</p><p> 在上電時字符型液晶1602顯示最初的起步價,里程收費,等待時間收費三種收費,通過按鍵可以調(diào)整起步價,里程收費,等待時間收費。通過按鍵模擬出租車的運行,暫停,停止。在1602液晶上可以顯示運行的時間,運行時暫停的時間,通過計算可以得出總共的費用和總的路程。在這里主要是以AT89C52單片機為核心控制器,P0口接1602液晶顯示模塊,P1口接按鍵的,通過按鍵輸入。</p>
6、;<p> 關(guān)鍵詞:單片機 AT89C52;1602液晶;出租車計費器;</p><p><b> 目 錄</b></p><p><b> 前 言1</b></p><p> 第一章 出租車計價系統(tǒng)的設(shè)計要求與設(shè)計方案2</p><p> 1.1出租車計價器設(shè)計要
7、求2</p><p> 1.2系統(tǒng)主要功能2</p><p> 1.3方案論證與比較2</p><p> 第二章 出租車計價系統(tǒng)的硬件設(shè)計4</p><p> 2.1振蕩電路4</p><p> 2.2復(fù)位電路設(shè)計4</p><p> 2.3鍵盤接口電路5&
8、lt;/p><p> 2.4顯示電路5</p><p> 2.5路程測量部分6</p><p> 2.6單片機各引腳功能說明6</p><p> 2.71602液晶的簡介8</p><p> 第三章 出租車計價系統(tǒng)的軟件設(shè)計10</p><p> 3.1單片機資源使
9、用10</p><p> 3.2中斷子函數(shù)10</p><p> 3.3判鍵子函數(shù)11</p><p> 3.4顯示子程序11</p><p> 3.5總程序流程框圖13</p><p> 第四章proteus的簡介14</p><p> 4.1Proteus介
10、紹14</p><p> 第五章 設(shè)計體會與小結(jié)15</p><p><b> 參考文獻(xiàn)15</b></p><p><b> 附 錄16</b></p><p><b> 一.源程序16</b></p><p><b>
11、 二.設(shè)計總圖2</b></p><p><b> 前 言</b></p><p> 出租車計價器是出租車營運收費的專用智能化儀表,隨著電子技術(shù)的發(fā)展,出租車計價器技術(shù)也在不斷進(jìn)步和提高。國內(nèi)出租車計價器已經(jīng)經(jīng)歷了4 個階段的發(fā)展。從傳統(tǒng)的全部由機械元器件組成的機械式,到半電子式即用電子線路代替部分機械元器件的出租車計價器;再從集成電路式到目前的單
12、片機系統(tǒng)設(shè)計的出租車計價器。出租車計價器計費是否準(zhǔn)確、出租車司機是否作弊才是乘客最關(guān)心的問題,而計價器營運數(shù)據(jù)的管理是否方便才是出租車司機最關(guān)注的。因此怎樣設(shè)計出一種既能有效防止司機作弊又能方便司機的計價器尤為重要。因此, 本文以單片機A T89S52 為核心設(shè)計一款多功能出租車計價器,該計價器能實現(xiàn)按時間和里程綜合計算車價,能顯示時間、里程、單價、總車價等相關(guān)信息顯示。它比市場上的一些計價器使用更方便,功能更全,還具有有效防止司機作弊
13、和系統(tǒng)穩(wěn)定性好的優(yōu)點。</p><p> 第一章 出租車計價系統(tǒng)的設(shè)計要求與設(shè)計方案</p><p> 出租車計價器設(shè)計要求</p><p> 設(shè)計一個出租車自動計費器,計費包括起步價、行車?yán)锍逃嬞M、等待時間計費三部分,用1602液晶 顯示總金額,運行時間,暫停時間,最大值為99.9元,起步價為5.0元,3Km之內(nèi)起步價計費,超過3Km,設(shè)速度為100m/s
14、,10s增加1.3元(即1KM增加1.3元),等待時間單價為每分鐘1.5元,用液晶顯示總里程,同時用液晶顯示等待時間和運行花費時間。</p><p><b> 系統(tǒng)主要功能</b></p><p> 本出租車自動計費,上電后顯示最初的起步價,里程計費單價,等待時間計費單價,通過按鍵可以調(diào)節(jié)起步價,里程計費單價,等待時間計費單價。同時具有運行,暫停,停止等狀態(tài),可以
15、顯示運行的時間,同時可以顯示暫停的時間,具有累加功能,暫停和運行時間在暫停和運行前一次的狀態(tài)上計時。出租車停止后能夠顯示行駛的總費用。</p><p><b> 方案論證與比較</b></p><p> 方案一:采用數(shù)字電子技術(shù),利用555定時芯片構(gòu)成多諧振蕩器,或采用外圍的晶振電路作為時鐘脈沖信號,采用計數(shù)芯片對脈沖盡心脈沖的計數(shù)和分頻,最后通過譯碼電路對數(shù)據(jù)進(jìn)
16、行譯碼,將譯碼所得的數(shù)據(jù)送給數(shù)碼管顯示,一下是該方案的流程框圖,方案一如圖1-1所示:</p><p><b> 圖1-1方案一</b></p><p> 案二:采用EDA技術(shù),根據(jù)層次化設(shè)計理論,該設(shè)計問題自頂向下可分為分頻模塊,控制模塊 計量模塊、譯碼和動態(tài)掃描顯示模塊,其系統(tǒng)框圖如圖1-2所示:</p><p><b>
17、圖1-2方案二</b></p><p> 方案三:采用MCU技術(shù),通過單片機作為主控器,利用1602字符液晶作為顯示電路,采用外部晶振作為時鐘脈沖,通過按鍵可以方便調(diào)節(jié),以下是方案三的系統(tǒng)流程圖,本方案主要是必須對于數(shù)字電路比較熟悉,成本又不高。方案圖如圖1-3所示:</p><p><b> 圖1-3方案三</b></p><p&
18、gt; 方案總結(jié):通過各個方案的比較,本次采用方案三,不但控制簡單,而且成本低廉,設(shè)計電路簡單。</p><p> 第二章 出租車計價系統(tǒng)的硬件設(shè)計</p><p><b> 振蕩電路</b></p><p> 單片機內(nèi)部有一個高增益、反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。通過這兩個引腳在芯片外并接石英晶
19、體振蕩器和兩只電容(電容和一般取33pF)。這樣就構(gòu)成一個穩(wěn)定的自激振蕩器。 振蕩電路脈沖經(jīng)過二分頻后作為系統(tǒng)的時鐘信號,再在二分頻的基礎(chǔ)上三分頻產(chǎn)生ALE信號,此時得到的信號時機器周期信號。振蕩電路如圖2-1所示:</p><p><b> 圖2-1振蕩電路</b></p><p&g
20、t;<b> 復(fù)位電路設(shè)計</b></p><p> 復(fù)位操作有兩種基本形式:一種是上電復(fù)位,另一種是按鍵復(fù)位。按鍵復(fù)位具有上電復(fù)位功能外,若要復(fù)位,只要按圖中的RESET鍵,電源VCC經(jīng)電阻R1、R2分壓,在RESET端產(chǎn)生一個復(fù)位高電平。上電復(fù)位電路要求接通電源后,通過外部電容充電來實現(xiàn)單片機自動復(fù)位操作。上電瞬間RESET引腳獲得高電平,隨著電容的充電,RERST引腳的高電平將逐漸
21、下降。RERST引腳的高電平只要能保持足夠的時間(2個機器周期),單片機就可以進(jìn)行復(fù)位操作。按鍵復(fù)位電路圖如圖2-2所示。</p><p> 圖2-2 AT89C51引腳配置</p><p><b> 鍵盤接口電路</b></p><p> 獨立式鍵盤:獨立式鍵盤中,每個按鍵占用一根I/O口線,每個按鍵電路相對獨立。I/O口通過按鍵與地相
22、連,I/O口有上拉電阻,無鍵按下時,引腳端為高電平,有鍵按下時,引腳電平被拉低。I/O口內(nèi)部有上拉電阻時,外部可不接上拉電阻。</p><p><b> 顯示電路</b></p><p> 對于現(xiàn)實電路我們可以采用數(shù)碼管,也可以采用液晶顯示,液晶又分字符型和點陣型,我們使用的液晶是字符型液晶,并且?guī)ё址麕斓?,不需要查找代碼。英文字符就可。液晶電路使用時,如果發(fā)現(xiàn)液
23、晶不亮可以調(diào)節(jié)連接液晶的點位器,改變液晶的亮度。顯示電路如圖2-4所示:</p><p> 圖2-4 數(shù)碼管封裝圖及數(shù)據(jù)線與數(shù)碼管管腳關(guān)系</p><p><b> 路程測量部分</b></p><p> 出租車中需要一個能準(zhǔn)確獲得車輪轉(zhuǎn)動即路量信號的裝置,以得到標(biāo)準(zhǔn)的脈沖信號送入單片機的定時/ 計數(shù)器T1 即P3. 5 引腳,利用單片機
24、的T1 的計數(shù)功能完成100 次的計數(shù)后產(chǎn)生一中斷來完成路程的測量。(設(shè)車輪周長為1 m ,則霍爾傳感器每產(chǎn)生100 個脈沖便表示車已行程0. 1 km ,根據(jù)際情況在程序中進(jìn)行設(shè)置) 。汽車聯(lián)軸器按圓周間隔嵌入磁鋼,用霍傳感器集成芯片A44E 測并輸出脈沖,其工作原理如圖4 所示,霍爾傳感器集成芯片A44E 有信號轉(zhuǎn)換、電壓放大、等功能,為增加其抗干擾的能力,經(jīng)過74L S14 對信號整形后再通過光偶送入P3. 5 引腳。</p
25、><p> 圖2-5路程測量電路</p><p> 單片機各引腳功能說明</p><p> AT89S52電路圖如圖2-6所示: </p><p> VCC:供電電壓。GND:接地。P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能
26、夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行 圖2-6</p><p> 校驗時,P0輸出原碼,此時P0外部必須被拉高。 圖2-6 AT89S52
27、 </p><p> P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。 </p><p> P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p> P2口:P2口為一個
28、內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗
29、時接收高八位地址信號和控制信號。</p><p> P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89S52的一些特殊功能口,P3口同時為閃爍編程和編程校驗接收一些控制信號。</p><p> RS
30、T:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。</p><p> ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁
31、止ALE的輸出可在SFR8EH地址上置0。此時, ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。</p><p> /PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。</p><p> /EA/V
32、PP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。</p><p> XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。</p><p> XTAL2:來自反向振蕩器的
33、輸出。</p><p> 第三章 出租車計價系統(tǒng)的軟件設(shè)計</p><p><b> 單片機資源使用</b></p><p> 在本次設(shè)計中像電路鍵盤用到了P1口,其中P1.0到P1.4口作為鍵盤的輸</p><p> 入,直流電機電路的控制線用了P2口線,P3.0、P3.1、P3.2分別為led信號控制腳。顯
34、示電路用到了P0和P2口,P0口為液晶的數(shù)據(jù)口。</p><p><b> 中斷子函數(shù)</b></p><p> 對于中斷程序,只要定時器計數(shù)滿就會產(chǎn)生中斷50ms中斷一次,共計20次,秒鐘加1,秒鐘計滿再分鐘加,當(dāng)分鐘加到99時全部清零。以下是中斷子函數(shù)的流程圖如圖3-1所示:</p><p> 圖3-1 中斷子程序流程圖</p&
35、gt;<p><b> 判鍵子函數(shù)</b></p><p> 對于獨立式鍵盤判鍵,首先看有鍵按下不,如果有鍵按下則延時一會兒,在判斷是否真的有鍵按下,如果確實有鍵按下,在判鍵釋放,最后執(zhí)行鍵功能程序。判鍵子函數(shù)的流程框圖如圖3-2所示: </p><p> 圖3-2判鍵子程序流程圖</p><p><b&g
36、t; 顯示子程序</b></p><p> 1602液晶是字符型液晶,它的內(nèi)部自帶字符庫,它可以寫兩行的字符,同時每行可以寫40個字符,在寫顯示程序的時候,我們先寫命令,再設(shè)定字符顯示,最后寫數(shù)據(jù),在每寫一次命令或數(shù)據(jù)都需要判斷液晶是否忙。液晶顯示程序流程圖如圖3-3所示:</p><p> 圖3-3 顯示子總程序流程框圖</p><p> 圖3
37、-4整體程序流程圖</p><p> 第四章proteus的簡介</p><p><b> Proteus介紹</b></p><p> Proteus軟件是來自英國Labcenter electronics公司的EDA工具軟件,它組合了高級原理布圖、混合模式SPICE仿真,PCB設(shè)計以及自動布線來實現(xiàn)一個完整的電子設(shè)計系統(tǒng)。此系統(tǒng)受益于
38、15年來的持續(xù)開發(fā),被《電子世界》在其對PCB設(shè)計系統(tǒng)的比較文章中評為最好產(chǎn)品—“The Route to PCB CAD”。Proteus 產(chǎn)品系列也包含了我們革命性的VSM技術(shù),用戶可以對基于微控制器的設(shè)計連同所有的周圍電子器件一起仿真。用戶甚至可以實時采用諸如LED/LCD、鍵盤、RS232終端等動態(tài)外設(shè)模型來對設(shè)計進(jìn)行交互仿真。 其功能模塊:—個易用而又功能強大的ISIS原理布圖工具;PROSPICE混合模型SPICE仿
39、真;ARES PCB設(shè)計。PROSPICE 仿真器的一個擴展PROTEUS VSM:便于包括所有相關(guān)的器件的基于微處理器設(shè)計的協(xié)同仿真。此外,還可以結(jié)合微控制器軟件使用動態(tài)的鍵盤,開關(guān),按鈕,LEDs甚至LCD顯示CPU模型。支持許多通用的微控制器,如PIC,AVR,HC11以及8051。最新支持ARM。交互的裝置模型包括:LED和LCD顯示,RS232終</p><p> 第五章 設(shè)計體會與小結(jié) </
40、p><p> 出租車計費器系統(tǒng)的設(shè)計已經(jīng)全部完成,能按預(yù)期的效果進(jìn)行模擬汽車啟動,停止,暫停等功能并能夠通過LCD顯示車費數(shù)目。本款出租車計價器包括單價輸出、單價調(diào)整、顯示當(dāng)前的系統(tǒng)時間等功能。另外,多功能出租車計價器還具有性能可靠、電路簡單、成本低、實用性強等特點,加上經(jīng)過優(yōu)化的程序,使其有很高的智能化水平。</p><p> 一個月來,經(jīng)過自己努力,基本上完成了設(shè)計要求的內(nèi)容,在系統(tǒng)可
41、行性分析、原理圖設(shè)計等方面都作了許多實際工作,取得了一些成績,同時也遇到了一些問題,存在一些不足。經(jīng)過這一個月的學(xué)習(xí),我覺得自己不論是在理論知識方面還是在動手能力方面都有了不小的進(jìn)步,自己從中受益匪淺。這次設(shè)計很好的把以前學(xué)到的理論知識應(yīng)用于實踐,使我認(rèn)識到理論知識與實踐之間有一定的差距,只有通過不斷的努力學(xué)習(xí)和實踐才能很好的把理論知識應(yīng)用到實踐當(dāng)中,也只有通過不斷的實踐才能對理論知識的理解。</p><p>
42、 通過這次設(shè)計不僅學(xué)會了如何去查找相關(guān)資料,更重要的是通過查找資料和翻閱書籍學(xué)到了不少知識,擴大了知識面,提高了知識水平。經(jīng)過單元設(shè)計和系統(tǒng)設(shè)計鞏固了以前所學(xué)的專業(yè)知識,自己真正認(rèn)識到理論聯(lián)系實際的重要性,為以后的學(xué)習(xí)和工作提供了很多有價值的經(jīng)驗。通過這次設(shè)計不僅增強了自己的動腦能力和動手能力,也提高了我思考問題、分析問題、解決問題的能力,更重要的是學(xué)會用工程化的思想來解決問題。這在以前的學(xué)習(xí)過程中是不曾學(xué)到的。</p>
43、<p> 這次設(shè)計是我認(rèn)真認(rèn)識到完整、嚴(yán)謹(jǐn)、科學(xué)分析問題、解決問題的思想是多么的重要,只有擁有了科學(xué)的態(tài)度才能設(shè)計出有用的產(chǎn)品。另外通過本次設(shè)計,是我認(rèn)識到自己理論知識的應(yīng)用能力有很大的欠缺,需要在以后的學(xué)習(xí)中進(jìn)一步提高。</p><p><b> 參考文獻(xiàn)</b></p><p> 李廣弟,朱月秀,冷祖祁.單片機基礎(chǔ)[M].第3版.北京航空航天大學(xué)出
44、版社,2007</p><p> 李華.MCS-51系列單片機實用接口技術(shù)[M].北京航空航天大學(xué)出版社,1996</p><p> 李群芳,肖看.單片機原理接口與應(yīng)用.北京:清華大學(xué)出版社,2005</p><p> 朱承高.電工及電子技術(shù)手冊[M].北京:高等教育出版社,1990</p><p> 高峰.單片微型應(yīng)用系統(tǒng)設(shè)計及實用
45、技術(shù).北京:機械工業(yè)出版社,2004</p><p> 胡輝,單片機原理及應(yīng)用設(shè)計—21世紀(jì)高等院校規(guī)劃教材[M],水利水電出版社,2005.7</p><p> 劉守義,單片機應(yīng)用技術(shù)[M],西安:西安電子科技大學(xué)出版社,1996</p><p><b> 源程序</b></p><p> #include&l
46、t;reg52.h></p><p> #define uint unsigned int</p><p> #define unch unsigned char</p><p> sbit lcden=P1^4;//lcd使能端,高脈沖有效</p><p> sbit lcdrs=P1^5;//lcd數(shù)據(jù)-指令端,低電平-
47、寫指令,高電平-寫數(shù)據(jù)</p><p> sbit lcdrw=P1^6;//lcd讀-寫指令端,低電平執(zhí)行寫,高電平執(zhí)行讀</p><p> sbit key1=P2^0;//復(fù)位按鍵,初始起步價5元,里程數(shù)歸0</p><p> sbit key2=P2^1;//"+"按鍵,手動調(diào)整白天、夜間的單價和時鐘時間的調(diào)整</p
48、><p> sbit key3=P2^2;//"-"按鍵,手動調(diào)整白天、夜間的單價和時鐘時間的調(diào)整</p><p> sbit key4=P2^3;//白天夜間切換按鍵</p><p> sbit key5=P2^4;//移屏顯示時鐘</p><p> sbit key6=P2^5;//校正時間按鍵&l
49、t;/p><p> unch code time[2][6]={"day ","Night"};//白天夜間字符串?dāng)?shù)組</p><p> unch code week_table[7][4]={"Mon","Tue","Wed","Thu","Fri&qu
50、ot;,"Sat","Sun"};</p><p><b> //星期顯示</b></p><p> unch code date_table[]="Date:20";//年月日初始寫入</p><p> /********變量定義為整形實際顯示是浮點型,程序?qū)懭胄?shù)點**
51、***************/</p><p> uint kilometer;//里程變量</p><p> unch unit_price_day,unit_price_night;//白天夜間單價變量</p><p> unch change,flag_display;//屏幕切換標(biāo)志變量</p&g
52、t;<p> unch sw,gw;//分解位變量</p><p><b> unch i;</b></p><p> unch num1;//定時器1所需變量</p><p> unch temp_second,temp_minute,temp_hour;//時鐘小時、分
53、鐘、秒變量</p><p> unch year,month,day;//時鐘年、月、日變量</p><p> unch week,n;//時鐘星期所需變量</p><p> unch temp_add1;//時鐘校正時地址暫存變量</p><p> unch row;
54、//校正第幾行變量</p><p> unch count10s;//等待10s變量</p><p> uint total_price_temp;//根據(jù)里程數(shù)確定的價格變量</p><p> uint total_price_wait;//等待10s后的價格變量</p>
55、<p> void start()</p><p><b> {</b></p><p> temp_second=0;//秒初始值</p><p> temp_minute=0;//分鐘初始值</p><p> temp_hour=0;//小時初始值<
56、;/p><p> year=10;//年份初始值</p><p> month=8;//月份初始值</p><p> day=24;//日初始值</p><p> week=1;//星期初始值</p><p> temp_add1=0;
57、//校時地址暫存變量初始值</p><p> row=1;//校時第幾行初始值</p><p><b> }</b></p><p> //**********************分解位函數(shù)**********************//</p><p> void calcu
58、late(unch middle)</p><p><b> {</b></p><p> sw=middle/10;//十位</p><p> gw=middle%10;//個位</p><p><b> }</b></p><p> /**
59、**********************ms延時函數(shù)*************************/</p><p> void delay(uint z)</p><p><b> {</b></p><p><b> uint i,j;</b></p><p> for(i=z;
60、i>0;i--)</p><p> for(j=110;j>0;j--)</p><p><b> ;</b></p><p><b> }</b></p><p> //*******************************lcd寫數(shù)據(jù)*****************
61、//</p><p> void write_data(unch date)</p><p><b> {</b></p><p><b> lcden=0;</b></p><p> lcdrs=1; //寫數(shù)據(jù),高電平有效</p><p> P0=date
62、;//先賦值,</p><p><b> delay(5);</b></p><p><b> //延時后 </b></p><p> lcden=1;//lcden一旦拉高,數(shù)據(jù)立馬寫入</p><p><b> delay(5);</b></p>
63、<p><b> //延時后 </b></p><p> lcden=0;//再次置低,準(zhǔn)備下一次拉高</p><p><b> }</b></p><p> //******************************lcd寫指令*********************//</p&g
64、t;<p> void write_com(unch com)</p><p><b> {</b></p><p><b> lcden=0;</b></p><p> lcdrs=0;//寫指令,低電平有效</p><p> P0=com;//賦值</p&
65、gt;<p><b> delay(5);</b></p><p><b> //延時后 </b></p><p> lcden=1;//lcden拉高</p><p><b> delay(5);</b></p><p><b> //延
66、時后 </b></p><p> lcden=0;//再次置低</p><p><b> }</b></p><p> /************************************lcd初始化*********************/</p><p> void lcd_initi
67、al()</p><p><b> {</b></p><p><b> lcden=0;</b></p><p> lcdrw=0;//表示對lcd進(jìn)行寫操作</p><p> write_com(0x38);//lcd顯示</p><p> write_
68、com(0x0c);//開顯示,不顯示光標(biāo)</p><p> write_com(0x06);//讀或?qū)懞?,地址指?1</p><p> total_price_wait=0;//等待時計費變量清0</p><p> kilometer=0;//里程數(shù)清0</p><p> unit_price_day=14
69、;//白天單價初始值1.4,程序?qū)懭胄?shù)點</p><p> unit_price_night=17; //夜間單價初始值1.7,程序?qū)懭胄?shù)點</p><p><b> }</b></p><p> /********里程顯示函數(shù) 整形表示,程序?qū)懭胄?shù)點,精確0.1km***********/</p>&l
70、t;p> void kilometer_display(uint temp)</p><p><b> {</b></p><p> unch bw,sw,gw;</p><p> write_com(0x80);</p><p> bw=temp/100;</p><p> s
71、w=temp%100/10;</p><p> gw=temp%100%10;</p><p> write_data('0'+bw);</p><p> write_data('0'+sw);</p><p> write_data('.');</p><p>
72、 write_data('0'+gw);</p><p> write_data('k');</p><p> write_data('m');</p><p><b> }</b></p><p> /***************單價顯示函數(shù)(整形表示,程序?qū)?/p>
73、入小數(shù)點) ******************/</p><p> void unit_price_display(unch temp)</p><p><b> {</b></p><p> unch sw,gw;</p><p> sw=temp/10;</p><p> gw=t
74、emp%10;</p><p> write_com(0x80+9);</p><p> write_data('0'+sw);</p><p> write_data('.');</p><p> write_data('0'+gw);</p><p> w
75、rite_data('/');</p><p> write_data('k');</p><p> write_data('m');</p><p><b> }</b></p><p> /**********總價顯示函數(shù)(整形表示,程序?qū)懭胄?shù)點)精確到角**
76、************/</p><p> void total_price_display(uint temp)</p><p><b> {</b></p><p> unch qw,bw,sw;</p><p> qw=temp/1000;</p><p> bw=temp%10
77、00/100;</p><p> sw=temp%1000%100/10;</p><p> write_com(0x80+0x40);</p><p> write_data('0'+qw);</p><p> write_data('0'+bw);</p><p> wri
78、te_data('.');</p><p> write_data('0'+sw);</p><p><b> }</b></p><p> /***************白天/夜間,j=0表示白天,j=1表示夜間顯示函數(shù)****************/</p><p> vo
79、id time_display(unch j)</p><p><b> {</b></p><p><b> unch n;</b></p><p> write_com(0x80+0x40+9);</p><p> for(n=0;time[j][n]!=
80、39;\0';n++)</p><p> write_data(time[j][n]);</p><p><b> }</b></p><p> /******外部中斷0下降沿觸發(fā)形式統(tǒng)計里程數(shù)********/</p><p> void extern_interrupt0_initial()</
81、p><p><b> {</b></p><p> EA=1;//開總中斷</p><p> EX0=1;//開外部中斷0</p><p> IT0=1;//外部中斷0下降沿觸發(fā)</p><p><b> }</b></p><p&
82、gt; //***********************50ms定時初始化用于時鐘*******************************//</p><p> void timing1_initial()</p><p><b> {</b></p><p> TMOD=0x15;</p><p>
83、; TH1=(65536-45872)/256;//11.0592M晶振</p><p> TL1=(65536-45872)%256;</p><p> EA=1;//開總中斷</p><p> ET1=1;//開定時器1</p><p> TR1=1;//啟動定時器1 時鐘</
84、p><p><b> }</b></p><p> /*****************采用中斷的方式記錄里程,下降沿觸發(fā)***************************/</p><p> void extern_interrupt0() interrupt 0</p><p><b> {<
85、/b></p><p> unch mile_num;</p><p> count10s=0;</p><p> if(mile_num<10) //每個方波代表10米,10次代表100米即顯示0.1公里</p><p> mile_num++;</p><p><b> e
86、lse</b></p><p><b> {</b></p><p> mile_num=0;</p><p> kilometer=kilometer+1;</p><p><b> }</b></p><p><b> }<
87、;/b></p><p> /*************************************屏2日期顯示函數(shù)******************************/</p><p> void lcd_date_display()</p><p><b> {</b></p><p><
88、;b> unch i;</b></p><p> write_com(0x80+0x40+24);</p><p> for(i=0;date_table[i]!='\0';i++)</p><p><b> {</b></p><p> write_data(date_tab
89、le[i]);</p><p><b> }</b></p><p><b> }</b></p><p> /************************************屏2時鐘顯示函數(shù)********************************/</p><p> v
90、oid lcd2_display()</p><p><b> {</b></p><p> if(num1==20)//定時器1 50ms一次中斷 20次即為1s</p><p><b> {</b></p><p><b> num1=0;</b>&
91、lt;/p><p> temp_second++;</p><p> count10s++;</p><p> if(temp_second==60)</p><p><b> {</b></p><p> temp_second=0;</p><p> te
92、mp_minute++;</p><p><b> }</b></p><p> if(temp_minute==60)</p><p><b> {</b></p><p> temp_minute=0;</p><p> temp_hour++;</p&g
93、t;<p><b> }</b></p><p> if(temp_hour==24)</p><p><b> {</b></p><p> temp_hour=0;</p><p><b> day++;</b></p><p&
94、gt; week++;</p><p><b> }</b></p><p> if(week==7)</p><p><b> week=0;</b></p><p> if(day==32)//未考慮某月31天或30天以及閏年平年</p><
95、;p><b> {</b></p><p><b> day=1;</b></p><p><b> month++;</b></p><p><b> }</b></p><p> if(month==13)</p><
96、;p><b> {</b></p><p><b> month=1;</b></p><p><b> year++;</b></p><p><b> }</b></p><p> calculate(temp_second);/
97、/分解秒的各位</p><p> write_com(0x80+24+8);//確定秒在lcd屏上的位置</p><p> write_data('0'+sw);</p><p> write_data('0'+gw);</p><p> calculate(temp_minute);//分解分
98、的各位</p><p> write_com(0x80+24+0x05); //確定分鐘在lcd屏上的位置</p><p> write_data('0'+sw);</p><p> write_data('0'+gw); </p><p> write_data(':');</
99、p><p> calculate(temp_hour);//分解時的各位</p><p> write_com(0x80+24+0x02);//確定小時在lcd屏上的位置</p><p> write_data('0'+sw);</p><p> write_data('0'+gw);</p&g
100、t;<p> write_data(':');</p><p> write_com(0x80+24+12);//確定星期在lcd屏上的位置</p><p> for(n=0;week_table[week][n]!='\0';n++)</p><p> write_data(week_table[week
101、][n]);</p><p> calculate(year);//分解年的各位</p><p> write_com(0x80+0x40+24+7);//確定年在lcd屏上的位置</p><p> write_data('0'+sw);</p><p> write_data('0
102、'+gw);</p><p> write_data('/');</p><p> calculate(month);//分解月的各位</p><p> write_com(0x80+0x40+24+10); //確定月在lcd屏上的位置</p><p> write_data('0'+
103、sw);</p><p> write_data('0'+gw);</p><p> write_data('/');</p><p> calculate(day);//分解日的各位</p><p> write_com(0x80+0x40+24+13);//確定日在lcd屏上的位置&l
104、t;/p><p> write_data('0'+sw);</p><p> write_data('0'+gw);</p><p> write_data('\0');</p><p><b> }</b></p><p><b&g
105、t; }</b></p><p> //*********************定時器1中斷程序*******************//</p><p> void timing1() interrupt 3</p><p><b> {</b></p><p><b> TR1=0;
106、</b></p><p> TH1=(65536-45872)/256;</p><p> TL1=(65536-45872)%256;</p><p><b> num1++;</b></p><p> lcd2_display();//第二屏液晶顯示函數(shù)</p><p&
107、gt;<b> TR1=1;</b></p><p><b> }</b></p><p> /**********************獨立鍵盤掃描函數(shù)************************/</p><p> void key_scan()</p><p><b>
108、 {</b></p><p> if(key1==0)//復(fù)位按鍵,初始起步價5元,里程數(shù)歸0</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(key1==0)</p>
109、<p><b> {</b></p><p> while(!key1);</p><p><b> delay(5);</b></p><p> while(!key1);</p><p> total_price_temp=0;</p><p> l
110、cd_initial();//初始化液晶第一屏,里程數(shù)歸0,起步價5元</p><p> kilometer_display(kilometer);//顯示復(fù)位后初始里程數(shù)</p><p> if(i%2==1)//奇數(shù)次按下是夜間狀態(tài)再復(fù)位</p><p><b> {</b></p>
111、<p> unit_price_display(unit_price_night);//顯示夜間單價</p><p> time_display(1);//顯示夜間狀態(tài)</p><p><b> }</b></p><p> if(i%2==0)//偶數(shù)次按下是白天狀態(tài)再復(fù)位</p>&l
112、t;p><b> {</b></p><p> unit_price_display(unit_price_day);//顯示白天單價</p><p> time_display(0);//顯示白天狀態(tài)</p><p><b> }</b></p><p> total_p
113、rice_display(500);//起步價5元,程序?qū)懭胄?shù)點</p><p> lcd_date_display();//年月日初始寫入</p><p><b> }</b></p><p><b> }</b></p><p> if(flag_disp
114、lay==0)//如果是在屏幕1</p><p><b> {</b></p><p> if(key2==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p>
115、if(key2==0)</p><p><b> {</b></p><p> while(!key2);</p><p><b> delay(5);</b></p><p> while(!key2);</p><p> if(i%2==0)//偶數(shù)次按下
116、切換鍵后是白天,白天單價調(diào)整增加</p><p> unit_price_day++;</p><p> if(i%2==1)//奇數(shù)次按下切換鍵后是夜間,夜間單價調(diào)整增加</p><p> unit_price_night++;</p><p><b> }</b></p><p&
117、gt;<b> }</b></p><p> if(key3==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(key3==0)</p><p><
118、b> {</b></p><p> while(!key3);</p><p><b> delay(5);</b></p><p> while(!key3);</p><p> if(i%2==0)//偶數(shù)次按下切換鍵后是白天,白天單價調(diào)整減少</p><p>
119、; unit_price_day--;</p><p> if(i%2==1)//奇數(shù)次按下切換鍵后是夜間,夜間單價調(diào)整減少</p><p> unit_price_night--;</p><p><b> }</b></p><p><b> }</b></p>&
120、lt;p><b> }</b></p><p> /****************如果是在屏幕2則校正時鐘********************************/</p><p> if(flag_display==1)</p><p><b> {</b></p>
121、<p> if(key6==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(key6==0)</p><p><b> {</b></p><p> te
122、mp_add1+=3;//地址變量不斷更新</p><p> while(!key6);</p><p> TR1=0;//時鐘停止準(zhǔn)備校時</p><p> switch(temp_add1)</p><p><b> {</b></p><p><b&g
123、t; case 15:</b></p><p> temp_add1=8;//充新賦值地址暫存變量,準(zhǔn)備校正第2排</p><p><b> row=2;</b></p><p> break;</p><p><b> case 17:</b>
124、</p><p> temp_add1=0;//第一屏校正完后</p><p><b> row=1;</b></p><p> write_com(0x0c);//光標(biāo)不閃</p><p> TR1=1;//時鐘啟動</p><p><b>
125、break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> if(temp_add1==3)//采用尋地址法校正,小時加法校正</p
126、><p><b> {</b></p><p> if(key2==0)</p><p><b> {</b></p><p><b> delay(5);</b></p><p> if(key2==0)</p><p>
127、<b> {</b></p><p> while(!key2);</p><p> temp_hour++;</p><p> if(temp_hour==24)</p><p> temp_hour=0;</p><p> write_com(0x80+24+temp_add1-1
128、);</p><p> calculate(temp_hour);</p><p> write_data('0'+sw);</p><p> write_data('0'+gw);</p><p><b> }</b></p><
129、p><b> }</b></p><p><b> }</b></p><p> if(temp_add1==6)//采用尋地址法校正,分鐘加法校正</p><p><b> {</b></p><p> if(key2==0)</p>&l
130、t;p><b> {</b></p><p><b> delay(5);</b></p><p> if(key2==0)</p><p><b> {</b></p><p> while(!key2);</p><p> temp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計---出租車計價器
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計出租車計價器
- 單片機課程設(shè)計----出租車計價器
- 單片機課程設(shè)計-出租車計價器
- 單片機課程設(shè)計--出租車計價器
- 單片機課程設(shè)計---出租車計價器設(shè)計
- 單片機課程設(shè)計--出租車計價器設(shè)計
- 單片機課程設(shè)計論文---出租車計價器
- 課程設(shè)計---基于51單片機的出租車計價器
- 畢業(yè)設(shè)計(論文)-單片機課程設(shè)計出租車計價器
- 課程設(shè)計--基于單片機的出租車計價器的設(shè)計
- 基于單片機的出租車計價器的設(shè)計(課程設(shè)計)
- 基于單片機的出租車計價器設(shè)計
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
- 出租車計價器課程設(shè)計
- 課程設(shè)計--出租車計價器設(shè)計
評論
0/150
提交評論