單片機(jī)的多功能智能小車設(shè)計(jì)方案電路程序_第1頁
單片機(jī)的多功能智能小車設(shè)計(jì)方案電路程序_第2頁
單片機(jī)的多功能智能小車設(shè)計(jì)方案電路程序_第3頁
單片機(jī)的多功能智能小車設(shè)計(jì)方案電路程序_第4頁
單片機(jī)的多功能智能小車設(shè)計(jì)方案電路程序_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGE8摘要(關(guān)鍵詞:智能車AT89S52單片機(jī)金屬感應(yīng)器霍爾元件1602LCD)智能作為現(xiàn)代的新發(fā)明,是以后的發(fā)展方向,他可以按照預(yù)先設(shè)定的模式在一個(gè)環(huán)境里自動(dòng)的運(yùn)作,不需要人為的管理,可應(yīng)用于科學(xué)勘探等等的用途。智能電動(dòng)車就是其中的一個(gè)體現(xiàn)。本次設(shè)計(jì)的簡易智能電動(dòng)車,采用AT89S52單片機(jī)作為小車的檢測和控制核心;采用金屬感應(yīng)器TL—Q5MC來檢測路上感應(yīng)到的鐵片,從而把反饋到的信號(hào)送單片機(jī),使單片機(jī)按照預(yù)定的工作模式控制小車在各區(qū)域按預(yù)定的速度行駛,并且單片機(jī)選擇的工作模式不同也可控制小車順著S形鐵片行駛;采用霍爾元件A44E檢測小車行駛速度;采用1602LCD實(shí)時(shí)顯示小車行駛的時(shí)間,小車停止行駛后,輪流顯示小車行駛時(shí)間、行駛距離、平均速度以及各速度區(qū)行駛的時(shí)間。本設(shè)計(jì)結(jié)構(gòu)簡單,較容易實(shí)現(xiàn),但具有高度的智能化、人性化,一定程度體現(xiàn)了智能。目錄1設(shè)計(jì)任務(wù)………………31。1要求………………32方案比較與選擇………………………42。1路面檢測模塊……………………42.2LCD顯示模塊………………………52.3測速模塊…………52.4控速模塊…………62.5模式選擇模塊……………………73程序框圖………………74系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn)………………94。1路面檢測模塊……………………94.2LCD顯示模塊………………………94.3測速模塊…………94.4控速模塊…………94。5復(fù)位電路模塊……………………94.6模式選擇模塊……………………95最小系統(tǒng)圖……………106最終PCB板圖…………127系統(tǒng)程序………………138致謝……………………469參考文獻(xiàn)……………4710附錄…………………481.設(shè)計(jì)任務(wù):設(shè)計(jì)并制作了一個(gè)智能電動(dòng)車,其行駛路線滿足所需的要求。1.1要求:1。1.1基本要求:(1)分區(qū)控制:如(圖1)所示:(圖1)車輛從起跑線出發(fā)(出發(fā)前,車體不得超出起跑線)。在第一個(gè)路程C~D區(qū)(3~6米)以低速行駛,通過時(shí)間不低于10s;第二個(gè)路程D~E區(qū)(2米)以高速行駛,通過時(shí)間不得多于4秒;第三個(gè)路程E~F區(qū)(3~6米)以低速行駛,通過時(shí)間不低于10s。(2)小車能自動(dòng)記錄、顯示行駛時(shí)間、行駛距離以及行駛速度,還能記錄每段所走的時(shí)間,從而判斷是否符合課程設(shè)計(jì)要求。(記錄顯示裝置要求安裝在車上).1.1.2發(fā)揮部分:S型控制:如(圖2)所示:(圖2)車輛沿著S形鐵片行駛,自動(dòng)轉(zhuǎn)彎,自動(dòng)尋找正確方向和鐵片.當(dāng)離開S型鐵片跑道或者感應(yīng)不到鐵片一段時(shí)間的時(shí)候,小車自動(dòng)停止,并記錄行駛時(shí)間,路程,平均速度并通過LCD顯示出來。2。方案比較與選擇:根據(jù)設(shè)計(jì)任務(wù)要求,并且根據(jù)我們自己的需要而附加的功能,該電路的總體框圖可分為幾個(gè)基本的模塊,框圖如(圖3)所示:(圖3)2.1路面檢測模塊:采用鐵片感應(yīng)器TL-Q5MC來檢測路面上的鐵片從而給單片機(jī)中斷脈沖。原理圖接線如(圖4)所示:(圖4)2。2LCD顯示模塊:采用1602LCD,由單片機(jī)的總線模式連接。為節(jié)約電源電量并且不影響LCD的功能,LCD的背光用單片機(jī)進(jìn)行控制,使LCD的背光在小車行駛的過程中不亮,因?yàn)槲覀儾槐乜雌滹@示;在其它我們需要看顯示的內(nèi)容的時(shí)候LCD背光亮。2.3測速模塊:2。3。1方案1:采用采用霍爾開關(guān)元器件A44E檢測輪子上的小磁鐵從而給單片機(jī)中斷脈沖,達(dá)到測量速度的作用.霍爾元件具有體積小,頻率響應(yīng)寬度大,動(dòng)態(tài)特性好,對外圍電路要求簡單,使用壽命長,價(jià)格低廉等特點(diǎn),電源要求不高,安裝也較為方便.霍爾開關(guān)只對一定強(qiáng)度的磁場起作用,抗干擾能力強(qiáng),因此可以在車輪上安裝小磁鐵,而將霍爾器件安裝在固定軸上,通過對脈沖的計(jì)數(shù)進(jìn)行車速測量。2。3.2方案2:采用紅外傳感器進(jìn)行測速.但無論是反射式紅外傳感器還是對射式紅外傳感器,他們對都對外圍環(huán)境要求較高,易受外部環(huán)境的影響,穩(wěn)定性不高,且價(jià)格較為昂貴。通過對方案1、方案2的比較其優(yōu)缺點(diǎn),綜合多方面因素決定選用方案1,其原理圖接線如(圖5)所示:(圖5)2。4控速模塊:2.4.1方案1:使用功率三極管作為功率放大器的輸出控制直流電機(jī)。線性型驅(qū)動(dòng)的電路結(jié)構(gòu)和原理簡單,成本低,加速能力強(qiáng),但功率損耗大,特別是低速大轉(zhuǎn)距運(yùn)行時(shí),通過電阻R的電流大,發(fā)熱厲害,損耗大,對于小車的長時(shí)間運(yùn)行不利。2.4。2方案2:采用繼電器對電動(dòng)機(jī)的開或關(guān)進(jìn)行控制,通過開關(guān)的切換對小車的速度進(jìn)行調(diào)整.此方案的優(yōu)點(diǎn)是電路較為簡單,缺點(diǎn)是繼電器的響應(yīng)時(shí)間慢,易損壞,壽命較短,可靠性不高。2。4.3方案3:采用由雙極性管組成的H橋電路。用單片機(jī)控制晶體管使之工作在占空比可調(diào)的開關(guān)狀態(tài),精確調(diào)整電機(jī)轉(zhuǎn)速。這種電路由于工作在管子的飽和截止模式下,效率非常高;H橋電路保證了可以簡單地實(shí)現(xiàn)轉(zhuǎn)速和方向的控制;電子開關(guān)的速度很快,穩(wěn)定性也很高,是一種廣泛采用的調(diào)速技術(shù)。綜合3種方案的優(yōu)缺點(diǎn),決定選擇方案3,其電路原理圖如(圖6)所示:(圖6)2.5模式選擇模塊:模式選擇模塊通過一個(gè)74LS00與非門和兩個(gè)不帶鎖按鈕來控制單片機(jī)單片機(jī)的兩個(gè)中斷口,從而按動(dòng)按鈕來選擇小車走動(dòng)的路型、來選擇小車的速度是快速、中速、慢速;走完路程小車停止后還可以通過按鈕選擇想要在LCD上想看的信息,比如總時(shí)間、走過各段路程的時(shí)間、平均速度、總路程等.小車走動(dòng)的模式選擇有:(1)直線型:滿足設(shè)計(jì)任務(wù)的基本要求,能穩(wěn)定的走完全程。之后按順序循環(huán)不斷的顯示走完全程所用的時(shí)間、走完高速區(qū)所用的時(shí)間和走完低速區(qū)所用的時(shí)間這三個(gè)時(shí)間;或者可以通過兩個(gè)按鈕以及LCD顯示的菜單選擇所要看的內(nèi)容如平均速度、全程距離以及那三個(gè)時(shí)間。(2)S型:滿足設(shè)計(jì)任務(wù)的發(fā)揮部分的要求,小車能自動(dòng)的感應(yīng)到在前面或在后面鐵片,即第一次轉(zhuǎn)彎后若感應(yīng)到的是錯(cuò)誤的方向,則小車會(huì)后退自動(dòng)調(diào)整方向,沿著S型的鐵片走。當(dāng)走完S型鐵片后的一定時(shí)間里,小車自動(dòng)停止。之后自動(dòng)進(jìn)入菜單由我們自己選擇要看的內(nèi)容時(shí)間、平均速度和所走的距離。(3)自動(dòng)型:小車先以一定的速度走完全程,之后再以一定的速度倒退回起點(diǎn),再調(diào)整速度在一定的時(shí)間內(nèi)走完全程。走完后LCD顯示的內(nèi)容與直線型顯示的內(nèi)容一樣。3。程序框圖:單片機(jī)主程序框圖、速度感應(yīng)程序框圖和鐵片感應(yīng)程序框圖分別如(圖7)所示。(圖7)4.系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn):4.1路面檢測模塊:應(yīng)用一個(gè)金屬感應(yīng)器,安裝在車盤下,離地略小于或約四毫米。當(dāng)金屬傳感器檢測到鐵片時(shí)將對單片機(jī)發(fā)送中斷信號(hào),單片機(jī)運(yùn)行中斷,改變輸給電機(jī)驅(qū)動(dòng)信號(hào)的電壓占空比來控制小車的速度.4.2LCD顯示模塊:采用1602LCD,由單片機(jī)的總線模式連接。為節(jié)約電源,LCD的背光用單片機(jī)進(jìn)行控制.4.3測速模塊:通過霍爾元件感應(yīng)磁鐵來產(chǎn)生脈沖(當(dāng)霍爾元件在離磁場較近時(shí)輸出會(huì)是高電平,其它時(shí)候是低電平),一個(gè)車輪均勻放四個(gè)小磁鐵,計(jì)算一秒所得的脈沖數(shù),從而計(jì)算出一秒小車輪子轉(zhuǎn)動(dòng)圈數(shù),再測量出小車車輪周長即可計(jì)算出小車當(dāng)前速度,累加可得到當(dāng)前路程.4。4控速模塊:考慮到元器件的缺少以及我們所用的電路的驅(qū)動(dòng)電機(jī)的電路原理圖和和小車自帶的電路的電機(jī)驅(qū)動(dòng)原理圖一樣,所以暫時(shí)使用小車自帶的電機(jī)驅(qū)動(dòng)電路圖。4.5復(fù)位電路模塊:單片機(jī)的復(fù)位電路通過手動(dòng)來實(shí)現(xiàn),復(fù)位電路圖如(圖8)所示。(圖8)4。6模式選擇模塊:兩個(gè)中斷口使用和感應(yīng)鐵片、感應(yīng)速度所使用的中斷口一樣,通過一個(gè)與非門和按鈕控制.原理圖如(圖9)所示:(圖9)5.最小系統(tǒng)圖:該系統(tǒng)主要用到的是單片機(jī),所以主要的部分是最小系統(tǒng)圖,該最小系統(tǒng)圖如(圖10)所示:(圖12)6.最終PCB板圖:該最小系統(tǒng)的最終PCB板圖(包括LCD接口以及其他的外部擴(kuò)展電路部分,考慮到最小系統(tǒng)的簡潔以及容易看懂,外部擴(kuò)展電路不在最小系統(tǒng)圖上顯示。)分別如(圖11)、(圖12)所示:(圖11)(圖12)7.系統(tǒng)程序:按照預(yù)定的功能,系統(tǒng)實(shí)現(xiàn)預(yù)定的功能的程序如下所示:#include〈intrins.h〉? ???#include<AT89X52.h>/********************************************************************************\**???宏定義區(qū)?????? ??**\********************************************************************************//*-————-------—------—--—-—LCD模塊———----—----—--——----———--———-—----—*/#defineLCD_RW???P2_6??? //讀寫控制端#defineLCD_RS???P2_7? ???//數(shù)據(jù)命令選擇端#defineLCD_E ?P2_5?? ? //執(zhí)行使能端#defineLCD_Data???P1?????//P1口#defineWrite??? 0x00???? //低電平寫入#defineRead? ? 0x01?????//高電平讀出#defineData ??0x01 ???//高電平選擇數(shù)據(jù)#defineCmd ?0x00??? //低電平選擇命令#defineEnable? ?0x00?????//躍變到低電平時(shí)執(zhí)行命令#defineDisable?? 0x01#defineTrue ? 0x01#defineFalse? ??0x00#defineLCD_Init???0x38?????//初始化模式????? ?#defineLCD_DispCtr??0x0C? ?? //開顯示及光標(biāo)設(shè)置#defineLCD_CloseCtr??0x08? ???//關(guān)顯示#defineLCD_CLS ?0x01??? ?//清屏幕#defineLCD_EnterSet??0x06??? ?//顯示光標(biāo)#defineBusy ??P1_7???? //忙信號(hào)/*--———---------——-----——---測速/測距/測時(shí)模塊--—--—-—--——-—--——--——-—-—-—-—-*/#defineCircleLength??0.132 ? //小車轉(zhuǎn)一輪的長度為.132m/*-—------—-—----—-—-—-—---————控速模塊——-—-——----———------—--——-—--——-*/#defineP03????P0_3?????//后電機(jī)#defineP04?? ?P0_4?????//后電機(jī)#defineP01?? P0_1?? ??//前電機(jī)#defineP02 ? P0_2?? ?//前電機(jī)#defineP31 ???P0_5???//控制液晶背光#defineP33 ? ?P3_3/*------———-—--—-——---————-----—菜單選擇模塊?-----———--—-——------—-—-——*/#defineLine ???0x00 ? ??//0代表直線模式#defineCurve????0x01 ? ??//1代表S型模式#defineNormal???0x00?? //0代表正常速度#defineLow ? ?0x01? ??//1代表低速#defineHigh??? 0x02??? ?//2代表高速/*********************************************************************************\**???? ??全局函數(shù)聲明區(qū) ??? **\*********************************************************************************//*-----——--—-—---------—---——-LCD模塊—----—-—---—---—-—-—-—--------———----*/voidLCDInit(void);? ??? ??//LCD初始化voidSetWriteCmd(void); ???? ? //設(shè)置寫命令模式voidSetReadCmd(void); ?? ???//設(shè)置讀命令模式voidSetWriteData(void);????? ?//設(shè)置寫數(shù)據(jù)模式voidWriteCmd(charcmd);?????? //寫命令voidWriteDat(yī)a(charddata);?????? //寫數(shù)據(jù)voidExecuteCmd(void);? ? ? ?//執(zhí)行命令voidSetXY(charx,chary);???????//定位顯示地址voidDisplaySingleChar(charx,chary,charcchar);??//顯示單個(gè)字符voidDisplayString(charx,chary,char*str);?? //顯示一段字符串voidDelay(unsignedinttime);? ???//延時(shí)主程序voidDelayUs(unsignedinttime);? ????//延時(shí)子程序bitIsBusy(void);?? ????? //判斷忙標(biāo)志函數(shù)voidDisplayTime(void);???? ???//顯示時(shí)間voidDisplayAVGSpee(cuò)d(void);????? ?//顯示平均速度voidDisplayDistance(void);? ??? ?//顯示路程/*-—--———-——---—--—-—----—-—測速/測距/測時(shí)模塊——----——-————-———--————--*/? ?? voidINTInit(void);?? ?//所有中斷初始化voidSpeedINT(void);??? ? ??//測速中斷voidComputeTime(void);voidComputeSpeedANDDistance(void);?? ?//計(jì)算速度和距離/*—-—---—-——--———-——-—---———-—-控速模塊-——-—-—-——-—-———-—-—--------—-—----*/voidCtrSpeedINT(void); ????//控速中斷voidTime0INT(void);?voidTime1INT(void); ??? ? //控速單位時(shí)間中斷voidClock0_Init(void);?? ?? ? //時(shí)鐘中斷初始化voidClock1_Init(void);??? //時(shí)鐘中斷初始化voidCtrSpee(cuò)d(void);/********************************************************************************\**???全局變量區(qū)???? ?? **\********************************************************************************/floatSpeedCount=0;? ??? ?//測速計(jì)數(shù)脈沖floatSpeed=0.0; ??? ? floatDistance=0。0;? ?charTime1INTCount=0;???? ??//T1中斷時(shí)間計(jì)時(shí)floatPassTime=0。00;? ? ??? //小車行走的時(shí)間shortIsT0INT=1; ??? bit IsT1INT;? ?? ????//判斷T1是否已經(jīng)響應(yīng)中斷shortIsT0INT2=1;charThx[5]={0xf4,0xf4,0xc5,0xf4,0xff};?? ?//3ms,3ms,15ms,3mscharTlx[5]={0x48,0x48,0x68,0x48,0xff};?? charThx0=0xd8;charTlx0=0xf0;charThx1=0xb1;???? ????//20mscharTlx1=0xe0;shortRound=0;shortBack=0;shortBack0=0;bitBackid;bitStop=0;charArea0=0;charArea1=0;???? ? ??//區(qū)域變量charLowSpeedArea1StartTime;charLowSpeedArea1EndTime;charHighSpeedAreaEndTime;charLowSpeedArea2EndTime;charLowSpeedArea1PassTime=0;????? //第一個(gè)低速區(qū)通過時(shí)間charHighSpeedAreaPassTime=0; ?????//高速區(qū)通過時(shí)間charLowSpeedArea2PassTime=0;? ??//第二個(gè)低速區(qū)通過時(shí)間charReadyToGo=4;??? ????//倒計(jì)時(shí)charflag;bitRoundid=0;charNocurve=0;charChangeFlag;charMode;bitRunning;bitSelectedAll;????????//模式和速度是否選擇完畢標(biāo)志bit?IsSelectingMode;????????//模式選擇標(biāo)志bit?IsSelectingSpeed;????? ?//速度選擇標(biāo)志bitModeSelected; ??? ? //已經(jīng)被選擇的模式標(biāo)志charSelectedMode=10;????? //模式選擇是否完畢標(biāo)志bitNext;??? ??????//Next鍵標(biāo)志bitSpee(cuò)dSelected;????? ? //已經(jīng)被選中的速度方案標(biāo)志charSelectedSpee(cuò)d;??? ???//速度選擇是否完畢標(biāo)志bitChoosingDisplay;??????? //人工選擇菜單開始標(biāo)志bitSelectedShow;? ????? //顯示選擇標(biāo)志bit?SelectedReturn;????????//返回選擇標(biāo)志bitSelected; ???????//確定/返回鍵選擇標(biāo)志bitReturnSelection;?? ?????//返回鍵啟用標(biāo)志bitAVGSpeedShow;?? ?? ??//平均速度顯示標(biāo)志bitTotalDistanceShow;???????//總路程顯示標(biāo)志bitReturnMain;? ? ?????//返回主菜單標(biāo)志bitAutoDisplay;???? ???//自動(dòng)顯示標(biāo)志bitGoToChoosingDisplay;??? ???//人工選擇標(biāo)志bitAutoMode=0;charPassLineID=0;charPassLine=0;floatPrepareDistance;float(yī)FirstDistance;floatSecondDistance;floatThirdDistance;intFirstHigh;intSecondHigh;intThirdHigh;floatRate=1。25;??????? //5ms時(shí)的速度float(yī)Count=4;? ? ??? //時(shí)間的倍數(shù)/********************************************************************************\**? ?全局函數(shù)實(shí)現(xiàn)區(qū)???????**\********************************************************************************//*—------——---—------———-—----— 主函數(shù)—--——-----—--—----—-----——-—-——-*/voidmain(){ P01=0; P02=0; P03=0;?P04=0; P31=1;? ? ??????//單片機(jī)復(fù)位,背光開?Delay(40);????????? //延時(shí)等待LCD啟動(dòng)?LCDInit();?? ????? ?//初始化LCD?DisplayString(0x0,0,"Starting.。.");?DisplayString(0x0,1,”DesignedBy202");?Delay(300); WriteCmd(LCD_CLS);??? ????EA=1;????? ????//開總中斷?EX0=1; ???? ??? ?//開INT0中斷?IT0=1;?????????? //INTO邊沿觸發(fā)?EX1=1;????????? //開INT1中斷?IT1=1; ??????????//INT1邊沿觸發(fā) SelectedAll=False; ?? ??? //開始模式和速度選擇??/*-—---—--—-———-—----—---—--—模式選擇-—-----——---——----——-—------*/?DisplayString(0x0,0,"ChooseTheMode"); DisplayString(0x0,1,”youwant.");?Delay(50);?WriteCmd(LCD_CLS);??IsSelectingMode=True;?while(1) {? ??? ? ????WriteCmd(LCD_CLS);??DisplayString(0x0,0,”LineMode”);??DisplayString(0x0,1,"NextYes");??Delay(300);? ?? ???//延時(shí)消除抖動(dòng)??while(1)? ??????//不斷檢測中斷,直到按確定鍵或是NEXT鍵??{???if(Next==True)???? ?//如果按Next鍵則直接跳出????break;???if(ModeSelected==True)?? ??//如果按確定鍵則設(shè)置模式為Line并跳出???{ ????SelectedMode=Line;? ??break;?? } ?????? ?//如果什么鍵都沒有按下,那么一直顯示等待??}? if(ModeSelected==True)??????//按下了確定鍵,退出模式選擇? ?{ ??IsSelectingMode=False; ??break;??} if(Next==True)? ???//按下了Next鍵,顯示下一個(gè)菜單項(xiàng)??{ ? Next=False;? ?WriteCmd(LCD_CLS);???DisplayString(0x0,0,"CurveMode");???DisplayString(0x0,1,”NextYes");?????? ??Delay(300);???????//延時(shí)消除抖動(dòng)? ?while(1)?????? //不斷檢測中斷,直到按確定鍵或是Next鍵??{?? ?if(Next==True)? ???//如果再一次按下Next鍵,則跳出??? ?break;?? ?if(ModeSelected==True)? ?//如果按下確定鍵,則設(shè)置模式為Curve,并跳出 ???{???? SelectedMode=Curve;?????break;? ?}? ?}??} ??if(ModeSelected==True)?? ??//按下了確定鍵,退出模式選擇 { ??IsSelectingMode=False;???break;??}??if(Next==True)?? ? //再一次按下了Next鍵,則循環(huán)模式選擇? {???Next=False;???WriteCmd(LCD_CLS);???DisplayString(0x0,0,"AutoMode");? ?DisplayString(0x0,1,"NextYes");?? Delay(300); ? //延時(shí)消除抖動(dòng)? ?while(1)?? {????if(Next==True) ?? ?break; ? if(ModeSelected==True)? ??{?????AutoMode=1;? ???break;?? ??}???}??}? if(ModeSelected==True)??{ ?IsSelectingMode=False; ? break;??}??if(Next==True) ?{???Next=False;???continue; ?}?}? Delay(50);?WriteCmd(LCD_CLS);??/*-——-——-—-—---------———--—-速度選擇--—----------—-—-------—-----—-—-*/ if(SelectedMode==Line&&AutoMode==0)?{??DisplayString(0x0,0,”NowChoosea"); ?DisplayString(0x0,1,"kindofSpeed”);??Delay(50);??WriteCmd(LCD_CLS);????IsSelectingSpeed=True; ?while(1) ???? ???? {???WriteCmd(LCD_CLS);???DisplayString(0x0,0,”NormalSpeed”);???DisplayString(0x0,1,”NextYes");? ?Delay(300); ??????//延時(shí)消除抖動(dòng)? ? ?while(1)???{? ? if(Next==True)? ??//如果按Next鍵則直接跳出 ???break;??? if(SpeedSelected==True)? //如果按確定鍵則設(shè)置速度為Normal并跳出????{??????Thx[0]=0xec;Tlx[0]=0x78;? //5ms ? ??Thx[1]=0xf0;Tlx[1]=0x60; //4ms? ???Thx[2]=0x8a;Tlx[2]=0xd0;??//30ms ??Thx[3]=0xf4;Tlx[3]=0x48;?//3ms?????SelectedSpeed=Normal;? ??break; ??}?????? ?//如果什么鍵都沒有按下,那么一直顯示等待??????}????if(SpeedSelected==True)????//按下了確定鍵,退出速度選擇? ?{ ? IsSelectingSpeed=False;? ??break; ??}? ??if(Next==True) ?{? ??Next=False;?? ?WriteCmd(LCD_CLS);????DisplayString(0x0,0,"LowSpeed");??? DisplayString(0x0,1,”NextYes”); ???? ??Delay(300);?? ?//延時(shí)消除抖動(dòng)?? ?while(1)?? { ?? if(Next==True)?? ?//如果再一次按下Next鍵,則跳出????? break;??? ?if(Spee(cuò)dSelected==True) //如果按下確定鍵,則設(shè)置速度為Low,并跳出? ? ?{ ? ??? SelectedSpeed=Low;? ?//這里沒有速度設(shè)置,因?yàn)槟J(rèn)速度就是Low??????break;? ???}??????? }??? ??} ?? if(SpeedSelected==True)????//按下了確定鍵,退出速度選擇 ??{??? IsSelectingSpee(cuò)d=False; ? ?break;???}? ?if(Next==True) ??{? ??Next=False;?? ?WriteCmd(LCD_CLS); ???DisplayString(0x0,0,"HighSpeed");?? ?DisplayString(0x0,1,”NextYes");? ?Delay(300);?????//延時(shí)消除抖動(dòng)???? while(1)????{ ? ?if(Next==True)???//如果再一次按下Next鍵,則跳出????? break;?????if(SpeedSelected==True) //如果按下確定鍵,則設(shè)置速度為High,并跳出 ? ??{ ? ? ?Thx[0]=0xe0;Tlx[0]=0xc0;//8ms ??? Thx[1]=0xe0;Tlx[1]=0xc0;//8ms?????Thx[2]=0x63;Tlx[2]=0xc0;//40ms?????Thx[3]=0xec;Tlx[3]=0x78;//5ms?? ? SelectedSpee(cuò)d=High;????? break;???? }?? ???? } ????}????if(SpeedSelected==True)????//按下了確定鍵,退出速度選擇 ? { ?? IsSelectingSpeed=False; ???break;? ?}?? ?if(Next==True) ????//再一次按下了Next鍵,則循環(huán)速度選擇???{ ???Next=False;????continue;???}???}?}?SelectedAll=True;//標(biāo)志模式選擇和速度選擇完畢??Running=True; Delay(50);?WriteCmd(LCD_CLS); ?/*-—--—--—--———-------—--—-顯示所選擇的模式和速度方案---—----—---------—---*/?if(SelectedMode==Line)?{???DisplayString(0x0,0,”ChoosenModeis”);??DisplayString(0x0,1,”Line");??Delay(50);??WriteCmd(LCD_CLS);?}?if(SelectedMode==Curve) { ??DisplayString(0x0,0,"ChoosenModeis");? DisplayString(0x0,1,"Curve”);? Delay(50);??WriteCmd(LCD_CLS);?} if(AutoMode==1)?{??DisplayString(0x0,0,"ChoosenModeis”);??DisplayString(0x0,1,"AutoMode");??Delay(50); ?WriteCmd(LCD_CLS);?} ???if(SelectedMode==Line)?{? if(SelectedSpeed==Normal) ?{ ? DisplayString(0x0,0,"ChoosenSpee(cuò)dis”); ??DisplayString(0x0,1,"Normal");? Delay(50); ??WriteCmd(LCD_CLS);? }???if(SelectedSpeed==Low) ?{???DisplayString(0x0,0,”ChoosenSpeedis");?? DisplayString(0x0,1,”Low"); ? Delay(50);? ?WriteCmd(LCD_CLS);? }? ?if(SelectedSpeed==High)??{ ??DisplayString(0x0,0,”ChoosenSpeedis");?? DisplayString(0x0,1,"High"); ??Delay(50);? ?WriteCmd(LCD_CLS);? }?}?INTInit();?????????? //初始化所有中斷?DisplayString(0x0,0,"LeftTimesToGo");?while(ReadyToGo--){? DisplaySingleChar(0x7,1,ReadyToGo+0x30);??DisplaySingleChar(0x09,1,'s');??Delay(300); ??}?WriteCmd(LCD_CLS); DisplayString(0x05,0,"Go!!!”);?Delay(100);?WriteCmd(LCD_CLS);?DisplayString(0x0,0,"Living..."); DisplayString(0x0,1,"Designedby202");? if(SelectedMode==Line&&AutoMode==0)? flag=Area0; else flag=1;? while(flag〈5) {??if(AutoMode==1)???????? //自動(dòng)模式?{???switch(PassLineID)? {???case0:{ ???? ?if(IsT0INT==1)? ?????{P01=P02=P04=0;P03=1;} ? ?? else ??? ? {P01=P02=P03=P04=0;} ? ?}break;???case1:{? ?P01=P02=P03=0;P04=1;???}break;???case2:{???? P01=P02=P04=0;P03=1;????}break; ??default:break;??}? }?else {?? ? if(SelectedMode==Line)??????//直線模式??{ ???flag=Area0;????if(IsT0INT==1) ?? ?{P03=1;P04=0;P01=P02=0;}??else??? {P03=0;P04=0;P01=P02=0;}? }???else?????? ?? {??????? ? //S型模式???if((Nocurve<2)&&Round!=0&&(Back0>0)&&Back!=0)???{??? if(Backid==1) ????{P01=1;P02=0;P03=0;P04=1;} ???else??? ?{P01=0;P02=1;P03=0;P04=1;}? ??Back=1; ?}??? ?else ??{?? ??if(Round==0)? ?{???? ?if(IsT0INT2==1) ?????{P01=0;P02=0;P03=1;P04=0;}?????else ? ???{P01=0;P02=0;P03=0;P04=0;}????}??? else??? {????? if(P33==0) ? ???{ ????? if(IsT0INT2==1)??????? ?{P01=0;P02=0;P03=1;P04=0;}????????else? ?? ? ?{P01=0;P02=0;P03=0;P04=0;}?? ??}?????else?{ ???EX1=1; ?? ???if(Round%2) ???{? ????? if(IsT0INT2==1) ??? ??{P01=1;P02=0;P03=1;P04=0;Backid=1;}????? else???????{P01=1;P02=0;P03=0;P04=0;} ? ?????}?? ??else???? ? {? ?? ??? if(IsT0INT2==1) ???{P01=0;P02=1;P03=1;P04=0;Backid=0;}??? ? ???else? ??????{P01=0;P02=1;P03=0;P04=0;} ???? }??? }?????}??} ?}??? ?} ??if(IsT1INT==1)??{?? IsT1INT=0;???ComputeTime();???ComputeSpee(cuò)dANDDistance();??}?}??//補(bǔ)中斷路程,加上最后一次中斷缺失的路程?ComputeSpee(cuò)dANDDistance();?P04=1;P03=0;P01=P02=0;Delay(90);?P03=0;P04=0; ????? ???//行程結(jié)束,小車停止?P31=1;?? ? ????? //行程結(jié)束,背光開?ET0=0x0;????? ??//關(guān)T0中斷 ET1=0x0;???? ??? ?//關(guān)T1中斷?EX1=0x01; ?????? ?? //開INT1中斷?Running=False; ?AutoDisplay=True; ?? //默認(rèn)情況下直線模式會(huì)自動(dòng)顯示各個(gè)區(qū)域經(jīng)過的時(shí)間?WriteCmd(LCD_CLS); ?if(SelectedMode==Line)? ??? ?//直線模式才顯示 {??while(1) {???if(GoToChoosingDisplay==True)????break;???Delay(200);???WriteCmd(LCD_CLS);???Delay(200); ? DisplayString(0,0,”LowSpee(cuò)dArea1”); ? DisplayString(0,1,”Costed"); ? DisplaySingleChar(0x0C,1,'s’); ?LowSpeedArea1PassTime=LowSpee(cuò)dArea1EndTime—LowSpeedArea1StartTime; ??DisplaySingleChar(0x0A,1,LowSpee(cuò)dArea1PassTime%10+0x30);?? if(LowSpeedArea1PassTime>9)??//通過第一個(gè)低速區(qū)的時(shí)間超過s????DisplaySingleChar(0x0B,1,LowSpeedArea1PassTime/10+0x30);??? ???if(GoToChoosingDisplay==True)????break;?? Delay(200);???WriteCmd(LCD_CLS);?? Delay(200); ?DisplayString(0,0,"HighSpeedArea");?? DisplayString(0,1,"Costed");???DisplaySingleChar(0x0C,1,'s’); ??HighSpee(cuò)dAreaPassTime=HighSpeedAreaEndTime—LowSpeedArea1EndTime; ??DisplaySingleChar(0x0A,1,HighSpeedAreaPassTime%10+0x30);? ?if(HighSpeedAreaPassTime〉9) ??//通過高速區(qū)的時(shí)間超過s? ? DisplaySingleChar(0x0B,1,HighSpeedAreaPassTime/10+0x30);?? ?if(GoToChoosingDisplay==True)? break;? ?Delay(200);? WriteCmd(LCD_CLS); ?Delay(200); ??DisplayString(0,0,"LowSpee(cuò)dArea2”); ??DisplayString(0,1,"Costed");???DisplaySingleChar(0x0C,1,’s’);???LowSpeedArea2PassTime=LowSpee(cuò)dArea2EndTime-HighSpeedAreaEndTime; ??DisplaySingleChar(0x0A,1,LowSpee(cuò)dArea2PassTime%10+0x30); ?if(LowSpeedArea2PassTime>9)???//通過第二個(gè)低速區(qū)的時(shí)間超過s ??DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30);???}?} AutoDisplay=False;?/*—----——---菜單選擇你想要看的內(nèi)容-—總時(shí)間、總路程以及平均速度——-——------——-*/?ChoosingDisplay=True; ?? ?? ? WriteCmd(LCD_CLS);?/*首先顯示主菜單,然后顯示第一個(gè)選項(xiàng)*/?DisplayString(0x0,0,"NowChoosewhat");?DisplayString(0x0,1,”youwanttosee");?Delay(100);?while(1)?{ ??WriteCmd(LCD_CLS);? DisplayString(0x0,0,”CostedTime");? DisplayString(0x0,1,"NextShow"); ?Delay(250);??????? ??//延時(shí)消除抖動(dòng)/*—---------—-—--—-——-----—--—-----第一次按鍵-—---———-—----——-—----——--—-——---——--—*/??? /*不斷檢測確定鍵和Next鍵*/??while(1)??{???if(Next==True)??? break;???if(SelectedShow==True) ? ?break;? } ?/*按下了確定鍵,顯示第一個(gè)選項(xiàng)的內(nèi)容*/??if(SelectedShow==True)???{???SelectedShow=False; ? SelectedReturn=False;???Selected=False;? ?WriteCmd(LCD_CLS);???DisplayString(0,0,”CostedTimeis");??? ?? DisplayTime();???DisplayString(0x0A,1,"s");???ReturnSelection=True;? ?//按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能 ??AVGSpee(cuò)dShow=False;??? Delay(250);? ??? //延時(shí)消除抖動(dòng)??}? /**按下了Next鍵,則顯示第二個(gè)選項(xiàng)*/ ?if(Next==True)? ?? ?//按下Next鍵,顯示AVGSpee(cuò)d菜單項(xiàng)??{?? Next=False;???WriteCmd(LCD_CLS);???DisplayString(0x0,0,”AVGSpeed");? ?DisplayString(0x0,1,"NextShow");? ?? ??ReturnMain=False;???ReturnSelection=False;???//按下了Next鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能???AVGSpee(cuò)dShow=True; ????//表明AVGSpeed選項(xiàng)已經(jīng)顯示過了 ?Delay(250);????? //延時(shí)消除抖動(dòng)??}?/*—----—-—--—---—---—-—---—--—第二次按鍵————--——-------—-—--—---———-—-—---—*/??/*顯示第一個(gè)選項(xiàng)的內(nèi)容后又不斷檢測返回鍵(確定鍵)和Next鍵*/??while(1)??{ ?if(Next==True)?? ?break; ?if(Selected==True) ? ?break;? }??????if(Next==True)? ??{???Next=False;???ReturnMain=False;? ?ReturnSelection=False;? //按下了Next鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能 ???if(AVGSpee(cuò)dShow==False) //還沒有顯示AVGSpee(cuò)d選項(xiàng),顯示它???{??? ?? //即第一次選擇了確定鍵????WriteCmd(LCD_CLS);?? ?DisplayString(0x0,0,"AVGSpeed"); ???DisplayString(0x0,1,"NextShow”);????TotalDistanceShow=False;?//顯示了AVGSpeed,則表明TotalDistance還沒有顯示? ??????Delay(250);? ??//延時(shí)消除抖動(dòng)??? ?? ???? }????if(AVGSpeedShow==True) ??//已經(jīng)顯示過AVGSpeed選項(xiàng)了,則顯示下一個(gè)選項(xiàng) ??{???????//即第一次選擇了Next鍵??? WriteCmd(LCD_CLS);? ??DisplayString(0x0,0,"TotalDistance");??? DisplayString(0x0,1,"NextShow");????TotalDistanceShow=True;????//表明顯示了TotalDistance選項(xiàng)? ???Delay(250); ? ???//延時(shí)消除抖動(dòng)???}??}?? if(Selected==True) ?? ?//按下了確定鍵或返回鍵 ?{?? SelectedShow=False;???SelectedReturn=False;? ?Selected=False;???if(ReturnSelection==True)//第一次選擇了確定鍵,故這次按下的是返回鍵 ???ReturnMain=True;?? if(ReturnSelection==False)???{??? WriteCmd(LCD_CLS); ?? DisplayString(0,0,”TheAVGSpee(cuò)dis");?? ??? ??DisplayAVGSpeed();????DisplayString(0x0A,1,"m/s”); ???ReturnSelection=True; ? //按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能? ??? ??Delay(250);?? ?//延時(shí)消除抖動(dòng)?? ? ??} ??TotalDistanceShow=False; ?? ???}??if(ReturnMain==True) ?? ?//按下了返回鍵,返回主菜單 {???ReturnMain=False;???continue; ?}? ? ???/*--—-—--—--——-—-——-----—------—-———--第三次按鍵-—-——--—-——--———------——------—---—---*/??/*如果沒有返回主菜單,則繼續(xù)檢測Next鍵和確定鍵*/??while(1) {?? ? if(Next==True)?? ?break;???if(SelectedShow==True) ? ?break;??} ???/*按下Next鍵,顯示下一個(gè)選項(xiàng)*/ ?if(Next==True) ?{???Next=False; ??ReturnMain=False;???ReturnSelection=False;? //按下了Next鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能?? ?if(TotalDistanceShow==True)????ReturnMain=True;? ?if(TotalDistanceShow==False)??//還沒有顯示TotalDistance選項(xiàng),顯示它???{? ?????? ???WriteCmd(LCD_CLS); ???DisplayString(0x0,0,"TotalDistance”);??? DisplayString(0x0,1,"NextShow");? ??TotalDistanceShow=True;??? ? ?????? Delay(250);??? ??//延時(shí)消除抖動(dòng) ?????? ?}???}??if(Selected==True) ?? ? //按下了確定鍵或返回鍵? {?? SelectedShow=False;???SelectedReturn=False; ??Selected=False; ? if(ReturnSelection==True) ?//按下的是返回鍵? ??ReturnMain=True; ??if(ReturnSelection==False)? ????{ ???if(TotalDistanceShow==False)??//表明AVGSpeed選項(xiàng)的內(nèi)容還沒有顯示 ?? {?????WriteCmd(LCD_CLS); ?? ?DisplayString(0,0,”TheAVGSpeedis”);??????? ? DisplayAVGSpeed();? ???DisplayString(0x0A,1,”m/s");?????ReturnSelection=True;????? Delay(250); ????//延時(shí)消除抖動(dòng)?? ?}? ??if(TotalDistanceShow==True) ???{? ? ?WriteCmd(LCD_CLS);??? ?DisplayString(0,0,"TotalDistance”);?? ??DisplayDistance();? ?? DisplayString(0x0A,1,"m");??? ?ReturnSelection=True;??//按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能 ? ?Delay(250);??? ?//延時(shí)消除抖動(dòng) ???}???}??}? if(ReturnMain==True) ????//按下了返回鍵,返回主菜單??{???ReturnMain=False;???continue;? ? } /*---—-----—--—-----—--——-——-——-第四次按鍵—-—--—--—--—-——-————----—---—--—-—*/??while(1)??{ ? ??if(Next==True)????break;???if(SelectedShow==True) ? break;??} ?? if(Next==True) ???? ?//所有菜單項(xiàng)已經(jīng)顯示完畢,返回主菜單??{ ??Next=False;?? ReturnMain=False;?? ReturnSelection=False;??? ? if(TotalDistanceShow==False)?????{??? ? ?? ??WriteCmd(LCD_CLS);????DisplayString(0x0,0,"TotalDistance");??? DisplayString(0x0,1,”NextShow”); ? ?TotalDistanceShow=True; ? ????? ??Delay(250);? ???//延時(shí)消除抖動(dòng)??????????}???} ?if(SelectedShow==True)??{???SelectedShow=False;???SelectedReturn=False;???Selected=False;???if(ReturnSelection==True)? //按下的是返回鍵????ReturnMain=True;???if(ReturnSelection==False)? ??{?? ?if(TotalDistanceShow==True)????{?? ??WriteCmd(LCD_CLS);?????DisplayString(0,0,”TotalDistance");?????DisplayDistance(); ????DisplayString(0x0A,1,"m");? ???ReturnSelection=True;//按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能?????Delay(250);?????//延時(shí)消除抖動(dòng)? ??}???}?????}????if(ReturnMain==True) ?? ??//按下了返回鍵,返回主菜單??{???ReturnMain=False; ??continue;??????} /*——--—--—---—---—---—————-—------—第五次按鍵--—---—-——----——-—-—-——-----—-—----*/??while(1)??{????? if(Next==True)????break; ??if(SelectedShow==True)?? ?break; ?}??if(Next==True)???? ?//所有菜單項(xiàng)已經(jīng)顯示完畢,返回主菜單??{?? Next=False;? ReturnMain=False; ??ReturnSelection=False;? ?if(TotalDistanceShow==True)?? //最后一個(gè)選項(xiàng)已經(jīng)顯示完畢,返回主菜單?? {????ReturnMain=True;???}?? ??}???if(SelectedShow==True)??{ ?SelectedShow=False;???SelectedReturn=False;???Selected=False; ?if(ReturnSelection==True)??//按下的是返回鍵 ? ReturnMain=True;?? if(ReturnSelection==False) ? ???{????if(TotalDistanceShow==True)??? { ?? ?WriteCmd(LCD_CLS);? ???DisplayString(0,0,”TotalDistance");? ?? DisplayDistance();??? DisplayString(0x0A,1,"m");??? ?ReturnSelection=True;??//按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能 ? ? Delay(250);?????//延時(shí)消除抖動(dòng)??? }?? } ????} /*--——---——-----—----—--———---—---——--第六次按鍵-------——--—-—-——-—-—-----—-—-——-——*/? ??while(1)??{?? ? if(Next==True)? ??break;???if(SelectedShow==True) ? break;??}? if(Next==True)??{?? Next=False;???ReturnMain=False;???ReturnSelection=False;?????}??if(SelectedShow==True) {? SelectedShow=False;?? SelectedReturn=False;???Selected=False;??}??continue;??}?while(1);}/****************************************************************************************\**???? ???LCD驅(qū)動(dòng)模塊????????**\****************************************************************************************//*-—----—---—-—-—-—-——-———-—------—LCD初始化函數(shù)—---—-------———-------—-----—--*/voidLCDInit(void){//三次顯示模式設(shè)置?LCD_Data=0;?LCD_E=Disable;?Delay(5); WriteCmd(LCD_Init);?Delay(5); WriteCmd(LCD_Init);?Delay(5);?WriteCmd(LCD_Init);?WriteCmd(LCD_Init); ? ???//初始化 WriteCmd(LCD_CloseCtr);??? ?? //關(guān)顯示?WriteCmd(LCD_CLS);? ??? ?//清屏幕?WriteCmd(LCD_EnterSet);? ????//光標(biāo)移動(dòng)設(shè)置?WriteCmd(LCD_DispCtr);? ? ??//顯示開以及光標(biāo)設(shè)置?}/*--——-—-—--------—---—-—---——--LCD模式設(shè)置函數(shù)---—--—-—-—---—-—-—-—-—-—--———---——*\??SetWriteCmd()? ? 設(shè)置LCD為寫命令模式 SetReadCmd()????設(shè)置LCD為讀命令模式?SetWriteData() ? 設(shè)置LCD為寫數(shù)據(jù)模式?\*——-—-———----—--———----—--——----—-—-—--—--——---——---—--—--—---—----—--—-—--————*/voidSetWriteCmd(void){?LCD_RW=Write;?LCD_RS=Cmd;}voidSetReadCmd(void){?LCD_RW=Read;?LCD_RS=Cmd;}voidSetWriteDat(yī)a(void){?LCD_RW=Write;?LCD_RS=Data;}/*-——-——-—---—————--—--———---———---LCD功能執(zhí)行函數(shù)—-———-—---—----—-----—-—----—----——--—*\ ?WriteCmd()? ???寫命令?WriteDat(yī)a()?????寫數(shù)據(jù)?ExecuteCmd()?? ??執(zhí)行命令?SetXY()? ??顯示定位?DisplaySingleChar()? ?顯示單個(gè)字符?DisplayString()?? ?顯示一串字符?IsBusy()??????忙標(biāo)志檢測\*-—--———---—--—--—----——----—--——------——------———-----—-——---—-——---——--—-----—*/voidWriteCmd(charcmd){?while(IsBusy());?LCD_Data=cmd;? SetWriteCmd(); ExecuteCmd();}voidWriteData(charddata){?while(IsBusy());?LCD_Data=ddata;?SetWriteData(); ?ExecuteCmd();}voidExecuteCmd(void){ LCD_E=Enable;?LCD_E=Disable;}voidSetXY(charx,chary){?if(y) ?x|=0x40;?x|=0x80;?Delay(5); WriteCmd(x);}voidDisplaySingleChar(charx,chary,charcchar){?SetXY(x,y); WriteData(cchar);?}voidDisplayString(charx,chary,char*str){ while(*str)?{??Delay(5);? DisplaySingleChar(x++,y,*str); ?str++;?}}bitIsBusy(void){ LCD_Data=0xFF;?SetReadCmd(); ExecuteCmd();?return(bit)(P1&0x8

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論