基于單片機的多功能智能小車設計論文,基于,單片機,多功能,智能,小車,設計,論文
畢業(yè)設計(論文)
課 題 名 稱 基于單片機智能小車設計
學 生 姓 名
學 號
系、年級專業(yè) 信息工程系08電子科學與技術
指 導 教 師
職 稱 講師
2012年5月13日
53
摘要
智能作為現(xiàn)代的新發(fā)明,是以后的發(fā)展方向,他可以按照預先設定的模式在一個環(huán)境里自動的運作,不需要人為的管理,可應用于科學勘探等等的用途。智能電動車就是其中的一個體現(xiàn)。本次設計的簡易智能電動車,采用AT89S52單片機作為小車的檢測和控制核心;采用金屬感應器TL-Q5MC來檢測路上感應到的鐵片,從而把反饋到的信號送單片機,使單片機按照預定的工作模式控制小車在各區(qū)域按預定的速度行駛,并且單片機選擇的工作模式不同也可控制小車順著S形鐵片行駛;采用霍爾元件A44E檢測小車行駛速度;采用1602LCD實時顯示小車行駛的時間,小車停止行駛后,輪流顯示小車行駛時間、行駛距離、平均速度以及各速度區(qū)行駛的時間。本設計結構簡單,較容易實現(xiàn),但具有高度的智能化、人性化,一定程度體現(xiàn)了智能。
關鍵詞:智能車;AT89S52;單片機 ;金屬感應器;霍爾元件;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章 設計任務 1
1.1 要求 1
第二章 方案比較與選擇 2
2.1路面檢測模塊 2
2.2 LCD顯示模塊 3
2.3測速模塊 3
2.4控速模塊 3
2.5模式選擇模塊 4
第3章 程序框圖 5
第4章 系統(tǒng)的具體設計與實現(xiàn) 7
4.1路面檢測模塊 7
4.2 LCD顯示模塊 7
4.3測速模塊 7
4.4控速模塊 7
4.5復位電路模塊 7
4.6模式選擇模塊 8
第5章 最小系統(tǒng)圖 8
第6章 最終PCB板圖 10
總結 12
參考文獻 13
致謝 14
附錄 15
1 設計任務
設計并制作了一個智能電動車,其行駛路線滿足所需的要求。
1.1 要求
1.1.1 基本要求
(1)分區(qū)控制:
如(圖1)所示:
1.1
車輛從起跑線出發(fā)(出發(fā)前,車體不得超出起跑線)。在第一個路程C~D區(qū)(3~6米)以低速行駛,通過時間不低于10s;第二個路程D~E區(qū)(2米)以高速行駛,通過時間不得多于4秒;第三個路程E~F區(qū)(3~6米)以低速行駛,通過時間不低于10s。
(2)小車能自動記錄、顯示行駛時間、行駛距離以及行駛速度,還能記錄每段所走的時間,從而判斷是否符合課程設計要求。(記錄顯示裝置要求安裝在車上)。
1.1.2 發(fā)揮部分
S型控制:如(圖2)所示:
(圖2)
車輛沿著S形鐵片行駛,自動轉彎,自動尋找正確方向和鐵片。當離開S型鐵片跑道或者感應不到鐵片一段時間的時候,小車自動停止,并記錄行駛時間,路程,平均速度并通過LCD顯示出來。
第2章 方案比較與選擇
根據(jù)設計任務要求,并且根據(jù)我們自己的需要而附加的功能,該電路的總體框圖可分為幾個基本的模塊,框圖如(圖3)所示:
(圖3)
2.1 路面檢測模塊
采用鐵片感應器TL-Q5MC來檢測路面上的鐵片從而給單片機中斷脈沖。原理圖接線如(圖4)所示:
(圖4)
2.2 LCD顯示模塊
采用1602LCD,由單片機的總線模式連接。為節(jié)約電源電量并且不影響LCD的功能,LCD的背光用單片機進行控制,使LCD的背光在小車行駛的過程中不亮,因為我們不必看其顯示;在其它我們需要看顯示的內容的時候LCD背光亮。
2.3 測速模塊
2.3.1 方案1
采用采用霍爾開關元器件A44E檢測輪子上的小磁鐵從而給單片機中斷脈沖,達到測量速度的作用?;魻栐哂畜w積小,頻率響應寬度大,動態(tài)特性好,對外圍電路要求簡單,使用壽命長,價格低廉等特點,電源要求不高,安裝也較為方便。霍爾開關只對一定強度的磁場起作用,抗干擾能力強,因此可以在車輪上安裝小磁鐵,而將霍爾器件安裝在固定軸上,通過對脈沖的計數(shù)進行車速測量。
2.3.2 方案2
采用紅外傳感器進行測速。但無論是反射式紅外傳感器還是對射式紅外傳感器,他們對都對外圍環(huán)境要求較高,易受外部環(huán)境的影響,穩(wěn)定性不高,且價格較為昂貴。
通過對方案1、方案2的比較其優(yōu)缺點,綜合多方面因素決定選用方案1,其原理圖接線如(圖5)所示:
(圖5)
2.4 控速模塊:
2.4.1 方案1
使用功率三極管作為功率放大器的輸出控制直流電機。線性型驅動的電路結構和原理簡單,成本低,加速能力強,但功率損耗大,特別是低速大轉距運行時,通過電阻R的電流大,發(fā)熱厲害,損耗大,對于小車的長時間運行不利。
2.4.2 方案2
采用繼電器對電動機的開或關進行控制,通過開關的切換對小車的速度進行調整.此方案的優(yōu)點是電路較為簡單,缺點是繼電器的響應時間慢,易損壞,壽命較短,可靠性不高。
2.4.3 方案3
采用由雙極性管組成的H橋電路。用單片機控制晶體管使之工作在占空比可調的開關狀態(tài),精確調整電機轉速。這種電路由于工作在管子的飽和截止模式下,效率非常高;H橋電路保證了可以簡單地實現(xiàn)轉速和方向的控制;電子開關的速度很快,穩(wěn)定性也很高,是一種廣泛采用的調速技術。
綜合3種方案的優(yōu)缺點,決定選擇方案3,其電路原理圖如(圖6)所示:
(圖6)
2.5 模式選擇模塊
模式選擇模塊通過一個74LS00與非門和兩個不帶鎖按鈕來控制單片機單片機的兩個中斷口,從而按動按鈕來選擇小車走動的路型、來選擇小車的速度是快速、中速、慢速;走完路程小車停止后還可以通過按鈕選擇想要在LCD上想看的信息,比如總時間、走過各段路程的時間、平均速度、總路程等。
小車走動的模式選擇有:
(1) 直線型:滿足設計任務的基本要求,能穩(wěn)定的走完全程。之后按順序循環(huán)不斷的顯示走完全程所用的時間、走完高速區(qū)所用的時間和走完低速區(qū)所用的時間這三個時間;或者可以通過兩個按鈕以及LCD顯示的菜單選擇所要看的內容如平均速度、全程距離以及那三個時間。
(2) S型:滿足設計任務的發(fā)揮部分的要求,小車能自動的感應到在前面或在后面鐵片,即第一次轉彎后若感應到的是錯誤的方向,則小車會后退自動調整方向,沿著S型的鐵片走。當走完S型鐵片后的一定時間里,小車自動停止。之后自動進入菜單由我們自己選擇要看的內容時間、平均速度和所走的距離。
(3)自動型:小車先以一定的速度走完全程,之后再以一定的速度倒退回起點,再調整速度在一定的時間內走完全程。走完后LCD顯示的內容與直線型顯示的內容一樣。
第3章 程序框圖:
單片機主程序框圖、速度感應程序框圖和鐵片感應程序框圖分別如(圖7)所示。
(圖7)
第4章 系統(tǒng)的硬件設計與實現(xiàn)
4.1 路面檢測模塊
應用一個金屬感應器,安裝在車盤下,離地略小于或約四毫米。當金屬傳感器檢測到鐵片時將對單片機發(fā)送中斷信號,單片機運行中斷,改變輸給電機驅動信號的電壓占空比來控制小車的速度。
4.2 LCD顯示模塊
采用1602LCD,由單片機的總線模式連接。為節(jié)約電源,LCD的背光用單片機進行控制。
4.3 測速模塊
通過霍爾元件感應磁鐵來產(chǎn)生脈沖(當霍爾元件在離磁場較近時輸出會是高電平,其它時候是低電平),一個車輪均勻放四個小磁鐵,計算一秒所得的脈沖數(shù),從而計算出一秒小車輪子轉動圈數(shù),再測量出小車車輪周長即可計算出小車當前速度,累加可得到當前路程。
4.4 控速模塊
考慮到元器件的缺少以及我們所用的電路的驅動電機的電路原理圖和和小車自帶的電路的電機驅動原理圖一樣,所以暫時使用小車自帶的電機驅動電路圖。
4.5 復位電路模塊
單片機的復位電路通過手動來實現(xiàn),復位電路圖如(圖8)所示。
(圖8)
4.6 模式選擇模塊:
兩個中斷口使用和感應鐵片、感應速度所使用的中斷口一樣,通過一個與非門和按鈕控制。原理圖如(圖9)所示:
(圖9)
第5章 最小系統(tǒng)圖
該系統(tǒng)主要用到的是單片機,所以主要的部分是最小系統(tǒng)圖,該最小系統(tǒng)圖如(圖10)所示:
第6章 系統(tǒng)調試與仿真
該最小系統(tǒng)的最終PCB板圖(包括LCD接口以及其他的外部擴展電路部分,考慮到最小系統(tǒng)的簡潔以及容易看懂,外部擴展電路不在最小系統(tǒng)圖上顯示。)分別如(圖11)、(圖12)所示:
(圖11)
(圖12)
總結
在本次設計中,我學到了很多沒有接觸到的電子知識,使我的知識有了進一步提升,這次的畢業(yè)設計,對我今后參加工作是受益匪淺的,特別是老師們的精心指導,以及同學們的耐心幫助,讓我覺得做畢業(yè)設計是一件可遇而不可求的事情,我也希望,在我今后的工作中能發(fā)揚我們在學校做畢業(yè)設計的這種精神,能互相幫助,做事能細心細致,在此,我也感謝李劍老師以及實驗室的老師在設計中對我們的指導和幫助,十分感謝!
參考文獻
[1]胡乾斌等.單片微型計算機原理與應用.華中科技大學出版社.
[2]閻石.數(shù)字電子技術基礎(第五版).北京.高等教育出版社.2006.
[3] 皮大熊等.單片機課程設計實例指導,北京,北京理工大學出版社,2010.
[4]沈紅衛(wèi).單片機應用系統(tǒng)設計實例與分析,北京:北京航空航天大學出版社.2003
[5] 姜志海,黃玉清,劉連鑫.單片機原理及應用.電子工業(yè)出版社.
[6]樓然苗,李光飛.51系列單片機設計實例[M].北京航空航天大學出版社,2003.
[7]余家春.Protel 99 SE電路設計實用教程[M].中國鐵道出版社,2004.
[8]王為青.單片機Keil Cx51應用開發(fā)技術.人民郵電出版社,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] 胡漢才 單片機原理及其接口技術[M]清華大學出版社,2000年
[13] 曹琳琳 單片機原理及其接口技術[M]北京 國防科技大學出版社,2000年
[14] 許惠民 單片微型計算機原理、接口及應用[M]北京 北京郵電出版社,2000年
[15] 康華光 電子技術基礎[M]北京 高等教育出版社,2001年
[16] 孫傳友 測控電路及裝置 北京航空航天出版社,2002年
[17] 華成英 童詩白 模擬電子技術基礎 第四版 高等教育出版社 2006年
[18] Maxim.DS1629 data release book[Z].2002.
致謝
經(jīng)過三個月的學習和試驗,終于完成了我的畢業(yè)設計??粗约盒燎诘某晒?,心里非常高興。在這期間遇到了很多從來都沒有遇到過的問題,但是通過自己的努力和老師、同學的幫助最后把它們一一解決了。其中在李劍老師的精心安排和指導下,對題目有了較深入的理解,也嘗到了電路系統(tǒng)設計的艱辛。在本次設計中我在各個環(huán)節(jié)中都做到了深入實際,動手實踐,不僅對我們學過的理論知識進行了一次全面的復習和鞏固,而且還在電子電路、單片機等方面拓展了我們的知識面,為將來的實際工作打下良好的基礎,特別是在分析問題,解決問題的方面得到了良好的鍛煉機會,受益匪淺。
由于本人水平和經(jīng)驗有限,在設計的過程中難免存在一些不足甚至一些錯誤,敬請各位老師和同學批評指正。
最后,向我的指導教師李劍老師表示誠摯的感謝,同時,也向幫助過我的同學們表示感謝!
附錄
附錄A
元件清單:
元件
數(shù)量
AT89S52 單片機
1片
霍爾元件A44E
1個
鐵片感應器TL-Q5MC
1個
1602LCD
1片
小車
1部
小磁鐵片
4片
發(fā)光二極管
2個
帶鎖按鈕
2個
不帶鎖按鈕
3個
12MHz晶振
1個
排阻510
1個
74ls00
2個
16位排線
1條
排針
若干
電阻
若干
電容
若干
導線
若干
附錄B
按照預定的功能,系統(tǒng)實現(xiàn)預定的功能的程序如下所示:
#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 //躍變到低電平時執(zhí)行命令
#define Disable 0x01
#define True 0x01
#define False 0x00
#define LCD_Init 0x38 //初始化模式
#define LCD_DispCtr 0x0C //開顯示及光標設置
#define LCD_CloseCtr 0x08 //關顯示
#define LCD_CLS 0x01 //清屏幕
#define LCD_EnterSet 0x06 //顯示光標
#define Busy P1_7 //忙信號
/*-------------------------- 測速/測距/測時模塊 -------------------------------*/
#define CircleLength 0.132 //小車轉一輪的長度為.132m
/*-------------------------------- 控速模塊 -----------------------------------*/
#define P03 P0_3 //后電機
#define P04 P0_4 //后電機
#define P01 P0_1 //前電機
#define P02 P0_2 //前電機
#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); //設置寫命令模式
void SetReadCmd(void); //設置讀命令模式
void SetWriteData(void); //設置寫數(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); //顯示單個字符
void DisplayString(char x,char y,char *str); //顯示一段字符串
void Delay(unsigned int time); //延時主程序
void DelayUs(unsigned int time); //延時子程序
bit IsBusy(void); //判斷忙標志函數(shù)
void DisplayTime(void); //顯示時間
void DisplayAVGSpeed(void); //顯示平均速度
void DisplayDistance(void); //顯示路程
/*-------------------------- 測速/測距/測時模塊 -------------------------------*/
void INTInit(void); //所有中斷初始化
void SpeedINT(void); //測速中斷
void ComputeTime(void);
void ComputeSpeedANDDistance(void); //計算速度和距離
/*-------------------------------- 控速模塊 -----------------------------------*/
void CtrSpeedINT(void); //控速中斷
void Time0INT(void);
void Time1INT(void); //控速單位時間中斷
void Clock0_Init(void); //時鐘中斷初始化
void Clock1_Init(void); //時鐘中斷初始化
void CtrSpeed(void);
/********************************************************************************\
** 全局變量區(qū) **
\********************************************************************************/
float SpeedCount = 0; //測速計數(shù)脈沖
float Speed = 0.0;
float Distance = 0.0;
char Time1INTCount=0; //T1中斷時間計時
float PassTime=0.00; //小車行走的時間
short IsT0INT=1;
bit IsT1INT; //判斷T1是否已經(jī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; //第一個低速區(qū)通過時間
char HighSpeedAreaPassTime=0; //高速區(qū)通過時間
char LowSpeedArea2PassTime=0; //第二個低速區(qū)通過時間
char ReadyToGo=4; //倒計時
char flag;
bit Roundid=0;
char Nocurve=0;
char ChangeFlag;
char Mode;
bit Running;
bit SelectedAll; //模式和速度是否選擇完畢標志
bit IsSelectingMode; //模式選擇標志
bit IsSelectingSpeed; //速度選擇標志
bit ModeSelected; //已經(jīng)被選擇的模式標志
char SelectedMode=10; //模式選擇是否完畢標志
bit Next; //Next鍵標志
bit SpeedSelected; //已經(jīng)被選中的速度方案標志
char SelectedSpeed; //速度選擇是否完畢標志
bit ChoosingDisplay; //人工選擇菜單開始標志
bit SelectedShow; //顯示選擇標志
bit SelectedReturn; //返回選擇標志
bit Selected; //確定/返回鍵選擇標志
bit ReturnSelection; //返回鍵啟用標志
bit AVGSpeedShow; //平均速度顯示標志
bit TotalDistanceShow; //總路程顯示標志
bit ReturnMain; //返回主菜單標志
bit AutoDisplay; //自動顯示標志
bit GoToChoosingDisplay; //人工選擇標志
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時的速度
float Count=4; //時間的倍數(shù)
/********************************************************************************\
** 全局函數(shù)實現(xiàn)區(qū) **
\********************************************************************************/
/*-------------------------------- 主函數(shù) ------------------------------------*/
void main()
{
P01=0;
P02=0;
P03=0;
P04=0;
P31=1; //單片機復位,背光開
Delay(40); //延時等待LCD啟動
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); //延時消除抖動
while (1) //不斷檢測中斷,直到按確定鍵或是NEXT鍵
{
if (Next==True) //如果按Next鍵則直接跳出
break;
if (ModeSelected==True) //如果按確定鍵則設置模式為Line并跳出
{
SelectedMode=Line;
break;
} //如果什么鍵都沒有按下,那么一直顯示等待
}
if (ModeSelected==True) //按下了確定鍵,退出模式選擇
{
IsSelectingMode=False;
break;
}
if (Next==True) //按下了Next鍵,顯示下一個菜單項
{
Next=False;
WriteCmd(LCD_CLS);
DisplayString(0x0,0," Curve Mode ");
DisplayString(0x0,1,"Next Yes");
Delay(300); //延時消除抖動
while(1) //不斷檢測中斷,直到按確定鍵或是Next鍵
{
if (Next==True) //如果再一次按下Next鍵,則跳出
break;
if (ModeSelected==True) //如果按下確定鍵,則設置模式為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); //延時消除抖動
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); //延時消除抖動
while(1)
{
if (Next==True) //如果按Next鍵則直接跳出
break;
if (SpeedSelected==True) //如果按確定鍵則設置速度為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); //延時消除抖動
while(1)
{
if (Next==True) //如果再一次按下Next鍵,則跳出
break;
if (SpeedSelected==True) //如果按下確定鍵,則設置速度為Low,并跳出
{
SelectedSpeed=Low; //這里沒有速度設置,因為默認速度就是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); //延時消除抖動
while(1)
{
if (Next==True) //如果再一次按下Next鍵,則跳出
break;
if (SpeedSelected==True) //如果按下確定鍵,則設置速度為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; //標志模式選擇和速度選擇完畢
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) //自動模式
{
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