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

下載本文檔

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

文檔簡介

摘要〔關(guān)鍵詞:智能車AT89S52單片機(jī)金屬感應(yīng)器霍爾元件1602LCD〕智能作為現(xiàn)代的新創(chuàng)造,是以后的開展方向,他可以按照預(yù)先設(shè)定的模式在一個(gè)環(huán)境里自動(dòng)的運(yùn)作,不需要人為的管理,可應(yīng)用于科學(xué)勘探等等的用途。智能電動(dòng)車就是其中的一個(gè)表達(dá)。本次設(shè)計(jì)的簡易智能電動(dòng)車,采用AT89S52單片機(jī)作為小車的檢測(cè)和控制核心;采用金屬感應(yīng)器TL-Q5MC來檢測(cè)路上感應(yīng)到的鐵片,從而把反應(yīng)到的信號(hào)送單片機(jī),使單片機(jī)按照預(yù)定的工作模式控制小車在各區(qū)域按預(yù)定的速度行駛,并且單片機(jī)選擇的工作模式不同也可控制小車順著S形鐵片行駛;采用霍爾元件A44E檢測(cè)小車行駛速度;采用1602LCD實(shí)時(shí)顯示小車行駛的時(shí)間,小車停止行駛后,輪流顯示小車行駛時(shí)間、行駛距離、平均速度以及各速度區(qū)行駛的時(shí)間。本設(shè)計(jì)結(jié)構(gòu)簡單,較容易實(shí)現(xiàn),但具有高度的智能化、人性化,一定程度表達(dá)了智能。目錄1設(shè)計(jì)任務(wù)………………31.1要求………………32方案比擬與選擇………………………42.1路面檢測(cè)模塊………………………42.2LCD顯示模塊………………………52.3測(cè)速模塊……………52.4控速模塊……………62.5模式選擇模塊………………………73程序框圖………………74系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn)………………94.1路面檢測(cè)模塊………………………94.2LCD顯示模塊………………………94.3測(cè)速模塊……………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〕分區(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?!?〕小車能自動(dòng)記錄、顯示行駛時(shí)間、行駛距離以及行駛速度,還能記錄每段所走的時(shí)間,從而判斷是否符合課程設(shè)計(jì)要求。〔記錄顯示裝置要求安裝在車上〕。發(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路面檢測(cè)模塊:采用鐵片感應(yīng)器TL-Q5MC來檢測(cè)路面上的鐵片從而給單片機(jī)中斷脈沖。原理圖接線如〔圖4〕所示:〔圖4〕2.2LCD顯示模塊:采用1602LCD,由單片機(jī)的總線模式連接。為節(jié)約電源電量并且不影響LCD的功能,LCD的背光用單片機(jī)進(jìn)行控制,使LCD的背光在小車行駛的過程中不亮,因?yàn)槲覀儾槐乜雌滹@示;在其它我們需要看顯示的內(nèi)容的時(shí)候LCD背光亮。2.3測(cè)速模塊:方案1:采用采用霍爾開關(guān)元器件A44E檢測(cè)輪子上的小磁鐵從而給單片機(jī)中斷脈沖,到達(dá)測(cè)量速度的作用?;魻栐哂畜w積小,頻率響應(yīng)寬度大,動(dòng)態(tài)特性好,對(duì)外圍電路要求簡單,使用壽命長,價(jià)格低廉等特點(diǎn),電源要求不高,安裝也較為方便?;魻栭_關(guān)只對(duì)一定強(qiáng)度的磁場(chǎng)起作用,抗干擾能力強(qiáng),因此可以在車輪上安裝小磁鐵,而將霍爾器件安裝在固定軸上,通過對(duì)脈沖的計(jì)數(shù)進(jìn)行車速測(cè)量。方案2:采用紅外傳感器進(jìn)行測(cè)速。但無論是反射式紅外傳感器還是對(duì)射式紅外傳感器,他們對(duì)都對(duì)外圍環(huán)境要求較高,易受外部環(huán)境的影響,穩(wěn)定性不高,且價(jià)格較為昂貴。通過對(duì)方案1、方案2的比擬其優(yōu)缺點(diǎn),綜合多方面因素決定選用方案1,其原理圖接線如〔圖5〕所示:〔圖5〕2.4控速模塊:方案1:使用功率三極管作為功率放大器的輸出控制直流電機(jī)。線性型驅(qū)動(dòng)的電路結(jié)構(gòu)和原理簡單,本錢低,加速能力強(qiáng),但功率損耗大,特別是低速大轉(zhuǎn)距運(yùn)行時(shí),通過電阻R的電流大,發(fā)熱厲害,損耗大,對(duì)于小車的長時(shí)間運(yùn)行不利。方案2:采用繼電器對(duì)電動(dòng)機(jī)的開或關(guān)進(jìn)行控制,通過開關(guān)的切換對(duì)小車的速度進(jìn)行調(diào)整.此方案的優(yōu)點(diǎn)是電路較為簡單,缺點(diǎn)是繼電器的響應(yīng)時(shí)間慢,易損壞,壽命較短,可靠性不高。方案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顯示的菜單項(xiàng)選擇擇所要看的內(nèi)容如平均速度、全程距離以及那三個(gè)時(shí)間?!?〕S型:滿足設(shè)計(jì)任務(wù)的發(fā)揮局部的要求,小車能自動(dòng)的感應(yīng)到在前面或在后面鐵片,即第一次轉(zhuǎn)彎后假設(shè)感應(yīng)到的是錯(cuò)誤的方向,那么小車會(huì)后退自動(dòng)調(diào)整方向,沿著S型的鐵片走。當(dāng)走完S型鐵片后的一定時(shí)間里,小車自動(dòng)停止。之后自動(dòng)進(jìn)入菜單由我們自己選擇要看的內(nèi)容時(shí)間、平均速度和所走的距離?!?〕自動(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路面檢測(cè)模塊:應(yīng)用一個(gè)金屬感應(yīng)器,安裝在車盤下,離地略小于或約四毫米。當(dāng)金屬傳感器檢測(cè)到鐵片時(shí)將對(duì)單片機(jī)發(fā)送中斷信號(hào),單片機(jī)運(yùn)行中斷,改變輸給電機(jī)驅(qū)動(dòng)信號(hào)的電壓占空比來控制小車的速度。4.2LCD顯示模塊:采用1602LCD,由單片機(jī)的總線模式連接。為節(jié)約電源,LCD的背光用單片機(jī)進(jìn)行控制。4.3測(cè)速模塊:通過霍爾元件感應(yīng)磁鐵來產(chǎn)生脈沖(當(dāng)霍爾元件在離磁場(chǎng)較近時(shí)輸出會(huì)是高電平,其它時(shí)候是低電平),一個(gè)車輪均勻放四個(gè)小磁鐵,計(jì)算一秒所得的脈沖數(shù),從而計(jì)算出一秒小車輪子轉(zhuǎn)動(dòng)圈數(shù),再測(cè)量出小車車輪周長即可計(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〕所示?!矆D8〕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)圖上顯示?!撤謩e如〔圖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)/*--------------------------測(cè)速/測(cè)距/測(cè)時(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/*------------------------------菜單項(xiàng)選擇擇模塊 ---------------------------------*/#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); //寫命令voidWriteData(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í)間voidDisplayAVGSpeed(void); //顯示平均速度voidDisplayDistance(void); //顯示路程/*--------------------------測(cè)速/測(cè)距/測(cè)時(shí)模塊-------------------------------*/voidINTInit(void); //所有中斷初始化voidSpeedINT(void); //測(cè)速中斷voidComputeTime(void);voidComputeSpeedANDDistance(void); //計(jì)算速度和距離/*--------------------------------控速模塊-----------------------------------*/voidCtrSpeedINT(void); //控速中斷voidTime0INT(void); voidTime1INT(void); //控速單位時(shí)間中斷voidClock0_Init(void); //時(shí)鐘中斷初始化voidClock1_Init(void); //時(shí)鐘中斷初始化voidCtrSpeed(void);/********************************************************************************\** 全局變量區(qū) **\********************************************************************************/floatSpeedCount=0; //測(cè)速計(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)志bitSpeedSelected; //已經(jīng)被選中的速度方案標(biāo)志charSelectedSpeed; //速度選擇是否完畢標(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;floatFirstDistance;floatSecondDistance;floatThirdDistance;intFirstHigh;intSecondHigh;intThirdHigh;floatRate=1.25; //5ms時(shí)的速度floatCount=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) //不斷檢測(cè)中斷,直到按確定鍵或是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) //不斷檢測(cè)中斷,直到按確定鍵或是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(SpeedSelected==True) //如果按下確定鍵,那么設(shè)置速度為Low,并跳出 { SelectedSpeed=Low; //這里沒有速度設(shè)置,因?yàn)槟J(rèn)速度就是Lowbreak; } } }if(SpeedSelected==True) //按下了確定鍵,退出速度選擇 { IsSelectingSpeed=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;//8msThx[1]=0xe0;Tlx[1]=0xc0;//8ms Thx[2]=0x63;Tlx[2]=0xc0;//40ms Thx[3]=0xec;Tlx[3]=0x78;//5ms SelectedSpeed=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,"ChoosenSpeedis"); 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(); ComputeSpeedANDDistance(); } }//補(bǔ)中斷路程,加上最后一次中斷缺失的路程 ComputeSpeedANDDistance(); 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,"LowSpeedArea1"); DisplayString(0,1,"Costed"); DisplaySingleChar(0x0C,1,'s'); LowSpeedArea1PassTime=LowSpeedArea1EndTime-LowSpeedArea1StartTime; DisplaySingleChar(0x0A,1,LowSpeedArea1PassTime%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'); HighSpeedAreaPassTime=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,"LowSpeedArea2"); DisplayString(0,1,"Costed"); DisplaySingleChar(0x0C,1,'s'); LowSpeedArea2PassTime=LowSpeedArea2EndTime-HighSpeedAreaEndTime; DisplaySingleChar(0x0A,1,LowSpeedArea2PassTime%10+0x30);if(LowSpeedArea2PassTime>9) //通過第二個(gè)低速區(qū)的時(shí)間超過s DisplaySingleChar(0x0B,1,LowSpeedArea2PassTime/10+0x30); } } AutoDisplay=False;/*----------------菜單項(xiàng)選擇擇你想要看的內(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)/*------------------------------------第一次按鍵--------------------------------------*//*不斷檢測(cè)確定鍵和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í)候開啟返回鍵的功能 AVGSpeedShow=False; Delay(250); //延時(shí)消除抖動(dòng) }/**按下了Next鍵,那么顯示第二個(gè)選項(xiàng)*/if(Next==True) //按下Next鍵,顯示AVGSpeed菜單項(xiàng) { Next=False; WriteCmd(LCD_CLS); DisplayString(0x0,0,"AVGSpeed"); DisplayString(0x0,1,"NextShow"); ReturnMain=False; ReturnSelection=False; //按下了Next鍵,那么這個(gè)時(shí)候關(guān)閉返回鍵的功能 AVGSpeedShow=True; //說明AVGSpeed選項(xiàng)已經(jīng)顯示過了 Delay(250); //延時(shí)消除抖動(dòng) }/*------------------------------------第二次按鍵--------------------------------------*//*顯示第一個(gè)選項(xiàng)的內(nèi)容后又不斷檢測(cè)返回鍵〔確定鍵〕和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(AVGSpeedShow==False) //還沒有顯示AVGSpeed選項(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,"TheAVGSpeedis"); DisplayAVGSpeed(); DisplayString(0x0A,1,"m/s"); ReturnSelection=True; //按下了確定鍵,那么這個(gè)時(shí)候開啟返回鍵的功能 Delay(250); //延時(shí)消除抖動(dòng) } TotalDistanceShow=False; }if(ReturnMain==True) //按下了返回鍵,返回主菜單 { ReturnMain=False;continue; } /*------------------------------------第三次按鍵--------------------------------------*//*如果沒有返回主菜單,那么繼續(xù)檢測(cè)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;}voidSetWriteData(void){ LCD_RW=Write; LCD_RS=Data;}/*---------------------------------LCD功能執(zhí)行函數(shù)--------------------------------------*\ WriteCmd() 寫命令 WriteData() 寫數(shù)據(jù) ExecuteCmd() 執(zhí)行命令 SetXY() 顯示定位 DisplaySingleChar() 顯示單個(gè)字符 DisplayString() 顯示一串字符 IsBusy() 忙標(biāo)志檢測(cè)\*----------------------------------------------------------------------------------------*/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&0x80); }/*-------------------------------------延時(shí)函數(shù)-------------------------------------*/voidDelay(unsignedinttime){unsignedinttimeCounter=0;for(timeCounter=time;timeCounter>0;timeCounter--) DelayUs(255);}voidDelayUs(unsignedinttime){unsignedinttimeCounter=0;for(timeCounter=0;timeCounter<time;timeCounter++) _nop_();}/*******************************************************************************************\**LCD顯示模塊**\*******************************************************************************************/voidComputeTime(void){if(Area0<5) PassTime+=0.5;}voidComputeSpeedANDDistance(void){ Speed=SpeedCount/4*CircleLength; //計(jì)算瞬時(shí)速度 Distance+=Speed; //計(jì)算距離 SpeedCount=0;}/*-------------------------------------顯示時(shí)間----------------------------------------*/voidDisplayTime(void){charPassTime1=0x30;charPassTime2=0x30;charPassTime3=0x30;charPassTime4=0x30;if((int)PassTime*100<100) //時(shí)間未夠1s { PassTime1+=0; PassTime2+=(int)(PassTime*100)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論