單片機(jī)課程設(shè)計(jì)報(bào)告出租車計(jì)價(jià)器_第1頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告出租車計(jì)價(jià)器_第2頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告出租車計(jì)價(jià)器_第3頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告出租車計(jì)價(jià)器_第4頁(yè)
單片機(jī)課程設(shè)計(jì)報(bào)告出租車計(jì)價(jià)器_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

.z...?單片機(jī)原理與接口技術(shù)?課程設(shè)計(jì)題目:基于單片機(jī)的出租車計(jì)價(jià)器的設(shè)計(jì)學(xué)院:管理科學(xué)與工程學(xué)院專業(yè):電子信息工程學(xué)號(hào):200883017 **:夏念念初始條件:運(yùn)用所學(xué)的單片機(jī)原理與接口技術(shù)知識(shí)和數(shù)字電路知識(shí);52單片機(jī)應(yīng)用開(kāi)發(fā)系統(tǒng)一套;PC機(jī)及相關(guān)應(yīng)用軟件。要求完成的主要任務(wù):以目前生活中正在使用的出租車計(jì)價(jià)器為原型進(jìn)展設(shè)計(jì),要求具有按時(shí)間和里程綜合計(jì)算車價(jià)的功能,能顯示時(shí)間、里程、單價(jià)、總車價(jià)等相關(guān)信息。完成出租車計(jì)價(jià)器的設(shè)計(jì)和調(diào)試。撰寫課程設(shè)計(jì)說(shuō)明書,說(shuō)明書使用A4打印紙計(jì)算機(jī)打印,用Proteus等繪圖軟件繪制電子線路圖紙。基于52單片機(jī)原理出租車計(jì)價(jià)器的設(shè)計(jì)摘要本設(shè)計(jì)的是一個(gè)基于單片機(jī)AT89C52的出租車自動(dòng)計(jì)費(fèi)設(shè)計(jì),附有復(fù)位電路,時(shí)鐘電路,鍵盤電路等。復(fù)位電路是單片機(jī)的初始化操作,除了正常的初始化外,為擺脫困境,通過(guò)復(fù)位電路可以重新開(kāi)場(chǎng)。時(shí)鐘電路采用12MHz的晶振,作為系統(tǒng)的時(shí)鐘源,具有較高的準(zhǔn)確性。在上電時(shí)字符型液晶1602顯示最初的起步價(jià),里程收費(fèi),等待時(shí)間收費(fèi)三種收費(fèi),通過(guò)按鍵可以調(diào)整起步價(jià),里程收費(fèi),等待時(shí)間收費(fèi)。通過(guò)按鍵模擬出租車的運(yùn)行,暫停,停頓。在1602液晶上可以顯示運(yùn)行的時(shí)間,運(yùn)行時(shí)暫停的時(shí)間,通過(guò)計(jì)算可以得出總共的費(fèi)用和總的路程。在這里主要是以AT89C52單片機(jī)為核心控制器,P0口接1602液晶顯示模塊,P1口接按鍵的,通過(guò)按鍵輸入。關(guān)鍵詞:?jiǎn)纹瑱C(jī)AT89C52;1602液晶;出租車計(jì)費(fèi)器;-.z目錄前言1第一章出租車計(jì)價(jià)系統(tǒng)的設(shè)計(jì)要求與設(shè)計(jì)方案21.1出租車計(jì)價(jià)器設(shè)計(jì)要求21.2系統(tǒng)主要功能21.3方案論證與比擬2第二章出租車計(jì)價(jià)系統(tǒng)的硬件設(shè)計(jì)42.1振蕩電路42.2復(fù)位電路設(shè)計(jì)42.3鍵盤接口電路52.4顯示電路52.5路程測(cè)量局部62.6單片機(jī)各引腳功能說(shuō)明62.71602液晶的簡(jiǎn)介8第三章出租車計(jì)價(jià)系統(tǒng)的軟件設(shè)計(jì)103.1單片機(jī)資源使用103.2中斷子函數(shù)103.3判鍵子函數(shù)113.4顯示子程序113.5總程序流程框圖13第四章proteus的簡(jiǎn)介144.1Proteus介紹14第五章設(shè)計(jì)體會(huì)與小結(jié)15參考文獻(xiàn)15附錄16一.源程序16二.設(shè)計(jì)總圖2-.z-.z..前言出租車計(jì)價(jià)器是出租車營(yíng)運(yùn)收費(fèi)的專用智能化儀表,隨著電子技術(shù)的開(kāi)展,出租車計(jì)價(jià)器技術(shù)也在不斷進(jìn)步和提高。國(guó)內(nèi)出租車計(jì)價(jià)器已經(jīng)經(jīng)歷了4個(gè)階段的開(kāi)展。從傳統(tǒng)的全部由機(jī)械元器件組成的機(jī)械式,到半電子式即用電子線路代替局部機(jī)械元器件的出租車計(jì)價(jià)器;再?gòu)募呻娐肥降侥壳暗膯纹瑱C(jī)系統(tǒng)設(shè)計(jì)的出租車計(jì)價(jià)器。出租車計(jì)價(jià)器計(jì)費(fèi)是否準(zhǔn)確、出租車司機(jī)是否作弊才是乘客最關(guān)心的問(wèn)題,而計(jì)價(jià)器營(yíng)運(yùn)數(shù)據(jù)的管理是否方便才是出租車司機(jī)最關(guān)注的。因此怎樣設(shè)計(jì)出一種既能有效防止司機(jī)作弊又能方便司機(jī)的計(jì)價(jià)器尤為重要。因此,本文以單片機(jī)AT89S52為核心設(shè)計(jì)一款多功能出租車計(jì)價(jià)器,該計(jì)價(jià)器能實(shí)現(xiàn)按時(shí)間和里程綜合計(jì)算車價(jià),能顯示時(shí)間、里程、單價(jià)、總車價(jià)等相關(guān)信息顯示。它比市場(chǎng)上的一些計(jì)價(jià)器使用更方便,功能更全,還具有有效防止司機(jī)作弊和系統(tǒng)穩(wěn)定性好的優(yōu)點(diǎn)。第一章出租車計(jì)價(jià)系統(tǒng)的設(shè)計(jì)要求與設(shè)計(jì)方案出租車計(jì)價(jià)器設(shè)計(jì)要求設(shè)計(jì)一個(gè)出租車自動(dòng)計(jì)費(fèi)器,計(jì)費(fèi)包括起步價(jià)、行車?yán)锍逃?jì)費(fèi)、等待時(shí)間計(jì)費(fèi)三局部,用1602液晶顯示總金額,運(yùn)行時(shí)間,暫停時(shí)間,最大值為99.9元,起步價(jià)為5.0元,3Km之內(nèi)起步價(jià)計(jì)費(fèi),超過(guò)3Km,設(shè)速度為100m/s,10s增加1.3元〔即1KM增加1.3元〕,等待時(shí)間單價(jià)為每分鐘1.5元,用液晶顯示總里程,同時(shí)用液晶顯示等待時(shí)間和運(yùn)行花費(fèi)時(shí)間。系統(tǒng)主要功能本出租車自動(dòng)計(jì)費(fèi),上電后顯示最初的起步價(jià),里程計(jì)費(fèi)單價(jià),等待時(shí)間計(jì)費(fèi)單價(jià),通過(guò)按鍵可以調(diào)節(jié)起步價(jià),里程計(jì)費(fèi)單價(jià),等待時(shí)間計(jì)費(fèi)單價(jià)。同時(shí)具有運(yùn)行,暫停,停頓等狀態(tài),可以顯示運(yùn)行的時(shí)間,同時(shí)可以顯示暫停的時(shí)間,具有累加功能,暫停和運(yùn)行時(shí)間在暫停和運(yùn)行前一次的狀態(tài)上計(jì)時(shí)。出租車停頓后能夠顯示行駛的總費(fèi)用。方案論證與比擬方案一:采用數(shù)字電子技術(shù),利用555定時(shí)芯片構(gòu)成多諧振蕩器,或采用外圍的晶振電路作為時(shí)鐘脈沖信號(hào),采用計(jì)數(shù)芯片對(duì)脈沖盡心脈沖的計(jì)數(shù)和分頻,最后通過(guò)譯碼電路對(duì)數(shù)據(jù)進(jìn)展譯碼,將譯碼所得的數(shù)據(jù)送給數(shù)碼管顯示,一下是該方案的流程框圖,方案一如圖1-1所示:圖1-1方案一案二:采用EDA技術(shù),根據(jù)層次化設(shè)計(jì)理論,該設(shè)計(jì)問(wèn)題自頂向下可分為分頻模塊,控制模塊計(jì)量模塊、譯碼和動(dòng)態(tài)掃描顯示模塊,其系統(tǒng)框圖如圖1-2所示:圖1-2方案二方案三:采用MCU技術(shù),通過(guò)單片機(jī)作為主控器,利用1602字符液晶作為顯示電路,采用外部晶振作為時(shí)鐘脈沖,通過(guò)按鍵可以方便調(diào)節(jié),以下是方案三的系統(tǒng)流程圖,本方案主要是必須對(duì)于數(shù)字電路比擬熟悉,本錢又不高。方案圖如圖1-3所示:圖1-3方案三方案總結(jié):通過(guò)各個(gè)方案的比擬,本次采用方案三,不但控制簡(jiǎn)單,而且本錢低廉,設(shè)計(jì)電路簡(jiǎn)單。第二章出租車計(jì)價(jià)系統(tǒng)的硬件設(shè)計(jì)振蕩電路單片機(jī)內(nèi)部有一個(gè)高增益、反相放大器,其輸入端為芯片引腳*TAL1,其輸出端為引腳*TAL2。通過(guò)這兩個(gè)引腳在芯片外并接石英晶體振蕩器和兩只電容〔電容和一般取33pF〕。這樣就構(gòu)成一個(gè)穩(wěn)定的自激振蕩器。振蕩電路脈沖經(jīng)過(guò)二分頻后作為系統(tǒng)的時(shí)鐘信號(hào),再在二分頻的根底上三分頻產(chǎn)生ALE信號(hào),此時(shí)得到的信號(hào)時(shí)機(jī)器周期信號(hào)。振蕩電路如圖2-1所示:圖2-1振蕩電路復(fù)位電路設(shè)計(jì)復(fù)位操作有兩種根本形式:一種是上電復(fù)位,另一種是按鍵復(fù)位。按鍵復(fù)位具有上電復(fù)位功能外,假設(shè)要復(fù)位,只要按圖中的RESET鍵,電源VCC經(jīng)電阻R1、R2分壓,在RESET端產(chǎn)生一個(gè)復(fù)位高電平。上電復(fù)位電路要求接通電源后,通過(guò)外部電容充電來(lái)實(shí)現(xiàn)單片機(jī)自動(dòng)復(fù)位操作。上電瞬間RESET引腳獲得高電平,隨著電容的充電,RERST引腳的高電平將逐漸下降。RERST引腳的高電平只要能保持足夠的時(shí)間〔2個(gè)機(jī)器周期〕,單片機(jī)就可以進(jìn)展復(fù)位操作。按鍵復(fù)位電路圖如圖2-2所示。圖2-2AT89C51引腳配置鍵盤接口電路獨(dú)立式鍵盤:獨(dú)立式鍵盤中,每個(gè)按鍵占用一根I/O口線,每個(gè)按鍵電路相對(duì)獨(dú)立。I/O口通過(guò)按鍵與地相連,I/O口有上拉電阻,無(wú)鍵按下時(shí),引腳端為高電平,有鍵按下時(shí),引腳電平被拉低。I/O口內(nèi)部有上拉電阻時(shí),外部可不接上拉電阻。顯示電路對(duì)于現(xiàn)實(shí)電路我們可以采用數(shù)碼管,也可以采用液晶顯示,液晶又分字符型和點(diǎn)陣型,我們使用的液晶是字符型液晶,并且?guī)ё址麕?kù)的,不需要查找代碼。英文字符就可。液晶電路使用時(shí),如果發(fā)現(xiàn)液晶不亮可以調(diào)節(jié)連接液晶的點(diǎn)位器,改變液晶的亮度。顯示電路如圖2-4所示:圖2-4數(shù)碼管封裝圖及數(shù)據(jù)線與數(shù)碼管管腳關(guān)系路程測(cè)量局部出租車中需要一個(gè)能準(zhǔn)確獲得車輪轉(zhuǎn)動(dòng)即路量信號(hào)的裝置,以得到標(biāo)準(zhǔn)的脈沖信號(hào)送入單片機(jī)的定時(shí)/計(jì)數(shù)器T1即P3.5引腳,利用單片機(jī)的T1的計(jì)數(shù)功能完成100次的計(jì)數(shù)后產(chǎn)生一中斷來(lái)完成路程的測(cè)量。(設(shè)車輪周長(zhǎng)為1m,則霍爾傳感器每產(chǎn)生100個(gè)脈沖便表示車已行程0.1km,根據(jù)際情況在程序中進(jìn)展設(shè)置)。汽車聯(lián)軸器按圓周間隔嵌入磁鋼,用霍傳感器集成芯片A44E測(cè)并輸出脈沖,其工作原理如圖4所示,霍爾傳感器集成芯片A44E有信號(hào)轉(zhuǎn)換、電壓放大、等功能,為增加其抗干擾的能力,經(jīng)過(guò)74LS14對(duì)信號(hào)整形后再通過(guò)光偶送入P3.5引腳。圖2-5路程測(cè)量電路單片機(jī)各引腳功能說(shuō)明AT89S52電路圖如圖2-6所示:VCC:供電電壓。GND:接地。P0口:P0口為一個(gè)8位漏級(jí)開(kāi)路雙向I/O口,每腳可吸收8TTL門流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲(chǔ)器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0口作為原碼輸入口,當(dāng)FIASH進(jìn)展圖2-6校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。圖2-6AT89S52P1口:P1口是一個(gè)內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時(shí),將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時(shí),P1口作為第八位地址接收。P2口:P2口為一個(gè)內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個(gè)TTL門電流,當(dāng)P2口被寫“1”時(shí),其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時(shí),P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲(chǔ)器或16位地址外部數(shù)據(jù)存儲(chǔ)器進(jìn)展存取時(shí),P2口輸出地址的高八位。在給出地址“1P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。ALE/PROG:當(dāng)外部存儲(chǔ)器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時(shí),ALE端以不變的頻率周期輸出正脈沖信號(hào),此頻率為振蕩器頻率的1/6。因此它可用作對(duì)外部輸出的脈沖或用于定時(shí)目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲(chǔ)器時(shí),將跳過(guò)一個(gè)ALE脈沖。如想制止ALE的輸出可在SFR8EH地址上置0。此時(shí),ALE只有在執(zhí)行MOV*,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE制止,置位無(wú)效。/PSEN:外部程序存儲(chǔ)器的選通信號(hào)。在由外部程序存儲(chǔ)器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在外部數(shù)據(jù)存儲(chǔ)器時(shí),這兩次有效的/PSEN信號(hào)將不出現(xiàn)。/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間外部程序存儲(chǔ)器〔0000H-FFFFH〕,不管是否有內(nèi)部程序存儲(chǔ)器。注意加密方式1時(shí),/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時(shí),此間內(nèi)部程序存儲(chǔ)器。在FLASH編程期間,此引腳也用于施加12V編程電源〔VPP〕。*TAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。*TAL2:來(lái)自反向振蕩器的輸出。第三章出租車計(jì)價(jià)系統(tǒng)的軟件設(shè)計(jì)單片機(jī)資源使用在本次設(shè)計(jì)中像電路鍵盤用到了P1口,其中P1.0到P1.4口作為鍵盤的輸入,直流電機(jī)電路的控制線用了P2口線,P3.0、P3.1、P3.2分別為led信號(hào)控制腳。顯示電路用到了P0和P2口,P0口為液晶的數(shù)據(jù)口。中斷子函數(shù)對(duì)于中斷程序,只要定時(shí)器計(jì)數(shù)滿就會(huì)產(chǎn)生中斷50ms中斷一次,共計(jì)20次,秒鐘加1,秒鐘計(jì)滿再分鐘加,當(dāng)分鐘加到99時(shí)全部清零。以下是中斷子函數(shù)的流程圖如圖3-1所示:圖3-1中斷子程序流程圖判鍵子函數(shù)對(duì)于獨(dú)立式鍵盤判鍵,首先看有鍵按下不,如果有鍵按下則延時(shí)一會(huì)兒,在判斷是否真的有鍵按下,如果確實(shí)有鍵按下,在判鍵釋放,最后執(zhí)行鍵功能程序。判鍵子函數(shù)的流程框圖如圖3-2所示:圖3-2判鍵子程序流程圖顯示子程序1602液晶是字符型液晶,它的內(nèi)部自帶字符庫(kù),它可以寫兩行的字符,同時(shí)每行可以寫40個(gè)字符,在寫顯示程序的時(shí)候,我們先寫命令,再設(shè)定字符顯示,最后寫數(shù)據(jù),在每寫一次命令或數(shù)據(jù)都需要判斷液晶是否忙。液晶顯示程序流程圖如圖3-3所示:圖3-3顯示子總程序流程框圖圖3-4整體程序流程圖第四章proteus的簡(jiǎn)介Proteus介紹Proteus軟件是來(lái)自英國(guó)Labcenterelectronics公司的EDA工具軟件,它組合了高級(jí)原理布圖、混合模式SPICE仿真,PCB設(shè)計(jì)以及自動(dòng)布線來(lái)實(shí)現(xiàn)一個(gè)完整的電子設(shè)計(jì)系統(tǒng)。此系統(tǒng)受益于15年來(lái)的持續(xù)開(kāi)發(fā),被?電子世界?在其對(duì)PCB設(shè)計(jì)系統(tǒng)的比擬文章中評(píng)為最好產(chǎn)品—“TheRoutetoPCBCAD〞。Proteus產(chǎn)品系列也包含了我們革命性的VSM技術(shù),用戶可以對(duì)基于微控制器的設(shè)計(jì)連同所有的周圍電子器件一起仿真。用戶甚至可以實(shí)時(shí)采用諸如LED/LCD、鍵盤、RS232終端等動(dòng)態(tài)外設(shè)模型來(lái)對(duì)設(shè)計(jì)進(jìn)展交互仿真。

