基于MCS51單片機的計數(shù)器及出租車計費器設(shè)計_第1頁
基于MCS51單片機的計數(shù)器及出租車計費器設(shè)計_第2頁
基于MCS51單片機的計數(shù)器及出租車計費器設(shè)計_第3頁
基于MCS51單片機的計數(shù)器及出租車計費器設(shè)計_第4頁
基于MCS51單片機的計數(shù)器及出租車計費器設(shè)計_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 單 片 機 課 程 設(shè) 計 課程名稱: 單片機課程設(shè)計 設(shè)計題目: 基于外部脈沖自動計數(shù)的出租車計費器設(shè)計 專 業(yè): 測控技術(shù)與儀器 學(xué)生姓名: 湖南工業(yè)大學(xué)電氣與信息工程學(xué)院一、設(shè)計任務(wù):1.1外部脈沖自動計數(shù),自動顯示。1.1.1設(shè)計一個255計數(shù)器:0255計數(shù),計滿后自動清0,重新計數(shù)(在數(shù)碼管中顯示)。1.1.2設(shè)計一個50000計數(shù)器:050000計數(shù),計滿后自動清0,重新計數(shù)(在數(shù)碼管中顯示)。1.2 設(shè)計一個出租車計費系統(tǒng): 起步價為5元(2km以內(nèi)),2km后,0.8元/0.5km;要求每500m刷新計費一次,在6位數(shù)碼管中,前3位顯示數(shù)碼管顯示里程數(shù),后3位數(shù)碼管顯示價錢

2、(角,元,十元,百元)二、設(shè)計思路及源程序:2.1、0-255計數(shù)器設(shè)計:設(shè)計思路: 十進(jìn)制數(shù)0-255可用8位二進(jìn)制數(shù)來表示,定時器/計數(shù)器的四種工作方式均可實現(xiàn)0-255的計數(shù)功能(工作方式3只有定時器0可以實現(xiàn))。在此為了設(shè)計方便,我采用定時器/計數(shù)器t1工作方式2(可自動重裝初值),外部脈沖由at89s51的p3.5管腳引入,每來一個外部脈沖,計數(shù)器t1計數(shù)加一。由此,只需對tl1的計數(shù)值進(jìn)行相應(yīng)的二進(jìn)制-十進(jìn)制轉(zhuǎn)換,通過算法進(jìn)行運算可得到百位,十位,各位,并存入相應(yīng)變量中(對c51語言而言)。選通相應(yīng)數(shù)碼管,再將各位數(shù)字的相應(yīng)顯示編碼輸入即可在數(shù)碼管上顯示計數(shù)結(jié)果。源程序:/*程序功

3、能描述:計數(shù)器接受外部脈沖實現(xiàn)自動計數(shù),計數(shù)范圍0-255 計滿數(shù)后自動清零,再重新循環(huán)計數(shù) 。 說明:主要硬件設(shè)備:6位共陽極數(shù)碼管,晶振頻率:12mhz*/#include"reg51.h" /c51頭文件unsigned char code led_num10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /數(shù)碼管顯示數(shù)字的十六進(jìn)制代碼unsigned char code led_bit6=0xf8,0xf9,0xfa,0xfb,0xfc,0xfd; /位選代碼,注意語句后的分號不能丟/*函數(shù)名稱:延時子程序*/

4、void delay(unsigned int dat) unsigned int k,j; /定義局部無符號整形變量 for(k=0;k<dat;k+) for(j=0;j<2000;j+); /空循環(huán),延時語句 /*函數(shù)名稱:計數(shù)器初始設(shè)置函數(shù)*/void init_timer1(void) tmod=0x60; /設(shè)置為計數(shù)器模式,工作方式2,自動重裝初值 th1=0x00; /計數(shù)器初值設(shè)為0 tl1=0x00; tr1=1; /開啟計數(shù)器/*函數(shù)名稱:主函數(shù) 說明:先將計數(shù)器1的tl1中數(shù)據(jù)百位、十位、個位分離,并存于數(shù)組led中,再將對應(yīng)數(shù)字的編碼送入數(shù)碼器顯示出來*/

5、void main(void) unsigned char i,j; unsigned char led3; /用來存放要顯示數(shù)字的百、十和個位上的數(shù)字 init_timer1(); /計數(shù)器初始化 while(1) led0=tl1%10; /取個位數(shù)字存于字符數(shù)組 led1=tl1%100/10; /取十位數(shù)字 led2=tl1/100; /取百位數(shù)字 for(j=0;j<10;j+) /在顯示上消耗時間,使三個數(shù)碼管顯示不中斷. for(i=0; i < 3; i+) p2=led_biti; /把ledi表示的位置的位選通 p0=led_numledi; /把相應(yīng)位置的數(shù)顯

