第一篇:51單片機(jī) 出租車計(jì)價(jià)器課程設(shè)計(jì)
第一章 出租車計(jì)價(jià)系統(tǒng)的設(shè)計(jì)要求與設(shè)計(jì)方案
1.1 出租車計(jì)價(jià)器設(shè)計(jì)要求
設(shè)計(jì)一個(gè)出租車自動計(jì)費(fèi)器,計(jì)費(fèi)包括起步價(jià)、行車?yán)锍逃?jì)費(fèi)、等待時(shí)間計(jì)費(fèi)三部分,用七段數(shù)碼管顯示總金額,單價(jià),運(yùn)行里程,起步價(jià)為6元,超過6元,每一公里增加1元或2元,等待時(shí)間單價(jià)為每30秒鐘1元,計(jì)費(fèi)功能:費(fèi)用的計(jì)算是按行駛里程收費(fèi)。設(shè)起步價(jià)為6元。
1、當(dāng)總金額<6元時(shí),按起價(jià)計(jì)算費(fèi)用
2、當(dāng)總金額>6元時(shí),每公里按1元或2元計(jì)費(fèi)
3、等待累計(jì)時(shí)間>30s時(shí),按1元/30s計(jì)費(fèi)
4、S1為啟動按鈕、S2轉(zhuǎn)換單價(jià)按鈕、S3復(fù)位按鈕。顯示功能:
1、顯示行駛里程:用三位數(shù)字顯示,顯示方式為“XX.X”,單位為km。計(jì)程范圍0-99.9km,精確到0.1km。
2、顯示單價(jià):用兩位數(shù)字顯示,顯示方式為“X.X”,單位為元。
3、顯示總費(fèi)用:用三位數(shù)字顯示,顯示方式為“XX.X”,單位為元。計(jì)價(jià)范圍0-99.9元,精確到0.1元。
1.2 系統(tǒng)主要功能
本出租車自動計(jì)費(fèi),上電后顯示最初的起步價(jià),里程計(jì)費(fèi)單價(jià)。同時(shí)具有運(yùn)行,復(fù)位,轉(zhuǎn)換等狀態(tài),可以切換白天與晚上不同計(jì)費(fèi)單價(jià),可以實(shí)現(xiàn)每等待30s收1元功能。出租車顯示行駛的總費(fèi)用,里程,單價(jià)。
1.3 方案論證與比較
方案一:采用數(shù)字電子技術(shù),利用555定時(shí)芯片構(gòu)成多諧振蕩器,或采用外圍的晶振電路作為時(shí)鐘脈沖信號,采用計(jì)數(shù)芯片對脈沖盡心脈沖的計(jì)數(shù)和分頻,最后通過譯碼電路對數(shù)據(jù)進(jìn)行譯碼,將譯碼所得的數(shù)據(jù)送給數(shù)碼管顯示,一下是該方案的流程框圖,方案一如圖1-1所示:
圖1-1方案一
方案二:采用EDA技術(shù),根據(jù)層次化設(shè)計(jì)理論,該設(shè)計(jì)問題自頂向下可分為分頻模塊,控制模塊 計(jì)量模塊、譯碼和動態(tài)掃描顯示模塊,其系統(tǒng)框圖如圖1-2所示:
圖1-2方案二
方案三:采用MCU技術(shù),通過單片機(jī)作為主控器,采用外部晶振作為時(shí)鐘脈沖,通過按鍵可以方便調(diào)節(jié),以下是方案三的系統(tǒng)流程圖,本方案主要是必須對于數(shù)字電路比較熟悉,成本又不高。方案圖如圖1-3所示:
圖1-3方案三
方案總結(jié):通過各個(gè)方案的比較,本次采用方案三,不但控制簡單,而且成本低廉,設(shè)計(jì)電路簡單。
第二章 出租車計(jì)價(jià)系統(tǒng)的硬件設(shè)計(jì)
2.1 AT89C51單片機(jī)介紹
AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī)。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集合輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個(gè)芯片中,ATMEL的AT89S51是一種高效微控器,為很多嵌入式控制系統(tǒng)提供了一種靈活性且廉價(jià)的方案 單片機(jī)各引腳功能說明:
VCC:供電電壓。GND:接地。
P0口:P0口為一個(gè)8位漏級開路雙向I/O口,每腳可吸收8TTL門流。當(dāng)P1口的管腳第一次寫1時(shí),被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時(shí),P0 口作為原碼輸入口,當(dāng)FIASH進(jìn)行。校驗(yàn)時(shí),P0輸出原碼,此時(shí)P0外部必須被拉高。
P1口: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)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進(jìn)行存取時(shí),P2口輸出地址的高八位。在給出地址“1”時(shí),它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時(shí),P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時(shí)接收高八位地址信號和控制信號。
P3口:P3口管腳是8個(gè)帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個(gè)TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。P3口也可作為AT89S52的一些特殊功能口,P3口同時(shí)為閃爍編程和編程校驗(yàn)接收一些控制信號。
RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時(shí),要保持RST腳兩個(gè)機(jī)器周期的高電平時(shí)間。
ALE/PROG:當(dāng)訪問外部存儲器時(shí),地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。
/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個(gè)機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時(shí),這兩次有效的/PSEN信號將不出現(xiàn)。
/EA/VPP:當(dāng)/EA保持低電平時(shí),則在此期間選擇外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器。
XTAL1:反向振蕩放大器的輸入及內(nèi)部時(shí)鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出。
2.2 里程計(jì)算、計(jì)價(jià)單元的設(shè)計(jì)
里程計(jì)算是通過安裝在車輪上的霍爾傳感器A44E檢測到的信號,送到單片機(jī),經(jīng)處理計(jì)算,送給顯示單元的。其原理如圖2-1所示
圖2-1 由于A44E 屬于開關(guān)型的霍爾器件,其工作電壓范圍比較寬(4.5~18V),其輸出的信號符合TTL 電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的I/O 端口上,而且其最高檢測頻率可達(dá)到1MHZ。
如圖2-2,A44E 集成霍耳開關(guān)由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D 和OC 門輸出E 五個(gè)基本部分組成。
圖2-2 路程測量電路
在輸入端輸入電壓CC V,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍耳電勢發(fā)生器的兩端,根據(jù)霍耳效應(yīng)原理,當(dāng)霍耳片處在磁場中時(shí),在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍耳電勢差H V 輸出,該H V 信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC 門輸出。當(dāng)施加的磁場達(dá)到工作點(diǎn)(即OP B)時(shí),觸發(fā)器輸出高電壓(相對于地電位),使三極管導(dǎo)通,此時(shí)OC 門輸出端輸出低電壓,通常稱這種狀態(tài)為開。當(dāng)施加的磁場達(dá)到釋放點(diǎn)(即rP B)時(shí),觸發(fā)器輸出低電壓,三極管截止,使OC 門輸出高電壓,這種狀態(tài)為關(guān)。這樣兩次電壓變換,使霍耳開關(guān)完成了一次開關(guān)動作。
我們選擇了P3.5 口作為信號的輸入端,內(nèi)部采用計(jì)數(shù)的方式,車輪每轉(zhuǎn)一圈(我們設(shè)車輪的周長是10米),霍爾開關(guān)就檢測并輸出信號,引起單片機(jī)對脈沖計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到10次時(shí),也就是0.1 公里,單片機(jī)就控制將金額自動的加增加,其計(jì)算公式:當(dāng)前單價(jià)× 公里數(shù)=金額。
2.3 數(shù)據(jù)顯示單元的設(shè)計(jì)
由于設(shè)計(jì)要求有單價(jià)(2 位)、路程(3位)、總金額(3位)顯示輸出,我們采用8個(gè)7段數(shù)碼管動態(tài)顯示。如圖2-3:
圖2-3 數(shù)據(jù)顯示硬件電路圖
2.4 按鍵單元的設(shè)計(jì)
電路共采用了四個(gè)按鍵,S1、S2、S3、S4,其功能分別是:S1 啟動計(jì)價(jià)開關(guān)、S2 白天/晚上轉(zhuǎn)換開關(guān)、S3 數(shù)據(jù)復(fù)位清零開關(guān)、S4閉合表示出租車正常運(yùn)行,計(jì)價(jià)器也正常計(jì)價(jià);若打開S4則表示出租車在暫停,轉(zhuǎn)入判斷是否收費(fèi)程序,閉合超過30秒,開始計(jì)價(jià)。如圖2-4:
圖2-4 按鍵單元電路圖 2.5 振蕩電路
單片機(jī)內(nèi)部有一個(gè)高增益、反相放大器,其輸入端為芯片引腳XTAL1,其輸出端為引腳XTAL2。通過這兩個(gè)引腳在芯片外并接石英晶體振蕩器和兩只電容(電容和一般取33pF)。這樣就構(gòu)成一個(gè)穩(wěn)定的自激振蕩器。振蕩電路脈沖經(jīng)過二分頻后作為系統(tǒng)的時(shí)鐘信號,再在二分頻的基礎(chǔ)上三分頻產(chǎn)生ALE信號,此時(shí)得到的信號時(shí)機(jī)器周期信號。振蕩電路如圖2-5所示:
圖2-5 振蕩電路
2.6 復(fù)位電路
復(fù)位操作有兩種基本形式:一種是上電復(fù)位,另一種是按鍵復(fù)位。按鍵復(fù)位具有上電復(fù)位功能外,若要復(fù)位,只要按圖中的RESET鍵,電源VCC經(jīng)電阻R1、R2分壓,在RESET端產(chǎn)生一個(gè)復(fù)位高電平。上電復(fù)位電路要求接通電源后,通過外部電容充電來實(shí)現(xiàn)單片機(jī)自動復(fù)位操作。上電瞬間RESET引腳獲得高電平,隨著電容的充電,RERST引腳的高電平將逐漸下降。RERST引腳的高電平只要能保持足夠的時(shí)間(2個(gè)機(jī)器周期),單片機(jī)就可以進(jìn)行復(fù)位操作。按鍵復(fù)位電路圖如圖2-6所示。
圖2-6 復(fù)位電路 總電路圖
第三章 出租車計(jì)價(jià)系統(tǒng)的軟件設(shè)計(jì)
3.1主程序流程圖記描述
由于用到了外部中斷0,所以,按中斷系統(tǒng)的編程結(jié)構(gòu)在0000H處放置一條長跳轉(zhuǎn)指令LJMP START跳轉(zhuǎn)到主程序入口,在外部中斷0的中斷入口地址0003H處放置一條長跳轉(zhuǎn)指令LJMP EXT0跳轉(zhuǎn)到外部中斷0服務(wù)程序處。主程序進(jìn)行程序中用到的一些存儲單元的初始化,T0,T1的初始化。首先,進(jìn)行存儲器單元初始化,將71H-79H單元賦值。然后進(jìn)行定時(shí)器的設(shè)置。設(shè)置T1的工作方式為模式2,計(jì)數(shù)狀態(tài),自啟動。T0的工作方式,模式1,定時(shí)狀態(tài),自啟動,對輸入的脈沖進(jìn)行計(jì)數(shù),給T0、T1賦初值。之后調(diào)用計(jì)數(shù)脈沖子程序,及等待子程序,數(shù)碼管動態(tài)顯示子程序,最后進(jìn)入鍵盤掃描子程序進(jìn)行掃描。主程序不斷進(jìn)行調(diào)用數(shù)碼管顯示子程序及鍵盤掃描子程序循環(huán)操作,等待中斷。如圖3-1:
圖3-1 主程序流程圖 3.2計(jì)費(fèi)子程序流程圖
72H存儲總金額小數(shù)位,73H存儲器總金額個(gè)位,78H存儲器總金額十位,77H存儲單價(jià)元。將72H中值放入A中,再將A與77H相加,即小數(shù)位與單價(jià)相加,結(jié)果存入A,再進(jìn)行十進(jìn)制調(diào)整,將結(jié)果存于R6,將高四位與低四位交換并屏蔽高四位,保留低四位與個(gè)位相加得到總金額個(gè)位。若總金額超過10則清零,并且總金額十位加1。將R6中數(shù)值取出,屏蔽高四位,輸出總金額小數(shù)位。如圖3-2:
圖3-2 計(jì)費(fèi)子程序流程圖 3.3 等待是否收費(fèi)子程序
在出租車的計(jì)價(jià)系統(tǒng)中,出租車在等待的時(shí)候也要計(jì)價(jià),本設(shè)計(jì)體現(xiàn)了這點(diǎn)。程序判斷了出租車是否停止,若停止30秒以上是,開始計(jì)價(jià)。55H中賦初值20,56H中賦初值10,總共30秒延時(shí)。超過30秒時(shí),調(diào)用計(jì)費(fèi)子程序。如圖3-3
圖3-3 等待是否收費(fèi)子程序流程圖
3.4 按鍵子程序流程圖
圖3-4 等待收費(fèi)子程序流程圖
3.5 外部中斷0流程圖
圖3-5 外部中斷0子程序流程圖 程序
ORG 0000H LJMP MAIN ORG 0003H;外部中斷入口地址 LJMP REST ORG 030H MAIN:
MOV 71H,#00H;脈沖計(jì)數(shù)每10個(gè)脈沖里程數(shù)加0.1顯示緩沖單元 MOV 72H,#00H;存儲總金額小數(shù)位 MOV 73H,#00H;存儲總金額個(gè)位 MOV 74H,#00H;存儲里程數(shù)小數(shù)位 MOV 75H,#00H;存儲里程數(shù)個(gè)位 MOV 76H,#00H;存儲單價(jià)角位 MOV 77H,#01H;存儲單價(jià)元位 MOV 78H,#00H;存儲總金額十位 MOV 79H,#00H;存儲里程數(shù)十位 MOV 55H,#20;給定等待初值20*50ms MOV 56H,#10;10秒等待時(shí)間初值 SETB EA;開總中斷 SETB EX0;開外部中斷0 MOV TCON,#04H;外部中斷0低電平
MOV TMOD,#61H;設(shè)置使用定時(shí)器1,模式2,計(jì)數(shù)狀態(tài),自啟動,定時(shí)器0,模式1,定時(shí)狀態(tài),自啟動
MOV TL0,#0B0H;50ms初值設(shè)定C350H MOV TH0,#03CH MOV TL1,#0FFH;設(shè)置定時(shí)器低八位初值為FFH,即有一脈沖輸入就溢出
MOV TH1,#0FFH;設(shè)置定時(shí)器高八位初值為FFH,用于重裝低八位 START: LCALL PULSE;調(diào)用計(jì)數(shù)脈沖子程序 LCALL WAIT;調(diào)用等待子程序 LCALL DISPLAY;調(diào)用顯示程序進(jìn)行顯示 LCALL KEY;調(diào)用鍵盤掃描程序
SJMP START;返回START處繼續(xù)循環(huán)執(zhí)行 REST: PUSH ACC MOV 71H,#00H;脈沖計(jì)數(shù)每10個(gè)脈沖里程數(shù)加1顯示緩存單元 MOV 72H,#00H;存儲總金額個(gè)位 MOV 73H,#00H;存儲總金額十位 MOV 74H,#00H;存儲里程數(shù)個(gè)位 MOV 75H,#00H;存儲里程數(shù)十位 MOV 78H,#00H;存儲總金額百位 MOV 79H,#00H;存儲里程數(shù)百位 MOV 55H,#20 MOV 56H,#10 POP ACC RETI PULSE: JBC TF1,PTO1;TF1為1則轉(zhuǎn)PT01 LJMP PSOUT PTO1: MOV 55H,#20 MOV 56H,#10 INC 71H MOV R1,71H CJNE R1,#0AH,PSOUT;脈沖調(diào)整,改變立即數(shù)即可;里程數(shù)個(gè)位74H,R1不等于0AH則轉(zhuǎn)PSOUT MOV 71H,#00H INC 74H LCALL MONEY MOV R1,74H CJNE R1,#0AH,PSOUT;里程數(shù)十位75H MOV 74H,#00H INC 75H MOV R1,75H CJNE R1,#0AH,PSOUT MOV 75H,#00H INC 79H MOV R1,79H CJNE R1,#0AH,PSOUT MOV 79H,#00H PSOUT:RET WAIT: JBC TF0,PTO2 LJMP CHU0 PTO2:MOV TL0,#0B0H MOV TH0,#03CH DJNZ 55H,CHU0;不為0則轉(zhuǎn) MOV 55H,#20 DJNZ 56H,CHU0 MOV 56H,#10;30秒等待計(jì)時(shí) INC 72H MOV A,72H LCALL MONEY1 CHU0:RET MONEY: MOV A,72H ADD A,77H MONEY1:DA A MOV R6,A SWAP A ANL A,#0FH ADD A,73H MOV 73H,A CJNE A,#0AH,MONEY2 MOV 73H,#00H INC 78H MOV A,78H CJNE A,#0AH,MONEY2 MOV 78H,#00H MONEY2:MOV A,R6 ANL A,#0FH MOV 72H,A RET DISPLAY:MOV A,78H CJNE A,#00H,L2 MOV A,73H CJNE A,#06H,L1 L1:JNC L2 MOV A,#82H ADD A,#80H MOV P0,A MOV P2,#02H LCALL DELAY MOV P2,#00H MOV A,#0C0H MOV P0,A MOV P2,#01H LCALL DELAY MOV P2,#00H MOV A,#0C0H MOV P0,A MOV P2,#40H LCALL DELAY MOV P2,#00H LJMP L3 L2:MOV A,73H MOV DPTR,#TAB MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#02H LCALL DELAY MOV P2,#00H MOV A,72H MOVC A,@A+DPTR MOV P0,A MOV P2,#01H LCALL DELAY MOV P2,#00H MOV A,78H MOVC A,@A+DPTR MOV P0,A MOV P2,#40H LCALL DELAY MOV P2,#00H L3:MOV A,75H MOV DPTR,#TAB MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#08H LCALL DELAY MOV P2,#00H MOV A,74H MOVC A,@A+DPTR MOV P0,A MOV P2,#04H LCALL DELAY MOV P2,#00H MOV A,77H MOVC A,@A+DPTR ADD A,#80H MOV P0,A MOV P2,#20H LCALL DELAY MOV P2,#00H MOV A,76H MOVC A,@A+DPTR MOV P0,A MOV P2,#10H LCALL DELAY MOV P2,#00H
MOV A,79H MOVC A,@A+DPTR MOV P0,A MOV P2,#80H LCALL DELAY MOV P2,#00H RET KEY: MOV A,#0FH MOV P3,A MOV A,P3 ORL A,#0F0H CJNE A,#0FFH,KEY1 LCALL DELAY SJMP EKEOUT KEY1: LCALL DELAY MOV A,P3 ORL A,#0F0H CJNE A,#0FFH,KEY2 SJMP EKEOUT KEY2: MOV R1,A KEY3: MOV A,P3 ORL A,#0FCH CJNE A,#0FFH,KEY3 MOV A,R1 JNB ACC.0,RUN JNB ACC.1,CHANGE SJMP EKEOUT RUN: SETB TR0 SETB TR1 SETB EA SJMP EKEOUT EKEOUT:RET CHANGE: PUSH ACC MOV A,77H CJNE A,#02H,NIGHT MOV 77H,#01H SJMP CHOUT NIGHT: MOV 77H,#02H CHOUT: POP ACC RET DELAY: MOV R7,#100 DJNZ R7,$ RET TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H END
第二篇:單片機(jī)課程設(shè)計(jì)出租車計(jì)價(jià)器1.
常州機(jī)電職業(yè)技術(shù)學(xué)院 畢業(yè)設(shè)計(jì)(論文
作者:叢佳偉學(xué)號:40931111系部:電氣工程系 專業(yè):應(yīng)用電子技術(shù) 題目:出租車計(jì)價(jià)器系統(tǒng) 指導(dǎo)者:徐登黃勇 評閱者: 2012年05月 摘要
現(xiàn)在各個(gè)城市出租車行業(yè)都已普及,因此出租車計(jì)價(jià)器的技術(shù)已經(jīng)成熟,但是出租車計(jì)價(jià)器的市場還具有廣闊的前景。隨著城市建設(shè)的日益完善,關(guān)乎城市面貌的出租車行業(yè)也將迅速發(fā)展,出租車計(jì)價(jià)器的的大批量需求也是毫無疑問的,所以未來出租車計(jì)價(jià)器的市場還是有相當(dāng)大的潛力的。
本次出租車計(jì)價(jià)器設(shè)計(jì)以AT89S52單片機(jī)為中心,采用U18霍爾傳感器對輪胎轉(zhuǎn)數(shù)進(jìn)行計(jì)數(shù),實(shí)現(xiàn)對出租車?yán)锍痰臏y量,并最終計(jì)算出結(jié)果。其中采用寄存器芯片AT24C02使系統(tǒng)在掉電的時(shí)候?qū)蝺r(jià)、里程、車輪長度等信息進(jìn)行存儲,采用時(shí)鐘芯片DS1302來顯示時(shí)間和在系統(tǒng)需要時(shí)進(jìn)行計(jì)時(shí)。輸出采用兩個(gè)4段數(shù)碼顯示管,而且根據(jù)按鍵有空車指示燈、等待查詢指示燈、單程指示燈進(jìn)行指示。
汽車計(jì)價(jià)器是乘客與司機(jī)雙方的交易準(zhǔn)則,它是出租車行業(yè)發(fā)展的重要標(biāo)志,是出租車中最重要的工具。它關(guān)系著交易雙方的利益。具有良好性能的計(jì)價(jià)器無論是對廣大出租車司機(jī)朋友還是乘客來說都是很必要的。因此,汽車計(jì)價(jià)器的研究也是有一定的應(yīng)用價(jià)值的。
關(guān)鍵詞:計(jì)價(jià)器、霍爾傳感器、單片機(jī) 目錄 摘要(1 1 緒論(3 1.1 出租車計(jì)價(jià)器概述(3 1.2 單片機(jī)的概述(3 2 總體方案設(shè)計(jì)(4 2.1 設(shè)計(jì)任務(wù)要求(4 2.1.1 設(shè)計(jì)任務(wù)(4 2.1.2 設(shè)計(jì)要求(5 2.2 設(shè)計(jì)的主要功能(5 2.3 方案的選取(5 2.3.1 硬件設(shè)計(jì)方案(5 2.3.2 軟件設(shè)計(jì)方案(6 3 硬件設(shè)計(jì)(7 3.1 AT89S52單片機(jī)及最小系統(tǒng)(7 3.2 測距單元(10 3.3 按鍵單元(12 3.4 時(shí)鐘單元(12
3.5 顯示單元(13 3.6 儲存單元(15 4 軟件設(shè)計(jì)(16 4.1 系統(tǒng)主程序(16 4.2 數(shù)據(jù)處理子程序(17 4.3 等待時(shí)間計(jì)時(shí)子程序(18 4.4 鍵盤掃描子程序(19 5 Proteus軟件仿真(21 總結(jié).............................................錯誤!未定義書簽。致謝.(23 參考文獻(xiàn)(23 附
1、系統(tǒng)原理圖(25 1 緒論
1.1 出租車計(jì)價(jià)器概述
我國在70年代開始出現(xiàn)出租車,但那時(shí)的計(jì)費(fèi)系統(tǒng)大都是國外進(jìn)口不但不夠準(zhǔn)確,價(jià)格還十分昂貴。隨著改革開放日益深入,出租車行業(yè)的發(fā)展勢頭已十分突出,國內(nèi)各機(jī)械廠家紛紛推出國產(chǎn)計(jì)價(jià)器。出租車計(jì)價(jià)器的功能從剛開始的只顯示路程(需要司機(jī)自己定價(jià),計(jì)算后四舍五入,到能夠自主計(jì)費(fèi),以及現(xiàn)在的能夠打一發(fā)票和語音提示、按時(shí)間自主變動單價(jià)等功能。隨著城市旅游業(yè)的發(fā)展,出租車行業(yè)已成為城市的窗口,象征著一個(gè)城市的文明程度。
本次設(shè)計(jì)的目的在于現(xiàn)在各大中城市出租車行業(yè)都已普及自動計(jì)價(jià)器,所以計(jì)價(jià)器技術(shù)的發(fā)展已成定局。而部分小城市尚未普及,但隨著城市建設(shè)日益加快,象征
著城市面貌的出租車行業(yè)也將加速發(fā)展,計(jì)價(jià)器的普及也是毫無疑問的,所以未來汽車計(jì)價(jià)器的市場還是十分有潛力的。
1.2 單片機(jī)的概述
計(jì)算機(jī)系統(tǒng)已明顯地朝巨型化、單片化、網(wǎng)絡(luò)化三個(gè)方向發(fā)展。巨型化發(fā)展的目的在于不斷提高計(jì)算機(jī)的運(yùn)算速度和處理能力,以解決復(fù)雜系統(tǒng)計(jì)算和高速數(shù)據(jù)處理,比如系統(tǒng)仿真和模擬、實(shí)時(shí)運(yùn)算和處理。單片化是把計(jì)算機(jī)系統(tǒng)盡可能集成在一塊半導(dǎo)體芯片上,其目的在于計(jì)算機(jī)微型化和提高系統(tǒng)的可靠性,這種單片計(jì)算簡稱單片機(jī)。單片機(jī)的內(nèi)部硬件結(jié)構(gòu)和指令系統(tǒng)主要是針對自動控制應(yīng)用而設(shè)計(jì)的所以單片機(jī)又稱微控制器MCU(Micro Controller Unit。用它可以很容易地將計(jì)算機(jī)嵌入到各種儀器和現(xiàn)場控制設(shè)備中,因此單片機(jī)又叫做嵌入式微控制器(Embedded MCU。單片機(jī)自20世紀(jì)70年代問世以來,以其鮮明的特點(diǎn)得到迅猛發(fā)展,已廣泛應(yīng)用于家用電器、智能玩具、智能儀器儀表、工業(yè)控制、航空航天等領(lǐng)域,經(jīng)過30多年的發(fā)展,性能不斷提高,品種不斷豐富,已經(jīng)形成自動控制的一支中堅(jiān)力量。據(jù)統(tǒng)計(jì),我國的單片機(jī)年容量已達(dá)1~3億片,且每年以大約16%的速度增長,但相對于國際市場我國的占有率還不到1%。這說明單片機(jī)應(yīng)用在我國有著廣闊的前景。對于從事自動控制的技術(shù)人員來講,掌握單片機(jī)原理及其應(yīng)用已經(jīng)成為必不可少的學(xué)習(xí)任
務(wù)。
單片機(jī)的應(yīng)用十分廣泛,在工業(yè)控制領(lǐng)域、家電產(chǎn)品、智能化儀器儀表、計(jì)算機(jī)外部設(shè)備,特別是機(jī)電一體化產(chǎn)品中,都有重要的用途。其主要的用途可以分為以下方面。
●顯示:通過單片機(jī)控制發(fā)光二極管或是液晶,顯示特定的圖形和字符?!駲C(jī)電控制:用單片機(jī)控制機(jī)電產(chǎn)品做定時(shí)或定向的動作。
●檢測:通過單片機(jī)和傳感器的聯(lián)合使用,用來檢測產(chǎn)品或者工況的意 外發(fā)生。
●通信:通過RS-232串行通信或者是USB通信,傳輸數(shù)據(jù)和信號。●科學(xué)計(jì)算:用來實(shí)現(xiàn)簡單的算法。
那么單片機(jī)是不是解決上述應(yīng)用的唯一選擇呢?當(dāng)然不是!單片機(jī)最明顯的優(yōu)點(diǎn)是價(jià)格便宜,從幾元人民幣到幾十元人民幣。這是因?yàn)檫@類芯片的生產(chǎn)量很大,技術(shù)也很成熟。
其次,單片機(jī)的體積也遠(yuǎn)小于其他兩種方案。單片機(jī)本身一般用40引腳封裝,當(dāng)然功能多一些的單片機(jī)也有引腳比較多的,如68引腳,功能少的只有10多個(gè)或20多個(gè)引腳,有的甚至只有8只引腳。
當(dāng)然,單片機(jī)無論在速度還是容量方面都小于其他兩種方案,但是在實(shí)際工作中并不是任何需要計(jì)算機(jī)的場合都要求計(jì)算機(jī)有很高的性能。例如,控制電冰箱的控制器就不需要使用嵌入式系統(tǒng),用一片51就可以輕松實(shí)現(xiàn)。所以應(yīng)用的關(guān)鍵是看能否夠用,是否有很好的性能價(jià)格比。51系列的單片機(jī)已經(jīng)面世十多年,依然沒有被淘汰,還在不斷發(fā)展中,這就說明是它有廣闊的應(yīng)用前景。總體方案設(shè)計(jì)
本次設(shè)計(jì)是使用單片機(jī)技術(shù)來實(shí)現(xiàn)一個(gè)出租車的數(shù)字計(jì)價(jià)器,利用單片機(jī)豐富的IO端口,及其控制的靈活性,實(shí)現(xiàn)基本的里程計(jì)價(jià)功能和單雙程價(jià)格調(diào)整、時(shí)鐘顯示功能等等。具有性能可靠,電路簡單、成本低、擴(kuò)展空間大等特點(diǎn)。
2.1 設(shè)計(jì)任務(wù)要求 2.1.1 設(shè)計(jì)任務(wù)
設(shè)計(jì)一款基于AT89S52單片機(jī)的出租車數(shù)字計(jì)價(jià)器,通過對傳感器的檢測,對數(shù)值進(jìn)行處理和顯示。
2.1.2 設(shè)計(jì)要求
一、基本要求
(1能顯示里程,單位為公里,最后一位為小數(shù)位。(2能顯示金額數(shù),單位為元,最后一位為小數(shù)位。
(3可設(shè)定單程價(jià)格和往返價(jià)格,單程價(jià)格為2元/公里,往返價(jià)格為1.5元/ 公里。
(4車速<5公里/小時(shí)的時(shí)間累積為總等待時(shí)間,每5分鐘等待時(shí)間相當(dāng)于 里程數(shù)增加1公里。
(5起步公里數(shù)為3公里,價(jià)格為5元,若實(shí)際距離大于3公里,按規(guī)則3計(jì) 算價(jià)格。
(6按暫停鍵,計(jì)價(jià)器可暫停計(jì)價(jià),按查詢鍵,可顯示總等待時(shí)間。
二、發(fā)揮部分
(1增加了空車指示功能,當(dāng)無客人時(shí),按下功能切換按鍵,空車指示燈亮。(2增加實(shí)時(shí)時(shí)間顯示,無論計(jì)價(jià)器工作或者空車,都能顯示實(shí)時(shí)時(shí)間,便于時(shí)間提醒。
(3增加信息儲存功能??梢詢Υ娴却龝r(shí)間,里程和金額。2.2 設(shè)計(jì)的主要功能
本設(shè)計(jì)所設(shè)計(jì)的出租車數(shù)字計(jì)價(jià)器的主要功能有:金額輸出、路程輸出、數(shù)據(jù)復(fù)位、計(jì)時(shí)計(jì)價(jià)、空車顯示等。輸出采用2個(gè)4位8段共陽數(shù)碼管,車輛行走時(shí)前4位顯示路程,后4位顯示金額。車輛候車時(shí),前4位顯示等待時(shí)間,后4位顯示等待金額。空車時(shí)顯示實(shí)時(shí)時(shí)間。儲存等待時(shí)間,里程和金額。
2.3 方案的選取
本設(shè)計(jì)是由軟件設(shè)計(jì)和硬件設(shè)計(jì)兩部分組成的。軟件設(shè)計(jì)要進(jìn)行程序的編寫和軟件仿真;硬件設(shè)計(jì)要設(shè)計(jì)電路、硬件仿真和制作電路板。
2.3.1 硬件設(shè)計(jì)方案
本系統(tǒng)的硬件設(shè)計(jì)主要包括單片機(jī)AT89S52、數(shù)據(jù)顯示部件、U18霍爾傳感 器電路、里程計(jì)算及計(jì)價(jià)單元的設(shè)計(jì)。在硬件設(shè)計(jì)過程中,充分利用各部件的功能,實(shí)現(xiàn)多功能的出租車計(jì)價(jià)器設(shè)計(jì)。
計(jì)價(jià)器的單片機(jī)系統(tǒng)框圖如圖2-1所示。它由以下幾個(gè)部件組成:霍爾傳感器單元、AT89S52單片機(jī)、金額顯示、里程顯示、電源。利用單片機(jī)豐富的IO 端口,及其控制的靈活性,實(shí)現(xiàn)基本的里程和價(jià)格的計(jì)算及顯示功能。
圖2-1計(jì)價(jià)器系統(tǒng)框圖 2.3.2 軟件設(shè)計(jì)方案
本設(shè)計(jì)程序的采取C 語言進(jìn)行編寫,使用Keil uVision3編譯和Proteus7.4a 仿真軟件進(jìn)行仿真調(diào)試。其中的里程計(jì)算和費(fèi)用計(jì)算方案如下。
1、里程計(jì)算
(1霍爾傳感器對車輪進(jìn)行信號檢測,產(chǎn)生并輸出脈沖信號到單片機(jī);(2單片機(jī)對傳感器輸出的脈沖信號進(jìn)行計(jì)數(shù),并進(jìn)行km 計(jì)算:每一個(gè)信號代表輪胎旋轉(zhuǎn)一周,設(shè)輪胎的周長為1.57m;每km 產(chǎn)生的信號數(shù)為N ,里程顯示為N × 1.57m = 1.57N(km
2、費(fèi)用計(jì)算
(1出租車的起步費(fèi)為5元,并且3km 內(nèi)不需額外計(jì)價(jià);(2出租車行駛3km 后,單程2元/km ,雙程1.5元/km。
單 片 機(jī) 霍爾
傳感器 數(shù)據(jù)顯示 狀態(tài)指示 時(shí)鐘顯示 按鍵 信息存儲
(3等待收費(fèi)的標(biāo)準(zhǔn)為5分鐘算一公里;(4暫停時(shí)計(jì)價(jià)器暫停計(jì)價(jià),不收費(fèi)用。3 硬件設(shè)計(jì)
本設(shè)計(jì)的硬件設(shè)計(jì)包括單片機(jī)AT89S52單元、測距單元、顯示單元(數(shù)碼管顯示金額、等待時(shí)間和里程,指示燈對單雙程切換指示、空車指示、等待計(jì)時(shí)指示、按鍵單元、時(shí)鐘單元和儲存單元。
3.1 AT 89S52單片機(jī)及最小系統(tǒng)
1、AT89S52單片機(jī)
AT89S52具有如下特點(diǎn):40個(gè)引腳,8k Bytes Flash片內(nèi)程序存儲器, 256bytes的隨機(jī)存取數(shù)據(jù)存儲器(RAM,32個(gè)外部雙向輸入/輸出(I/O口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,全雙工串行口,看門狗(WDT電路,片內(nèi)時(shí)鐘振蕩器。
P0口有二個(gè)功能:
1、外部擴(kuò)展存儲器時(shí),當(dāng)做數(shù)據(jù)/地址總線。
2、不擴(kuò)展時(shí),可做一般的I/O使用,但內(nèi)部無上拉電阻,作為輸入或輸出時(shí)應(yīng)在外部接上拉電阻。
P1口只做I/O口使用:其內(nèi)部有上拉電阻。
P2口有兩個(gè)功能:
1、擴(kuò)展外部存儲器時(shí),當(dāng)作地址總線使用。
2、做一般I/O口使用,其內(nèi)部有上拉電阻。
P3口有兩個(gè)功能:除了作為I/O使用外(其內(nèi)部有上拉電阻,還有一些特殊功能,由特殊寄存器來設(shè)置。
圖3-1 AT89S52引腳圖
設(shè)計(jì)中用到的單片機(jī)各管腳(圖3-1功能以及與其他模塊連接介紹如下: VCC:接+5V電源。
VSS:接地。
時(shí)鐘引腳:XTAL1和XTAL2兩端接晶振和30PF的電容,構(gòu)成時(shí)鐘電路。
它可以使單片機(jī)穩(wěn)定可靠的運(yùn)行。
RST:復(fù)位信號輸入端,高電平有效。當(dāng)在此引腳加兩個(gè)機(jī)器周期的高電平時(shí),就可以完成復(fù)位操作。
P1.0:接功能按鍵。
P1.1:接切換鍵,表示單雙程切換。P1.2:接查詢(上次金額鍵。P1.3:接清零鍵。P1.4:接空車指示燈。P1.5:接查詢指示燈。P1.6:接開始計(jì)時(shí)指示燈。P1.7:接雙程指示燈。P3.0:接查詢/確認(rèn)鍵。
P0口接數(shù)碼管段選端,P2口接數(shù)碼管位選段。P3.2:接霍爾傳感器的輸出口。P3.3:接存儲器的SCL口。P3.4:接儲存器的SDA口。
P3.5:接時(shí)鐘電路DS1302的RST口。P3.6:接DS1302的SCLK口。P3.7:接DS1302的I/O口。
2、單片機(jī)最小系統(tǒng)
復(fù)位電路和晶振電路是AT89S52工作所需的最簡外圍電路。單片機(jī)最小系統(tǒng)電路圖如圖3-2所示。
圖3-2單片機(jī)最小系統(tǒng)
AT89S52 的復(fù)位端是一個(gè)史密特觸發(fā)輸入,高電平有效。RST端若由低電平上升到高電平并持續(xù)2個(gè)周期,系統(tǒng)將實(shí)現(xiàn)一次復(fù)位操作。在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時(shí)間的高電平,外接11.0592M 晶振和兩個(gè)30pF 電容組成系統(tǒng)的內(nèi)部時(shí)鐘電路。
3.2 測距單元
本次設(shè)計(jì)我們選取了霍爾傳感器來進(jìn)行里程測量。
霍爾器件是一種磁傳感器。用它們可以檢測磁場及其變化,可在各種與磁場有關(guān)的場合中使用?;魻柶骷曰魻栃?yīng)為其工作基礎(chǔ)。
霍爾器件具有許多優(yōu)點(diǎn),它們的結(jié)構(gòu)牢固,體積小,重量輕,壽命長,安裝方便,功耗小,頻率高,耐震動,不怕灰塵、油污、水汽及鹽霧等的污染或腐蝕。
霍爾器件分為:霍爾元件和霍爾集成電路兩大類,前者是一個(gè)簡單的霍爾片,使用時(shí)常常需要將獲得的霍爾電壓進(jìn)行放大。后者將霍爾片和它的信號處理電路集成在同一個(gè)芯片上。本次設(shè)計(jì)選取了霍爾集成電路來測量里程。
里程測量是通過將霍爾傳感器的集成電路安裝在車輪上方的鐵板上,將磁鐵安裝在車輪上,旋轉(zhuǎn)的車輪將磁鐵對準(zhǔn)集成電路時(shí),霍爾傳感器會輸出一個(gè)脈沖信號,送到單片機(jī),經(jīng)過單片機(jī)的計(jì)算處理,將行駛的里程送到顯示單元并顯示出來。
其原理示意圖如下:
圖3-3 傳感器測距示意圖
U18是一種利用霍爾效應(yīng)做成的半導(dǎo)體集成電路器件,它被設(shè)計(jì)在交變磁場中運(yùn)行,特別是能在低電源電壓和長時(shí)間運(yùn)行溫度范圍可達(dá)到125℃。這種霍爾IC可用作各種類型的傳感器(速度傳感器、位移傳感器、轉(zhuǎn)速傳感器等等,接觸開關(guān)以及
相類似的應(yīng)用場合。其工作電壓比較寬(2.5~20V,可運(yùn)行在較大的溫度范圍內(nèi)(-20℃~125℃, 其輸出的信號符合TTL電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的IO 端口上,而且其最高檢測頻率可達(dá)到1MHZ。
霍爾傳感器的特性如圖3-4所示,其中BOP為工作點(diǎn)“開”的磁感應(yīng)強(qiáng)度, BRP為釋放點(diǎn)“關(guān)”的磁感應(yīng)強(qiáng)度。當(dāng)外加的磁感應(yīng)強(qiáng)度超過動作點(diǎn)BOP時(shí),傳
感器輸出低電平,當(dāng)磁感應(yīng)強(qiáng)度降到動作點(diǎn)BOP以下時(shí),傳感器輸出電平不變,一直要降到釋放點(diǎn)BRP時(shí),傳感器才由低電平躍變?yōu)楦唠娖健OP與BRP之間的滯后使開關(guān)動作更為可靠。
U18集成霍耳開關(guān)由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片B、差分放大器C、施密特觸發(fā)器D和OC門輸出E五個(gè)基本部分組成。
在輸入端輸入電壓VCC,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍爾電勢發(fā)生器的兩端,根據(jù)霍爾效應(yīng)原理,當(dāng)霍爾片處在磁場中時(shí),在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍爾電勢差VH輸出,該VH信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC門輸出。當(dāng)施加的磁場達(dá)到工作點(diǎn)(即Bop時(shí),觸發(fā)器輸出高電壓(相對于地電位,使三極管導(dǎo)通,此時(shí)OC門輸出端輸出低電壓,三極管截止,使OC門輸出高電壓,這種狀態(tài)為關(guān)。這樣兩次電壓變換,使霍爾開關(guān)完成了一次開關(guān)動作。
圖3-4 U18霍爾傳感器和其輸出特性
U18霍爾傳感器有3個(gè)外接口,2個(gè)是電源的正負(fù)極接口,最后一個(gè)是脈沖信號輸出口,只要將霍爾傳感器的信號輸出端接到單片機(jī)的端口上便可以實(shí)現(xiàn)距離檢測。
其中,單片機(jī)的P3.2(INT0引腳作為信號的輸入端,采用外部中斷0進(jìn)行計(jì)數(shù)。車輪每轉(zhuǎn)一圈,霍爾傳感器就產(chǎn)生一個(gè)脈沖信號,根據(jù)霍爾效應(yīng)原理,當(dāng)霍爾片處在磁場中時(shí),霍爾傳感器的輸出端輸出低電平。當(dāng)車輪轉(zhuǎn)動一圈時(shí)小磁鐵提供一個(gè)磁場,則霍爾傳感器輸出一次低電平完成一次數(shù)據(jù)采集,從而產(chǎn)生信號。霍爾傳感器檢測并輸出信號到單片機(jī)的INT0或INT1計(jì)算脈沖輸入端, 引起單片機(jī)的中斷,對脈沖計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到特定的次數(shù)時(shí),里程就會增加,單片機(jī)對里程進(jìn)行計(jì)算后,通過接口電路將計(jì)算好的結(jié)果傳送到數(shù)碼管并顯示出來。
3.3 按鍵單元
本設(shè)計(jì)的按鍵單元電路(如圖3-5有5個(gè)按鍵,功能分別是:S1是空車時(shí)查詢上次金額和里程以及等待時(shí)間,結(jié)賬時(shí)查詢本次金額和里程以及等待時(shí)間;S2功能鍵,不按時(shí)空車指示燈亮而且數(shù)碼管顯示實(shí)時(shí)時(shí)間,按下時(shí)可設(shè)置單雙程,此時(shí)再按S3可進(jìn)行單程和雙程之間切換,再按S1可確認(rèn)單雙程,雙程時(shí)雙程指示燈亮并開始計(jì)價(jià);按下S4可對本次金額、里程以及等待時(shí)間進(jìn)行查詢;S5為清零鍵,按下時(shí)清零之前數(shù)據(jù)消除以及存儲本次信息。
圖3-5 按鍵單元電路 3.4 時(shí)鐘單元
本設(shè)計(jì)采用基于DS1302的時(shí)鐘電路(如圖3-6對時(shí)間進(jìn)行實(shí)時(shí)顯示,單片機(jī)掉電對其沒有影響。用數(shù)碼管表現(xiàn)出來,當(dāng)出租車空車時(shí)就顯示時(shí)間,給人時(shí)間提示。
圖3-6 時(shí)鐘電路單元 3.5 顯示單元
本設(shè)計(jì)顯示單元包括兩部分:數(shù)碼管顯示(圖3-7和二極管指示顯示(圖3-8。數(shù)碼管顯示部分使用兩個(gè)四位一體的LED數(shù)碼管,LED顯示器是由LED發(fā)光二極管發(fā)展過來的一種顯示器件,是發(fā)光二極管的改型。LED是發(fā)光二極管的簡稱,是一種將電能轉(zhuǎn)換成光能的設(shè)備。本身也是一種光源。LED顯示器是由發(fā)光二極管排列組成的顯示器件。它采用低電壓掃描驅(qū)動,具有:耗電少、使用壽命長、成本低、故障少、視角大、可視距離遠(yuǎn)等特點(diǎn)。此外,它的響應(yīng)時(shí)間短(一般不超過0.1us,亮度也比較高。它的缺點(diǎn)是工作電流比較大,每一段的工作電流在10mA左右。
其中每位數(shù)碼管是由8個(gè)發(fā)光二極管演變而來,其中7個(gè)發(fā)光二極管構(gòu)成7筆字形,另一個(gè)構(gòu)成小數(shù)點(diǎn),稱為8段LED。8段LED數(shù)碼管是利用7個(gè)LED(發(fā)光二極管外加一個(gè)小數(shù)點(diǎn)的LED組合而成的顯示設(shè)備,可以顯示0~9等10個(gè)數(shù)字和小數(shù)點(diǎn),使用非常廣泛,它的外觀如圖3-9所示:
圖3-9 8段數(shù)碼管
這類數(shù)碼管可以分為共陽極(8個(gè)發(fā)光二極管的陽極接在—起與共陰極(8 個(gè)發(fā)光二極管陰極連在一起兩種,共陽極就是把所有LED的陽極連接到共同接點(diǎn),而每個(gè)LED的陰極分別為a、b、c、d、e、f、g及dp(小數(shù)點(diǎn);共陰極則是把所有LED的陰極連接到共同接點(diǎn),而每個(gè)LED的陽極分別為a、b、c、d、e、f、g及dp(小數(shù)點(diǎn),如圖3-10所示。
圖3-10 共陽和共陰數(shù)碼管結(jié)構(gòu)
通過控制這個(gè)公共端,可使該位亮或暗。如共陰極端接地或共陽極接高電平,則該位顯示器有效,反之無效。本設(shè)計(jì)采用共陰LED數(shù)碼管。
數(shù)碼管有靜態(tài)顯示和動態(tài)顯示兩種,這里采用動態(tài)顯示。它具有低功耗、接口少等特點(diǎn)。如圖3-7兩個(gè)四位一體數(shù)碼管接P0口作為段選,接P2口作為位選。空車時(shí)顯示時(shí)間,開始計(jì)價(jià)時(shí)前四位顯示路程,后四位顯示價(jià)錢。當(dāng)查詢等待時(shí)間時(shí)顯示為等待時(shí)間。
圖3-7顯示單元(數(shù)碼管顯示部分
二極管指示部分包括空車指示燈、等待時(shí)間查詢指示、開始計(jì)時(shí)指示和雙程指示如圖3-8。這些指示燈能對出租車的每一種狀態(tài)進(jìn)行指示,空車時(shí)空車指示燈亮,查詢等待時(shí)間時(shí)等待時(shí)間查詢指示燈亮,當(dāng)汽車速度小于5km/h 時(shí)開始計(jì)時(shí),計(jì)時(shí)指示燈亮。計(jì)價(jià)前如果按下雙程鍵雙程指示燈亮,表示為雙程。
圖3-8 顯示單元(二極管指示部分 3.6 儲存單元
存儲單元的作用是儲存上一次的里程、金額和等待時(shí)間。AT24C02 是Atmel 公司的1KB的電可擦除存儲芯片,采用兩線串行的總線和單片機(jī)通訊,電壓最低可以到2.5V,額定電流為1mA,靜態(tài)電流10uA(5.5V,芯片內(nèi)的資料可以在斷電的情況下保存40年以上,而且采用8 腳的DIP 封裝,使用方便。
圖3-11儲存單元電路
圖中R3、R4 是上拉電阻,其作用是減少AT24C02 的靜態(tài)功耗。由于AT24C02的數(shù)據(jù)線和地址線是復(fù)用的,采用串口的方式傳送數(shù)據(jù),所以只用兩根線SCL(時(shí)鐘脈沖和SDA(數(shù)據(jù)/地址與單片機(jī)P3.3和P3.4口連接,進(jìn)行傳送數(shù)據(jù)。軟件設(shè)計(jì)
本系統(tǒng)的軟件設(shè)計(jì)主要分為系統(tǒng)主程序、數(shù)據(jù)處理子程序、等待時(shí)間及時(shí)子程序和鍵盤掃描子程序五個(gè)模塊,下面對每一塊進(jìn)行介紹。
4.1 系統(tǒng)主程序
本設(shè)計(jì)中,軟件設(shè)計(jì)采用模塊化操作,利用各個(gè)模塊之間的相互聯(lián)系,在設(shè)計(jì)中采用主程序調(diào)用各個(gè)子程序的方法,使程序通俗易懂,我們設(shè)計(jì)了整體程序流程圖。
在main函數(shù)編寫開始,要進(jìn)行初始化,包括對系統(tǒng)初始化和對硬件設(shè)備進(jìn)行初始化,并使硬件處于就緒狀態(tài)。
在主程序模塊中,需要完成對各接口芯片的初始化、出租車起價(jià)和單價(jià)的初始化、中斷向量的設(shè)計(jì)以及開中斷、循環(huán)等待等工作。系統(tǒng)流程圖如下圖4-1。
開始 初始化 數(shù)據(jù)處理 鍵盤掃描 結(jié)束
圖4-1系統(tǒng)主程序流程圖 4.2 數(shù)據(jù)處理子程序
每當(dāng)霍爾傳感器輸出一個(gè)低電平信號就使單片機(jī)中斷一次,在計(jì)數(shù)中斷服務(wù)程序,里程和金額都相應(yīng)變化,當(dāng)然等待時(shí)間也換算成里程(當(dāng)速度小于5km/h 時(shí)5分鐘想當(dāng)于1公里。計(jì)算程序根據(jù)里程數(shù)分別進(jìn)入不同的計(jì)算公式。如果里程大于3公里,則執(zhí)行公式:金額=(里程-3*單價(jià)+5;否則,執(zhí)行公式:總金額=起步價(jià)。程序流程圖如圖4-2所示。
計(jì)算里程 開始
里程<3公里否是
金額=5元金額=單價(jià)*(里程-3+5 顯示金額
結(jié)束
圖4-2 數(shù)據(jù)處理子程序流程圖 4.3 等待時(shí)間計(jì)時(shí)子程序
當(dāng)出租車的速度5km/h時(shí)等待時(shí)間開始計(jì)時(shí),并被換算里程,進(jìn)行計(jì)算顯示等待時(shí)間和金額。當(dāng)結(jié)算時(shí)停止計(jì)時(shí)和計(jì)費(fèi)并顯示金額,當(dāng)有查詢鍵按下時(shí)顯示等待時(shí)間,當(dāng)有清零鍵按下時(shí)存儲本次金額。如圖4-3: 開始
結(jié)算鍵按下?Speed<5公里/ 小時(shí)?開始計(jì)時(shí),并顯示Speed>5公里/ 小時(shí)?停止計(jì)時(shí),開始計(jì) 路程 否 是
停止計(jì)時(shí),計(jì)費(fèi),顯示金額 查詢鍵按下? 存儲本次金額 是清零鍵按下? 是 否
顯示等待時(shí)間
圖4-3等待時(shí)間計(jì)時(shí)子程序 4.4 鍵盤掃描子程序
鍵盤采用查詢的方式,放在主程序中,當(dāng)沒有按鍵按下的時(shí)候,單片機(jī)循環(huán)主程序,一旦右按鍵按下,便轉(zhuǎn)向相應(yīng)的子程序處理,處理結(jié)束再返回。流程圖如圖4-4。
開始 功能鍵按下? 單雙程設(shè)置 切換鍵按下? 切換單雙程 確認(rèn)鍵按下? 空車指示滅,開始計(jì)價(jià)計(jì)時(shí),顯示里 程,價(jià)格 結(jié)算鍵按下? 結(jié)算金額顯示 是 是 是 是
否 顯示時(shí)間 否 否 否
查詢鍵按下? 顯示等待時(shí)間與里 程
清零鍵按下?存儲金額 是 否 是否 按下兩次? 是
查詢鍵按下? 顯示上次金額 是
圖4-4 鍵盤掃描子程序 5 Proteus軟件仿真
本設(shè)計(jì)需要用Keil uVision3對C51程序進(jìn)行編譯,生成“.hex”文件,如圖5-1 :
圖5-1 Keil uVision3編譯
在Proteus軟件中畫出仿真電路(如圖5-2,把Keil uVision3編譯后生成的“.hex”導(dǎo)入到單片機(jī)中,按“運(yùn)行仿真”鍵進(jìn)行仿真。
圖5-2Proteus仿真 總結(jié)
總結(jié)在本次設(shè)計(jì)中,我們采用AT89S52芯片為核心器件,設(shè)計(jì)出了簡單的出租車計(jì)價(jià)器,能夠?qū)崿F(xiàn)顯示時(shí)間、等待時(shí)間、金額和里程,按鍵控制,空車指示。
選題后,我們便開始復(fù)習(xí)單片機(jī)方面的知識,也查閱、搜索了很多相關(guān)資料,進(jìn)行總體設(shè)計(jì)與具體設(shè)計(jì),同時(shí)也學(xué)習(xí)仿真軟件Proteus和編程軟件Keil uVision3。由于以前都采用匯編語言實(shí)現(xiàn)編程,對用C語言來實(shí)現(xiàn)單片機(jī)的編程不太習(xí)慣,花費(fèi)了一些時(shí)間來熟悉C語言的編程。在設(shè)計(jì)開始,要形成流程圖,它可以使設(shè)計(jì)有一定的邏輯性與嚴(yán)密性,使得設(shè)計(jì)思路明確。采用模塊化的設(shè)計(jì)思想很重要,它方便編寫、修改與調(diào)試,另外加上必要的注釋,便于交流與理解。
這次課程設(shè)計(jì)設(shè)計(jì)完成后,體會頗多,在學(xué)與做的過程中,取長補(bǔ)短,不斷學(xué)習(xí)新的知識,吸取經(jīng)驗(yàn),達(dá)到進(jìn)步的目的。通過自身的努力以及相關(guān)圖書資料的幫助,逐漸熟
悉了Keil uVision3、PROTEUS和C語言等軟件的使用以及硬件焊接與檢測過程中的一些小技巧。本次設(shè)計(jì)我學(xué)習(xí)到不少單片機(jī)的知識,但由于自己的理論知識水平有限,實(shí)踐知識和設(shè)計(jì)經(jīng)驗(yàn)不足,在設(shè)計(jì)過程中難免存在一些問題。所焊實(shí)物尚有許多不足,個(gè)別功能還不能很好的實(shí)現(xiàn),主要原因是考慮問題不周全,電路設(shè)計(jì)經(jīng)驗(yàn)少,實(shí)際動手能力不足。懇請各位老師批評指正,以使我在以后的學(xué)習(xí)和實(shí)踐中加以改進(jìn)和提高。
致謝
畢業(yè)設(shè)計(jì)即將結(jié)束,在老師的指導(dǎo)和同學(xué)的幫助之下,學(xué)生對于出租車計(jì)價(jià)器設(shè)計(jì)有了更多新的認(rèn)知,對出租車計(jì)價(jià)器設(shè)計(jì)有了更深一步的認(rèn)識,對出租車計(jì)價(jià)器綜合設(shè)計(jì)的整體脈絡(luò)了解得更加的清晰透徹。通過畢業(yè)設(shè)計(jì),學(xué)生對自己三年以來所學(xué)的知識有更多的認(rèn)識。
畢業(yè)設(shè)計(jì),幫助我們總結(jié)大學(xué)的收獲、認(rèn)清自我。同時(shí),還幫助我們改變一些處理事情時(shí)懶散的習(xí)慣。從最開始時(shí)的搜集資料,整理資料,到方案比選,確定方案,再到著手開始設(shè)計(jì),每一步都是環(huán)環(huán)相扣,銜接緊密,其中任何一個(gè)步驟產(chǎn)生遺漏或者疏忽,就會對以后的設(shè)計(jì)帶來很多的不便。
本次作者的畢業(yè)設(shè)計(jì)是由徐老師指導(dǎo)的,在他的悉心指導(dǎo)下,我開闊了眼界,明確了思路。在整個(gè)的設(shè)計(jì)過程中,徐老師提出了許多寶貴的建議和指導(dǎo),使我能夠順利的完成整個(gè)設(shè)計(jì),在此,謹(jǐn)向徐老師表示由衷的感謝。
在即將離開學(xué)校之際,我要感謝在大學(xué)生活中任課的眾多老師,正是在他們的諄諄教誨下使我順利完成了大學(xué)的基礎(chǔ)知識和專業(yè)知識的學(xué)習(xí)。在此,還要感謝陪伴我共同走過大學(xué)時(shí)代并給予我?guī)椭耐瑢W(xué)和朋友們,感謝你們,祝福你們在以后的日子里開開心心的度過每一天!參考文獻(xiàn)
1.戴佳, 陳斌, 苗龍.51單片機(jī)應(yīng)用系統(tǒng)開發(fā)典型實(shí)例.中國電力出版社,2005
2.余發(fā)山,王福忠.單片機(jī)原理及應(yīng)用技術(shù).中國礦業(yè)大學(xué)出版社, 2008.6 3.侯玉寶, 陳忠平, 李成群.基于Proteus的51系列單片機(jī)設(shè)計(jì)與仿真.電子工業(yè)出版社,2008 4.李玉梅.基于MCS-51系列單片機(jī)原理的應(yīng)用設(shè)計(jì).國防工業(yè)出版社,2006 5.邊春元, 李文濤, 江杰.C51單片機(jī)典型模塊設(shè)計(jì)與應(yīng)用.機(jī)械工業(yè)出版社,2008 6.樓然苗,胡佳文,李光飛等.單片機(jī)實(shí)驗(yàn)與課程設(shè)計(jì).浙江大學(xué)出版社,2010.10 常州機(jī)電職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)報(bào)告 附
1、系統(tǒng)原理圖、25
第三篇:單片機(jī)出租車計(jì)價(jià)器源程序
出租車計(jì)價(jià)器設(shè)計(jì)與制作
設(shè)計(jì)并制作一臺出租車計(jì)價(jià)器。調(diào)試時(shí)采用10Hz方波信號模擬,每個(gè)方波代表10m?;疽螅?/p>
(1)不同情況具有不同的收費(fèi)標(biāo)準(zhǔn)
白天 1元/公里 晚上 2元/ 公里 途中等待(30s)1元/30s
(2)數(shù)據(jù)輸出(6位LED數(shù)碼管顯示)
單價(jià)輸出2位 路途輸出2位 總金額輸出2位
(3)按鍵(3個(gè))
啟動計(jì)價(jià)開關(guān) 數(shù)據(jù)復(fù)位(清零)白天/晚上轉(zhuǎn)換
3.4.1模塊1:系統(tǒng)設(shè)計(jì)
(1)分析任務(wù)要求,寫出系統(tǒng)整體設(shè)計(jì)思路
通過分析,需要實(shí)現(xiàn)四個(gè)主要的功能模塊,分別為脈沖計(jì)數(shù)模塊、定時(shí)器計(jì)時(shí)模塊、按鍵的處理以及
數(shù)碼管動態(tài)掃描等功能。
定時(shí)器計(jì)時(shí)模塊主要完成途中等待(即沒有脈沖來時(shí))30秒的計(jì)時(shí)。在啟動鍵按下后,定時(shí)器就不停的計(jì)時(shí),只要有脈沖來就將計(jì)時(shí)的值清除為零。如果沒有脈沖來,當(dāng)計(jì)時(shí)超過30秒時(shí),相應(yīng)的總金額要
按照收費(fèi)標(biāo)準(zhǔn)計(jì)價(jià)。
中斷的管理:盡管中斷有嵌套以及優(yōu)先級的功能,但是由于定時(shí)器已經(jīng)使用一個(gè)了中斷資源,脈沖檢測不宜再采用中斷方式,而是采用查詢方式。由于需要不停的要清除30秒的計(jì)時(shí),因此,脈沖的計(jì)數(shù)不
采用定時(shí)器的計(jì)數(shù)方式。
啟動鍵觸發(fā)定時(shí)器開始工作,而定時(shí)器的運(yùn)行可以作為脈沖計(jì)數(shù)的標(biāo)志,只要定時(shí)器計(jì)時(shí)在運(yùn)行,每來一個(gè)中斷都應(yīng)該計(jì)數(shù)。
主程序完成鍵盤的掃描和按鍵的處理,查詢脈沖產(chǎn)生的中斷,并完成脈沖的計(jì)數(shù)。每個(gè)脈沖代表10米,則當(dāng)計(jì)數(shù)到100時(shí)表示1千米的距離,相應(yīng)的總金額要按照收費(fèi)標(biāo)準(zhǔn)計(jì)價(jià)
(2)選擇單片機(jī)型號和所需外圍器件型號,設(shè)計(jì)單片機(jī)硬件電路原理圖
采用MCS51系列單片機(jī)At89S51作為主控制器,外圍電路器件包括數(shù)碼管驅(qū)動、獨(dú)立式鍵盤、復(fù)位電
路等。硬件電路原理圖如圖3-9所示。
圖3-11 出租車計(jì)價(jià)器的硬件電路原理圖
數(shù)碼管驅(qū)動采用2個(gè)四聯(lián)共陰極數(shù)碼管顯示,由于單片機(jī)驅(qū)動能力有限,采用74HC244作為數(shù)碼管的驅(qū)動。在74HC244的7段碼輸出線上串聯(lián)100歐姆電阻起限流作用。
獨(dú)立式按鍵使用上提拉電路連接,在沒有鍵按下時(shí),輸出高電平。P0口用于輸出7段LED共陰極顯示代碼,P2口用于輸出低電平有效的位選碼。0~9的7段LED共陰極顯示代碼:3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。
(3)分析軟件任務(wù)要求,寫出程序設(shè)計(jì)思路,分配單片機(jī)內(nèi)部資源,畫出程序流程圖
軟件的任務(wù)要求包括定時(shí)器的設(shè)置、按鍵的掃描、按鍵的功能處理、脈沖的計(jì)數(shù)、路途等待超30秒的計(jì)
時(shí)以及總金額的計(jì)算等。
程序設(shè)計(jì)的思路:使用中斷方式對定時(shí)器的溢出進(jìn)行計(jì)數(shù)實(shí)現(xiàn)30秒的計(jì)時(shí)。主程序采用查詢外部中斷標(biāo)志實(shí)現(xiàn)脈沖的計(jì)數(shù),由于每個(gè)脈沖代表10m,因此,當(dāng)脈沖計(jì)數(shù)超過100時(shí),計(jì)價(jià)器按照收費(fèi)標(biāo)準(zhǔn)計(jì)價(jià)。主程序在初始化變量和定時(shí)器參數(shù)設(shè)置之后,進(jìn)入一個(gè)循環(huán)結(jié)構(gòu),循環(huán)掃描鍵盤、查詢脈沖的中斷、數(shù)碼管的動態(tài)掃描等功能,當(dāng)脈沖的中斷標(biāo)志被查詢到,若路途等待時(shí)間未超30秒時(shí),要及時(shí)將路途等待時(shí)間的值清除為零。主程序的流程圖如圖3-12所示。
圖3-12 出租車計(jì)價(jià)器的主程序流程圖
中斷服務(wù)程序主要實(shí)現(xiàn)計(jì)時(shí)功能,當(dāng)啟動鍵按下之后,定時(shí)器開始工作,用一個(gè)變量對定時(shí)器溢出中斷的次數(shù)進(jìn)行計(jì)數(shù),達(dá)到計(jì)時(shí)功能,該變量在每次脈沖到來時(shí)被清零(在主程序中清零),當(dāng)脈沖長時(shí)間沒有來,則當(dāng)該變量計(jì)數(shù)超過30秒時(shí),總金額按照途中等待計(jì)費(fèi)標(biāo)準(zhǔn)進(jìn)行計(jì)價(jià)。中斷程序的流程圖如圖
3-13所示。
圖3-13 出租車計(jì)價(jià)器的中斷服務(wù)程序流程圖
(4)設(shè)計(jì)系統(tǒng)軟件調(diào)試方案、硬件調(diào)試方案及軟硬件聯(lián)合調(diào)試方案
軟件調(diào)試方案:偉福軟件中,在“文件新建文件”中,新建C語言源程序文件,編寫相應(yīng)的程序。在“文件新建項(xiàng)目”的菜單中,新建項(xiàng)目并將C語言源程序文件包括在項(xiàng)目文件中。
在 “項(xiàng)目編譯”菜單中將C源文件編譯,檢查語法錯誤及邏輯錯誤。在編譯成功后,產(chǎn)生以 “*.hex”和“*.bin” 后綴的目標(biāo)文件。
硬件調(diào)試方案:在設(shè)計(jì)平臺中,將單片機(jī)的P1.0-P1.2分別與3個(gè)獨(dú)立式鍵盤通過插線連接起來,將P3.2與脈沖信號源連接起來。
在偉福中將程序文件編譯成目標(biāo)文件后,將下載線安裝在實(shí)驗(yàn)平臺上,運(yùn)行“MCU下載程序”,選擇相應(yīng)的flash 數(shù)據(jù)文件,點(diǎn)擊“編程”按鈕,將程序文件下載到單片機(jī)的Flash中。
然后,上電重新啟動單片機(jī),檢查所編寫的程序是否達(dá)到題目的要求,是否全面完整地完成試題的內(nèi)容。3.4.2 程序設(shè)計(jì)
/*晶振:11.0592M T1-250微秒溢出中斷一次;P3.2(int0)-中斷100次,查詢IE0置位,P1^0為啟動鍵;P1^1為清除鍵;P1^2為白天/晚上的切換鍵 變量的定義: key_val: 返回按鍵的值 255-無鍵
T1_cnt: 定時(shí)器溢出數(shù)計(jì)數(shù)
cnt_30: 30秒鐘的計(jì)時(shí)
cnt_distance: 計(jì)算路程
cnt_cost: 總金額
state_val: 狀態(tài):0-白天 1 夜晚
cost_val[3]: 收費(fèi)標(biāo)準(zhǔn):白天單價(jià)cost_val[0]=1元/公里;晚上單價(jià)cost_val[1]=2元/公里; 等待單價(jià)cost_val[2]=1元/30s
led_seg_code:數(shù)碼管7段碼 */ //-------------------#include “reg51.h” unsigned char data cnt_30,cnt_distance,cnt_cost;unsigned int data T1_cnt,D_cnt;unsigned char data key_val,key_val_old;unsigned char data state_val;char code cost_val[3]={1,2,1};char code led_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//led_seg_code[0-9]代表0-9 //-------延時(shí)-----------------void delay(unsigned int i)//延時(shí) { while(--i);} //-------初始化變量------------------void init_variant()//初始化一些變量的內(nèi)容 {unsigned char i;cnt_30=0;//30秒的計(jì)時(shí) D_cnt=0;//脈沖的個(gè)數(shù) cnt_distance=0;//距離的計(jì)數(shù)
cnt_cost=0;//保存總價(jià)格 } //-------掃描鍵盤-----------------unsigned char scan_key(){ unsigned char i,k;i=P1;if(i==0xff){ k=255;} //無鍵按下
else //有鍵按下
{ delay(10);//延時(shí)去抖動
if(i!=P1){k=255;} else { switch(i){ case 0xfe: k=0;break;//P1.0按下,啟動鍵
case 0xfd: k=1;break;//P1.1按下,清除鍵
case 0xfb: k=2;break;//P1.2按下,切換鍵
} } } return k;} //-------數(shù)碼管動態(tài)掃描-------------void led_show(){unsigned char i,k;
//-----顯示單價(jià)----k=cost_val[state_val];i=k%10;//暫存?zhèn)€位 P0=led_seg_code[i];P2=0xbf;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0x7f;delay(10);//-----顯示距離------k=cnt_distance;i=k%10;//暫存?zhèn)€位 P0=led_seg_code[i];P2=0xf7;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xef;delay(10);//-----顯示總價(jià)格-----------k=cnt_cost;i=k%10;//暫存?zhèn)€位 P0=led_seg_code[i];P2=0xfe;delay(10);i=k%100/10;P0=led_seg_code[i];P2=0xfd;delay(10);} //-------計(jì)時(shí)----------------void timer1()interrupt 3 //T1中斷 { T1_cnt++;if(T1_cnt>3999)//如果計(jì)數(shù)>3999, 計(jì)時(shí)1s { T1_cnt=0;if(cnt_30<30)//沒有超過30秒,繼續(xù)計(jì)時(shí)
{cnt_30++;} else //超過30秒,途中等待計(jì)價(jià)
{cnt_30=0;cnt_cost=cnt_cost+cost_val[2];} } } //---------主程序----------------
main(){//初始化各變量 T1_cnt=0;state_val=0;key_val_old=255;init_variant();//初始化51的寄存器
TMOD=0x20;//用T1計(jì)時(shí) 8位自動裝載定時(shí)模式,不用T0 TH1=0x19;//250微秒溢出一次;250=(256-x)*12/11.0592-> x= 230.4 TL1=0x19;EA=1;//開中斷 ET1=1;
TR1=0;//定時(shí)器T0 TCON=0x01;//Int0中斷取邊沿觸發(fā)模式 while(1){ key_val=scan_key();// 255;// if(key_val!=key_val_old){ key_val_old=key_val;if(key_val!=255){ switch(key_val){ case 0: //啟動鍵
TR1=1;//啟動計(jì)時(shí),TR1=1為啟動了的標(biāo)志
break;case 1: //清除鍵
init_variant();//清除變量
TR1=0;//關(guān)閉定時(shí)器
break;case 2: //白天/黑夜的切換
if(state_val==0){state_val=1;} else {state_val=0;} break;} } } if(IE0==1&& TR1==1)//每來1個(gè)脈沖,中斷一次
{ IE0=0;cnt_30=0;//30秒的計(jì)時(shí)清零
if(D_cnt<100)
{D_cnt++;} else //計(jì)數(shù)100次,每次10米,表示一公里
{D_cnt=0;cnt_distance=cnt_distance+1;
cnt_cost=cnt_cost+cost_val[state_val];} } led_show();} } //-----出租車計(jì)價(jià)器程序結(jié)束------------
第四篇:出租車計(jì)價(jià)器 硬件課程設(shè)計(jì)
硬件課程設(shè)計(jì)報(bào)告
題目:出租車計(jì)價(jià)器
目錄
1. 引言....................................................................................................................................錯誤!未定義書簽。
1.1設(shè)計(jì)目的................................................................................................................錯誤!未定義書簽。1.2設(shè)計(jì)任務(wù)................................................................................................................錯誤!未定義書簽。1.3設(shè)計(jì)思路................................................................................................................錯誤!未定義書簽。
2.需求分析.............................................................................................................................錯誤!未定義書簽。
2.1芯片原理................................................................................................................錯誤!未定義書簽。2.1.1可編程計(jì)數(shù)器/定時(shí)器8253/8254原理.............................................................錯誤!未定義書簽。2.1.2可編程外圍接口芯片8255原理.......................................................................錯誤!未定義書簽。2.1.3 12864液晶顯示器ST7920原理........................................................................錯誤!未定義書簽。2.2硬件設(shè)計(jì)................................................................................................................錯誤!未定義書簽。2.3軟件設(shè)計(jì)................................................................................................................錯誤!未定義書簽。2.3.1功能模塊圖.........................................................................................................錯誤!未定義書簽。2.3.2程序流程圖.........................................................................................................錯誤!未定義書簽。2.3.3模塊流程圖.........................................................................................................錯誤!未定義書簽。
3.詳細(xì)設(shè)計(jì).............................................................................................................................錯誤!未定義書簽。
3.1程序模塊分析........................................................................................................錯誤!未定義書簽。3.1.1初始化模塊程序分析.........................................................................................錯誤!未定義書簽。3.1.2判斷開關(guān)程序模塊分析.....................................................................................錯誤!未定義書簽。3.1.3圈數(shù)統(tǒng)計(jì)模塊程序分析.....................................................................................錯誤!未定義書簽。3.1.4計(jì)算里程模塊程序分析.....................................................................................錯誤!未定義書簽。3.1.5顯示模塊程序分析.............................................................................................錯誤!未定義書簽。3.1.6結(jié)束模塊程序分析.............................................................................................錯誤!未定義書簽。3.2程序代碼................................................................................................................錯誤!未定義書簽。
4.5.6.程序結(jié)果.............................................................................................................................錯誤!未定義書簽。分析與測試.........................................................................................................................錯誤!未定義書簽。體會.....................................................................................................................................錯誤!未定義書簽。
附錄A:參考文獻(xiàn).....................................................................................................................錯誤!未定義書簽。
一、引言
1.1設(shè)計(jì)目的
現(xiàn)在各大城市出租車已經(jīng)成為了一種重要的交通工具,當(dāng)然出租車的收費(fèi)問題也成了人們關(guān)注的焦點(diǎn),那么怎么樣才能實(shí)現(xiàn)一種合理的收費(fèi)方式讓大家都認(rèn)可呢?在這種要求下,出租車自動計(jì)價(jià)器就走進(jìn)了人們的生活,當(dāng)然這就要求有一種合理公正的計(jì)價(jià)器收費(fèi)方式。這不僅關(guān)系到出租車計(jì)價(jià)器的市場,也影響這出租車的市場,這就要求我們設(shè)計(jì)出更好的計(jì)價(jià)器來滿足人們的需求。
本設(shè)計(jì)是關(guān)于出租車計(jì)價(jià)器的設(shè)計(jì)。在本次設(shè)計(jì)中,我以計(jì)價(jià)器的基本功能作為設(shè)計(jì)的重點(diǎn)。為了完成上述設(shè)計(jì),我們采用了8254、8255等芯片,用計(jì)算機(jī)匯編語言進(jìn)行軟件功能的實(shí)現(xiàn)。
1.2設(shè)計(jì)任務(wù)
1.實(shí)現(xiàn)一個(gè)出租車計(jì)價(jià)器,可以顯示起步價(jià)。2.一個(gè)鍵來控制是否到達(dá)終點(diǎn),是否計(jì)價(jià)要清零。3.基于路程的出租車計(jì)價(jià)方式。
1.3設(shè)計(jì)思路
利用直流電機(jī)來模仿出租車輪子的轉(zhuǎn)動來計(jì)算出租車行進(jìn)的路程。將直流電機(jī)的直流端與滑動變阻器相連,通過人工控制滑動變阻器來模擬出租車的行進(jìn);并將計(jì)數(shù)端與8253CLK0端相連,GATE0接高電平,工作方式為方式二。直流電機(jī)每轉(zhuǎn)1000圈,8253輸出一個(gè)高電平,假設(shè)出租車已經(jīng)走了1公里。同時(shí)將8253OUT0接入8255方便CPU讀取。再將8255與ST7920顯示器相連,CPU通過控制8255來控制顯示,一旦8255從8253讀入一個(gè)高電平,則公里數(shù)加一,同時(shí)價(jià)格相應(yīng)增加。另有一個(gè)開關(guān)連入8255,用以判斷出租車計(jì)價(jià)器是否啟動。
二、需求分析
2.1芯片原理
本節(jié)主要在介紹本次設(shè)計(jì)所用到的芯片的原理,共有可編程計(jì)數(shù)器/定時(shí)器8253/8254、可編程外圍接口芯片8255和12864液晶顯示器ST7920原理三種芯片。
2.1.1可編程計(jì)數(shù)器/定時(shí)器8253/8254原理
圖2-1 8254內(nèi)部結(jié)構(gòu)圖
從圖2-1可見,8254內(nèi)部包含數(shù)據(jù)總線緩沖器、讀/寫控制邏輯、控制字寄存器和3個(gè)結(jié)構(gòu)完全相同的計(jì)數(shù)器,這3個(gè)計(jì)數(shù)器分別稱為計(jì)數(shù)器0、計(jì)數(shù)器1和計(jì)數(shù)器2。
圖2-2 8254管腳圖
A1、A0:地址輸入線,用來控制8253內(nèi)部的4個(gè)端口,即3個(gè)計(jì)數(shù)器和1個(gè)控制字寄存器與CPU系統(tǒng)地址線相連。
CLK0-2:時(shí)鐘脈沖輸入端,用于輸入定時(shí)脈沖或計(jì)數(shù)脈沖信號。CLK可以是系統(tǒng)的時(shí)鐘脈沖,也可以由系統(tǒng)時(shí)鐘分頻或者其他脈沖源提供。當(dāng)用于定時(shí)時(shí),這個(gè)脈沖必須是均勻的、連續(xù)的、周期精確的,而用于計(jì)數(shù)時(shí),這個(gè)脈沖可以是不均勻的、斷續(xù)的、周期不定的。
GATE0-2:門控輸入端,用于外部控制計(jì)數(shù)器的啟動計(jì)數(shù)和停止計(jì)數(shù)的操
作。兩個(gè)或兩個(gè)以上計(jì)數(shù)器連用時(shí),可用此信號同步,也可用于與外部某信號的同步。
OUT0-2:計(jì)數(shù)輸出,當(dāng)計(jì)數(shù)器從初值開始完成計(jì)數(shù)操作進(jìn),OUT引腳輸出相應(yīng)的信號。
8253的方式控制字
圖2-3 8254控制字圖
本設(shè)計(jì)中8254的功能
只是用通道1,采用方式三。采用二進(jìn)制計(jì)數(shù),輸入0FFFH。先輸入低字節(jié),再輸入高字節(jié)。當(dāng)8254從0FFFFH遞減到159FH時(shí)(即轉(zhuǎn)了60000圈時(shí)),8254向總線發(fā)信號使程序向下進(jìn)行。
2.1.2可編程外圍接口芯片8255原理
內(nèi)部結(jié)構(gòu)如圖所示,由以下4個(gè)部分組成:
圖2-4 8255內(nèi)部結(jié)構(gòu)圖
(1)輸入/輸出端口A、B、C。這三個(gè)端口均可看作是I/O端口,但它們的結(jié)構(gòu)和功能也稍有不同。A口和B口是一個(gè)獨(dú)立的8位I/O口。C口:可以看作是一個(gè)獨(dú)立的8位I/O口;也可以看作是兩個(gè)獨(dú)立的4位I/O口。
(2)A組和B組控制電路。這是兩組根據(jù)CPU命令控制8255A工作方式的電路,這些控制電路內(nèi)部設(shè)有控制寄存器,可以根據(jù)CPU送來的編程命令來控制8255A的工作方式,也可以根據(jù)編程命令來對C口的指定位進(jìn)行置/復(fù)位的操作。A組控制電路用來控制A口及C口的高4位;B組控制電路用來控制B口及C口的低4位
(3)讀/寫控制邏輯。(同上:它負(fù)責(zé)管理8255A的數(shù)據(jù)傳輸過程。它接收CS*及RD*、WR*、RESET,還有來自系統(tǒng)地址總線的口地址選擇信號A0和A1。將這些信號組合后,得到對A組控制部件和B組控制部件的控制命令,并將命令發(fā)給這兩個(gè)部件,以完成對數(shù)據(jù)、狀態(tài)信息和控制信息的傳輸。)
(4)數(shù)據(jù)總緩沖器。(同上:它是8位的雙向的三態(tài)緩沖器。作為8255A與系統(tǒng)總線連接的界面,輸入/輸出的數(shù)據(jù),CPU的編程命令以及外設(shè)通過8255A傳送的工作狀態(tài)等信息,都是通過它來傳輸?shù)?。?/p>
如圖所示8255A的芯片引腳信號。除了電源和地以外,其他信號可以分為兩組:
圖2-5 8255管腳圖
1.和外設(shè)一邊相連的: PA7-PA0:A組數(shù)據(jù)信號
PB7-PB0:B組數(shù)據(jù)信號 PC7-PC0:C組數(shù)據(jù)信號 2.和CPU一邊相連的:
RESET:復(fù)位信號,低電平有效。當(dāng)RESET信號來到時(shí),所有內(nèi)部寄存器就被清除,同時(shí),3個(gè)數(shù)據(jù)端口被自動設(shè)為輸入端口。
D7-D0:它們是8255A的數(shù)據(jù)線,和系統(tǒng)數(shù)據(jù)總線相連。
CS*:芯片選擇信號,低電平有效。在一個(gè)系統(tǒng)中,一般根據(jù)全部接口芯片來分配若干較低位地址(比如A5、A4、A3)來組成各種芯片選擇碼,當(dāng)這幾位地址組成某一個(gè)代碼時(shí),譯碼器便往8255A的CS*端輸出一個(gè)低電平,于是8255A被選中。只有當(dāng) CS*有效時(shí),讀信號RD*和寫信號WR*才對8255A有效。
RD*:芯片讀出信號低電平有效。WR*:芯片寫入信號低電平有效。8255的方式控制字格式
圖2-6 8255控制字圖
本設(shè)計(jì)中8255的功能
8255PA0-PA7和PC0-PC2與ST7920相連,控制輸出。PB0與8253的OUT1相連,讀入8253OUT1 的數(shù)據(jù)。PB1與開關(guān)K0相連,讀入K0的數(shù)值用于確定是否開啟計(jì)價(jià)器。
2.1.3可編程外圍接口芯片8255原理
ST7920控制器系列中文圖形液晶模塊的軟件特性主要由ST7920控制驅(qū)動器決定。ST7920同時(shí)作為控制器和驅(qū)動器,它可提供33路com輸出和64路seg輸出。在驅(qū)動器ST7921的配合下,最多可以驅(qū)動256×32點(diǎn)陣液晶。
ST7920是臺灣矽創(chuàng)電子公司生產(chǎn)的中文圖形控制芯片,它是一種內(nèi)置12864漢字圖形點(diǎn)陣的液晶顯示控制模塊,用于顯示漢字及圖形。該芯片共內(nèi)置8192
個(gè)中文漢字(16×16點(diǎn)陣)、128個(gè)字符的ASCII字符庫(8×16點(diǎn)陣)及64×2256點(diǎn)陣顯示RAM(GDRAM)。
為了能夠簡單、有效地顯示漢字和圖形,該模塊內(nèi)部設(shè)計(jì)有2MB的中文字型CGROM和64×256點(diǎn)陣的GDRAM繪圖區(qū)域;同時(shí),該模塊還提供有4組可編程控制的16×16點(diǎn)陣造字空間;除此之外,為了適應(yīng)多種微處理器和單片機(jī)接口的需要,該模塊還提供了4位并行、8位并行、2線串行以及3線串行等多種接口方式。利用上述功能可方便地實(shí)現(xiàn)漢字、ASCII碼、點(diǎn)陣圖形、自造字體的同屏顯示,所有這些功能(包括顯示RAM、字符產(chǎn)生器以及液晶驅(qū)動電路和控制器)都包含在集成電路芯片里,因此,只要一個(gè)最基本的微處理系統(tǒng)就可以通過ST7920芯片來控制其它的芯片
圖2-7 ST7920外觀尺寸圖
本設(shè)計(jì)中ST7920的功能
用于顯示出租車行駛路程與應(yīng)收費(fèi)用。
2.2硬件設(shè)計(jì)
其中,8253GATE1連+5V高電平,直流電機(jī)連0~+5V,8253連280h~287h,8255連288h~28fh。8255PA0-PA7連ST7920顯示器D0-D7,PC0連DI,PC1連RW,PC2連E。開關(guān)K0連8255PB0。8253CLK1連直流電機(jī)計(jì)數(shù)端。
0~+5V直流電機(jī)D0-D7計(jì)數(shù)ST7920顯示屏DIRWE+5VGATE1CLK1PA0-PA7+5VPC0PC1PC2開關(guān)K0PB0+5V8253CS8255CS280H-288H289H-28FH總線圖2-8硬件連接圖
實(shí)際連接圖如下圖所示
圖2-9硬件實(shí)際連接圖
2.3軟件設(shè)計(jì) 2.3.1功能模塊圖
本節(jié)先給出一個(gè)程序的功能模塊圖。
出租車計(jì)價(jià)器系統(tǒng)計(jì)價(jià)器開關(guān)功能模塊讀入直流電機(jī)轉(zhuǎn)圈數(shù)模塊ST7920顯示功能模塊根據(jù)里程計(jì)算價(jià)格模塊
圖2-10軟件功能模塊圖
2.3.2程序流程圖
本節(jié)先給出一個(gè)程序的整體流程圖。
開始結(jié)束8253初始化液晶顯示屏初始化8255初始化是計(jì)價(jià)器是否開始工作通過8255讀入b0否是否有鍵盤輸入否液晶顯示屏初始化是液晶顯示屏調(diào)用顯示價(jià)格功能從直流電機(jī)讀入輸入圈數(shù)將更改過的路程在顯示器中顯示出來讀到一定圈數(shù)走的路程加一比較路程是否大于3公里是價(jià)格為(路程-3)*2+7 元將儲存的顯示字符串內(nèi)路程價(jià)格改為目前路程價(jià)格否價(jià)格為7元
圖2-11軟件程序流程圖
2.3.3模塊流程圖
如果對整個(gè)程序進(jìn)行細(xì)分則可以分為初始化模塊,判斷開關(guān)模塊,圈數(shù)統(tǒng)計(jì)模塊,計(jì)算里程模塊、結(jié)束模塊和顯示模塊。其中初始化模塊是8253芯片、8255芯片和顯示屏的初始化。判斷開關(guān)模塊是對8255的b0端是否有高電平進(jìn)行判斷。
圈數(shù)統(tǒng)計(jì)模塊是對直流電機(jī)傳入8253中高電平的數(shù)量進(jìn)行圈數(shù)統(tǒng)計(jì)。計(jì)算里程模塊是對里程及價(jià)格進(jìn)行計(jì)算的模塊。結(jié)束模塊是程序結(jié)束的操作與方法。顯示模塊是控制顯示屏顯示計(jì)算模塊的結(jié)果。
初始化模塊顯示模塊調(diào)用關(guān)判斷開關(guān)模塊開結(jié)束模塊圈數(shù)統(tǒng)計(jì)模塊計(jì)算里程模塊調(diào)用顯示模塊圖2-12軟件模塊流程圖
三、詳細(xì)設(shè)計(jì)
3.1程序模塊分析
我們將按模塊分析程序的功能并給出模塊內(nèi)的功能流程圖。
3.1.1初始化模塊分析
在初始化模塊中,我們定義了需要使用的8255和8254的接口,需要使用的變量如JSS,要輸出的字符串等,初始化了DS,完成了8255的初始化以及顯示屏的初始化。其流程圖為
開始圖3-1初始化模塊流程圖
3.1.2判斷開關(guān)模塊分析
以上為判斷開關(guān)模塊,在判斷開關(guān)模塊中,系統(tǒng)讀入8255PB0的電平,如果是高電平則程序繼續(xù)進(jìn)行,如果是低電平則程序調(diào)用chushi函數(shù),用屏幕顯示“空車歡迎乘坐”,并繼續(xù)度8255PB0直到有高電平為止。其流程圖如下所示:
8255PB0是否為高電平是圈數(shù)統(tǒng)計(jì)模塊否Chushi函數(shù)計(jì)數(shù)變量和對應(yīng)的字符串置零顯示 空車 歡迎乘坐 調(diào)用顯示模塊
圖3-2判斷開關(guān)模塊流程圖
3.1.3圈數(shù)統(tǒng)計(jì)模塊分析
在圈數(shù)統(tǒng)計(jì)模塊中,我們將直流電機(jī)計(jì)數(shù)端連入8254CLK1中(8253采用方式三),在CLK1中讀所記的數(shù),從0FFFFH向下計(jì),一直計(jì)到159FH,即轉(zhuǎn)了6000圈后,進(jìn)入程序的下一段。其流程圖如下所示:
讀8254計(jì)數(shù)值否是否到159FH以下是重新將8254計(jì)數(shù)初值設(shè)為0FFFFH計(jì)算里程模塊
圖3-3圈數(shù)統(tǒng)計(jì)模塊流程圖
3.1.4計(jì)算里程模塊分析
我們用地址JSS里表示已經(jīng)走過的公里,即8254傳過來的高電平,同時(shí)我們采用價(jià)格公式來計(jì)算價(jià)格,將其里程和價(jià)格對應(yīng)的中文字碼表存入要顯示的字符串中。我們用地址JSS里表示已經(jīng)走過的公里,即8254傳過來的高電平,同時(shí)我們采用價(jià)格公式來計(jì)算價(jià)格,將其里程和價(jià)格對應(yīng)的中文字碼表存入要顯示的字符串中。
計(jì)算公式為: 價(jià)格=(里程-3)* 2……(里程>3)
價(jià)格= 7…………………..(里程<=3)并調(diào)用顯示模塊來顯示這些字碼其流程圖如下所示:
圈數(shù)統(tǒng)計(jì)模塊計(jì)數(shù)值JSS加一并十進(jìn)制化里程數(shù)加一里程數(shù)是否是大于3是價(jià)格為(里程-3)*2調(diào)用顯示模塊否價(jià)格為7
圖3-4計(jì)算里程模塊流程圖
3.1.5顯示模塊分析
在顯示模塊中,我們使用ST7920顯示我們要顯示的兩行字符串。我們采取先顯示第一行,再顯示第二行的方法,只是用ST7920的中間兩行。
調(diào)整顯示屏指針指向第二行調(diào)整顯示屏指針指向第三行調(diào)整字符串指針指向第一個(gè)字調(diào)整字符串指針指向第九個(gè)字輸出輸出延時(shí)延時(shí)
圖3-5顯示模塊流程圖
3.1.6結(jié)束模塊分析
結(jié)束模塊在程序的尾部在結(jié)束模塊中,我們規(guī)定只要在鍵盤上按任意一個(gè)鍵就會結(jié)束整個(gè)程序。如果無鍵按下,則程序自動跳轉(zhuǎn)到程序頭部。其程序流程圖如下圖所示:
調(diào)用DOS中斷是否有鍵按下是結(jié)束否判斷開關(guān)模塊
圖3-6結(jié)束模塊流程圖
3.2程序代碼
IO8253A
EQU 280H IO8253B
EQU 281H IO8253C
EQU 283H
DATA
SEGMENT HZ DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH
DW BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放原始輸出 HZ_TAB DW 0C2B7H,0B3CCH,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0B9ABH,0C0EFH
DW 0BCDBH,0B8F1H,0A3B0H,0A3B0H,0A3B0H,0A3AEH,0A3B0H,0D4AAH;存放要輸出的值 HZ_BG DW 0BFD5H,0B3B5H,0A2A0H,0A2A0H,0BBB6H,0D3ADH,0B3CBH,0D7F8H
DW 0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H,0A2A0H;存放“空車歡迎乘坐”
HZ_ADR DB ?
;存放顯示行起始端口地址 JSS
DW 0000H DII
DW 0000H GAO
DW 0000H ZHE
DW 0000H NUMBER
DW 0A3B0H,0A3B1H,0A3B2H,0A3B3H,0A3B4H,0A3B5H,0A3B6H,0A3B7H,0A3B8H,0A3B9H DATA
ENDS IO_ADDRESS
EQU 288H
CODE SEGMENT ASSUME CS:CODE,DS:DATA START:
MOV AX,DATA MOV DS,AX
MOV DX,IO_ADDRESS ADD DX,3 MOV AL,82H OUT DX,AL
;8255初始化 MOV AL,0FFH MOV DX,300H OUT DX, AL CALL CLEAR
;LCD 清除
LLL:
MOV DX,IO_ADDRESS ADD DX,1 IN AL,DX
;判斷開關(guān)是否打開 AND AL,01H CMP AL,01H JZ F0 CALL CHUSHI JMP LLL F0: MOV AL,01110110B MOV DX,IO8253C OUT DX,AL
;8254初始化 MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH
;設(shè)置計(jì)數(shù)初值0FFFFH OUT DX,AL F1: MOV AL,01000000B
MOV DX,IO8253C OUT DX,AL MOV DX,IO8253B
IN AL,DX MOV AH,AL IN AL,DX XCHG AH,AL CMP AX,159FH
;查看是否下降到159FH JA F1
;不滿足條件繼續(xù)讀值
MOV AL,01110110B
;重置8253 MOV DX,IO8253C OUT DX,AL MOV AL,0FFH MOV DX,IO8253B OUT DX,AL MOV AL,0FFH OUT DX,AL
CALL DISP
;調(diào)顯示子程序
CALL DDSP
CALL DELAY PUSH DX
MOV AH,06H MOV DL,0FFH INT 21H POP DX
JZ LLL
MOV AH,4CH
;退出
INT 21H L1:
JMP
START;L1
CHUSHI PROC NEAR
LEA SI, HZ_TAB LEA DI,HZ MOV CX,0FH F3: ADD SI,2 ADD DI,2 MOV AX,[DI] MOV [SI],AX LOOP F3
;重置HZ_TAB
MOV AX,0000H LEA BX,JSS MOV [BX],AX LEA BX, HZ_BG MOV CH,2
CALL LCD_DISP LEA BX, HZ_BG MOV CH,3
;顯示“空車歡迎乘坐” CALL LCD_DISP RET CHUSHI ENDP
DDSP
PROC NEAR
LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX]
MOV BP,AX AND BP,00FFH ADD BP,BP
MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+6],DX
;將JSS中低八位傳入HZ_TAB MOV BP,AX AND BP,0FF00H ROR BP,8 ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+4],DX
LEA BX, HZ_TAB
MOV CH,2
息
CALL LCD_DISP LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AX,0003H
JBE L3 CALL BJ LEA BX,JSS JMP L4
L3:MOV BP,0007H
ADD BP,BP MOV DX,WORD PTR[BP+SI ] MOV WORD PTR[DI+24],DX JMP L4 L4:
LEA BX, HZ_TAB
MOV CH,3
CALL LCD_DISP RET DDSP
ENDP
BJ
PROC NEAR
LEA DI,HZ_TAB LEA BX,JSS LEA SI,NUMBER MOV AX,WORD PTR[BX] CMP AL,03H
;將JSS中高八位傳入HZ_TAB
;顯示第2行信;比較路程與3的大小;路程比3小的情況
;顯示第3行信息
JAE BJ1 SUB AH,01H ADD AL,0AH SUB AL,03H AAS
;路程減三并十進(jìn)制化 JMP BJ2 BJ1:
SUB AX,0003H BJ2: MOV CX,AX AND AX,00FFH ADD AL,AL AAA ADD AX,07H AAA
LEA BX,DII MOV [BX],AX;DII MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+24],DX
MOV AX,CX SHR AX,8 AND AX,00FFH ADD AL,AL
AAA LEA BX,GAO MOV [BX],AX;GAO LEA BX,DII MOV DX,[BX];DII AND AX,00FFH AND DX,0FF00H SHR DX,8 AND DX,00FFH ADD AL,DL
AAA LEA BX,ZHE MOV [BX],AX;ZHE MOV BP,AX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI]
;路程加七并十進(jìn)制化;先計(jì)算個(gè)位
;十位相加
;再加進(jìn)位
MOV WORD PTR[DI+22],DX
;再計(jì)算十位 LEA BX,ZHE MOV DX,[BX] LEA BX,GAO MOV AX,[BX] AND DX,0FF00H AND AX,0FF00H SHR AX,8 SHR DX,8 ADD DL,AL
;百位加進(jìn)位 AAA MOV BP,DX AND BP,00FFH ADD BP,BP MOV DX,WORD PTR[BP+SI] MOV WORD PTR[DI+20],DX
;最后計(jì)算百位 RET BJ ENDP
DISP
PROC NEAR
;顯示子程序
PUSH DX
LEA BX, JSS
MOV AX,WORD PTR[BX]
ADD AL,01H
CMP AL,09H
;判斷是否<=9
JLE NUM
;若是則為'0'-'9',ASCII碼加30H
MOV AL,00H
ADD AH,01H
CMP AH,0AH
JZ L2 NUM:
MOV WORD PTR[BX],AX
ADD AL,30H
ADD AH,30H
MOV DL,AH
MOV DH,AL
MOV AH,02H
;屏幕顯示
INT 21H
MOV DL,DH
MOV AH,02H
;屏幕顯示
INT 21H
MOV DL,0DH
;加回車符
INT 21H
MOV DL,0AH
;加換行符
INT 21H
POP DX
RET
;子程序返回 DISP ENDP L2: MOV AH,4CH
;退出
INT 21H
CLEAR
PROC
MOV AL,0CH
CLEAR
FUNCUP
;
;
;
FUNCUP
LCD_DISP
;
址
DISP_SEC:
NEXT:
CONTINUE:
MOV DX, IO_ADDRESS OUT DX,AL
;設(shè)置CLEAR命令 CALL CMD_SETUP
;啟動LCD執(zhí)行命令 RET
ENDP
PROC MOV AL, 0FH
;LCD功能設(shè)置命令 OUT DX, AL CALL CMD_SETUP MOV AL, 34H
;LCD顯示狀態(tài)命令 OUT DX, AL CALL CMD_SETUP RET
ENDP PROC LEA BX, HZ_TAB CMP CH, 2 JZ DISP_SEC MOV BYTE PTR HZ_ADR, 88H
;第三行起始端口地ADD BX,16
;指向第二行信息 JMP NEXT MOV BYTE PTR HZ_ADR,90H MOV CL,8
PUSH CX MOV AL,HZ_ADR MOV DX, IO_ADDRESS OUT DX, AL CALL CMD_SETUP
;設(shè)定DDRAM地址命令 MOV AX,[BX] PUSH AX MOV AL,AH
;先送漢字編碼高位 MOV DX,IO_ADDRESS OUT DX,AL CALL DATA_SETUP
;輸出漢字編碼高字節(jié)
CALL DELAY
;延遲
POP AX
MOV DX,IO_ADDRESS
OUT DX, AL
CALL DATA_SETUP
;輸出漢字編碼低字節(jié)
CALL DELAY
INC BX
INC BX
;修改顯示內(nèi)碼緩沖區(qū)指針
INC BYTE PTR HZ_ADR
;修改LCD顯示端口地址
POP CX
DEC CL
JNZ CONTINUE
RET LCD_DISP
ENDP CMD_SETUP
PROC
MOV DX,IO_ADDRESS
制端口
ADD DX,2
NOP
MOV AL,00000000B
(LCD I端=0,W端=0)
OUT DX, AL
CALL DELAY
NOP
MOV AL,00000100B
=1)
OUT DX, AL
NOP
CALL DELAY
MOV AL, 00000000B
0)
OUT DX, AL
CALL DELAY
RET CMD_SETUP
ENDP DATA_SETUP
PROC
MOV DX,IO_ADDRESS
口
ADD DX,2
MOV AL,00000001B
(LCD I端=1)
OUT DX, AL
NOP
CALL DELAY
;指向8255端口控
;PC1置0,PC0置0
;PC2置1(LCD E端
;PC2置0,(LCD E端置
;指向8255控制端
;PC1置0,PC0=1
MOV AL,00000101B
;PC2置1(LCD E端=1)
OUT DX, AL
NOP
CALL DELAY
MOV AL, 00000001B
;PC2置0,(LCD E端=0)
OUT DX, AL
NOP
CALL DELAY
RET DATA_SETUP
ENDP DELAY
PROC
PUSH CX
PUSH DX
MOV CX, 0FFFH X1:
LOOP
X1
POP DX
POP CX
RET DELAY
ENDP
CODE ENDS
END START
四、程序結(jié)果
我們利用8254、8255、ST7920顯示屏、直流電機(jī)等制作出了一個(gè)出租車計(jì)價(jià)器有專用鍵可以表示是否空車,同時(shí)利用直流電機(jī)模擬車輪運(yùn)動,通過路程計(jì)算價(jià)格,成果如下圖所示:
圖4-1程序結(jié)果圖
五、分析與測試
程序中,我遇到的最大的難題就是如何完成正確的十進(jìn)制計(jì)算,因?yàn)樗械挠?jì)算指令都是十六進(jìn)制的,雖然有的計(jì)算里有類似AAA這樣的調(diào)整指令,但是很多時(shí)候就不一定記得起來加上。同時(shí)由于需要根據(jù)數(shù)字來查表對應(yīng)相應(yīng)的字符碼,而且我是建立一個(gè)從零到九的數(shù)組,而由于計(jì)算錯誤導(dǎo)致經(jīng)常出現(xiàn)亂碼,而且比較難找到相應(yīng)的錯誤。而且有些計(jì)算沒有十進(jìn)制轉(zhuǎn)換指令,需要自己編寫。
同時(shí)我認(rèn)為我利用提前存儲變量來表示走過的路程比利用堆棧要好,因?yàn)槎褩H菀子浕?,而變量有?dú)特的名字,利于記憶與調(diào)用。而且易于清零、增減。
六、心得體會
這次課程設(shè)計(jì)中,令我印象最為深刻的就是我們應(yīng)該有一種堅(jiān)持的精神,有時(shí)候幾個(gè)小時(shí)都沒有成果,找不到BUG。顯示的就是有問題,這時(shí)候我們應(yīng)該有一種堅(jiān)持下去的毅力,積極詢問老師同學(xué),問題的解決就很快了。
同時(shí)我發(fā)現(xiàn)編程習(xí)慣非常重要,應(yīng)該有一個(gè)提前的規(guī)劃,不能想到哪寫到哪,這樣的話,后期的DEBUG會非常麻煩,因?yàn)樽约阂部床欢约旱拇a,我們都應(yīng)該有規(guī)范化的代碼意識,這樣的編程能力才能上升。
參考文獻(xiàn)
[1]周荷琴,吳秀清,《微型計(jì)算機(jī)原理與接口技術(shù)》,合肥:中國科學(xué)技術(shù)大學(xué)出版社 2008。[2] 曹國清,《數(shù)字電路與邏輯設(shè)計(jì)》,徐州:中國礦業(yè)大學(xué)出版社 2003。[3] 8255芯片原理:http://baike.baidu.com/link?url=KHojvZzBGmo26_6iYGTdrdqH6PxQbM1Hnnc8hWQNPIp60L7TWG5LZu_ppSkXo5maU5M4APs4qCGSudiqZ0bdl_ [4]ST7920芯片原理:http://wenku.baidu.com/view/0dafd9232f60ddccda38a0fa.html訪問時(shí)間2013/10/15 [5]ST7920中文字碼表:http://wenku.baidu.com/view/d4abe628647d27284b735127.html訪問時(shí)間:2013/10/15
第五篇:出租車計(jì)價(jià)器課程設(shè)計(jì)2
出租車計(jì)價(jià)器課程設(shè)計(jì)
目錄
前言
1、系統(tǒng)工作原理 1.1 功能說明 1.2 基本原理
2、硬件設(shè)計(jì)
2.1 單片機(jī)最小系統(tǒng)單元 2.2 A44E霍爾傳感器檢測單元 2.3 AT24C01存儲單元 2.4 鍵盤調(diào)整單元 2.5 顯示單元
3、軟件設(shè)計(jì) 3.1 系統(tǒng)主程序 3.2 中斷程序
3.2.1 里程計(jì)數(shù)中斷程序 3.2.2 中途等待中斷程序 3.3 計(jì)算程序 3.4 顯示程序 3.5 鍵盤程序
4、總結(jié) 參考文獻(xiàn)
附錄A 系統(tǒng)原理圖
附錄B 系統(tǒng)源程序
前言
隨著出租車行業(yè)的發(fā)展,出租車已經(jīng)是城市交通的重要組成部分,從加強(qiáng)行業(yè)管理以及減少司機(jī)與乘客的糾紛出發(fā),具有良好性能的計(jì)價(jià)器對出租車司機(jī)和乘客來說都是很必要的。而采用模擬電路和數(shù)字電路設(shè)計(jì)的計(jì)價(jià)器整體電路的規(guī)模較大,用到的器件多,造成故障率高,難調(diào)試。而采用單片機(jī)進(jìn)行的設(shè)計(jì),相對來說功能強(qiáng)大,用較少的硬件和適當(dāng)?shù)能浖嗷ヅ浜峡梢院苋菀椎貙?shí)現(xiàn)設(shè)計(jì)要求,且靈活性強(qiáng),可以通過軟件編程來完成更多的附加功能。本設(shè)計(jì)采用AT89S52單片機(jī)為主控器,以A44E霍爾傳感器測距,實(shí)現(xiàn)對出租車的多功能的計(jì)價(jià)設(shè)計(jì),并采用AT24C01實(shí)現(xiàn)在系統(tǒng)掉電的時(shí)候保存單價(jià)等信息,輸出采用8段數(shù)碼顯示管。本電路設(shè)計(jì)的計(jì)價(jià)器不但能實(shí)現(xiàn)基本的計(jì)價(jià),而且還能根據(jù)白天,黑夜和中途等待來調(diào)節(jié)單價(jià)。
第一章 系統(tǒng)工作原理
1.1 功能說明
出租車計(jì)價(jià)器根據(jù)乘客乘坐汽車行駛距離和等候時(shí)間的多少進(jìn)行計(jì)價(jià),并在行程中同步顯示車費(fèi)值。從起步價(jià)開始,當(dāng)汽車程行駛未滿3公里時(shí),均按起步價(jià)計(jì)算。過3公里后,實(shí)現(xiàn)每1公里單價(jià)收費(fèi),中間遇暫停時(shí),計(jì)程數(shù)不再增加,開始計(jì)時(shí)收費(fèi),測距收費(fèi)和測時(shí)收費(fèi)的和便構(gòu)成了一位乘客的車費(fèi)。同時(shí),白天和夜晚價(jià)格不同,可以進(jìn)行切換。白天單價(jià)、夜晚單價(jià)、等待單價(jià)和起步價(jià)格都可通過獨(dú)立鍵盤進(jìn)行調(diào)節(jié)。(默認(rèn)起步價(jià)為5元/3公里,里程單價(jià)白天為1.5元/公里,夜晚為1.8元/公里,等待計(jì)時(shí)單價(jià)為0.5元/5分鐘)
1.2 基本原理
計(jì)數(shù)器系統(tǒng)主要由五部分組成:A44E霍爾傳感器、AT89S52單片機(jī)、獨(dú)立鍵盤、EEPROM AT24C01和顯示數(shù)碼管。
霍爾傳感器安裝在車輪上,主要檢測汽車行進(jìn)的公里數(shù),并產(chǎn)生一系列相應(yīng)的脈沖輸出,脈沖送到單片機(jī)進(jìn)行處理,單片機(jī)根據(jù)程序設(shè)定通過計(jì)算脈沖數(shù)換算出行駛公里數(shù),再根據(jù)從EEPROM中讀取的價(jià)格等相關(guān)數(shù)據(jù)進(jìn)行金額的計(jì)算,計(jì)算好的金額、里程和單價(jià)都實(shí)時(shí)地顯示在數(shù)碼管上。獨(dú)立鍵盤可以調(diào)節(jié)價(jià)格等相關(guān)數(shù)據(jù),按下相應(yīng)的按鈕,產(chǎn)生信號交由單片機(jī)處理并實(shí)時(shí)顯示出來,調(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è)計(jì)
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è)計(jì),所以不必再擴(kuò)展程序存儲器。復(fù)位電路和晶振電路是AT89S52 工作所需的最簡外圍電路。單片機(jī)最小系統(tǒng)電路圖如圖2所示。
圖2 單片機(jī)最小系統(tǒng)圖
AT89S52 的復(fù)位端是一個(gè)史密特觸發(fā)輸入,高電平有效。RST端若由低電平上升到高電平并持續(xù)2個(gè)周期,系統(tǒng)將實(shí)現(xiàn)一次復(fù)位操作。在復(fù)位電路中,按一下復(fù)位開關(guān)就使在RST端出現(xiàn)一段時(shí)間的高電平,外接11.0592M 晶振和兩個(gè)30pF 電容組成系統(tǒng)的內(nèi)部時(shí)鐘電路。
2.2 A44E霍爾傳感器檢測單元
A44E 屬于開關(guān)型的霍爾器件,其工作電壓范圍比較寬(4.5~18V),其輸出的信號符合TTL電平標(biāo)準(zhǔn),可以直接接到單片機(jī)的IO 端口上,而且其最高檢測頻率可達(dá)到1MHZ。
A44E 集成霍耳開關(guān)由穩(wěn)壓器A、霍耳電勢發(fā)生器(即硅霍耳片)B、差分放大器C、施密特觸發(fā)器D和OC門輸出E五個(gè)基本部分組成。在輸入端輸入電壓Vcc,經(jīng)穩(wěn)壓器穩(wěn)壓后加在霍爾電勢發(fā)生器的兩端,根據(jù)霍爾效應(yīng)原理,當(dāng)霍爾片處在磁場中時(shí),在垂直于磁場的方向通以電流,則與這二者相垂直的方向上將會產(chǎn)生霍爾電勢差VH輸出,該VH信號經(jīng)放大器放大后送至施密特觸發(fā)器整形,使其成為方波輸送到OC門輸出。當(dāng)施加的磁場達(dá)到工作點(diǎn)(即Bop)時(shí),觸發(fā)器輸出高電壓(相對于地電位),使三極管導(dǎo)通,此時(shí)OC門輸出端輸出低電壓,三極管截止,使OC門輸出高電壓,這種狀態(tài)為關(guān)。這樣兩次電壓變換,使霍爾開關(guān)完成了一次開關(guān)動作。A44E霍爾傳感器原理如圖3所示。
圖3 A44E霍爾傳感器原理
里程計(jì)算是通過安裝在車輪上的霍爾傳感器檢測到的脈沖信號,送到單片機(jī)產(chǎn)生中斷,單片機(jī)再根據(jù)程序設(shè)定,計(jì)算出里程。其原理如圖4所示。
圖4 傳感器測距示意圖
本系統(tǒng)選擇了將A44E的脈沖輸出口接到P3.3口外部中斷1作為信號的輸入端(這樣可以減少程序設(shè)計(jì)的麻煩),車輪每轉(zhuǎn)一圈(設(shè)車輪的周長是1米),霍爾開關(guān)就檢測并輸出信號,引起單片機(jī)的中斷,對脈沖計(jì)數(shù),當(dāng)計(jì)數(shù)達(dá)到1000次時(shí),即1公里,單片機(jī)就控制將金額自動增加,如圖5。
圖5 A44E霍爾元件接線圖
2.3 AT24C01存儲單元 存儲單元的作用是在電源斷開的時(shí)候,存儲當(dāng)前設(shè)定的單價(jià)信息。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(時(shí)鐘脈沖)和SDA(數(shù)據(jù)/地址)與單片機(jī)P2.2和P2.3口連接,進(jìn)行傳送數(shù)據(jù)。
每當(dāng)設(shè)定一次單價(jià),系統(tǒng)就自動調(diào)用存儲程序,將單價(jià)信息保存在芯片內(nèi);當(dāng)系統(tǒng)重新上電的時(shí)候,自動調(diào)用讀存儲器程序,將存儲器內(nèi)的單價(jià)等信息,讀到緩存單元中,供主程序使用。
2.4 鍵盤調(diào)整單元
當(dāng)單價(jià)等信息需要進(jìn)行修改時(shí),就要用到鍵盤進(jìn)行修改。由于調(diào)節(jié)信息不多,故采用4個(gè)獨(dú)立鍵盤即可,分別實(shí)現(xiàn)清零、切換、增大、減小和功能等作用。電路原理如圖8所示。
圖8 鍵盤調(diào)整單元接線圖
S1:接P1.0口,對上一次的計(jì)費(fèi)進(jìn)行清零,為下次載客準(zhǔn)備
S2:接P1.1口,實(shí)現(xiàn)白天和夜晚單價(jià)的切換;當(dāng)功能鍵S4按下時(shí),S2可對數(shù)據(jù)進(jìn)行增大。S3:接P1.2口,當(dāng)功能鍵S4按下時(shí),S3可對數(shù)據(jù)進(jìn)行減小。S4:接P1.3口,按1次,進(jìn)入調(diào)整白天單價(jià);按2次,進(jìn)入調(diào)整夜晚單價(jià);按3次,進(jìn)入調(diào)整等待單價(jià);按4次,進(jìn)入調(diào)整起步價(jià);按5次,返回。
2.5 顯示單元
顯示單元由7個(gè)8段共陽數(shù)碼管組成,采用動態(tài)掃描進(jìn)行顯示。前三個(gè)數(shù)碼管分別接P3.0、P3.1和P3.2,用于顯示總金額;中間兩個(gè)分別接P3.4和P3.5,用于顯示里程;后邊兩個(gè)分別接P3.6和P3.7,用于顯示單價(jià)。電路如圖9所示。
圖9 數(shù)碼管顯示圖
第三章 軟件設(shè)計(jì)
3.1 系統(tǒng)主程序
在主程序模塊中,需要完成對各參量和接口的初始化、出租車起價(jià)和單價(jià)的初始化以及中斷、計(jì)算、循環(huán)等工作。另外,在主程序模塊中還需要設(shè)置啟動/清除標(biāo)志寄存器、里程寄存器和價(jià)格寄存器,并對它們進(jìn)行初始化。然后,主程序?qū)⒏鶕?jù)各標(biāo)志寄存器的內(nèi)容,分別完成啟動、清除、計(jì)程和計(jì)價(jià)等不同的操作。
當(dāng)汽車運(yùn)行起來時(shí),就啟動計(jì)價(jià),根據(jù)里程寄存器中的內(nèi)容計(jì)算和判斷行駛里程是否已超過起步價(jià)公里數(shù)。若已超過,則根據(jù)里程值、每公里的單價(jià)數(shù)和起步價(jià)數(shù)來計(jì)算出當(dāng)前的總金額,并將結(jié)果存于總金額寄存器中;中途等待時(shí),無脈沖輸入,不產(chǎn)生中斷,當(dāng)時(shí)間超過等待設(shè)定值時(shí),開始進(jìn)行計(jì)時(shí),并把等待價(jià)格加到總金額里,然后將總金額、里程和單價(jià)送數(shù)碼管顯示出來。程序流程如圖10所示。
圖10 主程序流程圖 圖11 計(jì)算程序流程圖
3.2 中斷程序
3.2.1 里程計(jì)數(shù)中斷程序
每當(dāng)霍爾傳感器輸出一個(gè)低電平信號就使單片機(jī)中斷一次,當(dāng)里程計(jì)數(shù)器對里程脈沖計(jì)滿1000次時(shí),進(jìn)入里程計(jì)數(shù)中斷服務(wù)程序中,里程變量加一。主函數(shù)中總金額也相應(yīng)地變化。
3.2.2 中途等待中斷程序
在中途等待中斷程序中,每1ms產(chǎn)生一次中斷,將當(dāng)前里程值送入某個(gè)緩存變量,每5分鐘將緩存變量中的值和當(dāng)前里程值比較,當(dāng)汽車停止,霍爾傳感器5分鐘沒有輸出信號,當(dāng)前里程值和緩存變量內(nèi)的值相同,則進(jìn)入等待計(jì)時(shí),每5分鐘記一次價(jià)格。
3.3 計(jì)算程序
計(jì)算程序根據(jù)里程數(shù)分別進(jìn)入不同的計(jì)算公式。如果里程大于3公里,則執(zhí)行公式:總金額=起步價(jià)+(里程-3)*單價(jià)+等待時(shí)間*等待單價(jià);否則,執(zhí)行公式:總金額=起步價(jià)+等待時(shí)間*等待單價(jià)。程序流程圖如圖11所示。
3.4 顯示程序
顯示程序利用定時(shí)器每1ms產(chǎn)生一次中斷,相應(yīng)變量置位,點(diǎn)亮一個(gè)數(shù)碼管,顯示一位數(shù)據(jù),利用主函數(shù)內(nèi)的循環(huán),實(shí)現(xiàn)動態(tài)掃描顯示,同時(shí)根據(jù)數(shù)碼管余輝和人眼暫留現(xiàn)象,即可實(shí)現(xiàn)顯示。
3.5 鍵盤程序
鍵盤采用查詢的方式,放在主程序中,當(dāng)沒有按鍵按下的時(shí)候,單片機(jī)循環(huán)主程序,一旦右按鍵按下,便轉(zhuǎn)向相應(yīng)的子程序處理,處理結(jié)束再返回。流程圖如圖12。
圖12 鍵盤程序流程圖
第四章 總結(jié)
經(jīng)過這些天有關(guān)于出租車計(jì)價(jià)器的課程設(shè)計(jì),使我對單片機(jī)的應(yīng)用有了更深的了解。在課程設(shè)計(jì)的過程中,還是碰到了許多的問題。比如,對于數(shù)碼管動態(tài)掃描顯示和鍵盤的延時(shí)防抖的綜合編程不能較好地解決;對于代碼的前后順序及調(diào)用掌握得還不夠好;對于一些相關(guān)的應(yīng)用軟件沒能熟練掌握。通過這幾天晚上的苦想和反復(fù)調(diào)試,以及參考網(wǎng)上的程序,最終還是把問題解決了。通過這次課程設(shè)計(jì),我最大的收獲就是自己的動手能力和獨(dú)立解決問題的能力得到了很大的提高,也充分體會到了自己設(shè)計(jì)東西的樂趣、學(xué)會查閱資料和對別人的東西融會變通的重要性,也明白了很多知識光靠趴在書本上學(xué)是學(xué)不到其中的精髓的,必須親自去試著實(shí)踐,親自去經(jīng)歷才能對它們真正的掌握,凡事都要自己去動下手,去實(shí)踐一下,遇到困難,永遠(yuǎn)不要沮喪氣餒。在動手的過程中,不僅能增強(qiáng)實(shí)踐能力,而且在理論上可以有更深的認(rèn)識;這次設(shè)計(jì)給了我極大的鼓舞和信心,相信在以后的學(xué)習(xí)中可以通過不斷的摸索和實(shí)踐來提高其他方面的知識。
參考文獻(xiàn)
[1] 馬淑華,王鳳文,張美金編著.單片機(jī)原理與接口技術(shù)(第二版).北京:北京郵電大學(xué)出版社,2007.[2] 譚浩強(qiáng)著.C程序設(shè)計(jì)(第三版).北京:清華大學(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=P3^3;
//外部中斷
sbit key0=P1^0;
//清零
sbit key1=P1^1;
//切換/+
sbit key2=P1^2;
//-
sbit key3=P1^3;
//功能鍵
sbit p30=P3^0;
//數(shù)碼管各位控制
sbit p31=P3^1;
sbit p32=P3^2;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p36=P3^6;
sbit p37=P3^7;
sbit SDA=P2^3;
//IIC引腳
sbit SCL=P2^2;
uint inter,aa,bb,temp,temp1;
uint zongjine,licheng,dengdai;
uint key3num,qiehuantemp,delaytemp;
uchar danjia1,danjia2,danjia3,danjia,qibu;
void delay(uint x)
//延時(shí)時(shí)基為1ms {
int i,j;
for(i=x;i>0;i--)
for(j=340;j>0;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)&&(i<250))
i++;
SCL=0;
delayNOP();}
uchar read_byte()
// 從EEPROM讀到MCU {
uchar i,j;
for(i=0;i<8;i++)
{
SCL=1;
j<<=1;
j|=SDA;
SCL=0;
}
return(j);}
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delayNOP();
SDA=CY;
delayNOP();
SCL=1;
delayNOP();
}
SCL=0;
// 從MCU寫到EEPROM
delayNOP();
SDA=1;
delayNOP();}
void write_data(uchar addr, uchar date){
start();
write_byte(0xa0);
respons();
write_byte(addr);
respons();
write_byte(date);
respons();
stop();}
uchar read_data(uchar addr)
{
uchar date;
start();
write_byte(0xa0);
// 在指定地址addr處寫入數(shù)據(jù)date // 在指定地址addr讀取數(shù)據(jù)
respons();
write_byte(addr);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;}
void display(uint zongjine0,uint licheng0,uint danjia0){
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;
//數(shù)碼管顯示
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=table[jbai];break;
case 1:p31=0;P0=table[jshi]&0x7f;break;
case 2:p32=0;P0=table[jge];break;
case 3:p34=0;P0=table[lshi];break;
case 4:p35=0;P0=table[lge];break;
case 5:p36=0;P0=table[dshi]&0x7f;break;
case 6:p37=0;P0=table[dge];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)白天單價(jià)
//
{
if(key1==0)
{
delay(5);
if(key1==0)
danjia1=0;
{
danjia1++;
if(danjia1==100)
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);
}
調(diào)夜晚單價(jià)
danjia2=0;
}
display(1,0,danjia1);} if(key3num==2)
//{
write_data(1,danjia1);
if(key1==0)
{
delay(5);
if(key1==0)
{
danjia2++;
if(danjia2==100)
while(!key1);
delay(5);
while(!key1);
}
}
danjia2=99;
if(key2==0)
{
delay(5);
if(key2==0)
{
danjia2--;
if(danjia2==-1)
while(!key2);
delay(5);
while(!key2);
}
}
display(2,0,danjia2);} if(key3num==3)
//調(diào)等待單價(jià)
{
write_data(2,danjia2);
if(key1==0)
danjia3=0;
{
delay(5);
if(key1==0)
{
danjia3++;
if(danjia3==100)
while(!key1);
delay(5);
while(!key1);
} } if(key2==0){
delay(5);
if(key2==0)
{
danjia3--;
if(danjia3==-1)
danjia3=99;
while(!key2);
步價(jià)
delay(5);
while(!key2);
}
}
display(3,0,danjia3);} if(key3num==4)
//調(diào)起{
write_data(3,danjia3);
if(key1==0)
{
delay(5);
if(key1==0)
{
qibu++;
if(qibu==100)
qibu=0;
while(!key1);
delay(5);
qibu=99;
while(!key1);
} } if(key2==0){
delay(5);
if(key2==0)
{
qibu--;
if(qibu==-1)
while(!key2);
delay(5);
while(!key2);
} }
display(4,0,qibu);
}
if(key3num==5)
//退出功能鍵
{
}
}
write_data(4,qibu);
key3num=0;}
if(key3==0){
delay(5);
if(key3==0)
{
key3num++;
while(!key3);
delay(5);
while(!key3);
} }
} } void init(){ SDA=1;SCL=1;
zongjine=0;licheng=0;dengdai=0;
danjia1=read_data(1);danjia2=read_data(2);danjia3=read_data(3);qibu=read_data(4);
aa=0;//數(shù)碼管動態(tài)掃描的定時(shí)器時(shí)基個(gè)數(shù)
bb=0;//判斷是否等待的時(shí)基個(gè)數(shù)
inter=0;
EA=1;//開總中斷
EX1=1;//開外部中斷1 IT1=1;//觸發(fā)方式下降沿
TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;//開定時(shí)器T0中斷
TR0=1;//開定時(shí)器T0
P3=0x08;P0=table[0];}
void jisuan(){ if(licheng>3)zongjine=qibu+(licheng-3)*danjia+dengdai*danjia3;//金額計(jì)算
else zongjine=qibu+dengdai*danjia3;//起步公里內(nèi)金額計(jì)算 }
void qiehuan(){ if(key1==0)//白天夜晚切換
{ delay(5);//鍵盤防抖
if(key1==0)qiehuantemp=!qiehuantemp;while(!key1);delay(5);while(!key1);} if(qiehuantemp==0)danjia=danjia2;if(qiehuantemp==1)danjia=danjia1;}
void main(){ init();qiehuantemp=1;key3num=0;while(1){ qiehuan();//切換白天夜晚單價(jià)
jisuan();//計(jì)算總金額
display(zongjine,licheng,danjia);keyscan();if(key0==0)//清零鍵
init();} }
void inter1()interrupt 2 //脈沖中斷 { delay(5);// if(exter==0)// { // IT1=1;inter++;if(inter==5){ inter=0;licheng++;} } // while(!exter);// delay(5);// while(!exter);// }
void timer0()interrupt 1 { TH0=(65536-1000)/256;TL0=(65536-1000)%256;aa++;bb++;temp1=licheng;//測試是否進(jìn)入等待
if(bb==10000)//10s無反應(yīng)進(jìn)入等待計(jì)費(fèi)
{ bb=0;if(temp=temp&temp1)dengdai++;temp=licheng;} }
原來文件地址http://blog.sina.com.cn/s/blog_609003ef0100dt1o.html
存儲器可以不用