版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE出租車計價器系統(tǒng)摘要隨著出租車行業(yè)的發(fā)展,對出租車計費器的要求也越來越高。二十世紀(jì)后半期,隨著集成電路和計算機技術(shù)的飛速發(fā)展,單片機技術(shù)也得到了飛速發(fā)展,基于單片機的出租車計費器不僅可以解決電子系統(tǒng)小型化、低功耗、高可靠性等問題,而且其開發(fā)周期短、開發(fā)軟件投入少、芯片價格不斷降低,特別是對小批量、多品種的產(chǎn)品需求,單片機具有體積小、功能強可靠性高、價格低廉等一系列優(yōu)點,不僅已成為工業(yè)測控領(lǐng)域普遍采用的智能化控制工具,而且已滲入到人們工作和和生活的各個角落,有力地推動了各行業(yè)的技術(shù)改造和產(chǎn)品的更新?lián)Q代,應(yīng)用前景廣闊。(使用單片機的外圍電路比較簡單),在時間計數(shù)和速度的計算上便于擴展功能很,系統(tǒng)能夠?qū)崿F(xiàn)升級。很多數(shù)值可以預(yù)先寫到芯片中。本設(shè)計假設(shè)速度恒定為60Km/h,即1Km/min。本設(shè)計主要了解應(yīng)用單片機的定時器/計數(shù)器,以及中斷。這是一個比較小的系統(tǒng),故采用匯編語言來編輯。匯編語言是一種編譯型程序設(shè)計語言,它具有編譯速度快,占用系統(tǒng)空間小,具有一定的助記可讀性等特點。本系統(tǒng)假設(shè)速度恒定60Km/h(1Km/min),單價一定1.3元/Km,起步價5.0元,超過三公里開始計費,每公里加1.3元。關(guān)鍵詞:出租車計費器;AT89C51;定時器/計數(shù)器TAXIMENTERSYSTEMAbstractAsthetaxiindustry,taximetersontherequestalsogettinghigherandhigher.Thelatterhalfofthe20thcentury,alongwithintegratedcircuitsandtherapiddevelopmentofcomputertechnology,SCMtechnologyhasbeendevelopingrapidly,basedonSCMtaximeterscannotonlysolvetheelectronicsystemofsmall,low-power,high-Reliabilityandotherissues,anditsshortdevelopmentcycle,asmallersoftwaredevelopment,chippricesarelower,especiallyforsmallquantities,andmorevarietiesofproductdemand,MCUissmallinsize,highreliabilityandstrongfeatures,suchasalowpriceSeriesofadvantages,notonlyhasbecomewidelyadoptedinthefieldofindustrialmeasurementandcontrolofintelligentcontrol,butalsotohaveinfiltratedintopeople'sworkandlifeandeverycornerofapowerfulimpetustothetechnologicaltransformationofvariousindustriesandtheupgradingofproducts,theapplicationofabroadprospect.(SCMuseoftherelativelysimpleexternalcircuit),intimecountandthespeedofcalculationisveryeasyexpansionoffunctions,thesystemcanberealizedupgrade.Numericalwrotealotofchipsinadvance.Thecurriculumdesignassumptionsfortheconstantspeedof60Km/h,thatis,1Km/min.
Learnthislesson,amajorapplicationMCUtimer/counter,anddisruption.Thisisarelativelysmallsystem,theuseofassemblylanguagetoedit.Compilationoflanguageisacompiler-basedprogramminglanguage,ithascompiledfast,occupyspaceonthesystem,havesomehelpinmindthecharacteristicsofreadability.
Thesystemassumedaconstantspeedof60Km/h(1Km/min),pricedsome1.3yuan/Km,withfaresstarting5.0yuan,accountingbeganmorethanthreekilometers,and1.3yuanperkm.Keywords:axi-billing;AT89C51;imer/counter目錄1概述 11.1我國出租車的發(fā)展 11.2現(xiàn)階段出租車計價器的要求 22方案論證 32.1方案一 32.2方案二 32.3方案比較 33單片機89C51的簡介 43.1主芯片89C51的硬件資源 43.1.1單片機的概念 43.1.289C51的芯片引腳圖 53.1.3使用I/O口的注意事項 73.289C51中斷系統(tǒng) 73.2.1中斷源 73.2.2中斷的控制 83.2.3中斷響應(yīng) 83.3單片機定時器/計數(shù)器的使用 93.3.1與T/C有關(guān)的特殊功能寄存器 103.3.2定時器/計數(shù)器的初始化 104計價器系統(tǒng)設(shè)計 124.1硬件設(shè)計 124.1.1整體硬件電路圖 124.1.274LS273和74LS02簡介 134.2軟件設(shè)計 144.2.1模塊介紹 144.2.2程序流程圖 154.2.3程序流程圖 16結(jié)束語 25參考文獻 26出租車計價器系統(tǒng)PAGE411概述1.1我國出租車的發(fā)展20世紀(jì)20-30年代是我國城市出租汽車行業(yè)的大發(fā)展時期。20年代初,北京自用及營運汽車有1231輛,出租汽車行達51家.據(jù)統(tǒng)計,上海市于2933-1934年間,有出租汽車行達91家,營業(yè)站153處,營運汽車達1151輛。20年代末,哈爾濱由于外國僑民劇增,使得出租汽車增多,在500輛。1934年,河南出現(xiàn)了最早的出租汽車。開封有了首家私人出租車戶,經(jīng)營5輛小客車。1935年,河南長途汽車營業(yè)部購進3輛福特牌小客車,也在市區(qū)經(jīng)營出租業(yè)務(wù)。當(dāng)時,因出租車很時髦,用戶多是豪紳富商,他們走官場,講闊氣,不惜高價租用,所以,出租車的營業(yè)狀況較好??谷諔?zhàn)爭爆發(fā)后,國土的淪陷,戰(zhàn)爭的紛擾,出租汽車發(fā)展受到?jīng)_擊,數(shù)量急劇減少。至1942年,北京出租汽車行減少到48家,營運汽車約446輛,以后逐漸萎縮,至1946年,僅剩出租汽車303輛。上海在此期間,出租汽車行僅存30家,至1948年,出租汽車行僅有51家,車數(shù)減少到705輛。中華人民共和國成立初期,出租汽車主要由兩種成分組成。一種為私有制的出租汽車,這種成分由于服務(wù)對象發(fā)生變化,客流量下降,加上車輛難以更新,營運車輛日趨減少,到1956年前,北京市出租一汽車行僅剩30家。另一種成分為公有制事業(yè)單位,主要是為了滿足接待外賓來訪和重要會議需要,由各省市人民政府組建成的汽車公司和汽車隊。50年代末至60年代初,國家旅游主管部門為適應(yīng)旅游事業(yè)發(fā)展的需要,先后在各地組建了旅游汽車隊?!拔母铩睍r期,乘出租車被稱為“四舊”,受到批判,車輛大量停駛,出租汽車行業(yè)處于奄奄一息狀態(tài)。當(dāng)時,北京市僅有出租汽車200多輛。其他城市出租汽車也為數(shù)不多。1978年12月,黨的十一屆三中全會召開以后,國家實行了改革開放政策,城市經(jīng)濟日益繁榮,對外經(jīng)濟文化交流日益頻繁,人民生活有了很大的改善和提高,出租汽車不再是北京、上海、天津及廣州、哈爾濱等大城市的專利,全國很多中小城市在1980年以后也出現(xiàn)了出租汽車,且連續(xù)出現(xiàn)幾次高速發(fā)展浪潮。國家為解決群眾“乘車難”問題,滿足不同層次乘客出行的需要,對出租汽車行實行國營、集體、個人一起上,各行各業(yè)均可參與經(jīng)營出租汽車的政策,為出租汽車行業(yè)的發(fā)展帶來了契機,80年代后期至90年代,形成了快速發(fā)展的態(tài)勢。根據(jù)市場發(fā)展的需要,國家有關(guān)部委相繼頒布了出租汽車行業(yè)的管理規(guī)定,各地政府也根據(jù)本地實際制定了不少出租汽車管理辦法,使出租汽車行業(yè)逐步走上了規(guī)范化、正規(guī)化的法制管理軌道。1.2現(xiàn)階段出租車計價器的要求隨著出租車行業(yè)的發(fā)展,對出租車計費器的要求也越來越高,用戶不僅要求計費器性能穩(wěn)定,計費準(zhǔn)確,有防作弊功能;同時還要求其具有車票資料打印、IC卡付費、語音報話、和電腦串行通信等功能。通常,設(shè)計出租車計費器面臨以下三方面的問題:(1)不同國家和地區(qū)的計費方式存在差異。有些地區(qū)有夜間收費及郊區(qū)收費等,而有些地區(qū)則無夜間收費和郊區(qū)收費;即使同一地區(qū),不同車型的出租車,其計費方式也有差別;另一方面,出租車還面臨幾年一次的調(diào)價或調(diào)整計費方式等問題。因此,所設(shè)計的計費器不僅要能滿足不同國家和地區(qū)的要求,而且計費方式的調(diào)整也應(yīng)當(dāng)很方便。(2)由于個別地區(qū)對計費器有特殊要求,有時必須修改軟件;另外,計費器還面臨軟件的升級;因而,所設(shè)計的計費器應(yīng)能很方便地重新編程。(3)計費器必須要有防作弊功能,能有效防止司機作弊;同時要防止計費器在營運過程中死機。為此,設(shè)計出一款好的計費器,解決了上述問題是非常必要的。該計費器內(nèi)設(shè)置了多達64個選項,幾乎涵蓋了大多數(shù)國家和地區(qū)的出租車計費方式,因此,使用時無需更改計費器的硬件,而只需更改相應(yīng)的選項資料,便可適用于不同的國家和地區(qū),且計費資料的傳送可由電腦通過RS-232串口或?qū)S玫氖殖质劫Y料傳輸器來完成,非常方便;由于采用了具有單片機AT58C51,因此,編程時無需將單片機從電路板上取下,就可以直接對單片機進行編程;另外,該設(shè)計還采用單、雙信號防作弊技術(shù)和看門狗電路,較好地解決了計費器的作弊現(xiàn)象及死機問題。目前,該計費器已在許多大中城市得到了廣泛的應(yīng)用。3單片機89C51的簡介3.1主芯片89C51的硬件資源3.1.1單片機的概念單片機(microcontroller,又稱微控制器)是在一塊硅片上集成了各種部件的微型計算機。這些部件包括中央處理器CPU、數(shù)據(jù)存儲器RAM、程序存儲器ROM、定時器/計數(shù)器和多種I/O接口電路。圖4-1是80C51單片機的基本結(jié)構(gòu)圖圖4-1圖4-189C51結(jié)構(gòu)方框圖a.89C51單片機的結(jié)構(gòu)特點有以下幾點:8位CPU;片內(nèi)振蕩器及時鐘電路;32根I/O線;外部存儲器ROM和RAM,尋址范圍各64KB;兩個16位的定時器/計數(shù)器;5個中斷源,2個中斷優(yōu)先級全雙工串行口布爾處理器b.定時器/計數(shù)器89C51內(nèi)部有兩個16位可編程定時器/計數(shù)器,記為T0和T1。16位是指它們都是由16個觸發(fā)器構(gòu)成,故最大計數(shù)模值為2-1??删幊淌侵杆麄兊墓ぷ鞣绞接芍噶顏碓O(shè)定,或者當(dāng)計數(shù)器來用,或者當(dāng)定時器來用,并且計數(shù)(定時)的范圍也可以由指令來設(shè)置。這種控制功能是通過定時器方式控制寄存器TMOD來完成的.如果需要,定時器在計到規(guī)定的定時值時可以向CPU發(fā)出中斷申請,從而完成某種定時的控制功能。在計數(shù)狀態(tài)下同樣也可以申請中斷。定時器控制寄存器TCON用來負責(zé)定時器的啟動、停止以及中斷管理在定時工作時,時鐘由單片機內(nèi)部提供,即系統(tǒng)時鐘經(jīng)過12分頻后作為定時器的時鐘。技術(shù)工作時,時鐘脈沖由TO和T1輸入。c.中斷系統(tǒng)89C51的中斷系統(tǒng)允許接受五個獨立的中斷源,即兩個外部中斷申請,兩個定時器/計數(shù)器中斷以及一個串行口中斷。外部中斷申請通過INTO和INT1(即P3.2和P3.3)輸入,輸入方式可以是電平觸發(fā)(低電平有效),也可以是邊沿觸發(fā)(下降沿有效)。兩個定時器中斷請求是當(dāng)定時器溢出時向CPU提出的,即當(dāng)定時器由狀態(tài)1轉(zhuǎn)為全零時提出的。第五個中斷請求是由串行口發(fā)出的,串行口每發(fā)送完一個數(shù)據(jù)或接收完一個數(shù)據(jù),就可提出一次中斷請求。3.1.289C51的芯片引腳圖VCC:供電電壓。GND:接地。P0口:P0口為一個8位漏極開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。圖4-2圖4-289C51引腳圖P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89CP3.0RXD(串行輸入口)P3.1TXD(串行輸出口)P3.2/INT0(外部中斷0)P3.3/INT1(外部中斷1)P3.4T0(定時器/計數(shù)器0外部輸入)P3.5T1(定時器/計數(shù)器1外部輸入)P3.6/WR(外部數(shù)據(jù)存儲器寫選通)P3.7/RD(外部數(shù)據(jù)存儲器讀選通)P3口同時為閃爍編程和編程校驗接收一些控制信號。RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機器周期的高電平時間。ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。EA/VPP:當(dāng)/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源(VPP)。XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。3.1.3使用I/O口的注意事項(1)P1,P2,P3口的輸出緩沖器可驅(qū)動4個LSTTL電路。對于HCMOS芯片單片機的I/O口,在正常情況下,可任意由TTL或NMOS電路驅(qū)動。HMOS及CMOS性的單片機I/O口有集電極開路或漏極開路的輸出來驅(qū)動時,不必外加上拉電阻(2)對于74LS系列,CD4000系列以及一些大規(guī)模集成電路芯片(如8155,8253,8279等),都可以和MCS-51系列單片機直接接口。具體使用時,可以查閱有關(guān)器件手冊或參考典型電路(3)對一些線性組件,特別是應(yīng)用鍵盤、碼盤、LED顯示器等輸入/輸出設(shè)備時,應(yīng)當(dāng)盡量增加驅(qū)動部分的容量,否則,單片機將提供不出足夠的驅(qū)動電流供給負載使用3.289C51中斷系統(tǒng)所謂中斷,是指當(dāng)計算機執(zhí)行正常程序時,系統(tǒng)中出現(xiàn)某些急需處理的異常情況和特殊情求,CPU暫停執(zhí)行現(xiàn)行程序,轉(zhuǎn)去對隨機發(fā)生地更緊迫事件進行處理;處理完畢后,CPU自動返回原來的程序繼續(xù)執(zhí)行。中斷允許軟件設(shè)計不需要關(guān)心系統(tǒng)其他部分定時要求,算術(shù)程序不需要考慮隔幾個指令檢查I/O設(shè)備是否需要服務(wù)。相反,算術(shù)程序編寫時好像有無限的時間作算術(shù)運算而無其他工作在進行。若其它事件需要服務(wù)時,則通過中斷告訴系統(tǒng)。89C51單片機有5個中斷源,有兩個中斷優(yōu)先級,每個中斷源的優(yōu)先級可以編程控制。中斷允許受到CPU開中斷和中斷源開中斷的兩級控制。3.2.1中斷源中斷源是指任何引起計算機中斷的事件,一般一臺機器允許有許多個中斷源。89C51系列單片機至少有5個中斷源。增加很少的硬件就可把各種硬件中斷源“線或”成為一個外部中斷輸入,然后再順序檢索一起中斷的特定源。89C51單片機的5個中斷源是:① 外部中斷請求0,由(P3.2)輸入;② 外部中斷請求1,由(P3.3)輸入;③ 片內(nèi)定時器/計數(shù)器0益處中斷請求;④ 片內(nèi)定時器/計數(shù)器1溢出中斷請求;片內(nèi)串行口發(fā)送/接收中斷請求;為了了解每個中斷源是否產(chǎn)生了中斷請求,中斷系統(tǒng)應(yīng)設(shè)置許多個中斷請求觸發(fā)器(標(biāo)志位)實現(xiàn)記憶。這些中斷源請求標(biāo)志位分別有特殊功能寄存器TCON和SCON的相應(yīng)位鎖存定時器/計數(shù)器控制寄存器TCON,它是一個八位的寄存器,各位如表4.1所示:表4.1定時器/計數(shù)器控制寄存器TCONTF1TF0IE1IT1IE0IT0IT0,IT1:外部中斷0、1觸發(fā)方式選擇位,由軟件設(shè)置。1是下降沿觸發(fā),0是電平觸發(fā)。IE0,IE1:外部終端0、1請求標(biāo)志位。TF0,TF1:定時器/計數(shù)器0、1溢出中斷請求標(biāo)志。3.2.2中斷的控制中斷的控制主要實現(xiàn)中斷的開關(guān)管理和中斷優(yōu)先級的管理。這個管理主要通過對特殊功能寄存器IE和IP的編程實現(xiàn)。(1)中斷允許寄存器IE表4.2中斷允許寄存器IEEA-ET2ESET1EX1ET0EX0EX0,EX1:外部終端0,1的中斷允許位。1是中斷開,0是中斷關(guān)ET0,ET1:定時器/計數(shù)器0、1溢出中斷允許位。1是開中斷,0是關(guān)中斷ES:串行口中斷允許位。1是中斷開,0是中斷關(guān)ET2:定時器/計數(shù)器2溢出中斷位EA:CPU開/關(guān)中斷控制位。1是開中斷,0是關(guān)中斷(2)中斷優(yōu)先級寄存器IP表4.3中斷優(yōu)先級寄存器IPPSPT1PX1PT0PX0若系統(tǒng)中多個中斷源同時請求中斷,則CPU按中斷源的優(yōu)先級別,由高到低分別響應(yīng)。89C51單片機有兩個中斷優(yōu)先級:高優(yōu)先級和低優(yōu)先級。每個中斷源都可以編程為高優(yōu)先級。這可以實現(xiàn)兩級中斷嵌套。嵌套的原則:一個正在執(zhí)行的中斷服務(wù)程序可以被高級的中斷請求中斷,而不能被同級或較低級的中斷請求中斷。兩級中斷通過使用IP寄存器設(shè)置,相應(yīng)的位置1,則優(yōu)先級高,0則優(yōu)先級低。PX0、PX1:終端0、1中斷優(yōu)先級控制;PT0、PT1:定時器/計數(shù)器0、1中斷優(yōu)先級控制。PS:串行口中斷優(yōu)先級控制。89C51復(fù)位時,IP被清零,5個中斷源都在同一個優(yōu)先級。這時若其中幾個中斷源同時產(chǎn)生中斷請求,則CPU按照片內(nèi)硬件優(yōu)先級鏈路的順序相應(yīng)中斷,硬件優(yōu)先級由高到低的順序是:外部終端0,定時器/計數(shù)器0,外部中斷1,定時器/計數(shù)器1串行口中斷。3.2.3中斷響應(yīng)89C51的CPU在每個機器周期采樣中斷源的中斷請求標(biāo)志位,如果沒有上述阻止條件,則將在下一個機器周期響應(yīng)被激活的最高級中斷請求。阻止條件如下:CPU正在處理同級或更高級的中斷;現(xiàn)行機器周期不是所執(zhí)行指令的最后一個機器周期;正在執(zhí)行的是RETI或者是訪問IE或IP的指令;CPU在中斷響應(yīng)之后完成如下操作:硬件清除相應(yīng)的中斷標(biāo)志位;執(zhí)行一條硬件子程序,保護斷點,并轉(zhuǎn)向中斷服務(wù)程序入口。結(jié)束中斷時執(zhí)行RETI指令,恢復(fù)斷點,返回主程序。89C51的CPU在相應(yīng)中斷請求時,由硬件電路自動形成轉(zhuǎn)向與該中斷源對應(yīng)的中斷的服務(wù)程序入口地址。這種方法為硬件向量中斷法。各中斷源的中斷服務(wù)程序入口地址如下:表4.4中斷源的中斷服務(wù)程序入口地址編號中斷源入口地址0外部終端00003H1定時器/計數(shù)器0000BH2外部終端10013H3定時器/計數(shù)器1001BH4串行口中斷0023H各中斷服務(wù)程序入口地址僅隔8個字節(jié),編譯器在這些地址放入無條件轉(zhuǎn)移指令,跳到服務(wù)程序的實際地址。向量中斷包括把先前的程序計數(shù)指針推入堆棧,中斷服務(wù)程序很像其他子程序。當(dāng)向量中斷發(fā)生時,硬件禁止所有中斷。此時表明外部中斷或定時器溢出的標(biāo)志位由硬件清除。中斷服務(wù)程序的不同分支取決于中斷源。在重新允許全局CPU中斷EA之前,必須仔細清除各種標(biāo)志。標(biāo)志會引起立即地重復(fù)中斷。89C51對終端實際上有特殊的返回指令RETI。不是RET。RETI重新允許系統(tǒng)識別其他中斷。因而,沒必要在正常使用中斷時復(fù)位EA,只要在程序初始化時開中斷一次就可以了。3.3單片機定時器/計數(shù)器的使用89C51系列單片機至少有兩個16位內(nèi)部定時器/計數(shù)器。8952有三個定時器/計數(shù)器,其中連個基本定時器/計數(shù)器是定時器/計數(shù)器0和定時器/計數(shù)器1。他們既可以編程為定時器使用,也可以編程為計數(shù)器使用。若是計數(shù)內(nèi)部晶振驅(qū)動時鐘,則它是定時器;若是計數(shù)89C51的輸入引腳的脈沖信號,則它是計數(shù)器。89C51的T/C時加一計數(shù)的。定時器實際上也是工作在技術(shù)方式下的,只不過對固定頻率的脈沖計數(shù);由于脈沖周期固定,由計數(shù)值可以計算出時間,有定時功能。當(dāng)T/C工作在定時器時,對振蕩源12分頻的脈沖計數(shù),即每個機器周期計數(shù)值加一,頻率加=fosc/12。晶振為6MHz,計數(shù)頻率=500KHz,每2uS計數(shù)加一。當(dāng)T/C工作在計數(shù)器時,計數(shù)脈沖來自外部脈沖輸入引腳T0或T1。當(dāng)T0或T1腳上負跳變需2個機器周期,即24個振蕩周期。所以T0或T1腳輸入的計數(shù)外部脈沖的最高頻率為fosc/12。當(dāng)晶振為12MHz時,最高技術(shù)頻率為500KHz,高于此頻率將計數(shù)出錯。3.3.1與T/C有關(guān)的特殊功能寄存器(1)計數(shù)寄存器TH和TLT/C是16位的,計數(shù)寄存器有TH高8位TL低8位構(gòu)成。在特殊功能寄存器中,對應(yīng)T/C0為TH0和TL0;對應(yīng)T/C1為TH1和TL1。定時器/計數(shù)器的初始值通過TH1/TL1和TH0/TL0設(shè)置(2)定時器/計數(shù)器控制寄存器TCON表4.5定時器/計數(shù)器控制寄存器TCONTR1TR0TR0、TR1:定時器/計數(shù)器0、1啟動控制位。1是啟動,0是停止TCON復(fù)位后清零,T/C需要受到軟件控制才能啟動計數(shù);當(dāng)計數(shù)計滿時,產(chǎn)生向高位的進位TF,即溢出中斷請求標(biāo)志T/C的方式控制寄存器TMOD表4.6T/C的方式控制寄存器TMODGATEC/TM1M0GATEC/TM1M0C/T:計數(shù)器或定時器選擇位。1位計數(shù)器,0位定時器GATE:門控信號。1時T/C的啟動控制受到雙重控制,即要求TR0/TR1和INT0/INT1同時為高;0時T/C的啟動僅受TR0/TR1控制。表4.7M1和M0工作方式選擇位M1M0方式功能000為13位定時器/計數(shù)器,TL存低5位,TH存高8位011為16定時器/計數(shù)器,TL存低8,TH存高8位102常數(shù)自動裝入的8位定時器/計數(shù)器113僅適用于T/C0,兩個8為定時器/計數(shù)器3.3.2定時器/計數(shù)器的初始化(1)初始化步驟在使用89C51的定時器/計數(shù)器前,應(yīng)對它進行編程初始化,主要是對TCON和TMOD編程,還需要計算和裝載T/C的計數(shù)初值。一般完成以下幾個步驟:確定T/C的工作方式編程TMOD寄存器。計算T/C中的計數(shù)初值,并裝載到TH和TL。T/C在中斷方式工作時,須開CPU中斷和源中斷編程IE寄存器。啟動定時器/計數(shù)器編程TCON中TR1和TR0位(2)計數(shù)初值的計算在定時器方式下,T/C是對機器周期脈沖計數(shù)的,如果fosc=6MHz,一個機器周期為2us,則方式013位定時器最大時間間隔=(2-1)×2us=16.384ms;方式116位定時器最大時間間隔=(2-1)×2us=131.072ms;方式28位定時器最大時間間隔=(2-1)×2us=512us若使T/C工作在定時器方式1,要求定時1ms,求計數(shù)初值。如設(shè)計數(shù)初值為x,則有(2-1)×2us=1000usx=2-500因此,TH,TL可置65536-500。4計價器系統(tǒng)設(shè)計4.1硬件設(shè)計4.1.1整體硬件電路圖圖3-1整體硬件電路圖圖3-1整體硬件電路圖由上圖我們可以清楚地看到,本電路控制核心是AT89C51芯片。該方案我們采用動態(tài)顯示的方法。動態(tài)顯示的優(yōu)點是,它占用CPU的時間少,每次只把一個數(shù)據(jù)送到外部接口,雖然我們仿真看到的是全部數(shù)碼管都亮著,那是因為動態(tài)顯示的時間比較快,超過我們?nèi)搜鄣谋鎰e能力。若我們在仿真的時候暫停一下,就可以清楚地看到,時間單元和價格單元分別只顯示一位。靜態(tài)顯示,是每一個數(shù)碼管不論在什么時候都點亮,占用CPU的時間很多。按鍵主要控制系統(tǒng)的初始化、開始工作、數(shù)據(jù)鎖存三項工作。剛開始上電,則所有的數(shù)碼管同時顯示全0狀態(tài),當(dāng)?shù)谝淮伟聪麻_關(guān),價格從起步價005.0元開始計費,等待是否超過三公里以及計算,時間單元則從00.00.00開始計時,一秒一秒往上加。P0口作為數(shù)據(jù)總線口,分別把數(shù)據(jù)輸送到4個74LS273地址鎖存器中,而鎖存器的工作需要等待脈沖的到來。脈沖通過寫地址有些端口p3.6和端口p2.0-p2.3經(jīng)過或非門來產(chǎn)生。只有當(dāng)把數(shù)據(jù)送到外部接口時,p3.6口才為低電平,p2.0-p2.3用來控制到底是把數(shù)據(jù)送往哪一個鎖存器。算法公式是:總費用=起始費用+(里程-3km)×里程單價+(等候時間-4min)×等候單價路程=速度×?xí)r間(速度恒定,60Km/h,也就是1Km/min)若路程小于等于3,則收起步價5元,否則按費用公式算。由于速度恒定,所以計算的核心是時間,只要判斷時間超出4分鐘,則費用公式就開始計算,每多出一公里,費用就加上1.6元,一分鐘一公里來計算,因此本設(shè)計比較簡單。時間單元由單片機的定時器/計數(shù)器來計算,延時1ms時間的初值由程序來設(shè)定。4.1.274LS273和74LS02簡介圖3-274LS273管腳圖圖3-274LS273管腳圖圖2-274LS273管腳圖圖2-274LS273管腳圖引腳功能:74LS273是8位數(shù)據(jù)/地址鎖存器。74LS273是一種帶清除功能的8D觸發(fā)器,1D~8D為數(shù)據(jù)輸入端,1Q~8Q為數(shù)據(jù)輸出端,正脈沖觸發(fā),低電平清除,常用作8位地址鎖存器。圖3-374LS02管腳圖圖3-374LS02管腳圖引腳功能:74LS02是四二輸入或非門。該芯片有四個或非門公選擇,如1A或1B后,經(jīng)過非門再輸出,只有當(dāng)輸入的兩個變量同時為0時,輸出才為1。具有緩沖倒相功能。4.2軟件設(shè)計4.2.1模塊介紹該計費器系統(tǒng)的軟件設(shè)計分為一下幾個模塊:(1)主程序模塊在主程序模塊中,需要完成對個接口芯片的初始化、出租車起步價和單價、中斷向量的設(shè)計以及開中斷、循環(huán)等待等工作。另外,在主程序模塊中還需要設(shè)置啟動/清除標(biāo)志寄存器、里程寄存器和價格寄存器,并對它們進行初始化。然后,主程序?qū)⒏鶕?jù)各標(biāo)志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。流程圖如3-4所示。當(dāng)按下輕觸開關(guān)時,開始對系統(tǒng)初始化,價格和時間都顯示0、0,再次按下開關(guān),時間單元開始計時,并計算時間是否超過2分鐘,超過2分鐘,則從第3分鐘開始計費。價格單元從起步價5.0元開始計費,每多一分鐘,價格單元多加1.5元。(2)顯示子程序模塊由于顯示是由顯示時間子程序DIS1和顯示價格子程序DIS組成的,時間由小時、分、秒三個單元組成,共六個數(shù)碼管。價格由元和角兩個單元組成,最大可以顯示999.9元。4.2.2程序流程圖各緩沖區(qū)初始化各緩沖區(qū)初始化開始對定時器中斷設(shè)置開始計數(shù)顯示緩沖單元首址送R0掃描初值送R2取顯示單元值,轉(zhuǎn)為段顯碼送段數(shù)據(jù)口段顯碼送段數(shù)據(jù)口掃描值送位數(shù)據(jù)口P0讓調(diào)整位的DP點亮延時一小段時間顯示單元地址加1掃描值右移一位顯示狀態(tài)是否切換查詢6位顯示完?取段碼送到顯示緩沖區(qū)單元NY分調(diào)整?YN在顯示的低位斷碼上加80H,即點亮DP。查詢下一個調(diào)整位圖3-4程序流程4.2.3程序流程圖 #include<reg52.h>//包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義#include<stdio.h>//#include"1602.h"http://#include"delay.h"http://#include"Init_Time0.h"http://#include"Init_Time1.h"http://#include"KeyScan.h"#include<intrins.h>voidInit_Timer0(void);voidInit_Timer1(void);voidDelayUs2x(unsignedchart);voidDelayMs(unsignedchart);voidKeyScan(void);voidSavePrice(void);voidReadPrice(void);voidDisplayAdjust(void);voidDisplayTaxi(void);#defineucharunsignedchar#defineuintunsignedintvoidStart_I2c();voidStop_I2C();voidWriteByte(uchar);ucharReadByteIIC();voidAck_I2c(bit);bitI_Write_Str(uchar,uchar,uchar*,uchar);bitIReadByte(uchar,uchar*);bitI_Read_Str(uchar,uchar,uchar*,uchar);bitLCD_Check_Busy(void);voidLCD_Write_Com(unsignedcharcom);voidLCD_Write_Data(unsignedcharData);voidLCD_Clear(void);voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s);voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData);voidLCD_Init(void);voidLcd_User_Chr(void);unsignedcharFuncIndex;bitOneSecondArrive;unsignedintT1_Counter;//計數(shù)longPulseSum;longPrePulseSum;bitbReadyToGo;//0:空車1:客人已經(jīng)上車,開始計費bitbDayOrNight;floatMoneyToPay;//的士錢floatBaseFare;//起步價floatUnitPriceDay;//白天單價floatUnitPriceNight;//晚上單價floatWaitPrice;//等待單價floatRunKM; //已經(jīng)行走的公里數(shù)floatCurUnitPrice;floatMoneyForKm;floatMoneyForTime;unsignedcharidataSecond;//等待的秒數(shù)unsignedcharidataMinute;//等待的分鐘數(shù)unsignedcharidataHour;//等待的小數(shù)數(shù)bitbWaitFlag;//0:車在行進緊1:車停止intTimeSum;//前3公里價格不變,從第4公里開始,每公里增加一次單價。//若在10秒鐘內(nèi),系統(tǒng)沒有接收到脈沖信號,等待系統(tǒng)就會自行啟動,//每10秒增加一次等待單價。所有價格都可以自行設(shè)定//三公里以內(nèi)是起步價,以外才開始按里程收費//的士費用=行走的里程*每公里單價+等待的時間*價格//風(fēng)扇的的直徑是D=40MM=4CM,周長=D*3.14=12.56CM//也就是風(fēng)扇轉(zhuǎn)一圈的所走過的路程就等于風(fēng)扇的周長,如果轉(zhuǎn)N圈就是N個周長//所以只要計算出風(fēng)扇的轉(zhuǎn)過的圈數(shù)就可以模擬成的士走過的公里數(shù)/*主函數(shù)*/ voidmain(void){ Init_Timer0();Init_Timer1();///////////////////////////////////////////////////////////////////////////////#if1//第一次上電設(shè)為1,燒入默認(rèn)的單價數(shù)據(jù),包括起步價白天單價晚上單價每10秒的等待單價 BaseFare=5; //起步價 UnitPriceDay=1.6; //白天單價 UnitPriceNight=1.6; //晚上單價 WaitPrice=1.6; //每10秒的等待單價 //SavePrice();#endif/////////////////////////////////////////////////////////////////////////////// //ReadPrice();//讀取24C02存儲的價格數(shù)據(jù) CurUnitPrice=UnitPriceDay; PrePulseSum=0;//0xFFFFFFFF; RunKM=0; MoneyForKm=0; Second=0; Minute=0; Hour=0; LCD_Init(); while(1)//主循環(huán) { if(OneSecondArrive==1)//更新溫度顯示并處理 { OneSecondArrive=0; PulseSum=T1_Counter*65536+TH1*256+TL1;//計算總的脈沖數(shù) if(PrePulseSum==PulseSum)//車輛停止 bWaitFlag=1; else//車輛在行進 { PrePulseSum=PulseSum; bWaitFlag=0; RunKM=PulseSum*1.256;//單位是DM4020風(fēng)扇,直徑4cm,周長=12.56cm=1.256DM RunKM=RunKM/10000;//單位是1KM RunKM=(int)(RunKM); // if(RunKM<=3) //MoneyForKm= BaseFare;//3km以內(nèi)起步價 //else //MoneyForKm=(RunKM-3)*CurUnitPrice+BaseFare; } if(RunKM<=3) MoneyForKm= BaseFare;//3km以內(nèi)起步價 else MoneyForKm=(RunKM-3)*CurUnitPrice+BaseFare; TimeSum=Hour*60+Minute;//每分鐘為1單位 if(TimeSum>=4) MoneyForTime=WaitPrice*(TimeSum-4); else MoneyForTime=0; MoneyToPay=MoneyForKm+MoneyForTime; if(FuncIndex!=0) DisplayAdjust(); else DisplayTaxi(); } KeyScan(); }}//#include<reg52.h>//#include<intrins.h>#define_Nop()_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();bitack;sbitSDA=P1^1;sbitSCL=P1^0;/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):voidStart_I2c();功能:起動總線函數(shù),啟動I2C總線,即發(fā)送I2C起始條件.********************************************************************/voidStart_I2c(){SDA=1;//發(fā)送起始條件的數(shù)據(jù)信號_Nop();SCL=1;_Nop();//起始條件建立時間大于4.7us,延時_Nop();_Nop();_Nop();_Nop();SDA=0;//發(fā)送起始信號_Nop();//起始條件鎖定時間大于4μs_Nop();_Nop();_Nop();_Nop();SCL=0;//準(zhǔn)備發(fā)送或接收數(shù)據(jù)_Nop();}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):voidStop_I2c();功能:結(jié)束總線函數(shù),結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.********************************************************************/voidStop_I2c(){SDA=0;//發(fā)送結(jié)束條件的數(shù)據(jù)信號_Nop();//發(fā)送結(jié)束條件的時鐘信號SCL=1;//結(jié)束條件建立時間大于4μs_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1;//發(fā)送I2C總線結(jié)束信號_Nop();_Nop();_Nop();_Nop();_Nop();SDA=0;_Nop();SCL=0;_Nop();}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):voidWriteByte(ucharc);功能:字節(jié)數(shù)據(jù)傳送函數(shù),將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù), 發(fā)完后等待應(yīng)答,并對此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0假)發(fā)送數(shù)據(jù)正常,ack=0;ack=1表示被控器無應(yīng)答或損壞。********************************************************************/voidWriteByteIIC(ucharc){ucharBitCnt;for(BitCnt=0;BitCnt<8;BitCnt++)//要傳送的數(shù)據(jù)長度為8位{if((c<<BitCnt)&0x80)SDA=1;//判斷發(fā)送位elseSDA=0;_Nop();SCL=1;//置時鐘線為高,通知被控器開始接收數(shù)據(jù)位_Nop();_Nop();//保證時鐘高電平周期大于4μs_Nop();_Nop();_Nop();SCL=0;_Nop();}_Nop();_Nop();SDA=1;//8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位_Nop();_Nop();SCL=1;_Nop();_Nop();if(SDA==1)ack=0;elseack=1;//判斷是否接收到應(yīng)答信號_Nop();SCL=0;_Nop();}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):ucharReadByte();功能:字節(jié)數(shù)據(jù)傳送函數(shù),用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā) 應(yīng)答信號),發(fā)完后請用應(yīng)答函數(shù)。********************************************************************/ucharReadByteIIC(){ucharretc;ucharBitCnt;retc=0;SDA=1;//置數(shù)據(jù)線為輸入方式for(BitCnt=0;BitCnt<8;BitCnt++){_Nop();SCL=0;//置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位_Nop();_Nop();//時鐘低電平周期大于4.7μs_Nop();_Nop();_Nop();SCL=1;//置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效_Nop();_Nop();retc=retc<<1;if(SDA==1)retc=retc+1;//讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中_Nop();_Nop();}SCL=0;_Nop();_Nop();return(retc);}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):voidAck_I2c(bita);功能:應(yīng)答子函數(shù),主控器進行應(yīng)答信號,(可以是應(yīng)答或非應(yīng)答信號)參數(shù):a=0發(fā)送非應(yīng)答信號a=1發(fā)送應(yīng)答信號********************************************************************/voidAck_I2c(bita){if(a==0)SDA=0;//在此發(fā)出應(yīng)答或非應(yīng)答信號elseSDA=1;_Nop();_Nop();SCL=1;_Nop();_Nop();//時鐘低電平周期大于4μs_Nop();_Nop();_Nop();SCL=0;//清時鐘線,鉗住I2C總線以便繼續(xù)接收_Nop();_Nop();}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):bitIWrite_Str(ucharsla,ucharsuba,ucahr*s,ucharno);功能:向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù),從啟動總線到發(fā)送地址, 子地址,數(shù)據(jù),結(jié)束總線的全過程。參數(shù):從器件地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個字節(jié)。如果返回1表示操作成功,否則操作有誤。 注意:使用前必須已結(jié)束總線。********************************************************************/bitI_Write_Str(ucharsla,ucharsuba,uchar*s,ucharno){uchari;Start_I2c();//啟動總線WriteByteIIC(sla);//發(fā)送器件地址if(ack==0)return(0);WriteByteIIC(suba);//發(fā)送器件子地址if(ack==0)return(0);for(i=0;i<no;i++){WriteByteIIC(*s);//發(fā)送數(shù)據(jù)if(ack==0)return(0);s++;}Stop_I2c();//結(jié)束總線return(1);}/////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):bitIReadByte(ucharsla,ucahr*c);功能:向無子地址器件讀字節(jié)數(shù)據(jù)函數(shù),從啟動總線到發(fā)送地址, 讀數(shù)據(jù),結(jié)束總線的全過程。參數(shù):從器件地址sla,返回值在c,如果返回1表示操作成功,否則操作有誤。 注意:使用前必須已結(jié)束總線。********************************************************************//*bitIReadByte(ucharsla,uchar*c){Start_I2c();//啟動總線WriteByte(sla+1);//發(fā)送器件地址if(ack==1)return(0);*c=ReadByte();//讀取數(shù)據(jù)Ack_I2c(1);//發(fā)送非就答位Stop_I2c();//結(jié)束總線return(1);}*//////////////////////////////////////////////////////////////////////*******************************************************************函數(shù):bitIReadStr(ucharsla,ucharsuba,ucahr*s,ucharno);功能:向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù),從啟動總線到發(fā)送地址, 子地址,讀數(shù)據(jù),結(jié)束總線的全過程。參數(shù):從器件地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲區(qū),讀no個字節(jié)。如果返回1表示操作成功,否則操作有誤。 注意:使用前必須已結(jié)束總線。********************************************************************/bitI_Read_Str(ucharsla,ucharsuba,uchar*s,ucharno){uchari;Start_I2c();//啟動總線WriteByteIIC(sla);//發(fā)送器件地址if(ack==0){Stop_I2c();return(0);}WriteByteIIC(suba);//發(fā)送器件子地址if(ack==0){Stop_I2c();return(0);}Start_I2c();WriteByteIIC(sla+1);if(ack==0){Stop_I2c();return(0);}for(i=0;i<no-1;i++){*s=ReadByteIIC();//發(fā)送數(shù)據(jù)Ack_I2c(0);//發(fā)送就答位s++;}*s=ReadByteIIC();Ack_I2c(1);//發(fā)送非應(yīng)位Stop_I2c();//結(jié)束總線return(1);}/*1602液晶引腳定義如下:1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB715-BLA16-BLK*///#include"1602.h"http://#include"delay.h"#definePROTEUS#defineSELECT1#ifSELECT>0sbitRS=P2^5; //控制端口sbitRW=P2^6;sbitEN=P2^7;#defineDataPortP0 //數(shù)據(jù)端口#elsesbitRS=P0^2; //控制端口sbitRW=P0^1;sbitEN=P0^0;#defineDataPortP2 //數(shù)據(jù)端口#endif#defineRS_CLRRS=0#defineRS_SETRS=1#defineRW_CLRRW=0#defineRW_SETRW=1#defineEN_CLREN=0#defineEN_SETEN=1/*判忙函數(shù)*/#if0bitLCD_Check_Busy(void){DataPort=0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return(bit)(DataPort&0x80);}#endif/*寫入命令函數(shù)*/voidLCD_Write_Com(unsignedcharcom){#ifndefPROTEUSwhile(LCD_Check_Busy());//忙則等待#elseDelayUs2x(50);#endifRS_CLR;RW_CLR;EN_SET;DataPort=com;_nop_();EN_CLR;}/*寫入數(shù)據(jù)函數(shù)*/voidLCD_Write_Data(unsignedcharData){//#ifndefPROTEUS//while(LCD_Check_Busy());//忙則等待//#elseDelayUs2x(50);//#endifRS_SET;RW_CLR;EN_SET;DataPort=Data;_nop_();EN_CLR;}/*清屏函數(shù)*/voidLCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*寫入字符串函數(shù)*/voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s){if(y==0) { LCD_Write_Com(0x80+x);//表示第一行 }else { LCD_Write_Com(0xC0+x);//表示第二行 }while(*s) {LCD_Write_Data(*s);s++; }}#if0/*寫入字符函數(shù)*/voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData){if(y==0) { LCD_Write_Com(0x80+x); }else { LCD_Write_Com(0xC0+x); }LCD_Write_Data(Data);}#endif/*初始化函數(shù)*/voidLCD_Init(void){LCD_Write_Com(0x38);/*顯示模式設(shè)置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08);/*顯示關(guān)閉*/LCD_Write_Com(0x01);/*顯示清屏*/LCD_Write_Com(0x06);/*顯示光標(biāo)移動設(shè)置*/DelayMs(5);LCD_Write_Com(0x0C);/*顯示開及光標(biāo)設(shè)置*/}//#include"delay.h"/*uS延時函數(shù),含有輸入?yún)?shù)unsignedchart,無返回值unsignedchar是定義無符號字符變量,其值的范圍是0~255這里使用晶振12M,精確延時請使用匯編,大致延時長度如下T=tx2+5uS*/voidDelayUs2x(unsignedchart){while(--t);}/*mS延時函數(shù),含有輸入?yún)?shù)unsignedchart,無返回值unsignedchar是定義無符號字符變量,其值的范圍是0~255這里使用晶振12M,精確延時請使用匯編*/voidDelayMs(unsignedchart){while(t--){//大致延時1mSDelayUs2x(245); DelayUs2x(245);}}#defineLED_ON1#defineLED_OFF0sbitLED=P2^0;sbitAdjustBtn=P3^2;//價錢調(diào)整按鈕1.白天單價2.夜間單價3.等待單價4.起步價sbitPlusBtn =P3^3;//增加,幅度為0.1元sbitMinusBtn=P3^4;//減少,幅度為0.1元sbitDayOrNightBtn=P3^6;//白天或者夜晚切換sbitClearBtn=P3^7;///按下就是相當(dāng)于把的士的空車牌放下,開始計費了,再按一下就是空車,沒有人voidAdjustIndex(charx){ switch(FuncIndex) { case1://白天單價 if(x==1)UnitPriceDay+=0.1; if(x==-1)UnitPriceDay-=0.1; break; case2://夜晚單價 if(x==1)UnitPriceNight+=0.1; if(x==-1)UnitPriceNight-=0.1; break; case3://等待單價 if(x==1)WaitPrice+=0.1; if(x==-1)WaitPrice-=0.1; break; case4://起步價 if(x==1)BaseFare+=0.1; if(x==-1)BaseFare-=0.1; break; }}voidKeyScan(void){ if(ClearBtn==0)//清零鍵 { DelayMs(10);//消除抖動 if(ClearBtn==0) { while(ClearBtn==0); if(FuncIndex!=0)//調(diào)整價格狀態(tài)下,按清零鍵保存 { SavePrice(); FuncIndex=0; ReadPrice(); LCD_Clear(); } else//平時狀態(tài)下 // bReadyToGo=!bReadyToGo;//空車/有客人上車了 //if(bReadyToGo==0)//空車,復(fù)位對應(yīng)的參數(shù) { TH1=0; TL1=0; T1_Counter=0; PrePulseSum=0;//0XFFFFFFFF; //////////////// PulseSum=0; OneSecondArrive=0; Second=0; Minute=0; Hour=0; FuncIndex=0; LCD_Clear(); } } } if(AdjustBtn==0)//功能鍵 { DelayMs(10);//消除抖動 if(AdjustBtn==0) { while(AdjustBtn==0); LCD_Clear(); FuncIndex++; if(FuncIndex>4)//1.白天單價2.夜間單價3.等待單價4.起步價 FuncIndex=1; } } if(PlusBtn==0)//增加+ { DelayMs(10);//消除抖動 if(PlusBtn==0) { while(PlusBtn==0); AdjustIndex(1); } } if(MinusBtn==0)//減少- { DelayMs(10);//消除抖動 if(MinusBtn==0) { while(MinusBtn==0); AdjustIndex(-1); } } if(DayOrNightBtn==0)//白天/晚上切換鍵 { DelayMs(10);//消除抖動 if(DayOrNightBtn==0) { while(DayOrNightBtn==0); bDayOrNight=!bDayOrNight; CurUnitPrice=(bDayOrNight==0)?UnitPriceDay:UnitPriceNight; LED=(bDayOrNight==0)?1:0; } } }voidSavePrice(void){ unsignedcharvalue[4]; value[0]=BaseFare
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小區(qū)地面車位轉(zhuǎn)讓合同范例
- 中醫(yī)藥在肺結(jié)節(jié)全程管理中的優(yōu)勢及展望
- 2025版新教材高考歷史一輪復(fù)習(xí)課時質(zhì)量評價30十月革命的勝利與蘇聯(lián)的社會主義實踐含解析新人教版
- 天津個人營銷咨詢合同范例
- 拍賣房交房合同范例
- 夾絲玻璃合同范例
- 債務(wù)沖抵合同范例
- 商務(wù)車輛轉(zhuǎn)讓合同范例
- 房貸買賣合同范例
- 買水泥合同范例
- 第1~4單元期中檢測(試題)-2024-2025學(xué)年四年級上冊數(shù)學(xué)北師大版
- 《報關(guān)單填寫規(guī)范》課件
- 各專業(yè)文件準(zhǔn)備目錄-內(nèi)分泌科藥物臨床試驗機構(gòu)GCP SOP
- 化妝培訓(xùn)課件教學(xué)課件
- 車間員工安全培訓(xùn)試題附參考答案【典型題】
- 2024年保密基礎(chǔ)知識競賽試題庫及答案(共350題)
- 《江西數(shù)學(xué)三年級上學(xué)期數(shù)學(xué)期中試卷》
- 《萬維網(wǎng)安全新協(xié)議》課件 2024-2025學(xué)年人教版新教材初中信息技術(shù)七年級全一冊
- 全國職業(yè)院校技能大賽高職組(商務(wù)數(shù)據(jù)分析賽項)備賽試題及答案
- 部編版道德與法治二年級上冊第8課《裝扮我們的教室》精美課件
- 部編版歷史高一上學(xué)期期中試卷與參考答案(2024-2025學(xué)年)
評論
0/150
提交評論