6、式出來 delay(1); /延時 proteus仿真效果圖圖2.1、255計數(shù)器仿真效果圖2.2、0-50000計數(shù)器設(shè)計: 設(shè)計思路:0-50000計數(shù)器設(shè)計方法與0-255計數(shù)器設(shè)計方法有很多地方相似,主要在一些地方作了一些技術(shù)處理。由于十進(jìn)制數(shù)0-50000用8位二進(jìn)制已不能表示出來,在此只能選擇定時器/計數(shù)器工作方式1。在用16位計數(shù)器處理0-50000計數(shù)時,我們既可用單純的定時器/計數(shù)器模式,也可采用定時器/計數(shù)器中斷模式。中斷模式的優(yōu)越之處在于它可在計數(shù)溢出時打斷主程序的執(zhí)行,通過在中斷服務(wù)程序中編寫顯示清零程序,可以很精確的實現(xiàn)0-50000的計數(shù)。而用定時器/計數(shù)器模式時有

7、可能在計數(shù)滿50000時顯示不能及時清零,造成這種現(xiàn)象的原因主要是外部脈沖頻率太大,程序來不及對每個脈沖進(jìn)行處理。因此非中斷模式要受到外部脈沖的限制,考慮到現(xiàn)實中有些情況下脈沖頻率也可能會很大,故本程序及下面的出租車計費器均采用中斷模式,把計數(shù)清零語句放到中斷服務(wù)程序中,以保證能精確實現(xiàn)0-50000的計數(shù)。 源程序: /*程序功能:此程序為計數(shù)器1接受外部脈沖實現(xiàn)0-50000自動計數(shù),計數(shù)快慢由外部脈沖的大小決定說明:主要硬件設(shè)備:6位共陽極數(shù)碼管。*/#include"reg51.h" /頭文件unsigned char code led_num10=0xc0,0xf

8、9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /數(shù)碼管顯示數(shù)字的十六進(jìn)制代碼unsigned char code led_bit6=0xf8,0xf9,0xfa,0xfb,0xfc,0xfd; /位選代碼/*函數(shù)名稱:延時子程序函數(shù)*/void delay(unsigned int dat)unsigned int k,j;for(k=0;k<dat;k+)for(j=0;j<2000;j+); /空循環(huán),延時語句/*函數(shù)名稱:定時器1初始設(shè)置函數(shù)*/void init_timer1(void)tmod=0x50; /設(shè)置為計數(shù)器模式,工作方

9、式1th1=0x00; /計數(shù)器初值設(shè)為0tl1=0x00;tr1=1; /開啟計數(shù)器/*函數(shù)名稱:主函數(shù)說明:當(dāng)?shù)?0001個脈沖來臨時將計數(shù)器清零*/void main(void) unsigned char i,j; /定義控制循環(huán)的變量unsigned int temp; /定義一個整型變量用來存儲兩個字節(jié)的數(shù)據(jù)unsigned char led5; /用來存放要顯示數(shù)字的萬、千、百、十和個位init_timer1(); /計數(shù)器初始化while(1) if(th1=0xc3)&&(tl1>=0x51) /第50001個脈沖來臨時將計數(shù)器清零th1=0x00; t

10、l1=0x00;temp=th1; temp=temp<<8; /將th1中數(shù)字左移8位再賦給temp temp=temp|tl1; /將th1和tl1中數(shù)據(jù)合到一個整形變量temp中l(wèi)ed0=temp%10; /存取個位數(shù)字led1=temp%100/10; /存取十位數(shù)字led2=temp%1000/100; /存取百位數(shù)字led3=temp%10000/1000; /存取千位數(shù)字led4=temp/10000; /存取萬位數(shù)字 for(j=0;j<10;j+) /在顯示上消耗時間,使三個數(shù)碼管顯示不中斷for(i=0; i < 5; i+) p2=led_biti

