基于單片機(jī)的多功能智能小車設(shè)計(jì)論文,基于,單片機(jī),多功能,智能,小車,設(shè)計(jì),論文
畢業(yè)設(shè)計(jì)(論文)
課 題 名 稱 基于單片機(jī)智能小車設(shè)計(jì)
學(xué) 生 姓 名
學(xué) 號(hào)
系、年級(jí)專業(yè) 信息工程系08電子科學(xué)與技術(shù)
指 導(dǎo) 教 師
職 稱 講師
2012年5月13日
53
摘要
智能作為現(xiàn)代的新發(fā)明,是以后的發(fā)展方向,他可以按照預(yù)先設(shè)定的模式在一個(gè)環(huán)境里自動(dòng)的運(yùn)作,不需要人為的管理,可應(yīng)用于科學(xué)勘探等等的用途。智能電動(dòng)車就是其中的一個(gè)體現(xiàn)。本次設(shè)計(jì)的簡(jiǎn)易智能電動(dòng)車,采用AT89S52單片機(jī)作為小車的檢測(cè)和控制核心;采用金屬感應(yīng)器TL-Q5MC來檢測(cè)路上感應(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)簡(jiǎn)單,較容易實(shí)現(xiàn),但具有高度的智能化、人性化,一定程度體現(xiàn)了智能。
關(guān)鍵詞:智能車;AT89S52;單片機(jī) ;金屬感應(yīng)器;霍爾元件;1602LCD
ABSTRACT
Smart as a modern invention, the direction of development in the future, he can in an environment where automatic operation in accordance with the pre-set pattern, no human management can be applied to the use of scientific exploration. Smart electric car is one of expression. The simplicity of the design of intelligent electric car, using AT89S52 MCU core as the detection and control of the car; metal sensor TL-Q5MC to detect the way the sensor to the iron plates, so that the feedback signal to send to the microcontroller, so that microcontroller in accordance with predetermined operating mode to control the car traveling in the regions according to a predetermined speed, and the operating mode selected by the microcontroller to control the car traveling along the S-shaped iron plates; Hall element A44E detect car speed; using 1602LCD real-time display car traveling car to stop driving, take turns to car travel time, travel distance, average speed and velocity zone traveling time. This design is simple, more easy to implement, but are highly intelligent, humane, to some extent reflects the intelligent.
Keywords: smart car; AT89S52 is; microcontroller; metal sensors; Hall element; 1602LCD
目錄
摘要 Ⅰ
ABSTRACT Ⅱ
第1章 設(shè)計(jì)任務(wù) 1
1.1 要求 1
第二章 方案比較與選擇 2
2.1路面檢測(cè)模塊 2
2.2 LCD顯示模塊 3
2.3測(cè)速模塊 3
2.4控速模塊 3
2.5模式選擇模塊 4
第3章 程序框圖 5
第4章 系統(tǒng)的具體設(shè)計(jì)與實(shí)現(xiàn) 7
4.1路面檢測(cè)模塊 7
4.2 LCD顯示模塊 7
4.3測(cè)速模塊 7
4.4控速模塊 7
4.5復(fù)位電路模塊 7
4.6模式選擇模塊 8
第5章 最小系統(tǒng)圖 8
第6章 最終PCB板圖 10
總結(jié) 12
參考文獻(xiàn) 13
致謝 14
附錄 15
1 設(shè)計(jì)任務(wù)
設(shè)計(jì)并制作了一個(gè)智能電動(dòng)車,其行駛路線滿足所需的要求。
1.1 要求
1.1.1 基本要求
(1)分區(qū)控制:
如(圖1)所示:
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 路面檢測(cè)模塊
采用鐵片感應(yīng)器TL-Q5MC來檢測(cè)路面上的鐵片從而給單片機(jī)中斷脈沖。原理圖接線如(圖4)所示:
(圖4)
2.2 LCD顯示模塊
采用1602LCD,由單片機(jī)的總線模式連接。為節(jié)約電源電量并且不影響LCD的功能,LCD的背光用單片機(jī)進(jìn)行控制,使LCD的背光在小車行駛的過程中不亮,因?yàn)槲覀儾槐乜雌滹@示;在其它我們需要看顯示的內(nèi)容的時(shí)候LCD背光亮。
2.3 測(cè)速模塊
2.3.1 方案1
采用采用霍爾開關(guān)元器件A44E檢測(cè)輪子上的小磁鐵從而給單片機(jī)中斷脈沖,達(dá)到測(cè)量速度的作用?;魻栐哂畜w積小,頻率響應(yīng)寬度大,動(dòng)態(tài)特性好,對(duì)外圍電路要求簡(jiǎn)單,使用壽命長(zhǎng),價(jià)格低廉等特點(diǎn),電源要求不高,安裝也較為方便。霍爾開關(guān)只對(duì)一定強(qiáng)度的磁場(chǎng)起作用,抗干擾能力強(qiáng),因此可以在車輪上安裝小磁鐵,而將霍爾器件安裝在固定軸上,通過對(duì)脈沖的計(jì)數(shù)進(jìn)行車速測(cè)量。
2.3.2 方案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 控速模塊:
2.4.1 方案1
使用功率三極管作為功率放大器的輸出控制直流電機(jī)。線性型驅(qū)動(dòng)的電路結(jié)構(gòu)和原理簡(jiǎn)單,成本低,加速能力強(qiáng),但功率損耗大,特別是低速大轉(zhuǎn)距運(yùn)行時(shí),通過電阻R的電流大,發(fā)熱厲害,損耗大,對(duì)于小車的長(zhǎng)時(shí)間運(yùn)行不利。
2.4.2 方案2
采用繼電器對(duì)電動(dòng)機(jī)的開或關(guān)進(jìn)行控制,通過開關(guān)的切換對(duì)小車的速度進(jìn)行調(diào)整.此方案的優(yōu)點(diǎn)是電路較為簡(jiǎn)單,缺點(diǎn)是繼電器的響應(yīng)時(shí)間慢,易損壞,壽命較短,可靠性不高。
2.4.3 方案3
采用由雙極性管組成的H橋電路。用單片機(jī)控制晶體管使之工作在占空比可調(diào)的開關(guān)狀態(tài),精確調(diào)整電機(jī)轉(zhuǎn)速。這種電路由于工作在管子的飽和截止模式下,效率非常高;H橋電路保證了可以簡(jiǎn)單地實(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 路面檢測(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.2 LCD顯示模塊
采用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è)量出小車車輪周長(zhǎng)即可計(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)所示:
第6章 系統(tǒng)調(diào)試與仿真
該最小系統(tǒng)的最終PCB板圖(包括LCD接口以及其他的外部擴(kuò)展電路部分,考慮到最小系統(tǒng)的簡(jiǎn)潔以及容易看懂,外部擴(kuò)展電路不在最小系統(tǒng)圖上顯示。)分別如(圖11)、(圖12)所示:
(圖11)
(圖12)
總結(jié)
在本次設(shè)計(jì)中,我學(xué)到了很多沒有接觸到的電子知識(shí),使我的知識(shí)有了進(jìn)一步提升,這次的畢業(yè)設(shè)計(jì),對(duì)我今后參加工作是受益匪淺的,特別是老師們的精心指導(dǎo),以及同學(xué)們的耐心幫助,讓我覺得做畢業(yè)設(shè)計(jì)是一件可遇而不可求的事情,我也希望,在我今后的工作中能發(fā)揚(yáng)我們?cè)趯W(xué)校做畢業(yè)設(shè)計(jì)的這種精神,能互相幫助,做事能細(xì)心細(xì)致,在此,我也感謝李劍老師以及實(shí)驗(yàn)室的老師在設(shè)計(jì)中對(duì)我們的指導(dǎo)和幫助,十分感謝!
參考文獻(xiàn)
[1]胡乾斌等.單片微型計(jì)算機(jī)原理與應(yīng)用.華中科技大學(xué)出版社.
[2]閻石.數(shù)字電子技術(shù)基礎(chǔ)(第五版).北京.高等教育出版社.2006.
[3] 皮大熊等.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo),北京,北京理工大學(xué)出版社,2010.
[4]沈紅衛(wèi).單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)實(shí)例與分析,北京:北京航空航天大學(xué)出版社.2003
[5] 姜志海,黃玉清,劉連鑫.單片機(jī)原理及應(yīng)用.電子工業(yè)出版社.
[6]樓然苗,李光飛.51系列單片機(jī)設(shè)計(jì)實(shí)例[M].北京航空航天大學(xué)出版社,2003.
[7]余家春.Protel 99 SE電路設(shè)計(jì)實(shí)用教程[M].中國(guó)鐵道出版社,2004.
[8]王為青.單片機(jī)Keil Cx51應(yīng)用開發(fā)技術(shù).人民郵電出版社,2007.
[9] Li gang.51 series microcomputer application skills and system design. Beijing aerospace
[11]Zhou Jian.microcontroller easy primer. Beijing aerospace university press, 2004.
[12] 胡漢才 單片機(jī)原理及其接口技術(shù)[M]清華大學(xué)出版社,2000年
[13] 曹琳琳 單片機(jī)原理及其接口技術(shù)[M]北京 國(guó)防科技大學(xué)出版社,2000年
[14] 許惠民 單片微型計(jì)算機(jī)原理、接口及應(yīng)用[M]北京 北京郵電出版社,2000年
[15] 康華光 電子技術(shù)基礎(chǔ)[M]北京 高等教育出版社,2001年
[16] 孫傳友 測(cè)控電路及裝置 北京航空航天出版社,2002年
[17] 華成英 童詩(shī)白 模擬電子技術(shù)基礎(chǔ) 第四版 高等教育出版社 2006年
[18] Maxim.DS1629 data release book[Z].2002.
致謝
經(jīng)過三個(gè)月的學(xué)習(xí)和試驗(yàn),終于完成了我的畢業(yè)設(shè)計(jì)??粗约盒燎诘某晒?,心里非常高興。在這期間遇到了很多從來都沒有遇到過的問題,但是通過自己的努力和老師、同學(xué)的幫助最后把它們一一解決了。其中在李劍老師的精心安排和指導(dǎo)下,對(duì)題目有了較深入的理解,也嘗到了電路系統(tǒng)設(shè)計(jì)的艱辛。在本次設(shè)計(jì)中我在各個(gè)環(huán)節(jié)中都做到了深入實(shí)際,動(dòng)手實(shí)踐,不僅對(duì)我們學(xué)過的理論知識(shí)進(jìn)行了一次全面的復(fù)習(xí)和鞏固,而且還在電子電路、單片機(jī)等方面拓展了我們的知識(shí)面,為將來的實(shí)際工作打下良好的基礎(chǔ),特別是在分析問題,解決問題的方面得到了良好的鍛煉機(jī)會(huì),受益匪淺。
由于本人水平和經(jīng)驗(yàn)有限,在設(shè)計(jì)的過程中難免存在一些不足甚至一些錯(cuò)誤,敬請(qǐng)各位老師和同學(xué)批評(píng)指正。
最后,向我的指導(dǎo)教師李劍老師表示誠(chéng)摯的感謝,同時(shí),也向幫助過我的同學(xué)們表示感謝!
附錄
附錄A
元件清單:
元件
數(shù)量
AT89S52 單片機(jī)
1片
霍爾元件A44E
1個(gè)
鐵片感應(yīng)器TL-Q5MC
1個(gè)
1602LCD
1片
小車
1部
小磁鐵片
4片
發(fā)光二極管
2個(gè)
帶鎖按鈕
2個(gè)
不帶鎖按鈕
3個(gè)
12MHz晶振
1個(gè)
排阻510
1個(gè)
74ls00
2個(gè)
16位排線
1條
排針
若干
電阻
若干
電容
若干
導(dǎo)線
若干
附錄B
按照預(yù)定的功能,系統(tǒng)實(shí)現(xiàn)預(yù)定的功能的程序如下所示:
#include
#include
/********************************************************************************\
** 宏定義區(qū) **
\********************************************************************************/
/*------------------------------- LCD模塊 ------------------------------------*/
#define LCD_RW P2_6 //讀寫控制端
#define LCD_RS P2_7 //數(shù)據(jù)命令選擇端
#define LCD_E P2_5 //執(zhí)行使能端
#define LCD_Data P1 //P1口
#define Write 0x00 //低電平寫入
#define Read 0x01 //高電平讀出
#define Data 0x01 //高電平選擇數(shù)據(jù)
#define Cmd 0x00 //低電平選擇命令
#define Enable 0x00 //躍變到低電平時(shí)執(zhí)行命令
#define Disable 0x01
#define True 0x01
#define False 0x00
#define LCD_Init 0x38 //初始化模式
#define LCD_DispCtr 0x0C //開顯示及光標(biāo)設(shè)置
#define LCD_CloseCtr 0x08 //關(guān)顯示
#define LCD_CLS 0x01 //清屏幕
#define LCD_EnterSet 0x06 //顯示光標(biāo)
#define Busy P1_7 //忙信號(hào)
/*-------------------------- 測(cè)速/測(cè)距/測(cè)時(shí)模塊 -------------------------------*/
#define CircleLength 0.132 //小車轉(zhuǎn)一輪的長(zhǎng)度為.132m
/*-------------------------------- 控速模塊 -----------------------------------*/
#define P03 P0_3 //后電機(jī)
#define P04 P0_4 //后電機(jī)
#define P01 P0_1 //前電機(jī)
#define P02 P0_2 //前電機(jī)
#define P31 P0_5 //控制液晶背光
#define P33 P3_3
/*------------------------------ 菜單選擇模塊 ---------------------------------*/
#define Line 0x00 //0代表直線模式
#define Curve 0x01 //1代表S型模式
#define Normal 0x00 //0 代表正常速度
#define Low 0x01 //1 代表低速
#define High 0x02 //2 代表高速
/*********************************************************************************\
** 全局函數(shù)聲明區(qū) **
\*********************************************************************************/
/*------------------------------- LCD模塊 -------------------------------------*/
void LCDInit(void); //LCD初始化
void SetWriteCmd(void); //設(shè)置寫命令模式
void SetReadCmd(void); //設(shè)置讀命令模式
void SetWriteData(void); //設(shè)置寫數(shù)據(jù)模式
void WriteCmd(char cmd); //寫命令
void WriteData(char ddata); //寫數(shù)據(jù)
void ExecuteCmd(void); //執(zhí)行命令
void SetXY(char x,char y); //定位顯示地址
void DisplaySingleChar(char x,char y,char cchar); //顯示單個(gè)字符
void DisplayString(char x,char y,char *str); //顯示一段字符串
void Delay(unsigned int time); //延時(shí)主程序
void DelayUs(unsigned int time); //延時(shí)子程序
bit IsBusy(void); //判斷忙標(biāo)志函數(shù)
void DisplayTime(void); //顯示時(shí)間
void DisplayAVGSpeed(void); //顯示平均速度
void DisplayDistance(void); //顯示路程
/*-------------------------- 測(cè)速/測(cè)距/測(cè)時(shí)模塊 -------------------------------*/
void INTInit(void); //所有中斷初始化
void SpeedINT(void); //測(cè)速中斷
void ComputeTime(void);
void ComputeSpeedANDDistance(void); //計(jì)算速度和距離
/*-------------------------------- 控速模塊 -----------------------------------*/
void CtrSpeedINT(void); //控速中斷
void Time0INT(void);
void Time1INT(void); //控速單位時(shí)間中斷
void Clock0_Init(void); //時(shí)鐘中斷初始化
void Clock1_Init(void); //時(shí)鐘中斷初始化
void CtrSpeed(void);
/********************************************************************************\
** 全局變量區(qū) **
\********************************************************************************/
float SpeedCount = 0; //測(cè)速計(jì)數(shù)脈沖
float Speed = 0.0;
float Distance = 0.0;
char Time1INTCount=0; //T1中斷時(shí)間計(jì)時(shí)
float PassTime=0.00; //小車行走的時(shí)間
short IsT0INT=1;
bit IsT1INT; //判斷T1是否已經(jīng)響應(yīng)中斷
short IsT0INT2=1;
char Thx[5]={0xf4,0xf4,0xc5,0xf4,0xff}; //3ms,3ms,15ms,3ms
char Tlx[5]={0x48,0x48,0x68,0x48,0xff};
char Thx0=0xd8;
char Tlx0=0xf0;
char Thx1=0xb1; //20ms
char Tlx1=0xe0;
short Round=0;
short Back=0;
short Back0=0;
bit Backid;
bit Stop=0;
char Area0=0;
char Area1=0; //區(qū)域變量
char LowSpeedArea1StartTime;
char LowSpeedArea1EndTime;
char HighSpeedAreaEndTime;
char LowSpeedArea2EndTime;
char LowSpeedArea1PassTime=0; //第一個(gè)低速區(qū)通過時(shí)間
char HighSpeedAreaPassTime=0; //高速區(qū)通過時(shí)間
char LowSpeedArea2PassTime=0; //第二個(gè)低速區(qū)通過時(shí)間
char ReadyToGo=4; //倒計(jì)時(shí)
char flag;
bit Roundid=0;
char Nocurve=0;
char ChangeFlag;
char Mode;
bit Running;
bit SelectedAll; //模式和速度是否選擇完畢標(biāo)志
bit IsSelectingMode; //模式選擇標(biāo)志
bit IsSelectingSpeed; //速度選擇標(biāo)志
bit ModeSelected; //已經(jīng)被選擇的模式標(biāo)志
char SelectedMode=10; //模式選擇是否完畢標(biāo)志
bit Next; //Next鍵標(biāo)志
bit SpeedSelected; //已經(jīng)被選中的速度方案標(biāo)志
char SelectedSpeed; //速度選擇是否完畢標(biāo)志
bit ChoosingDisplay; //人工選擇菜單開始標(biāo)志
bit SelectedShow; //顯示選擇標(biāo)志
bit SelectedReturn; //返回選擇標(biāo)志
bit Selected; //確定/返回鍵選擇標(biāo)志
bit ReturnSelection; //返回鍵啟用標(biāo)志
bit AVGSpeedShow; //平均速度顯示標(biāo)志
bit TotalDistanceShow; //總路程顯示標(biāo)志
bit ReturnMain; //返回主菜單標(biāo)志
bit AutoDisplay; //自動(dòng)顯示標(biāo)志
bit GoToChoosingDisplay; //人工選擇標(biāo)志
bit AutoMode=0;
char PassLineID=0;
char PassLine=0;
float PrepareDistance;
float FirstDistance;
float SecondDistance;
float ThirdDistance;
int FirstHigh;
int SecondHigh;
int ThirdHigh;
float Rate=1.25; //5ms時(shí)的速度
float Count=4; //時(shí)間的倍數(shù)
/********************************************************************************\
** 全局函數(shù)實(shí)現(xiàn)區(qū) **
\********************************************************************************/
/*-------------------------------- 主函數(shù) ------------------------------------*/
void main()
{
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,"Designed By 202");
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,"Choose The Mode ");
DisplayString(0x0,1,"you want. ");
Delay(50);
WriteCmd(LCD_CLS);
IsSelectingMode=True;
while(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Line Mode ");
DisplayString(0x0,1,"Next Yes");
Delay(300); //延時(shí)消除抖動(dòng)
while (1) //不斷檢測(cè)中斷,直到按確定鍵或是NEXT鍵
{
if (Next==True) //如果按Next鍵則直接跳出
break;
if (ModeSelected==True) //如果按確定鍵則設(shè)置模式為L(zhǎng)ine并跳出
{
SelectedMode=Line;
break;
} //如果什么鍵都沒有按下,那么一直顯示等待
}
if (ModeSelected==True) //按下了確定鍵,退出模式選擇
{
IsSelectingMode=False;
break;
}
if (Next==True) //按下了Next鍵,顯示下一個(gè)菜單項(xiàng)
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Curve Mode ");
DisplayString(0x0,1,"Next Yes");
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,"Next Yes");
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," Now Choose a ");
DisplayString(0x0,1," kind of Speed ");
Delay(50);
WriteCmd(LCD_CLS);
IsSelectingSpeed=True;
while(1)
{
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Normal Speed ");
DisplayString(0x0,1,"Next Yes");
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," Low Speed ");
DisplayString(0x0,1,"Next Yes");
Delay(300); //延時(shí)消除抖動(dòng)
while(1)
{
if (Next==True) //如果再一次按下Next鍵,則跳出
break;
if (SpeedSelected==True) //如果按下確定鍵,則設(shè)置速度為L(zhǎng)ow,并跳出
{
SelectedSpeed=Low; //這里沒有速度設(shè)置,因?yàn)槟J(rèn)速度就是Low
break;
}
}
}
if (SpeedSelected==True) //按下了確定鍵,退出速度選擇
{
IsSelectingSpeed=False;
break;
}
if (Next==True)
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," High Speed ");
DisplayString(0x0,1,"Next Yes");
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
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,"Choosen Mode is ");
DisplayString(0x0,1," Line ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Curve)
{
DisplayString(0x0,0,"Choosen Mode is ");
DisplayString(0x0,1," Curve ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (AutoMode==1)
{
DisplayString(0x0,0,"Choosen Mode is ");
DisplayString(0x0,1," AutoMode ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedMode==Line)
{
if (SelectedSpeed==Normal)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Normal ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==Low)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," Low ");
Delay(50);
WriteCmd(LCD_CLS);
}
if (SelectedSpeed==High)
{
DisplayString(0x0,0,"Choosen Speed is");
DisplayString(0x0,1," High ");
Delay(50);
WriteCmd(LCD_CLS);
}
}
INTInit(); //初始化所有中斷
DisplayString(0x0,0,"Left Times To Go");
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,"Designed by 202");
if (SelectedMode==Line&&AutoMode==0)
flag=Area0;
else
flag=1;
while(flag<5)
{
if(AutoMode==1) //自動(dòng)模式
{
switch(PassLineID)
{
case 0 :{
if(IsT0INT==1)
{P01=P02=P04=0;P03=1;}
else
{P01=P02=P03=P04=0;}
}break;
case 1 :{
P01=P02=P03=0;P04=1;
}break;
case 2 :{
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