其功能模塊:—個(gè)易用而又功能強(qiáng)大的ISIS原理布圖工具;PROSPICE混合模型SPICE仿真;ARESPCB設(shè)計(jì)。PROSPICE仿真器的一個(gè)擴(kuò)展PROTEUSVSM:便于包括所有相關(guān)的器件的基于微處理器設(shè)計(jì)的協(xié)同仿真。此外,還可以結(jié)合微控制器軟件使用動(dòng)態(tài)的鍵盤,開(kāi)關(guān),按鈕,LEDs甚至LCD顯示CPU模型。支持許多通用的微控制器,如PIC,AVR,HC11以及8051。最新支持ARM。交互的裝置模型包括:LED和LCD顯示,RS232終端,通用鍵盤,I2C,SPI器件。強(qiáng)大的調(diào)試工具,包括存放器和存儲(chǔ)器,斷點(diǎn)和單步模式。IARC-SPY和KeiluVision2等開(kāi)發(fā)工具的源層調(diào)試。應(yīng)用特殊模型的DLL界面-提供有關(guān)元件庫(kù)的全部文件。第五章設(shè)計(jì)體會(huì)與小結(jié)出租車計(jì)費(fèi)器系統(tǒng)的設(shè)計(jì)已經(jīng)全部完成,能按預(yù)期的效果進(jìn)展模擬汽車啟動(dòng),停頓,暫停等功能并能夠通過(guò)LCD顯示車費(fèi)數(shù)目。本款出租車計(jì)價(jià)器包括單價(jià)輸出、單價(jià)調(diào)整、顯示當(dāng)前的系統(tǒng)時(shí)間等功能。另外,多功能出租車計(jì)價(jià)器還具有性能可靠、電路簡(jiǎn)單、本錢低、實(shí)用性強(qiáng)等特點(diǎn),加上經(jīng)過(guò)優(yōu)化的程序,使其有很高的智能化水平。一個(gè)月來(lái),經(jīng)過(guò)自己努力,根本上完成了設(shè)計(jì)要求的內(nèi)容,在系統(tǒng)可行性分析、原理圖設(shè)計(jì)等方面都作了許多實(shí)際工作,取得了一些成績(jī),同時(shí)也遇到了一些問(wèn)題,存在一些缺乏。經(jīng)過(guò)這一個(gè)月的學(xué)習(xí),我覺(jué)得自己不管是在理論知識(shí)方面還是在動(dòng)手能力方面都有了不小的進(jìn)步,自己從中受益匪淺。這次設(shè)計(jì)很好的把以前學(xué)到的理論知識(shí)應(yīng)用于實(shí)踐,使我認(rèn)識(shí)到理論知識(shí)與實(shí)踐之間有一定的差距,只有通過(guò)不斷的努力學(xué)習(xí)和實(shí)踐才能很好的把理論知識(shí)應(yīng)用到實(shí)踐當(dāng)中,也只有通過(guò)不斷的實(shí)踐才能對(duì)理論知識(shí)的理解。通過(guò)這次設(shè)計(jì)不僅學(xué)會(huì)了如何去查找相關(guān)資料,更重要的是通過(guò)查找資料和翻閱書籍學(xué)到了不少知識(shí),擴(kuò)大了知識(shí)面,提高了知識(shí)水平。經(jīng)過(guò)單元設(shè)計(jì)和系統(tǒng)設(shè)計(jì)穩(wěn)固了以前所學(xué)的專業(yè)知識(shí),自己真正認(rèn)識(shí)到理論聯(lián)系實(shí)際的重要性,為以后的學(xué)習(xí)和工作提供了很多有價(jià)值的經(jīng)歷。通過(guò)這次設(shè)計(jì)不僅增強(qiáng)了自己的動(dòng)腦能力和動(dòng)手能力,也提高了我思考問(wèn)題、分析問(wèn)題、解決問(wèn)題的能力,更重要的是學(xué)會(huì)用工程化的思想來(lái)解決問(wèn)題。這在以前的學(xué)習(xí)過(guò)程中是不曾學(xué)到的。這次設(shè)計(jì)是我認(rèn)真認(rèn)識(shí)到完整、嚴(yán)謹(jǐn)、科學(xué)分析問(wèn)題、解決問(wèn)題的思想是多么的重要,只有擁有了科學(xué)的態(tài)度才能設(shè)計(jì)出有用的產(chǎn)品。另外通過(guò)本次設(shè)計(jì),是我認(rèn)識(shí)到自己理論知識(shí)的應(yīng)用能力有很大的欠缺,需要在以后的學(xué)習(xí)中進(jìn)一步提高。參考文獻(xiàn)李廣弟,朱月秀,冷祖祁.單片機(jī)根底[M].第3版.航空航天大學(xué),2007李華.MCS-51系列單片機(jī)實(shí)用接口技術(shù)[M].航空航天大學(xué),1996李群芳,肖看.單片機(jī)原理接口與應(yīng)用.:清華大學(xué),2005朱承高.電工及電子技術(shù)手冊(cè)[M].:高等教育,1990頂峰.單片微型應(yīng)用系統(tǒng)設(shè)計(jì)及實(shí)用技術(shù).:機(jī)械工業(yè),2004胡輝,單片機(jī)原理及應(yīng)用設(shè)計(jì)—21世紀(jì)高等院校規(guī)劃教材[M],水利水電,2005.7*守義,單片機(jī)應(yīng)用技術(shù)[M],**:**電子科技大學(xué),1996源程序*include<reg52.h>*defineuintunsignedint*defineunchunsignedcharsbitlcden=P1^4; //lcd使能端,高脈沖有效sbitlcdrs=P1^5; //lcd數(shù)據(jù)-指令端,低電平-寫指令,高電平-寫數(shù)據(jù)sbitlcdrw=P1^6; //lcd讀-寫指令端,低電平執(zhí)行寫,高電平執(zhí)行讀sbitkey1=P2^0; //復(fù)位按鍵,初始起步價(jià)5元,里程數(shù)歸0sbitkey2=P2^1; //"+"按鍵,手動(dòng)調(diào)整白天、夜間的單價(jià)和時(shí)鐘時(shí)間的調(diào)整sbitkey3=P2^2; //"-"按鍵,手動(dòng)調(diào)整白天、夜間的單價(jià)和時(shí)鐘時(shí)間的調(diào)整sbitkey4=P2^3; //白天夜間切換按鍵sbitkey5=P2^4; //移屏顯示時(shí)鐘sbitkey6=P2^5; //校正時(shí)間按鍵unchcodetime[2][6]={"day","Night"}; //白天夜間字符串?dāng)?shù)組unchcodeweek_table[7][4]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; //星期顯示unchcodedate_table[]="Date:20"; //年月日初始寫入/********變量定義為整形實(shí)際顯示是浮點(diǎn)型,程序?qū)懭胄?shù)點(diǎn)*****************/uintkilometer; //里程變量unchunit_price_day,unit_price_night; //白天夜間單價(jià)變量unchchange,flag_display; //屏幕切換標(biāo)志變量unchsw,gw; //分解位變量unchi;unchnum1; //定時(shí)器1所需變量unchtemp_second,temp_minute,temp_hour; //時(shí)鐘小時(shí)、分鐘、秒變量unchyear,month,day; //時(shí)鐘年、月、日變量unchweek,n; //時(shí)鐘星期所需變量unchtemp_add1; //時(shí)鐘校正時(shí)地址暫存變量unchrow; //校正第幾行變量unchcount10s; //等待10s變量 uinttotal_price_temp; //根據(jù)里程數(shù)確定的價(jià)格變量uinttotal_price_wait; //等待10s后的價(jià)格變量voidstart(){ temp_second=0; //秒初始值 temp_minute=0; //分鐘初始值 temp_hour=0; //小時(shí)初始值 year=10; //年份初始值 month=8; //月份初始值 day=24; //日初始值 week=1; //星期初始值 temp_add1=0; //校時(shí)地址暫存變量初始值 row=1; //校時(shí)第幾行初始值}//**********************分解位函數(shù)**********************//voidcalculate(unchmiddle){ sw=middle/10; //十位 gw=middle%10; //個(gè)位}/************************ms延時(shí)函數(shù)*************************/voiddelay(uintz){ uinti,j; for(i=z;i>0;i--) for(j=110;j>0;j--) ;}//*******************************lcd寫數(shù)據(jù)*****************//voidwrite_data(unchdate){ lcden=0; lcdrs=1; //寫數(shù)據(jù),高電平有效 P0=date; //先賦值, delay(5); //延時(shí)后 lcden=1; //lcden一旦拉高,數(shù)據(jù)立馬寫入 delay(5); //延時(shí)后 lcden=0; //再次置低,準(zhǔn)備下一次拉高}//******************************lcd寫指令*********************//voidwrite_(unch){ lcden=0; lcdrs=0; //寫指令,低電平有效 P0=; //賦值 delay(5); //延時(shí)后 lcden=1; //lcden拉高 delay(5); //延時(shí)后 lcden=0; //再次置低}/************************************lcd初始化*********************/voidlcd_initial(){ lcden=0; lcdrw=0; //表示對(duì)lcd進(jìn)展寫操作 write_(0*38); //lcd顯示 write_(0*0c); //開(kāi)顯示,不顯示光標(biāo) write_(0*06); //讀或?qū)懞?,地址指?1 total_price_wait=0; //等待時(shí)計(jì)費(fèi)變量清0 kilometer=0; //里程數(shù)清0 unit_price_day=14; //白天單價(jià)初始值1.4,程序?qū)懭胄?shù)點(diǎn) unit_price_night=17; //夜間單價(jià)初始值1.7,程序?qū)懭胄?shù)點(diǎn)}/********里程顯示函數(shù)整形表示,程序?qū)懭胄?shù)點(diǎn),準(zhǔn)確0.1km***********/voidkilometer_display(uinttemp){ unchbw,sw,gw; write_(0*80); bw=temp/100; sw=temp%100/10; gw=temp%100%10; write_data('0'+bw); write_data('0'+sw); write_data('.'); write_data('0'+gw); write_data('k'); write_data('m');}/***************單價(jià)顯示函數(shù)(整形表示,程序?qū)懭胄?shù)點(diǎn))******************/voidunit_price_display(unchtemp){ unchsw,gw; sw=temp/10; gw=temp%10; write_(0*80+9); write_data('0'+sw); write_data('.'); write_data('0'+gw); write_data('/'); write_data('k'); write_data('m');}/**********總價(jià)顯示函數(shù)(整形表示,程序?qū)懭胄?shù)點(diǎn))準(zhǔn)確到角**************/voidtotal_price_display(uinttemp){ unchqw,bw,sw; qw=temp/1000; bw=temp%1000/100; sw=temp%1000%100/10; write_(0*80+0*40); write_data('0'+qw); write_data('0'+bw); write_data('.'); write_data('0'+sw);}/***************白天/夜間,j=0表示白天,j=1表示夜間顯示函數(shù)****************/voidtime_display(unchj){ unchn; write_(0*80+0*40+9); for(n=0;time[j][n]!='\0';n++) write_data(time[j][n]);}/******外部中斷0下降沿觸發(fā)形式統(tǒng)計(jì)里程數(shù)********/voide*tern_interrupt0_initial(){ EA=1; //開(kāi)總中斷 E*0=1; //開(kāi)外部中斷0 IT0=1; //外部中斷0下降沿觸發(fā)}//***********************50ms定時(shí)初始化用于時(shí)鐘*******************************//voidtiming1_initial() { TMOD=0*15; TH1=(65536-45872)/256; //11.0592M晶振 TL1=(65536-45872)%256; EA=1; //開(kāi)總中斷 ET1=1; //開(kāi)定時(shí)器1 TR1=1; //啟動(dòng)定時(shí)器1時(shí)鐘}/*****************采用中斷的方式記錄里程,下降沿觸發(fā)***************************/voide*tern_interrupt0()interrupt0{ unchmile_num; count10s=0; if(mile_num<10)//每個(gè)方波代表10米,10次代表100米即顯示0.1公里 mile_num++; else { mile_num=0; kilometer=kilometer+1; } }/*************************************屏2日期顯示函數(shù)******************************/voidlcd_date_display(){ unchi;write_(0*80+0*40+24); for(i=0;date_table[i]!='\0';i++) { write_data(date_table[i]); }}/************************************屏2時(shí)鐘顯示函數(shù)********************************/voidlcd2_display(){ if(num1==20) //定時(shí)器150ms一次中斷20次即為1s { num1=0; temp_second++; count10s++; if(temp_second==60) { temp_second=0; temp_minute++; } if(temp_minute==60) { temp_minute=0; temp_hour++; } if(temp_hour==24) { temp_hour=0; day++; week++; } if(week==7) week=0; if(day==32) //未考慮*月31天或30天以及閏年平年 { day=1; month++; } if(month==13) { month=1; year++; } calculate(temp_second); //分解秒的各位 write_(0*80+24+8); //確定秒在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); calculate(temp_minute); //分解分的各位 write_(0*80+24+0*05); //確定分鐘在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); write_data(':'); calculate(temp_hour); //分解時(shí)的各位 write_(0*80+24+0*02); //確定小時(shí)在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); write_data(':'); write_(0*80+24+12); //確定星期在lcd屏上的位置 for(n=0;week_table[week][n]!='\0';n++) write_data(week_table[week][n]); calculate(year); //分解年的各位 write_(0*80+0*40+24+7); //確定年在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); write_data('/'); calculate(month); //分解月的各位 write_(0*80+0*40+24+10); //確定月在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); write_data('/'); calculate(day); //分解日的各位 write_(0*80+0*40+24+13); //確定日在lcd屏上的位置 write_data('0'+sw); write_data('0'+gw); write_data('\0'); }}//*********************定時(shí)器1中斷程序*******************//voidtiming1()interrupt3{ TR1=0; TH1=(65536-45872)/256; TL1=(65536-45872)%256; num1++; lcd2_display(); //第二屏液晶顯示函數(shù) TR1=1;}/**********************獨(dú)立鍵盤掃描函數(shù)************************/voidkey_scan(){ if(key1==0) //復(fù)位按鍵,初始起步價(jià)5元,里程數(shù)歸0 { delay(5); if(key1==0) { while(!key1); delay(5); while(!key1); total_price_temp=0; lcd_initial(); //初始化液晶第一屏,里程數(shù)歸0,起步價(jià)5元 kilometer_display(kilometer); //顯示復(fù)位后初始里程數(shù) if(i%2==1) //奇數(shù)次按下是夜間狀態(tài)再?gòu)?fù)位 { unit_price_display(unit_price_night);//顯示夜間單價(jià) time_display(1); //顯示夜間狀態(tài) } if(i%2==0) //偶數(shù)次按下是白天狀態(tài)再?gòu)?fù)位 { unit_price_display(unit_price_day);//顯示白天單價(jià) time_display(0); //顯示白天狀態(tài) } total_price_display(500); //起步價(jià)5元,程序?qū)懭胄?shù)點(diǎn) lcd_date_display(); //年月日初始寫入 } } if(flag_display==0) //如果是在屏幕1 { if(key2==0) { delay(5); if(key2==0) { while(!key2); delay(5); while(!key2); if(i%2==0) //偶數(shù)次按下切換鍵后是白天,白天單價(jià)調(diào)整增加 unit_price_day++; if(i%2==1) //奇數(shù)次按下切換鍵后是夜間,夜間單價(jià)調(diào)整增加 unit_price_night++; } } if(key3==0) { delay(5); if(key3==0) { while(!key3); delay(5); while(!key3); if(i%2==0) //偶數(shù)次按下切換鍵后是白天,白天單價(jià)調(diào)整減少 unit_price_day--; if(i%2==1) //奇數(shù)次按下切換鍵后是夜間,夜間單價(jià)調(diào)整減少 unit_price_night--; } } }/****************如果是在屏幕2則校正時(shí)鐘********************************/ if(flag_display==1) { if(key6==0) { delay(5); if(key6==0) { temp_add1+=3; //地址變量不斷更新 while(!key6); TR1=0; //時(shí)鐘停頓準(zhǔn)備校時(shí) switch(temp_add1) { case15: temp_add1=8; //充新賦值地址暫存變量,準(zhǔn)備校正第2排 row=2; break; case17: temp_add1=0; //第一屏校正完后 row=1; write_(0*0c); //光標(biāo)不閃 TR1=1; //時(shí)鐘啟動(dòng) break; } } } if(temp_add1==3) //采用尋地址法校正,小時(shí)加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); temp_hour++; if(temp_hour==24) temp_hour=0; write_(0*80+24+temp_add1-1); calculate(temp_hour); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==6) //采用尋地址法校正,分鐘加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); temp_minute++; if(temp_minute==60) temp_minute=0; write_(0*80+24+temp_add1-1); calculate(temp_minute); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==9) //采用尋地址法校正,秒加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); temp_second++; if(temp_second==60) temp_second=0; write_(0*80+24+temp_add1-1); calculate(temp_second); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==12) //采用尋地址法校正,星期加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); week++; if(week==7) week=0; write_(0*80+24+temp_add1); for(n=0;week_table[week][n]!='\0';n++) write_data(week_table[week][n]); } } } if(temp_add1==8) //采用尋地址法校正,年加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); year++; if(year==99) year=0; write_(0*80+0*40+24+temp_add1-1); calculate(year); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==11) //采用尋地址法校正,月加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); month++; if(month==13) month=1; write_(0*80+0*40+24+temp_add1-1); calculate(month); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==14) //采用尋地址法校正,日加法校正 { if(key2==0) { delay(5); if(key2==0) { while(!key2); day++; if(day==32) day=1; write_(0*80+0*40+24+temp_add1-1); calculate(day); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==3) //采用尋地址法校正,小時(shí)減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); temp_hour--; if(temp_hour==255) temp_hour=23; write_(0*80+24+temp_add1-1); calculate(temp_hour); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==6) //采用尋地址法校正,分鐘減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); temp_minute--; if(temp_minute==255) temp_minute=59; write_(0*80+24+temp_add1-1); calculate(temp_minute); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==9) //采用尋地址法校正,秒減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); temp_second--; if(temp_second==255) temp_second=59; write_(0*80+24+temp_add1-1); calculate(temp_second); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==12) //采用尋地址法校正,星期減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); week--; if(week==255) week=6; write_(0*80+24+temp_add1); for(n=0;week_table[week][n]!='\0';n++) write_data(week_table[week][n]); } } } if(temp_add1==8) //采用尋地址法校正,年減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); year--; if(year==255) year=99; write_(0*80+0*40+24+temp_add1-1); calculate(year); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==11) //采用尋地址法校正,月減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); month--; if(month==0) month=12; write_(0*80+0*40+24+temp_add1-1); calculate(month); write_data('0'+sw); write_data('0'+gw); } } } if(temp_add1==14) //采用尋地址法校正,日減法校正 { if(key3==0) { delay(5); if(key3==0) { while(!key3); day--; if(day==0) day=31; write_(0*80+0*40+24+temp_add1-1); calculate(day); write_data('0'+sw); write_data('0'+gw); } }

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論