11、; /把ledi表示的位置的位選通 p0=led_numledi; /把相應(yīng)位置的數(shù)顯式出來 delay(1); /延時一個微小時 proteus仿真效果圖圖2.2、50000計數(shù)器仿真效果圖2.3、出租車計費設(shè)計:設(shè)計思路:出租車計費器的設(shè)計可在0-50000計數(shù)器的基礎(chǔ)上擴充改寫而成。出租車上安裝有一個霍爾傳感器,車子輪胎每轉(zhuǎn)動一圈,霍爾傳感器便產(chǎn)生一個脈沖。因此計數(shù)脈沖跟輪胎有直接的對應(yīng)關(guān)系,考慮到車輪是按一定的規(guī)格生產(chǎn)的,在此我們將車程(汽車行駛距離)與車輪的直徑及計數(shù)脈沖數(shù)聯(lián)系起來。因此車程可用計數(shù)脈沖的個數(shù)表示出來,因而車程的顯示可轉(zhuǎn)化為計數(shù)器顯示問題。而車程與收費之間的數(shù)學(xué)關(guān)系在

12、設(shè)計要求中已明確。我采用6位數(shù)碼管來顯示車程和收費。其中前三個數(shù)碼管顯示車程,后三個數(shù)碼管顯示收費。特別指出最好用中斷處理計數(shù)脈沖數(shù)的臨界值,否則很容易不能達(dá)到預(yù)期目標(biāo)。/*程序功能:此為一個出租車計費器,計數(shù)器接受外部脈沖自動計數(shù),在兩千米 以內(nèi)收費5元,之后每 500m刷新一次計費,每500米收費0.8元。數(shù)碼管前三位顯示里程數(shù),顯示精確到0.1km; 數(shù)碼管后三位顯示價錢,從低位到高位一次表示角,元,十元。 說明:車子的輪胎直徑用宏定義,方便根據(jù)不同車型修改參數(shù),用軟件仿真時為了更快看到結(jié)果,可將車的輪胎直徑參數(shù)設(shè)的小一點。*/#include"reg51.h" /c

13、51頭文件#define pi 3.14159 /宏定義圓周率為3.14159#define dia 1.0 /宏定義出租車輪胎的直徑為1.0米unsigned char code led_num10=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /數(shù)碼管顯示數(shù)字的十六進(jìn)制代碼unsigned char code led_bit6=0xf8,0xf9,0xfa,0xfb,0xfc,0xfd; /位選代碼/*函數(shù)名稱:延時子程序*/void delay(unsigned int dat) /延時大小由形參的大小決定 unsigned int

14、 k,j; for(k=0;k<dat;k+) for(j=0;j<2000;j+); /空循環(huán),耗時語句 /*函數(shù)名稱:定時器1初始化設(shè)置函數(shù)*/void init_timer1(void) tmod=0x50; /設(shè)置為計數(shù)器模式,工作方式1 th1=0x00; /計數(shù)器初值設(shè)為0 tl1=0x00; tr1=1; /開啟計數(shù)器/*函數(shù)名稱:主函數(shù) 說明:因為用三位數(shù)碼管表示角,元,十元,在所要求中最大顯示數(shù)據(jù)為99.4元,對應(yīng)計數(shù)器接收到9708個脈沖計費達(dá)到最大值,故在設(shè)計程序時,當(dāng)?shù)?709個脈沖來臨時要將計數(shù)器清零,并且計費也要清零 . */void main(void

15、) unsigned char i,j; /定義循環(huán)控制變量unsigned char cnt=0;unsigned int temp=0; unsigned int tab=0,wap=0; double way = 0,money = 0; /定義浮點型數(shù)據(jù),way表示路程,money表示收費 unsigned char led6; /用來存放要顯示數(shù)字的各位數(shù)字 init_timer1(); /計數(shù)器初始化 while(1) if(th1=0x25)&&(tl1>=0xed) /第9709個脈沖來臨時將計數(shù)器清零 th1=0x00;tl1=0x00;money=0;

16、 /計費清零 temp=th1; temp=temp<<8; /將th1中數(shù)字左移8位再賦給temp temp=temp|tl1; /將th1和tl1中數(shù)據(jù)合到一個整形變量temp中way=temp*pi*dia/1000.0; /車子行駛的路程存入浮點型變量way中 if(way>0)&&(way<=2.0) money=5.0; /兩千米之內(nèi)收費5元 else cnt=2*(way-2); /將超出2km部分轉(zhuǎn)化為0.5km的整數(shù)倍并存于cnt中 money=cnt*0.8+5; /算出應(yīng)收的費用并存于money中 wap=money*10; /將收

