C語言出租車計價器課程設(shè)計.doc_第1頁
C語言出租車計價器課程設(shè)計.doc_第2頁
C語言出租車計價器課程設(shè)計.doc_第3頁
C語言出租車計價器課程設(shè)計.doc_第4頁
C語言出租車計價器課程設(shè)計.doc_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

出租車計價器課程設(shè)計目錄前言1、 系統(tǒng)工作原理1.1 功能說明1.2 基本原理2、 硬件設(shè)計2.1 單片機(jī)最小系統(tǒng)單元2.2 A44E霍爾傳感器檢測單元2.3 AT24C01存儲單元2.4 鍵盤調(diào)整單元2.5 顯示單元3、 軟件設(shè)計3.1 系統(tǒng)主程序3.2 中斷程序3.2.1 里程計數(shù)中斷程序3.2.2 中途等待中斷程序3.3 計算程序3.4 顯示程序3.5 鍵盤程序4、 總結(jié)參考文獻(xiàn)附錄A 系統(tǒng)原理圖附錄B 系統(tǒng)源程序前言 隨著出租車行業(yè)的發(fā)展,出租車已經(jīng)是城市交通的重要組成部分,從加強行業(yè)管理以及減少司機(jī)與乘客的糾紛出發(fā),具有良好性能的計價器對出租車司機(jī)和乘客來說都是很必要的。而采用模擬電路和數(shù)字電路設(shè)計的計價器整體電路的規(guī)模較大,用到的器件多,造成故障率高,難調(diào)試。而采用單片機(jī)進(jìn)行的設(shè)計,相對來說功能強大,用較少的硬件和適當(dāng)?shù)能浖嗷ヅ浜峡梢院苋菀椎貙崿F(xiàn)設(shè)計要求,且靈活性強,可以通過軟件編程來完成更多的附加功能。本設(shè)計采用AT89S52單片機(jī)為主控器,以A44E霍爾傳感器測距,實現(xiàn)對出租車的多功能的計價設(shè)計,并采用AT24C01實現(xiàn)在系統(tǒng)掉電的時候保存單價等信息,輸出采用8段數(shù)碼顯示管。本電路設(shè)計的計價器不但能實現(xiàn)基本的計價,而且還能根據(jù)白天,黑夜和中途等待來調(diào)節(jié)單價。第一章系統(tǒng)工作原理1.1 功能說明 出租車計價器根據(jù)乘客乘坐汽車行駛距離和等候時間的多少進(jìn)行計價,并在行程中同步顯示車費值。從起步價開始,當(dāng)汽車程行駛未滿3公里時,均按起步價計算。過3公里后,實現(xiàn)每1公里單價收費,中間遇暫停時,計程數(shù)不再增加,開始計時收費,測距收費和測時收費的和便構(gòu)成了一位乘客的車費。同時,白天和夜晚價格不同,可以進(jìn)行切換。白天單價、夜晚單價、等待單價和起步價格都可通過獨立鍵盤進(jìn)行調(diào)節(jié)。(默認(rèn)起步價為5元/3公里,里程單價白天為1.5元/公里,夜晚為1.8元/公里,等待計時單價為0.5元/5分鐘)1.2 基本原理 計數(shù)器系統(tǒng)主要由五部分組成:A44E霍爾傳感器、AT89S52單片機(jī)、獨立鍵盤、EEPROM AT24C01和顯示數(shù)碼管。 霍爾傳感器安裝在車輪上,主要檢測汽車行進(jìn)的公里數(shù),并產(chǎn)生一系列相應(yīng)的脈沖輸出,脈沖送到單片機(jī)進(jìn)行處理,單片機(jī)根據(jù)程序設(shè)定通過計算脈沖數(shù)換算出行駛公里數(shù),再根據(jù)從EEPROM中讀取的價格等相關(guān)數(shù)據(jù)進(jìn)行金額的計算,計算好的金額、里程和單價都實時地顯示在數(shù)碼管上。獨立鍵盤可以調(diào)節(jié)價格等相關(guān)數(shù)據(jù),按下相應(yīng)的按鈕,產(chǎn)生信號交由單片機(jī)處理并實時顯示出來,調(diào)節(jié)好的數(shù)據(jù)存儲到EEPROM中,掉電后可以使調(diào)好的數(shù)據(jù)不丟失,下次得電后直接從EEPROM讀到單片機(jī),系統(tǒng)結(jié)構(gòu)圖如圖1。圖1 系統(tǒng)結(jié)構(gòu)圖第二章 硬件設(shè)計2.1 單片機(jī)最小系統(tǒng)單元 主控機(jī)系統(tǒng)采用了Atmel 公司生產(chǎn)的 AT89S52單片機(jī),它含有256 字節(jié)數(shù)據(jù)存儲器,內(nèi)置8K 的電可擦除FLASH ROM,可重復(fù)編程,大小滿足主控機(jī)軟件系統(tǒng)設(shè)計,所以不必再擴(kuò)展程序存儲器。復(fù)位電路和晶振電路是AT89S52 工作所需的最簡外圍電路。單片機(jī)最小系統(tǒng)電路圖如圖2所示。圖2 單片機(jī)最小系統(tǒng)圖 AT89S52 的復(fù)位端是一個史密特觸發(fā)輸入,高電平有效。RST端若由低電平上升到高電平并持續(xù)2個周期,系統(tǒng)將實現(xiàn)一次復(fù)位操作。在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時間的高電平,外接11.0592M 晶振和兩個30pF 電容組成系統(tǒng)的內(nèi)部時鐘電路。2.2 A44E霍爾傳感器檢測單元 A44E 屬于開關(guān)型的霍爾器件,其工作電壓范圍比較寬(4.518V),其輸出的信號符合TTL電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的IO 端口上,而且其最高檢測頻率可達(dá)到1MHZ。A44E 集成霍耳開關(guān)由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D和OC門輸出E五個基本部分組成。 在輸入端輸入電壓Vcc,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍爾電勢發(fā)生器的兩端,根據(jù)霍爾效應(yīng)原理,當(dāng)霍爾片處在磁場中時,在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍爾電勢差VH輸出,該VH信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC門輸出。當(dāng)施加的磁場達(dá)到工作點(即Bop)時,觸發(fā)器輸出高電壓(相對于地電位),使三極管導(dǎo)通,此時OC門輸出端輸出低電壓,三極管截止,使OC門輸出高電壓,這種狀態(tài)為關(guān)。這樣兩次電壓變換,使霍爾開關(guān)完成了一次開關(guān)動作。A44E霍爾傳感器原理如圖3所示。 圖3 A44E霍爾傳感器原理 里程計算是通過安裝在車輪上的霍爾傳感器檢測到的脈沖信號,送到單片機(jī)產(chǎn)生中斷,單片機(jī)再根據(jù)程序設(shè)定,計算出里程。其原理如圖4所示。 圖4 傳感器測距示意圖 本系統(tǒng)選擇了將A44E的脈沖輸出口接到P3.3口外部中斷1作為信號的輸入端(這樣可以減少程序設(shè)計的麻煩),車輪每轉(zhuǎn)一圈(設(shè)車輪的周長是1米),霍爾開關(guān)就檢測并輸出信號,引起單片機(jī)的中斷,對脈沖計數(shù),當(dāng)計數(shù)達(dá)到1000次時,即1公里,單片機(jī)就控制將金額自動增加,如圖5。圖5 A44E霍爾元件接線圖2.3 AT24C01存儲單元 存儲單元的作用是在電源斷開的時候,存儲當(dāng)前設(shè)定的單價信息。AT24C01 是Ateml公司的1KB的電可擦除存儲芯片,采用兩線串行的總線和單片機(jī)通訊,電壓最低可以到2.5V,額定電流為1mA,靜態(tài)電流10uA(5.5V),芯片內(nèi)的資料可以在斷電的情況下保存40年以上,而且采用8 腳的DIP 封裝,使用方便。AT24C02芯片引腳配置如圖6所示。存儲單元電路連接如圖7所示。圖 7 存儲單元電路原理圖 圖中R4、R5 是上拉電阻,其作用是減少AT24C01 的靜態(tài)功耗。由于AT24C01的數(shù)據(jù)線和地址線是復(fù)用的,采用串口的方式傳送數(shù)據(jù),所以只用兩根線SCL(時鐘脈沖)和SDA(數(shù)據(jù)/地址)與單片機(jī)P2.2和P2.3口連接,進(jìn)行傳送數(shù)據(jù)。 每當(dāng)設(shè)定一次單價,系統(tǒng)就自動調(diào)用存儲程序,將單價信息保存在芯片內(nèi);當(dāng)系統(tǒng)重新上電的時候,自動調(diào)用讀存儲器程序,將存儲器內(nèi)的單價等信息,讀到緩存單元中,供主程序使用。2.4 鍵盤調(diào)整單元 當(dāng)單價等信息需要進(jìn)行修改時,就要用到鍵盤進(jìn)行修改。由于調(diào)節(jié)信息不多,故采用4個獨立鍵盤即可,分別實現(xiàn)清零、切換、增大、減小和功能等作用。電路原理如圖8所示。圖8 鍵盤調(diào)整單元接線圖S1:接P1.0口,對上一次的計費進(jìn)行清零,為下次載客準(zhǔn)備S2:接P1.1口,實現(xiàn)白天和夜晚單價的切換;當(dāng)功能鍵S4按下時,S2可對數(shù)據(jù)進(jìn)行增大。S3:接P1.2口,當(dāng)功能鍵S4按下時,S3可對數(shù)據(jù)進(jìn)行減小。S4:接P1.3口,按1次,進(jìn)入調(diào)整白天單價;按2次,進(jìn)入調(diào)整夜晚單價;按3次,進(jìn)入調(diào)整等待單價;按4次,進(jìn)入調(diào)整起步價;按5次,返回。2.5 顯示單元 顯示單元由7個8段共陽數(shù)碼管組成,采用動態(tài)掃描進(jìn)行顯示。前三個數(shù)碼管分別接P3.0、P3.1和P3.2,用于顯示總金額;中間兩個分別接P3.4和P3.5,用于顯示里程;后邊兩個分別接P3.6和P3.7,用于顯示單價。電路如圖9所示。 圖9 數(shù)碼管顯示圖第三章 軟件設(shè)計3.1 系統(tǒng)主程序 在主程序模塊中,需要完成對各參量和接口的初始化、出租車起價和單價的初始化以及中斷、計算、循環(huán)等工作。另外,在主程序模塊中還需要設(shè)置啟動/清除標(biāo)志寄存器、里程寄存器和價格寄存器,并對它們進(jìn)行初始化。然后,主程序?qū)⒏鶕?jù)各標(biāo)志寄存器的內(nèi)容,分別完成啟動、清除、計程和計價等不同的操作。當(dāng)汽車運行起來時,就啟動計價,根據(jù)里程寄存器中的內(nèi)容計算和判斷行駛里程是否已超過起步價公里數(shù)。若已超過,則根據(jù)里程值、每公里的單價數(shù)和起步價數(shù)來計算出當(dāng)前的總金額,并將結(jié)果存于總金額寄存器中;中途等待時,無脈沖輸入,不產(chǎn)生中斷,當(dāng)時間超過等待設(shè)定值時,開始進(jìn)行計時,并把等待價格加到總金額里,然后將總金額、里程和單價送數(shù)碼管顯示出來。程序流程如圖10所示。 圖10 主程序流程圖 圖11 計算程序流程圖3.2 中斷程序 3.2.1 里程計數(shù)中斷程序 每當(dāng)霍爾傳感器輸出一個低電平信號就使單片機(jī)中斷一次,當(dāng)里程計數(shù)器對里程脈沖計滿1000次時,進(jìn)入里程計數(shù)中斷服務(wù)程序中,里程變量加一。主函數(shù)中總金額也相應(yīng)地變化。 3.2.2 中途等待中斷程序 在中途等待中斷程序中,每1ms產(chǎn)生一次中斷,將當(dāng)前里程值送入某個緩存變量,每5分鐘將緩存變量中的值和當(dāng)前里程值比較,當(dāng)汽車停止,霍爾傳感器5分鐘沒有輸出信號,當(dāng)前里程值和緩存變量內(nèi)的值相同,則進(jìn)入等待計時,每5分鐘記一次價格。3.3 計算程序 計算程序根據(jù)里程數(shù)分別進(jìn)入不同的計算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價+(里程-3)*單價+等待時間*等待單價;否則,執(zhí)行公式:總金額=起步價+等待時間*等待單價。程序流程圖如圖11所示。3.4 顯示程序 顯示程序利用定時器每1ms產(chǎn)生一次中斷,相應(yīng)變量置位,點亮一個數(shù)碼管,顯示一位數(shù)據(jù),利用主函數(shù)內(nèi)的循環(huán),實現(xiàn)動態(tài)掃描顯示,同時根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實現(xiàn)顯示。3.5 鍵盤程序 鍵盤采用查詢的方式,放在主程序中,當(dāng)沒有按鍵按下的時候,單片機(jī)循環(huán)主程序,一旦右按鍵按下,便轉(zhuǎn)向相應(yīng)的子程序處理,處理結(jié)束再返回。流程圖如圖12。 圖12 鍵盤程序流程圖第四章 總結(jié) 經(jīng)過這些天有關(guān)于出租車計價器的課程設(shè)計,使我對單片機(jī)的應(yīng)用有了更深的了解。在課程設(shè)計的過程中,還是碰到了許多的問題。比如,對于數(shù)碼管動態(tài)掃描顯示和鍵盤的延時防抖的綜合編程不能較好地解決;對于代碼的前后順序及調(diào)用掌握得還不夠好;對于一些相關(guān)的應(yīng)用軟件沒能熟練掌握。通過這幾天晚上的苦想和反復(fù)調(diào)試,以及參考網(wǎng)上的程序,最終還是把問題解決了。通過這次課程設(shè)計,我最大的收獲就是自己的動手能力和獨立解決問題的能力得到了很大的提高,也充分體會到了自己設(shè)計東西的樂趣、學(xué)會查閱資料和對別人的東西融會變通的重要性,也明白了很多知識光靠趴在書本上學(xué)是學(xué)不到其中的精髓的,必須親自去試著實踐,親自去經(jīng)歷才能對它們真正的掌握,凡事都要自己去動下手,去實踐一下,遇到困難,永遠(yuǎn)不要沮喪氣餒。在動手的過程中,不僅能增強實踐能力,而且在理論上可以有更深的認(rèn)識;這次設(shè)計給了我極大的鼓舞和信心,相信在以后的學(xué)習(xí)中可以通過不斷的摸索和實踐來提高其他方面的知識。參考文獻(xiàn)1 馬淑華,王鳳文,張美金編著. 單片機(jī)原理與接口技術(shù)(第二版). 北京:北京郵電大學(xué)出版社,2007.2 譚浩強著. C程序設(shè)計(第三版). 北京:清華大學(xué)出版社,2005.附錄A 系統(tǒng)原理圖源程序 #include#include #define uchar unsigned char#define uint unsigned int#define delayNOP(); _nop_();_nop_();_nop_();_nop_();_nop_(); uchar code table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90; sbit exter=P33; /外部中斷 sbit key0=P10; /清零sbit key1=P11; /切換/+sbit key2=P12; /-sbit key3=P13; /功能鍵 sbit p30=P30; /數(shù)碼管各位控制sbit p31=P31;sbit p32=P32;sbit p34=P34;sbit p35=P35;sbit p36=P36;sbit p37=P37; sbit SDA=P23; /IIC引腳sbit SCL=P22; uint inter,aa,bb,temp,temp1;uint zongjine,licheng,dengdai;uint key3num,qiehuantemp,delaytemp;uchar danjia1,danjia2,danjia3,danjia,qibu; void delay(uint x) /延時時基為1ms int i,j; for(i=x;i0;i-) for(j=340;j0;j-); void start() /IIC開始位 SDA = 1; SCL = 1; delayNOP(); SDA = 0; delayNOP(); SCL = 0; void stop() / IIC停止位 SDA = 0; delayNOP(); SCL = 1; delayNOP(); SDA = 1; void respons() /IIC應(yīng)答位 uchar i; SCL=1; delayNOP(); while(SDA=1)&(i250) i+; SCL=0; delayNOP(); uchar read_byte() / 從EEPROM讀到MCU uchar i,j; for(i=0;i8;i+) SCL=1; j=1; j|=SDA; SCL=0; return(j); void write_byte(uchar date) / 從MCU寫到EEPROM uchar i,temp; temp=date; for(i=0;i8;i+) temp=temp1; SCL=0; delayNOP(); SDA=CY; delayNOP(); SCL=1; delayNOP(); SCL=0; delayNOP(); SDA=1; delayNOP(); void write_data(uchar addr, uchar date) / 在指定地址addr處寫入數(shù)據(jù)date start(); write_byte(0xa0); respons(); write_byte(addr); respons(); write_byte(date); respons(); stop(); uchar read_data(uchar addr) / 在指定地址addr讀取數(shù)據(jù) uchar date; start(); write_byte(0xa0); respons(); write_byte(addr); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; void display(uint zongjine0,uint licheng0,uint danjia0) /數(shù)碼管顯示 uint jbai,jshi,jge,lshi,lge,dshi,dge; uint numwei,numshu; /數(shù)碼管位置分配 jbai=zongjine0/100; jshi=zongjine0%100/10; jge=zongjine0%100%10; lshi=licheng0/10; lge=licheng0%10; dshi=danjia0/10; dge=danjia0%10; /數(shù)碼管動態(tài)顯示 if(aa) aa=0; numshu+; if(numshu=7) numshu=0; P3=0xff; switch(numwei) case 0:p30=0;P0=tablejbai;break; case 1:p31=0;P0=tablejshi&0x7f;break; case 2:p32=0;P0=tablejge;break; case 3:p34=0;P0=tablelshi;break; case 4:p35=0;P0=tablelge;break; case 5:p36=0;P0=tabledshi&0x7f;break; case 6:p37=0;P0=tabledge;break; numwei+; if(numwei=7) numwei=0; void keyscan() /鍵盤掃描 if(key3=0) /功能鍵調(diào)節(jié) delay(5); if(key3=0) key3num=1; while(!key3); delay(5); while(!key3); while(key3num) if(key3num=1) /調(diào)白天單價 if(key1=0) delay(5); if(key1=0) danjia1+; if(danjia1=100) danjia1=0; while(!key1); delay(5); while(!key1); if(key2=0) delay(5); if(key2=0) danjia1-; if(danjia1=-1) danjia1=99; while(!key2); delay(5); while(!key2); display(1,0,danjia1); if(key3num=2) /調(diào)夜晚單價 write_data(1,danjia1); if(key1=0) delay(5); if(key1=0) danjia2+; if(danjia2=100) danjia2=0; while(!key1); delay(5); while(!key1); if(key2=0) delay(5); if(key2=0) danjia2-; if(danjia2=-1) danjia2=99; while(!key2); delay(5); while(!key2); display(2,0,danjia2); if(key3num=3) /調(diào)等待單價 write_data(2,danjia2); if(key1=0) delay(5); if(key1=0) danjia3+; if(danjia3=100) danjia3=0; while(!key1); delay(5); while(!ke

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論