【正文】
麻煩,計(jì)價(jià)器應(yīng)具有掉電保持功能,即當(dāng)重新啟動(dòng)后維持原有數(shù)值(包括總金額、等待時(shí)間、行駛里程、單價(jià))不變,直至強(qiáng)制按下清零鍵,計(jì)價(jià)器顯示起步價(jià)(剛起步時(shí)對(duì)應(yīng)總金額)、運(yùn)行單價(jià),為下一次計(jì)價(jià)做準(zhǔn)備。從起步開始,當(dāng)汽車行駛里程未滿3公里時(shí),均按起步價(jià)計(jì)算。2. 要求單價(jià)可調(diào),并要求對(duì)等待時(shí)間進(jìn)行計(jì)時(shí)。事實(shí)上,當(dāng)今許多硬件的開發(fā)都已開始用C語(yǔ)言編程,如各種單片機(jī)、DSP、ARM等,用C語(yǔ)言進(jìn)行工業(yè)控制也已成為一種趨勢(shì),為了更好的適應(yīng)當(dāng)今社會(huì)形勢(shì),為了更好的面對(duì)挑戰(zhàn)、把握機(jī)遇,此次畢業(yè)設(shè)計(jì)決定嘗試用C語(yǔ)言編程完成。2. 寄存器分配、不同存儲(chǔ)器的尋址及數(shù)據(jù)類型等細(xì)節(jié)完全由編輯器自動(dòng)處理。作為與自動(dòng)化技術(shù)和電子密切相關(guān)的理工科學(xué)生,掌握單片機(jī)是最簡(jiǎn)單也最基礎(chǔ)的要求。4. 通信方面。2. 智能儀器儀表。關(guān)鍵詞:STC89C52,霍爾傳感器A44E ,I2C總線,動(dòng)態(tài)顯示Design of Taximeter Based on STC89C52ABSTRACTWith the rapid development of city constriction, the taxi industry which symbolizes the cityscape also has an accelerated progress. Nowadays the automatic taximeter has been widely used in taxi industry in many cites. Therefore, the development of automatic taximeter is doomed. Although automatic taximeter is not spread in some towns, there is no doubt that it would be popularized. Thus, in future the business of automatic taximeter is still potential. One typical application of single chip puter is automatic taximeter. The hardware of this design is posed of single chip puter and peripheral circuits which consist of Detection Unit, Processing Unit and Human Computer Interaction Unit. The Detection Unit is based on Halleffect sensor. The Processing Unit contains STC89C52 and AT24C02. Human Computer Interaction Unit is posed of keyboard and LED.The function of this system includes as follows:1. Set the unit price。包括檢測(cè)模塊,控制模塊,人機(jī)模塊?,F(xiàn)在各大中城市出租車行業(yè)都已普及自動(dòng)計(jì)價(jià)器,所以計(jì)價(jià)器技術(shù)的發(fā)展有很好的前景。盡管小城市尚未普及,但計(jì)價(jià)器的普及也是毫無疑問的,所以未來汽車計(jì)價(jià)器的市場(chǎng)還是十分有潛力的。里程檢測(cè)模塊由A44E構(gòu)成,控制模塊包括STC89C52單片機(jī)和AT24C02,人機(jī)模塊包括獨(dú)立鍵盤和LED動(dòng)態(tài)顯示。2. Display the unit price, total amount and mileage.3. Accuracy: . After repeatedly debugging, the performance of this system is reached the design requirements. KEY WORDS: STC89C52, Halleffect sensor, A44E, I2C Bus, Dynamic display目 錄前 言 1第1章 系統(tǒng)工作原理 3 功能要求 3 基本原理 3第2章 硬件設(shè)計(jì) 5 單片機(jī)最小系統(tǒng)單元 5 霍爾傳感器單元 6 掉電存儲(chǔ)單元 8 鍵盤調(diào)整單元 9 顯示單元 10第3章 軟件設(shè)計(jì) 14 系統(tǒng)主程序 14 里程計(jì)數(shù)中斷程序 15 中途等待中斷程序 15 計(jì)算程序 17 顯示程序 18 鍵盤程序 18第4章 調(diào)試改進(jìn)過程及運(yùn)行結(jié)果分析 21 動(dòng)態(tài)掃描的調(diào)試和分析 21 AT24C02的編程與調(diào)試 21 按鍵查詢功能的實(shí)現(xiàn) 21 計(jì)算程序的分析與設(shè)計(jì) 22 結(jié)果分析與性能改進(jìn) 23 計(jì)價(jià)器系統(tǒng)的仿真 23結(jié) 論 26謝 辭 27參考文獻(xiàn) 28附 錄A 系統(tǒng)原理圖 30附 錄B 仿真圖PCB板 31附 錄C 系統(tǒng)源程序 33外文資料翻譯 55前 言單片機(jī)是一種可通過編程控制的微處理器,雖其自身不能單獨(dú)用在某項(xiàng)工程或產(chǎn)品上,但當(dāng)其與外圍數(shù)字器件和模擬器件結(jié)合時(shí)便可發(fā)揮強(qiáng)大的功能,現(xiàn)在單片機(jī)已廣泛應(yīng)用于眾多領(lǐng)域。如數(shù)字示波器、數(shù)字信號(hào)源、感應(yīng)電流表等。如調(diào)制解調(diào)器、程控交換技術(shù)等。為了進(jìn)一步豐富和鞏固單片機(jī)知識(shí),也為了能更好的聯(lián)系實(shí)際應(yīng)用,本次畢業(yè)設(shè)計(jì)選擇了基于單片機(jī)STC89C52控制的出租車計(jì)價(jià)器,并力求能做出實(shí)物。3. 程序有規(guī)范的結(jié)構(gòu),可分為不同的函數(shù),可使程序結(jié)構(gòu)化。也希望能在進(jìn)一步熟悉單片機(jī)控制的同時(shí),對(duì)數(shù)字電子技術(shù)、模擬電子技術(shù)、計(jì)算控制技術(shù)以及常用外圍芯片有更深層次的了解,提高自己的綜合能力。3. 利用I2C總線通過EEPROM對(duì)存儲(chǔ)空間進(jìn)行擴(kuò)展,使其具備掉電存儲(chǔ)功能。超過3公里后,實(shí)現(xiàn)每1公里單價(jià)收費(fèi),中間遇到暫停時(shí),計(jì)程數(shù)不再增加,開始計(jì)時(shí)收費(fèi),計(jì)程收費(fèi)和計(jì)時(shí)收費(fèi)的和便構(gòu)成了一位乘客的車費(fèi)。 基本原理 計(jì)價(jià)器系統(tǒng)主要由五部分組成:分別為基于霍爾傳感器A44E的里程檢測(cè)單元、STC89C52單片機(jī)、外擴(kuò)串行EEPROMAT24C0獨(dú)立鍵盤和LED顯示。系統(tǒng)結(jié)構(gòu)圖如圖11所示。單片機(jī)最小系統(tǒng)電路圖如圖21所示。對(duì)于單片機(jī)的P0口,可以作為地址/數(shù)據(jù)總線使用,也可以作為一般的I/O口使用。 霍爾傳感器單元A44E 屬于開關(guān)型的霍爾器件,其工作電壓范圍比較寬(~18V),其輸出的信號(hào)符合TTL電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的I/O 端口上,而且其最高檢測(cè)頻率可達(dá)到1MHZ[3] 。這樣兩次電壓變換,使霍爾開關(guān)完成了一次開關(guān)動(dòng)作。其原理如圖23所示。AT24C02芯片引腳配置如圖24所示。事實(shí)上AT24C02為典型的支持I2C總線的器件,對(duì)其進(jìn)行編程時(shí)需遵守I2C總線的時(shí)序要求,以及I2C委員會(huì)對(duì)各種I2C芯片的地址分配規(guī)則。(2)主控器的讀數(shù)據(jù)格式:與寫數(shù)據(jù)的不同之處在于數(shù)據(jù)發(fā)送結(jié)束和停止位之間加一個(gè)非應(yīng)答位,表示數(shù)據(jù)發(fā)送結(jié)束,格式為當(dāng)SCL為高時(shí)SDA傳送1。電路原理如圖25所示。所以在實(shí)際編程時(shí)一定要注意鍵盤的去抖動(dòng)。由于溢出指示是采用發(fā)光二極管是否點(diǎn)亮表示,故必須選好參數(shù)以確保發(fā)光二極管正常工作。圖26 74HC573的引腳分布:為三態(tài)允許輸入端(低電平有效),也可稱作輸出允許端;1D8D為數(shù)據(jù)輸入端;1Q8Q為數(shù)據(jù)輸出端;LE為鎖存允許端。由真值表可以看出,當(dāng)為高電平時(shí),無論LE與D端為何電平狀態(tài),其輸出均為高阻態(tài),此時(shí)芯片處于不可控狀態(tài)。使通道打開,接著送字碼,使字碼保持??;(送高電平),緊接著送位碼,控制要顯示的位,數(shù)據(jù)被保持。另外,在主程序模塊中還需要設(shè)置啟動(dòng)/清除標(biāo)志寄存器、里程寄存器和價(jià)格寄存器,并對(duì)它們進(jìn)行初始化。程序流程如圖31所示。計(jì)數(shù)初值可有以下公式獲得:X=(65536t)**10^6/12。用定時(shí)器作為基準(zhǔn),可使測(cè)試的等待時(shí)間更為精確(可以精確到uS級(jí));且每隔5秒比較一次,能有效減小誤判率,避免把汽車低速行駛誤認(rèn)為靜止等待處理。程序流程圖如圖34所示。如此循環(huán)操作,使每位分時(shí)顯示該位應(yīng)該顯示的字符 [7] 。 圖35 鍵盤程序按鍵檢測(cè)流程圖36所示。 AT24C02的編程與調(diào)試對(duì)AT24C02編程對(duì)我來說是一個(gè)比較新知識(shí)點(diǎn),遇到了不少問題, 這里僅把經(jīng)驗(yàn)教訓(xùn)簡(jiǎn)要介紹一下。 按鍵查詢功能的實(shí)現(xiàn)按鍵查詢比較容易實(shí)現(xiàn),只要注意1. 按鍵結(jié)束后注意退出按鍵處理;,即避免顯示一個(gè)數(shù)據(jù)后退不出來;。 while(!key)。改動(dòng)如下:1. 當(dāng)里程值大于30(實(shí)際對(duì)應(yīng)大于3公里)且無進(jìn)位時(shí),溢出指示燈不亮,總金額=起步價(jià)+(里程十位數(shù)字2)*運(yùn)行單價(jià)+等待單價(jià)*等待時(shí)間;2. 當(dāng)里程值小于30(實(shí)際對(duì)應(yīng)小于3公里),肯定無進(jìn)位,溢出指示燈不亮,總金額=起步價(jià)+等待單價(jià)*等待時(shí)間;3. 有進(jìn)位,溢出指示燈點(diǎn)亮,表示里程一定大于三公里,只需執(zhí)行總金額=起步價(jià)+7*運(yùn)行單價(jià)+(里程十位數(shù)字+1)*運(yùn)行單價(jià)+等待單價(jià)*等待時(shí)間即:總金額=起步價(jià)+(里程十位數(shù)字+8)*運(yùn)行單價(jià)+等待單價(jià)*等待時(shí)間; 結(jié)果分析與性能改進(jìn)經(jīng)過反復(fù)調(diào)試驗(yàn)證,基于STC89C52單片機(jī)控制設(shè)計(jì)的出租車計(jì)價(jià)器滿足了所有預(yù)設(shè)性能指標(biāo),具有較好的抗干擾性,價(jià)格也較為合理,具有很好的工業(yè)開發(fā)和市場(chǎng)前景。本次設(shè)計(jì)聯(lián)調(diào)時(shí)出現(xiàn)的問題主要有:第一是顯示時(shí)存在時(shí)序上的沖突,;第二就是中斷設(shè)置時(shí)出現(xiàn)混亂,即同時(shí)用定時(shí)器0,定時(shí)器1,和外部中斷1時(shí),后兩者都不再工作(通過編一個(gè)方波程序,),解決方法時(shí)讓定時(shí)器1工作在計(jì)數(shù)方式代替工作在定時(shí)方式,如此不但可以完成相應(yīng)功能,解決了問題,更重要的是省去一個(gè)中斷,簡(jiǎn)化了程序設(shè)計(jì)。4. 有完整的軟件仿真結(jié)果和硬件電路,并用Protel設(shè)計(jì)出了系統(tǒng)原理圖,制作了PCB板。1. 應(yīng)嘗試著在不影響整個(gè)計(jì)價(jià)器的功能的前提下把兩個(gè)鎖存器74HC573去掉,這樣會(huì)使硬件電路更簡(jiǎn)潔,成本也會(huì)更低。有其他老師和同學(xué),都幫了我不少忙,在此不再贅述。 //sbit fangbo=P3^5。 // sbit key3=P1^3。 //sbit wela=P3^1 。 // I2C引腳sbit Scl=P3^6。uint key3num,qiehuantemp。 //中斷調(diào)用 uint cc,dd,qufan。i) for(j=110。_nop_()。_nop_()。_nop_()。}void start(){ Scl=1。 Sda=0。 }void stop(){ Sda=0。 Sda=1。 Scl=1。 }void NoAck(){ Sda=1。 Scl=0。 do { temp=Data。0x80)==0x80) Sda=1。 Data=temp。} uchar Read() //讀一個(gè)字節(jié)的數(shù)據(jù),并返回該字節(jié)值{uchar temp=0。 // 置 Sda為輸入方式do{Scl=0。if(Sda) //如果Sda=1。 //否則temp的最低位清0if(BitCounter1){temp1=temp1。 Scl=0。 Ack()。 Ack()。 start()。 Ack()。 Data=Read()。 } /*void main(){ uchar rd。 delay(10)。 delay(10)。 jge=zongjine0%100/10。 lge=licheng0%10。 P2=0x01。 dula=0。 wela=0。 dula=0。 wela=0。 delay(4)。 dula=1。 wela=1。 P0=table[lshi]amp。 wela=1。 P0=table[lge]。 P2=0x40。0x7f。 P2=0x80。 dula=0。 key3num=1。 while(key3num) { if(key3num==1) //調(diào)白天單價(jià),danjia1 { //display(0,1,0,danjia1)。 while(!key1)。 if(key2==0) { danjia1。 while(!key2)。 if(key1==0) { delay(5)。 delay(5)。 if(danjia2==1) danjia2=99。 } } display(0,2,0,danjia2)。 if(key1==0) { delay(5)。 delay(5)。 if(danjia3==1) danjia3=99。 } } display(0,3,0,danjia3)。 if(key1==0)