17、費數(shù)據(jù)轉(zhuǎn)化為整形,最低位表示角,其次為元,十元 tab=way*10; /將路程數(shù)據(jù)轉(zhuǎn)化為整形,最低位表示百米,其次表示千米,萬米 led0=wap%10; /角位上的數(shù)字存led0 led1=wap%100/10; /得出元位上的數(shù)字 led2=wap/100; /得出十元位上的數(shù)字 led3=tab%10; /得出百米上的數(shù)字 led4=tab%100/10; /得出千米上的數(shù)字 led5=tab/100; /得出萬米上的數(shù)字 for(j=0;j<10;j+) /在顯示上消耗時間,使三個數(shù)碼管顯示不中斷 for(i=0; i < 6; i+) p2=led_biti; /把le

18、di表示的位置的位選通 if(i=1)|(i=4) p0=led_numledi&0x7f; /把相應(yīng)位置的數(shù)顯式出來,帶小數(shù)點 else p0=led_numledi; /把相應(yīng)位置的數(shù)顯式出來,不帶小數(shù)點 delay(1); /延時一個微小時間 proteus仿真效果圖注:高三位數(shù)碼管顯示車程,最低位表示百米;低三位數(shù)碼管顯示收費,最低位表示角圖1.2、出租車計費仿真效果圖三、單片機最小系統(tǒng)硬件資源介紹: 89s51單片機; 6位共陽極數(shù)碼管; 段碼驅(qū)動器74hc573,位選譯碼器74hc138; 4路獨立式按鍵; 外部晶振電路; isp下載接口(in system program

19、,在系統(tǒng)編程); dc+5v電源試配器(選配); isp下載線(選配)。單片機最小系統(tǒng)實訓(xùn)板硬件資源分布見圖1元件布局圖和圖2電路原理圖:其中p1為外部電源輸入座(dc+5v),s8為電源最小系統(tǒng)的電源開關(guān),e1和c3為電源濾波,去耦電容。d1為系統(tǒng)電源指示燈。j2為isp下載接口,s7系統(tǒng)復(fù)位按鍵。cry1,c1,c2為外部時針電路。ic1為89s51(dip-40),左上角為第一腳。pre1,pre2。為上拉排阻(阻值4.7k10k)。j5,j9,j6,j10分別對應(yīng)單片機的p0,p1,p2,p3口。便于二次開發(fā)。6路共陽極數(shù)碼管動態(tài)顯示電路,p0口通過74hc573(起驅(qū)動和隔離作用,讓

20、電流通過74ch573流入公共地),來控制數(shù)碼管的8路段碼,p20-p22通過74hc138譯碼器(使用其中的6路)控制數(shù)碼管的公共端(中間還有三極管做驅(qū)動器)。這樣設(shè)計的理由:為了保證該單片機最小系統(tǒng)的二次開發(fā)的資源充足和合理性。如果單只做一個動態(tài)顯示電路,可以省去74hc573,和74hc138。圖3.1 元件布局圖圖3.2 單片機最小系統(tǒng)原理圖四、課程設(shè)計總結(jié)這次單片機課程設(shè)計歷時兩周,是一次把理論融于實踐的教學(xué)行動?;谖覀兓A(chǔ)還比較薄弱,這次課程設(shè)計老師給我們布置了三個設(shè)計課題,分別是0-255計數(shù)器,0-50000計數(shù)器以及出租車計費器。這三個課題都是定時器/計數(shù)器接收外部脈沖實現(xiàn)

21、計數(shù),程序設(shè)計層層相扣,由淺入深。255計數(shù)器設(shè)計是這次課程設(shè)計最簡單的一道程序題,它也是后續(xù)程序設(shè)計的基礎(chǔ)。由于255計數(shù)器數(shù)據(jù)顯示范圍是0-255,所以由定時器t1的tli寄存器就可完全實現(xiàn)計數(shù)。定時器有四種工作方式,它們都可以滿足255計數(shù)要求(工作方式3只能用定時器t0),為了設(shè)計方便,老師建議使用定時器t1工作方式2(計數(shù)器自動重裝初值)。老師又說不使用中斷也可完全實現(xiàn)編程要求,而且告訴了我們數(shù)模轉(zhuǎn)換的方法,并幫我們理清了設(shè)計思路,這樣我們編程基本上不存在什么難點。 50000計數(shù)器設(shè)計比255計數(shù)器設(shè)計要難一點,也是這次課程設(shè)計比較關(guān)鍵的一環(huán)。50000計數(shù)器只能使用定時器工作方式1(16位計數(shù)器),這里需要處理16位數(shù)字,用匯編語言編程,在這里將是一個難點,用教科書中雙字節(jié)除法運算程序顯然程序冗長晦澀,不適合這種課程設(shè)計。在這

溫馨提示

  • 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

提交評論