機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第1頁(yè)
機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第2頁(yè)
機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第3頁(yè)
機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第4頁(yè)
機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第5頁(yè)
已閱讀5頁(yè),還剩161頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第7章軟件設(shè)計(jì)技術(shù)7.1軟件的總體功能第7章軟件設(shè)計(jì)技術(shù)7.1軟件的總體功能2

軟件運(yùn)行于微處理器,其功能由微處理器來(lái)決定。微處理器功能由系統(tǒng)的功能結(jié)構(gòu)、與微處理器相連的三個(gè)子系統(tǒng)和控制算法所決定。這些功能也可以分成兩部分:控制算法功能和一般控制功能2

軟件運(yùn)行于微處理器,其功能由微處理器來(lái)決定。3軟件功能的實(shí)時(shí)性意義:強(qiáng)調(diào)在規(guī)定的時(shí)間里執(zhí)行相應(yīng)的操作,誤時(shí)操作會(huì)導(dǎo)致嚴(yán)重的后果。軟件的實(shí)時(shí)性要滿足兩方面的要求:一是實(shí)時(shí)動(dòng)作響應(yīng)。二是實(shí)時(shí)數(shù)據(jù)處理。3軟件功能的實(shí)時(shí)性意義:強(qiáng)調(diào)在規(guī)定的時(shí)間里執(zhí)行相應(yīng)的操作47.2機(jī)電一體化系統(tǒng)軟件的任務(wù)和任務(wù)管理為了便于分析和編程,把各種軟件功能化分為小的、單元式的子功能。軟件功能是由子功能某種方式組合在一起的。由此,從學(xué)術(shù)的角度,把子功能提練為任務(wù)(類(lèi)似:進(jìn)程),軟件功能就是任務(wù)的組合。軟件的編程就包含兩個(gè)技術(shù),任務(wù)的編程和任務(wù)的管理。47.2機(jī)電一體化系統(tǒng)軟件的任務(wù)和任務(wù)管理為了便于分析和編5任務(wù)的劃分原則1.每個(gè)任務(wù)必須是獨(dú)立的;2每個(gè)任務(wù)不再可分;3所有任務(wù)的集合能滿足整個(gè)系統(tǒng)的功能要求。4劃分得到的任務(wù)常常按程序運(yùn)行方式來(lái)加以分類(lèi)描述,如驅(qū)動(dòng)程序、初始化程序、中斷程序、控制算法程序、顯示程序和鍵盤(pán)(或觸摸)輸入程序等。5還可以按分層結(jié)構(gòu)來(lái)理解。5任務(wù)的劃分原則1.每個(gè)任務(wù)必須是獨(dú)立的;6基于任務(wù)的編程方法1前后臺(tái)編程方法:如果編程人員將全部程序都自行編制,即把任務(wù)和任務(wù)的管理看做后臺(tái)程序,中斷處理看做前臺(tái)程序,就是前后臺(tái)程序編程方法。這是初級(jí)的、然而應(yīng)用很多的編程方法。2.操作系統(tǒng)編程方法:如果任務(wù)的管理有通用的、現(xiàn)成的程序,即操作系統(tǒng),而編程人員只編制任務(wù)程序,就稱(chēng)為操作系統(tǒng)編程方法。但是有時(shí)也需要編寫(xiě)驅(qū)動(dòng)程序。

6基于任務(wù)的編程方法1前后臺(tái)編程方法:如果編程人員將全7

3.設(shè)定式編程方法:這是一種近幾年剛剛出現(xiàn)的編程方法,如聯(lián)發(fā)科技推出的MTK平臺(tái)的軟件編程方法。任務(wù)和任務(wù)的管理均已完成,方便地提供給了開(kāi)發(fā)人員。設(shè)定式編程方法編程簡(jiǎn)單、節(jié)省開(kāi)發(fā)時(shí)間、程序系統(tǒng)穩(wěn)定可靠和功能強(qiáng)大,是今后程序編制方法的發(fā)展方向。7

3.設(shè)定式編程方法:這是一種近幾年剛剛出現(xiàn)的編程方法,如7.3機(jī)電一體化系統(tǒng)的程序設(shè)計(jì)方法7.3.1程序設(shè)計(jì)方法7.3機(jī)電一體化系統(tǒng)的程序設(shè)計(jì)方法7.3.1程序設(shè)計(jì)91.確定程序功能:根據(jù)控制系統(tǒng)設(shè)計(jì)方案確定控制軟件功能,根據(jù)系統(tǒng)的功能結(jié)構(gòu)確定前面沒(méi)有提到的其它軟件功能。

2.劃分任務(wù):將各類(lèi)軟件功能劃分成具體的任務(wù)。3.確定軟件編程要素:任務(wù)的組合方式和編程方法—使用和前邊類(lèi)似的產(chǎn)生和選擇方法。(產(chǎn)生與選擇)91.確定程序功能:根據(jù)控制系統(tǒng)設(shè)計(jì)方案確定控制軟件功能,根107.3.2模塊化編程技術(shù)應(yīng)用領(lǐng)域:?jiǎn)纹瑱C(jī)、操作系統(tǒng)和S7-300分成不同的程序,即不同的模塊由單獨(dú)的程序(頭文件)組合到一起。有全局變量問(wèn)題優(yōu)點(diǎn):模塊不用更改,結(jié)構(gòu)清晰區(qū)分:子程序在一個(gè)程序。107.3.2模塊化編程技術(shù)應(yīng)用領(lǐng)域:?jiǎn)纹瑱C(jī)、操作系統(tǒng)和S7.3.3運(yùn)水機(jī)器人編程實(shí)例1軟件功能7.3.3運(yùn)水機(jī)器人編程實(shí)例1軟件功能12運(yùn)水機(jī)器人功能結(jié)構(gòu)(用文字簡(jiǎn)單敘述)主要事件是將水裝入容器、微處理器控制電機(jī)驅(qū)動(dòng)輪式行走機(jī)構(gòu)運(yùn)輸容器和從容器卸水。使用鋰電池作為能源輸入,分別為驅(qū)動(dòng)電機(jī)和電控部分提供電能,有克服摩擦力和電氣部件能耗等能量損失。有循跡和開(kāi)關(guān)機(jī)等輸入信號(hào)送微處理器處理,顯示水量和時(shí)間等。12運(yùn)水機(jī)器人功能結(jié)構(gòu)(用文字簡(jiǎn)單敘述)主要事件是將水裝入13外圍部件軟件功能使用C8051F020單片機(jī)。控制16×2字符點(diǎn)陣液晶顯示器顯示水容量和運(yùn)水時(shí)間。以PWM方式控制電機(jī)驅(qū)動(dòng)芯片L298N驅(qū)動(dòng)兩路直流減速電機(jī),以開(kāi)關(guān)方式控制微型繼電器卸水。對(duì)循跡開(kāi)關(guān)信號(hào)進(jìn)行采集。13外圍部件軟件功能使用C8051F020單片機(jī)??刂?614控制算法功能對(duì)運(yùn)水機(jī)器人行走軌跡進(jìn)行閉環(huán)控制,采用比例(P)調(diào)節(jié)。14控制算法功能對(duì)運(yùn)水機(jī)器人行走軌跡進(jìn)行閉環(huán)控制,采用比例15任務(wù)劃分任務(wù)劃分為:初始化配置(config),延時(shí)(delay1ms),PCA初始化(PCA_Init),產(chǎn)生PWM脈寬調(diào)制的兩個(gè)任務(wù)(PWM0_set、PWM1_set),電機(jī)正反轉(zhuǎn)及速度的控制的六個(gè)任務(wù)(L_FORD、R_FORD、L_BACK、R_BACK、L_BREAK、R_BREAK),八路尋跡(Founding_Line),給lcd送命令(sendc),給lcd送數(shù)據(jù)(sendd),顯示地址定位函數(shù)(lcd_pos),lcd初始化函數(shù)(lcd_ini),第一次水量顯示(lcddisplay1),第二次水量顯示(lcddisplay2),顯示時(shí)間(lcddisplay3)。15任務(wù)劃分任務(wù)劃分為:初始化配置(config),延時(shí)(16任務(wù)的組合在八路尋跡(Founding_Line)中根據(jù)取入的八路傳感數(shù)字信號(hào)調(diào)用產(chǎn)生PWM脈寬調(diào)制的兩個(gè)任務(wù)(PWM0_set、PWM1_set)和電機(jī)正反轉(zhuǎn)及速度的控制的六個(gè)任務(wù)(L_FORD、R_FORD、L_BACK、R_BACK、L_BREAK、R_BREAK),并按控制問(wèn)題的要求調(diào)用第一次水量顯示(lcddisplay1)、第二次水量顯示(lcddisplay2)和顯示時(shí)間(lcddisplay3)。16任務(wù)的組合在八路尋跡(Founding_Line)中根17

第一次水量顯示(lcddisplay1)、第二次水量顯示(lcddisplay2)和顯示時(shí)間(lcddisplay3)中使用給lcd送命令(sendc)、給lcd送數(shù)據(jù)(sendd)和顯示地址定位函數(shù)(lcd_pos)。加入延時(shí)(delay1ms)以保證外圍部件的響應(yīng)。任務(wù)管理進(jìn)行初始化配置(config)、PCA初始化(PCA_Init)、電機(jī)正轉(zhuǎn)(L_FORD、R_FORD)和調(diào)用八路尋跡(Founding_Line)。17

第一次水量顯示(lcddisplay1)、第二次水量18編程方法使用前后臺(tái)編程方法。18編程方法使用前后臺(tái)編程方法。195.具體編程(1)資源分配P0^0——電機(jī)1PWM輸出左輪P0^1——電機(jī)2PWM輸出右輪L_DIR1A=P2^2——左輪電機(jī)方向控制L_DIR1B=P2^1——左輪電機(jī)方向控制R_DIR1A=P2^5——右輪電機(jī)方向控制R_DIR1B=P2^6——右輪電機(jī)方向控制195.具體編程(1)資源分配P0^0——電機(jī)1PWM輸20

P1^0--水泵控制P1^1—蜂鳴器控制PCA0CPM0——電機(jī)1PWM輸出,工作在8位定時(shí)器模式,允許比較器匹配中斷,每次中斷加載新的比較值,實(shí)現(xiàn)電機(jī)輸出的脈寬控制。PCA0CPM1——電機(jī)2PWM輸出,工作在8位定時(shí)器模式,允許比較器匹配中斷,每次中斷加載新的比較值,實(shí)現(xiàn)電機(jī)輸出的脈寬控制。P6.0-P6.7;傳感器接口lcdrw=P3^2;--讀寫(xiě)控制5lcdcs=P3^7;--E使能6lcdrs=P3^6;--命令數(shù)據(jù)選擇控制4 20

P1^0--水泵控制21傳感器規(guī)定前四個(gè)傳感器在低四位,后四個(gè)傳感器在高四位左右各兩個(gè)傳感器不壓黑線為低電平頭:低四位尾:高四位21傳感器規(guī)定前四個(gè)傳感器在低四位,后四個(gè)傳感器在高四位頭:22記錄行走情況遇垂直黑線次數(shù):intfb=0微偏:0100/0010中偏:1100/0011大偏:1000/000122記錄行走情況遇垂直黑線次數(shù):intfb=023(2)引用與定義#include<c8051f020.h>#include<stdio.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedlongulong;typedefunsignedintuint;#defineL_MOTO_BREAKL_DIR1A=L_DIR1B#defineL_MOTO_BACKL_DIR1A=0;L_DIR1B=1#defineL_MOTO_FORDL_DIR1A=1;L_DIR1B=0#defineR_MOTO_BREAKR_DIR1A=R_DIR1B#defineR_MOTO_BACKR_DIR1A=0;R_DIR1B=1#defineR_MOTO_FORDR_DIR1A=1;R_DIR1B=023(2)引用與定義#include<c8051f020.24

sbitL_DIR1A=P2^2;sbitL_DIR1B=P2^1;sbitR_DIR1A=P2^5;sbitR_DIR1B=P2^6;sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;24

sbitL_DIR1A=P2^2;25

intfb=0;//控制前后方向sbitlcdrw=P3^2;//5sbitlcdcs=P3^7;//6sbitlcdrs=P3^6;//4voidlcddisplay3(void);voidlcddisplay1(void);voidlcddisplay2(void);25

intfb=0;//控制前后方向26

此部分包括頭文件的定義、宏定義、位定義等,例如定義#defineL_MOTO_BREAKL_DIR1A=L_DIR1B,即表示在程序中以L_MOTO_BREAK來(lái)表示L_DIR1A=L_DIR1B;L_DIR1A代表P2^2口,表示左輪電機(jī)方向的控制;L_DIR1B代表P2^1口,亦表示左輪電機(jī)方向控制;當(dāng)L_DIR1A=L_DIR1B,即L_DIR1A與L_DIR1B都為1或都為0時(shí),即以L_MOTO_BREAK來(lái)表示。下面還有液晶顯示屏的I/O配置以及液晶顯示屏的顯示等。

26

此部分包括頭文件的定義、宏定義、位定義等,例如定義#d27(3)初始化配置,以保證單片機(jī)控制功能工作voidconfig(void){ WDTCN=0x07; WDTCN=0xde; //看門(mén)狗禁止

WDTCN=0xad; //看門(mén)狗禁止

XBR0=0x50; //配置交叉開(kāi)關(guān),

XBR1=0x00; XBR2=0x40; //交叉開(kāi)關(guān)允許

P0MDOUT=0x00;//p0.4~p0.5為推挽輸出27(3)初始化配置,以保證單片機(jī)控制功能工作voidc28

P1MDOUT=0xff;P2MDOUT=0xff; P3MDOUT=0xFF; P74OUT=0x00; //p4--p6 P6=0xff;OSCXCN=0x00; OSCICN=0x16; //采用內(nèi)部晶振,頻率為8MHZ}28

P1MDOUT=0xff;29

此部分主要進(jìn)行初始化配置,以保證單片機(jī)的控制功能

WDTCN即為看門(mén)狗定時(shí)器控制寄存器,此處通過(guò)WDTCN各位的設(shè)置使看門(mén)狗禁止

XBR0、XBR1、XBR2 是用來(lái)配置交叉開(kāi)關(guān)的特殊功能寄存器。XBR0=0x50即把XBR0的位6和位4置1,表示PCA0外部計(jì)數(shù)器輸入連接端口引腳及CEX0和CEX1鏈接兩個(gè)端口引腳;XBR1=0x00表示此特殊功能寄存器各位全置0,即各使能位不連接端口引腳;XBR2=0x40表示位6置1,即交叉開(kāi)關(guān)使能。

29

此部分主要進(jìn)行初始化配置,以保證單片機(jī)的控制功能30

P0MDOUT是端口0輸出方式寄存器,P0MDOUT=0x00表示端口引腳的輸出方式為漏極開(kāi)路方式。P1MDOUT、P2MDOUT、P2MDOUT分別是端口1、2、3輸出方式寄存器,各端口設(shè)置為0xff表示端口引腳的輸出方式為推挽方式。P74OUT是端口4~7的輸出方式寄存器,各位置0即表示輸出方式配置為漏極開(kāi)路輸出方式此處表示采用內(nèi)部振蕩器作為系統(tǒng)時(shí)鐘,OSCICN=0x16表示對(duì)內(nèi)部振蕩器使能,并使內(nèi)部振蕩器典型頻率為8MHZ。30

P0MDOUT是端口0輸出方式寄存器,P0MDOUT=31(4)延時(shí)

voiddelay1ms(uinttime){//延遲子程序0.5MS uintii; uintjj; for(ii=0;ii<time;ii++) {for(jj=0;jj<4000;jj++) ; }}31(4)延時(shí)

voiddelay1ms(uintt32(5)PCA初始化voidPCA_Init(){PCA0MD=0x08;//PCA采用系統(tǒng)時(shí)鐘,且PCA溢出中斷禁止

PCA0CN=0x40;//啟動(dòng)PCA計(jì)數(shù)器}voidPCA0_Init(){PCA0CPM0=0x42;//CEX0為8位PWM輸出模式

PCA0CPM1=0x42;//CEX1為8bitPWM輸出模式

}32(5)PCA初始化voidPCA_Init(){33

此部分即表示對(duì)PCA進(jìn)行初始化PCA0MD即為C8051F020內(nèi)部集成的可編程技術(shù)陣列PCA0的方式選擇寄存器,PCA0MD=0x08即表示選擇系統(tǒng)時(shí)鐘作為計(jì)數(shù)脈沖源且PCA0定時(shí)器/計(jì)數(shù)器溢出中斷禁止。PCA0CN即為PCA控制寄存器,PCA0CN=0x40表示允許PCA0定時(shí)器/計(jì)數(shù)器。PCA0CPMn表示PCA0捕捉/比較寄存器,PCA0CPMn=0x42表示比較器允許,并使用8位PWM輸出方式33

此部分即表示對(duì)PCA進(jìn)行初始化34(6)產(chǎn)生PWM脈寬調(diào)制voidPWM0_set(ucharval){ //高電平占空比為val/256 PCA0CPH0=~val+1;}voidPWM1_set(ucharval){ //高電平占空比為val/256 PCA0CPH1=~val+1;}34(6)產(chǎn)生PWM脈寬調(diào)制voidPWM0_set35

此部分用來(lái)產(chǎn)生PWM脈寬調(diào)制此語(yǔ)句表示對(duì)val按位取反再加1,val越大,則~val越小,即PCA0CPH0也越小,所以高電平占空比就越大,即val與高電平占空比成正比;35

此部分用來(lái)產(chǎn)生PWM脈寬調(diào)制36

(7)電機(jī)正反轉(zhuǎn)及速度的控制voidL_FORD(ucharL_spe_ford){L_MOTO_FORD;PWM0_set(L_spe_ford);}//電機(jī)速度voidR_FORD(ucharR_spe_ford){R_MOTO_FORD;PWM1_set(R_spe_ford);}36

(7)電機(jī)正反轉(zhuǎn)及速度的控制voidL_FORD37

voidL_BACK(uintL_spe_back){L_MOTO_BACK;PWM0_set(L_spe_back);}voidR_BACK(uintR_spe_back){R_MOTO_BACK;PWM1_set(R_spe_back);}voidL_BREAK(){L_MOTO_BREAK;}voidR_BREAK(){R_MOTO_BREAK;}37

voidL_BACK(uintL_spe_back38(8)八路尋跡voidFounding_Line(){ if((P6&0x0F)==0x0F)//終點(diǎn)停

{R_BREAK(); L_BREAK(); fb++;

38(8)八路尋跡voidFounding_Line()39

P6&0x0F進(jìn)行按位與運(yùn)算作用是屏蔽后四路尋跡,避免小車(chē)前進(jìn)過(guò)程中后四路尋跡對(duì)小車(chē)路徑的影響。按位與運(yùn)算,即1&0=0&1=0&0=1,1&1=1,假如P6口的返回值為00100100,與0x0F(即00001111)按位與的結(jié)果為00000100,即P6口前四路返回值不變,后四路返回值全變?yōu)?,也即屏蔽掉后四路尋跡的作用。然后判斷(P6&0x0F)==0x0F,如果成立,則執(zhí)行下面的程序,否則跳到后面的else語(yǔ)句。39

P6&0x0F進(jìn)行按位與運(yùn)算作用是屏蔽后四路尋跡,避免40

if(fb==2) { P1_0=1; lcddisplay1(); delay1ms(210);//延時(shí)4s P1_0=0;delay1ms(25); }40

if(fb==2)41

fb=2表示小車(chē)第二次遇到黑線停,P1_0=1表示水泵放水,然后進(jìn)行第一次液晶顯示屏顯示,延時(shí)4s,P1_0=0表示放水停止,關(guān)閉水泵,然后再進(jìn)行延時(shí)41

fb=2表示小車(chē)第二次遇到黑線停,P1_0=1表示水42

if(fb>=4){P1_0=1; lcddisplay2(); delay1ms(210);//延時(shí)4s P1_0=0; P1_1=1;lcddisplay3();}42

if(fb>=4)43

當(dāng)滿足fb>=4時(shí),執(zhí)行下面的程序,先進(jìn)行水泵放水,然后進(jìn)行第二次液晶顯示屏顯示,延時(shí)4s,關(guān)閉水泵,P1_1=1表示蜂鳴器響,然后再進(jìn)行延時(shí)43

當(dāng)滿足fb>=4時(shí),執(zhí)行下面的程序,先進(jìn)行水泵放水,44

if((fb==1)||(fb==3)){P1_2=1;delay1ms(600); P1_2=0; delay1ms(25);R_FORD(229);delay1ms(1); L_FORD(236);delay1ms(50);//延時(shí)0.5s }44

if((fb==1)||(fb==3))45

當(dāng)fb=1或者是fb=3時(shí),小車(chē)回到起點(diǎn)位置,P1_2=1表示對(duì)小車(chē)進(jìn)行注水,然后延時(shí)一段時(shí)間,注水停止,再延時(shí)25ms,小車(chē)前進(jìn)45

當(dāng)fb=1或者是fb=3時(shí),小車(chē)回到起點(diǎn)位置,P1_46

if(fb==2){L_BACK(240);R_BACK(249); delay1ms(50);//延時(shí)0.5s}}46

if(fb==2)47

else{ if((fb==1)||(fb==3)){if(P6==0x00){R_FORD(229); L_FORD(236);}此語(yǔ)句與前面if((P6&0x0F)==0x0F)對(duì)應(yīng),當(dāng)不滿足條件時(shí),執(zhí)行下面的程序47

else此語(yǔ)句與前面if((P6&0x0F)==0x48

P6=0x00,用二進(jìn)制表示即為00000000,即各路傳感器返回值均為0,表示8路傳感器均未壓黑線,小車(chē)前進(jìn)未跑偏48

P6=0x00,用二進(jìn)制表示即為00000000,即49

if(P6&0x02) { PWM0_set(245);PWM1_set(220); }當(dāng)P6=0x02,用二進(jìn)制表示為00000010時(shí),即前四路傳感器的右邊第二位壓黑線,此種情況下即表示小車(chē)左小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整49

if(P6&0x02)50

if(P6&0x04) { PWM0_set(235);PWM1_set(230); } if(P6&0x02) { PWM0_set(245);PWM1_set(220); }50

if(P6&0x04)51

當(dāng)P6=0x04,用二進(jìn)制表示為00000100時(shí),即前四路傳感器的右邊第三位壓黑線,此種情況下即表示小車(chē)右小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整51

當(dāng)P6=0x04,用二進(jìn)制表示為00000100時(shí),即52

if((P6&0x04)&&(P6&0x08)) { PWM0_set(235);PWM1_set(245); } if((P6&0x02)&&(P6&0x01)) { PWM0_set(255);PWM1_set(215); }52

if((P6&0x04)&&(P6&0x08))53

(P6&0x04)&&(P6&0x08)即表示前四路尋跡的右邊第三、四位尋跡壓黑線,此種情況下即表示小車(chē)右中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整53

(P6&0x04)&&(P6&0x08)即表示前四路尋54

if((P6&0x02)&&(P6&0x01)) { PWM0_set(255);PWM1_set(215); }(P6&0x02)&&(P6&0x01)即表示前四路尋跡的右邊第一、二位尋跡壓黑線,此種情況下即表示小車(chē)左中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整54

if((P6&0x02)&&(P6&0x01))55

if(P6&0x08) { PWM0_set(215);PWM1_set(240); } if(P6&0x01) { PWM0_set(255);PWM1_set(200); } }55

if(P6&0x08)56

當(dāng)P6=0x08,用二進(jìn)制表示為00001000時(shí),即前四路傳感器的右邊第四位壓黑線,此種情況下即表示小車(chē)右大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整56

當(dāng)P6=0x08,用二進(jìn)制表示為00001000時(shí),即57

if(P6&0x01) { PWM0_set(255);PWM1_set(200); } }當(dāng)P6=0x01,用二進(jìn)制表示為00000001時(shí),即前四路傳感器的右邊第一位壓黑線,此種情況下即表示小車(chē)左大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整57

if(P6&0x01)58

if(fb==2) {if(P6==0x00){L_BACK(240);R_BACK(250);} if(P6&0x40) { PWM0_set(230);PWM1_set(250); }58

if(fb==2)59

P6=0x00,用二進(jìn)制表示即為00000000,即各路傳感器返回值均為0,表示8路傳感器均未壓黑線,小車(chē)后退未跑偏當(dāng)P6=0x40,用二進(jìn)制表示為01000000時(shí),即后四路傳感器的右邊第三位壓黑線,此種情況下即表示小車(chē)右小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整59

P6=0x00,用二進(jìn)制表示即為00000000,即各60

if(P6&0x20) { PWM0_set(250);PWM1_set(250); } if((P6&0x40)&&(P6&0x80)) { PWM0_set(220);PWM1_set(250); }60

if(P6&0x20)61

當(dāng)P6=0x20,用二進(jìn)制表示為00100000時(shí),即后四路傳感器的右邊第二位壓黑線,此種情況下即表示小車(chē)左小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整(P6&0x40)&&(P6&0x80)即表示后四路尋跡的右邊第三、四位尋跡壓黑線,此種情況下即表示小車(chē)右中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整61

當(dāng)P6=0x20,用二進(jìn)制表示為00100000時(shí),即62

if((P6&0x20)&&(P6&0x10)) { PWM0_set(250);PWM1_set(240); } if(P6&0x80) { PWM0_set(200);PWM1_set(250); }62

if((P6&0x20)&&(P6&0x10))63

(P6&0x20)&&(P6&0x10)即表示后四路尋跡的右邊第一、二位尋跡壓黑線,此種情況下即表示小車(chē)左中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整當(dāng)P6=0x80,用二進(jìn)制表示為10000000時(shí),即后四路傳感器的右邊第四位壓黑線,此種情況下即表示小車(chē)右大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整63

(P6&0x20)&&(P6&0x10)即表示后四路尋64

if(P6&0x10) { PWM0_set(240);PWM1_set(210); } }}}64

if(P6&0x10)65

當(dāng)P6=0x10,用二進(jìn)制表示為00010000時(shí),即前四路傳感器的右邊第一位壓黑線,此種情況下即表示小車(chē)左大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整65

當(dāng)P6=0x10,用二進(jìn)制表示為00010000時(shí),即66循跡反饋形成分析b=1b=2b=3b=466循跡反饋形成分析b=1b=2b=3b=467垂線檢測(cè)偏移檢測(cè)占空比L298驅(qū)動(dòng)車(chē)輪軌跡TCRT循跡67垂線偏移占空L298車(chē)輪軌跡TCRT68(9)LCD控制voidsendc(ucharc)//給lcd送命令{ P4=c; lcdrs=0;//RS=L lcdrw=0;//RW=L EA=0;//關(guān)中斷

delay1ms(1); lcdcs=0;//E的高脈沖

lcdcs=1;//E的高脈沖68(9)LCD控制voidsendc(ucharc)/69

delay1ms(1); lcdrw=1; P4=0xff;//先置1,后讀取

delay1ms(1); EA=1;//開(kāi)中斷}69

delay1ms(1);70

voidsendd(ucharc)//給lcd送數(shù)據(jù){ EA=0; P4=c; lcdrs=1; lcdrw=0; delay1ms(1); lcdcs=1; lcdcs=0; lcdcs=1; delay1ms(1);70

voidsendd(ucharc)//給lcd送數(shù)71

lcdrw=1; P4=0xff;//先置1,后讀取

lcdrs=0; delay1ms(1); while(P4>=0x80); lcdcs=0; lcdcs=1; EA=1;/*if(c==c) delay1ms(3);*/} 71

lcdrw=1;72

voidlcd_pos(ucharpos)//顯示地址定位函數(shù){sendc(pos|0x80);}72

voidlcd_pos(ucharpos)//顯示73

voidlcd_ini(void)//lcd初始化函數(shù){ delay1ms(100); lcdcs=1;delay1ms(5); lcdrs=0; delay1ms(5); lcdrw=0; delay1ms(5);73

voidlcd_ini(void)//lcd初始化函74

sendc(0x38);//8位,2行,5*7字體

delay1ms(30); sendc(0x38);//8位,2行,5*7字體

delay1ms(30); sendc(0x38);//8位,2行,5*7字體

delay1ms(30); sendc(0x08);//顯示開(kāi),光標(biāo)關(guān);不閃

delay1ms(30);sendc(0x01);//清屏

delay1ms(30);74

sendc(0x38);//8位,2行,5*7字體75

// sendc(0x01);//清屏// delay1ms(30); sendc(0x06);// delay1ms(30);sendc(0x0C);//delay1ms(30);}75

// sendc(0x01);//清屏76(10)第一次顯示voidlcddisplay1(void)//顯示主函數(shù){ uchari=0;ucharline1[]={"once:550ml"}; ucharline2[]={"all:550ml"}; sendc(0x01); i=0; lcd_pos(0x00);//容量顯示

delay1ms(5);76(10)第一次顯示voidlcddisplay1(v77

while(line1[i]!='\0') { sendd(line1[i++]); delay1ms(10); } i=0; lcd_pos(0x40);//容量顯示

delay1ms(5); while(line2[i]!='\0'){ sendd(line2[i++]);delay1ms(10); }}77

while(line1[i]!='\0')78

(11)第二次顯示voidlcddisplay2(void)//顯示主函數(shù){ uchari=0; ucharline1[]={"twice:550ml"}; ucharline2[]={"all:1100ml"}; sendc(0x01); lcd_pos(0x00);//容量顯示

delay1ms(5); while(line1[i]!='\0') { sendd(line1[i++]); delay1ms(10); } i=0;78

(11)第二次顯示voidlcddisplay2(79

lcd_pos(0x40);//容量顯示

delay1ms(5); while(line2[i]!='\0'){ sendd(line2[i++]);delay1ms(10); }}79

lcd_pos(0x40);//容量顯示80

(12)顯示時(shí)間voidlcddisplay3(void)//顯示主函數(shù){ uchari=0; ucharline1[]={"time:00:35"}; ucharline2[]={"rate:31.4%"}; sendc(0x01); lcd_pos(0x00);//時(shí)間顯示

delay1ms(10);80

(12)顯示時(shí)間voidlcddisplay3(v81

while(line1[i]!='\0') { sendd(line1[i++]); delay1ms(10); } i=0; lcd_pos(0x40);//時(shí)間顯示

delay1ms(10);while(line2[i]!='\0') { sendd(line2[i++]); delay1ms(10); }}81

while(line1[i]!='\0')82(13)管理程序(主程序),調(diào)用子程序進(jìn)行電機(jī)控制和尋跡 voidmain(){config();P1_0=0;P1_1=0;P1_2=0;PCA_Init();PCA0_Init();lcd_ini();EA=1;82(13)管理程序(主程序),調(diào)用子程序進(jìn)行電機(jī)控制和尋跡83

while(1){if(fb==0){R_FORD(179); delay1ms(1);L_FORD(186);}Founding_Line();}}83

while(1)第7章軟件設(shè)計(jì)技術(shù)7.1軟件的總體功能第7章軟件設(shè)計(jì)技術(shù)7.1軟件的總體功能85

軟件運(yùn)行于微處理器,其功能由微處理器來(lái)決定。微處理器功能由系統(tǒng)的功能結(jié)構(gòu)、與微處理器相連的三個(gè)子系統(tǒng)和控制算法所決定。這些功能也可以分成兩部分:控制算法功能和一般控制功能2

軟件運(yùn)行于微處理器,其功能由微處理器來(lái)決定。86軟件功能的實(shí)時(shí)性意義:強(qiáng)調(diào)在規(guī)定的時(shí)間里執(zhí)行相應(yīng)的操作,誤時(shí)操作會(huì)導(dǎo)致嚴(yán)重的后果。軟件的實(shí)時(shí)性要滿足兩方面的要求:一是實(shí)時(shí)動(dòng)作響應(yīng)。二是實(shí)時(shí)數(shù)據(jù)處理。3軟件功能的實(shí)時(shí)性意義:強(qiáng)調(diào)在規(guī)定的時(shí)間里執(zhí)行相應(yīng)的操作877.2機(jī)電一體化系統(tǒng)軟件的任務(wù)和任務(wù)管理為了便于分析和編程,把各種軟件功能化分為小的、單元式的子功能。軟件功能是由子功能某種方式組合在一起的。由此,從學(xué)術(shù)的角度,把子功能提練為任務(wù)(類(lèi)似:進(jìn)程),軟件功能就是任務(wù)的組合。軟件的編程就包含兩個(gè)技術(shù),任務(wù)的編程和任務(wù)的管理。47.2機(jī)電一體化系統(tǒng)軟件的任務(wù)和任務(wù)管理為了便于分析和編88任務(wù)的劃分原則1.每個(gè)任務(wù)必須是獨(dú)立的;2每個(gè)任務(wù)不再可分;3所有任務(wù)的集合能滿足整個(gè)系統(tǒng)的功能要求。4劃分得到的任務(wù)常常按程序運(yùn)行方式來(lái)加以分類(lèi)描述,如驅(qū)動(dòng)程序、初始化程序、中斷程序、控制算法程序、顯示程序和鍵盤(pán)(或觸摸)輸入程序等。5還可以按分層結(jié)構(gòu)來(lái)理解。5任務(wù)的劃分原則1.每個(gè)任務(wù)必須是獨(dú)立的;89基于任務(wù)的編程方法1前后臺(tái)編程方法:如果編程人員將全部程序都自行編制,即把任務(wù)和任務(wù)的管理看做后臺(tái)程序,中斷處理看做前臺(tái)程序,就是前后臺(tái)程序編程方法。這是初級(jí)的、然而應(yīng)用很多的編程方法。2.操作系統(tǒng)編程方法:如果任務(wù)的管理有通用的、現(xiàn)成的程序,即操作系統(tǒng),而編程人員只編制任務(wù)程序,就稱(chēng)為操作系統(tǒng)編程方法。但是有時(shí)也需要編寫(xiě)驅(qū)動(dòng)程序。

6基于任務(wù)的編程方法1前后臺(tái)編程方法:如果編程人員將全90

3.設(shè)定式編程方法:這是一種近幾年剛剛出現(xiàn)的編程方法,如聯(lián)發(fā)科技推出的MTK平臺(tái)的軟件編程方法。任務(wù)和任務(wù)的管理均已完成,方便地提供給了開(kāi)發(fā)人員。設(shè)定式編程方法編程簡(jiǎn)單、節(jié)省開(kāi)發(fā)時(shí)間、程序系統(tǒng)穩(wěn)定可靠和功能強(qiáng)大,是今后程序編制方法的發(fā)展方向。7

3.設(shè)定式編程方法:這是一種近幾年剛剛出現(xiàn)的編程方法,如7.3機(jī)電一體化系統(tǒng)的程序設(shè)計(jì)方法7.3.1程序設(shè)計(jì)方法7.3機(jī)電一體化系統(tǒng)的程序設(shè)計(jì)方法7.3.1程序設(shè)計(jì)921.確定程序功能:根據(jù)控制系統(tǒng)設(shè)計(jì)方案確定控制軟件功能,根據(jù)系統(tǒng)的功能結(jié)構(gòu)確定前面沒(méi)有提到的其它軟件功能。

2.劃分任務(wù):將各類(lèi)軟件功能劃分成具體的任務(wù)。3.確定軟件編程要素:任務(wù)的組合方式和編程方法—使用和前邊類(lèi)似的產(chǎn)生和選擇方法。(產(chǎn)生與選擇)91.確定程序功能:根據(jù)控制系統(tǒng)設(shè)計(jì)方案確定控制軟件功能,根937.3.2模塊化編程技術(shù)應(yīng)用領(lǐng)域:?jiǎn)纹瑱C(jī)、操作系統(tǒng)和S7-300分成不同的程序,即不同的模塊由單獨(dú)的程序(頭文件)組合到一起。有全局變量問(wèn)題優(yōu)點(diǎn):模塊不用更改,結(jié)構(gòu)清晰區(qū)分:子程序在一個(gè)程序。107.3.2模塊化編程技術(shù)應(yīng)用領(lǐng)域:?jiǎn)纹瑱C(jī)、操作系統(tǒng)和S7.3.3運(yùn)水機(jī)器人編程實(shí)例1軟件功能7.3.3運(yùn)水機(jī)器人編程實(shí)例1軟件功能95運(yùn)水機(jī)器人功能結(jié)構(gòu)(用文字簡(jiǎn)單敘述)主要事件是將水裝入容器、微處理器控制電機(jī)驅(qū)動(dòng)輪式行走機(jī)構(gòu)運(yùn)輸容器和從容器卸水。使用鋰電池作為能源輸入,分別為驅(qū)動(dòng)電機(jī)和電控部分提供電能,有克服摩擦力和電氣部件能耗等能量損失。有循跡和開(kāi)關(guān)機(jī)等輸入信號(hào)送微處理器處理,顯示水量和時(shí)間等。12運(yùn)水機(jī)器人功能結(jié)構(gòu)(用文字簡(jiǎn)單敘述)主要事件是將水裝入96外圍部件軟件功能使用C8051F020單片機(jī)??刂?6×2字符點(diǎn)陣液晶顯示器顯示水容量和運(yùn)水時(shí)間。以PWM方式控制電機(jī)驅(qū)動(dòng)芯片L298N驅(qū)動(dòng)兩路直流減速電機(jī),以開(kāi)關(guān)方式控制微型繼電器卸水。對(duì)循跡開(kāi)關(guān)信號(hào)進(jìn)行采集。13外圍部件軟件功能使用C8051F020單片機(jī)??刂?697控制算法功能對(duì)運(yùn)水機(jī)器人行走軌跡進(jìn)行閉環(huán)控制,采用比例(P)調(diào)節(jié)。14控制算法功能對(duì)運(yùn)水機(jī)器人行走軌跡進(jìn)行閉環(huán)控制,采用比例98任務(wù)劃分任務(wù)劃分為:初始化配置(config),延時(shí)(delay1ms),PCA初始化(PCA_Init),產(chǎn)生PWM脈寬調(diào)制的兩個(gè)任務(wù)(PWM0_set、PWM1_set),電機(jī)正反轉(zhuǎn)及速度的控制的六個(gè)任務(wù)(L_FORD、R_FORD、L_BACK、R_BACK、L_BREAK、R_BREAK),八路尋跡(Founding_Line),給lcd送命令(sendc),給lcd送數(shù)據(jù)(sendd),顯示地址定位函數(shù)(lcd_pos),lcd初始化函數(shù)(lcd_ini),第一次水量顯示(lcddisplay1),第二次水量顯示(lcddisplay2),顯示時(shí)間(lcddisplay3)。15任務(wù)劃分任務(wù)劃分為:初始化配置(config),延時(shí)(99任務(wù)的組合在八路尋跡(Founding_Line)中根據(jù)取入的八路傳感數(shù)字信號(hào)調(diào)用產(chǎn)生PWM脈寬調(diào)制的兩個(gè)任務(wù)(PWM0_set、PWM1_set)和電機(jī)正反轉(zhuǎn)及速度的控制的六個(gè)任務(wù)(L_FORD、R_FORD、L_BACK、R_BACK、L_BREAK、R_BREAK),并按控制問(wèn)題的要求調(diào)用第一次水量顯示(lcddisplay1)、第二次水量顯示(lcddisplay2)和顯示時(shí)間(lcddisplay3)。16任務(wù)的組合在八路尋跡(Founding_Line)中根100

第一次水量顯示(lcddisplay1)、第二次水量顯示(lcddisplay2)和顯示時(shí)間(lcddisplay3)中使用給lcd送命令(sendc)、給lcd送數(shù)據(jù)(sendd)和顯示地址定位函數(shù)(lcd_pos)。加入延時(shí)(delay1ms)以保證外圍部件的響應(yīng)。任務(wù)管理進(jìn)行初始化配置(config)、PCA初始化(PCA_Init)、電機(jī)正轉(zhuǎn)(L_FORD、R_FORD)和調(diào)用八路尋跡(Founding_Line)。17

第一次水量顯示(lcddisplay1)、第二次水量101編程方法使用前后臺(tái)編程方法。18編程方法使用前后臺(tái)編程方法。1025.具體編程(1)資源分配P0^0——電機(jī)1PWM輸出左輪P0^1——電機(jī)2PWM輸出右輪L_DIR1A=P2^2——左輪電機(jī)方向控制L_DIR1B=P2^1——左輪電機(jī)方向控制R_DIR1A=P2^5——右輪電機(jī)方向控制R_DIR1B=P2^6——右輪電機(jī)方向控制195.具體編程(1)資源分配P0^0——電機(jī)1PWM輸103

P1^0--水泵控制P1^1—蜂鳴器控制PCA0CPM0——電機(jī)1PWM輸出,工作在8位定時(shí)器模式,允許比較器匹配中斷,每次中斷加載新的比較值,實(shí)現(xiàn)電機(jī)輸出的脈寬控制。PCA0CPM1——電機(jī)2PWM輸出,工作在8位定時(shí)器模式,允許比較器匹配中斷,每次中斷加載新的比較值,實(shí)現(xiàn)電機(jī)輸出的脈寬控制。P6.0-P6.7;傳感器接口lcdrw=P3^2;--讀寫(xiě)控制5lcdcs=P3^7;--E使能6lcdrs=P3^6;--命令數(shù)據(jù)選擇控制4 20

P1^0--水泵控制104傳感器規(guī)定前四個(gè)傳感器在低四位,后四個(gè)傳感器在高四位左右各兩個(gè)傳感器不壓黑線為低電平頭:低四位尾:高四位21傳感器規(guī)定前四個(gè)傳感器在低四位,后四個(gè)傳感器在高四位頭:105記錄行走情況遇垂直黑線次數(shù):intfb=0微偏:0100/0010中偏:1100/0011大偏:1000/000122記錄行走情況遇垂直黑線次數(shù):intfb=0106(2)引用與定義#include<c8051f020.h>#include<stdio.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedlongulong;typedefunsignedintuint;#defineL_MOTO_BREAKL_DIR1A=L_DIR1B#defineL_MOTO_BACKL_DIR1A=0;L_DIR1B=1#defineL_MOTO_FORDL_DIR1A=1;L_DIR1B=0#defineR_MOTO_BREAKR_DIR1A=R_DIR1B#defineR_MOTO_BACKR_DIR1A=0;R_DIR1B=1#defineR_MOTO_FORDR_DIR1A=1;R_DIR1B=023(2)引用與定義#include<c8051f020.107

sbitL_DIR1A=P2^2;sbitL_DIR1B=P2^1;sbitR_DIR1A=P2^5;sbitR_DIR1B=P2^6;sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;24

sbitL_DIR1A=P2^2;108

intfb=0;//控制前后方向sbitlcdrw=P3^2;//5sbitlcdcs=P3^7;//6sbitlcdrs=P3^6;//4voidlcddisplay3(void);voidlcddisplay1(void);voidlcddisplay2(void);25

intfb=0;//控制前后方向109

此部分包括頭文件的定義、宏定義、位定義等,例如定義#defineL_MOTO_BREAKL_DIR1A=L_DIR1B,即表示在程序中以L_MOTO_BREAK來(lái)表示L_DIR1A=L_DIR1B;L_DIR1A代表P2^2口,表示左輪電機(jī)方向的控制;L_DIR1B代表P2^1口,亦表示左輪電機(jī)方向控制;當(dāng)L_DIR1A=L_DIR1B,即L_DIR1A與L_DIR1B都為1或都為0時(shí),即以L_MOTO_BREAK來(lái)表示。下面還有液晶顯示屏的I/O配置以及液晶顯示屏的顯示等。

26

此部分包括頭文件的定義、宏定義、位定義等,例如定義#d110(3)初始化配置,以保證單片機(jī)控制功能工作voidconfig(void){ WDTCN=0x07; WDTCN=0xde; //看門(mén)狗禁止

WDTCN=0xad; //看門(mén)狗禁止

XBR0=0x50; //配置交叉開(kāi)關(guān),

XBR1=0x00; XBR2=0x40; //交叉開(kāi)關(guān)允許

P0MDOUT=0x00;//p0.4~p0.5為推挽輸出27(3)初始化配置,以保證單片機(jī)控制功能工作voidc111

P1MDOUT=0xff;P2MDOUT=0xff; P3MDOUT=0xFF; P74OUT=0x00; //p4--p6 P6=0xff;OSCXCN=0x00; OSCICN=0x16; //采用內(nèi)部晶振,頻率為8MHZ}28

P1MDOUT=0xff;112

此部分主要進(jìn)行初始化配置,以保證單片機(jī)的控制功能

WDTCN即為看門(mén)狗定時(shí)器控制寄存器,此處通過(guò)WDTCN各位的設(shè)置使看門(mén)狗禁止

XBR0、XBR1、XBR2 是用來(lái)配置交叉開(kāi)關(guān)的特殊功能寄存器。XBR0=0x50即把XBR0的位6和位4置1,表示PCA0外部計(jì)數(shù)器輸入連接端口引腳及CEX0和CEX1鏈接兩個(gè)端口引腳;XBR1=0x00表示此特殊功能寄存器各位全置0,即各使能位不連接端口引腳;XBR2=0x40表示位6置1,即交叉開(kāi)關(guān)使能。

29

此部分主要進(jìn)行初始化配置,以保證單片機(jī)的控制功能113

P0MDOUT是端口0輸出方式寄存器,P0MDOUT=0x00表示端口引腳的輸出方式為漏極開(kāi)路方式。P1MDOUT、P2MDOUT、P2MDOUT分別是端口1、2、3輸出方式寄存器,各端口設(shè)置為0xff表示端口引腳的輸出方式為推挽方式。P74OUT是端口4~7的輸出方式寄存器,各位置0即表示輸出方式配置為漏極開(kāi)路輸出方式此處表示采用內(nèi)部振蕩器作為系統(tǒng)時(shí)鐘,OSCICN=0x16表示對(duì)內(nèi)部振蕩器使能,并使內(nèi)部振蕩器典型頻率為8MHZ。30

P0MDOUT是端口0輸出方式寄存器,P0MDOUT=114(4)延時(shí)

voiddelay1ms(uinttime){//延遲子程序0.5MS uintii; uintjj; for(ii=0;ii<time;ii++) {for(jj=0;jj<4000;jj++) ; }}31(4)延時(shí)

voiddelay1ms(uintt115(5)PCA初始化voidPCA_Init(){PCA0MD=0x08;//PCA采用系統(tǒng)時(shí)鐘,且PCA溢出中斷禁止

PCA0CN=0x40;//啟動(dòng)PCA計(jì)數(shù)器}voidPCA0_Init(){PCA0CPM0=0x42;//CEX0為8位PWM輸出模式

PCA0CPM1=0x42;//CEX1為8bitPWM輸出模式

}32(5)PCA初始化voidPCA_Init(){116

此部分即表示對(duì)PCA進(jìn)行初始化PCA0MD即為C8051F020內(nèi)部集成的可編程技術(shù)陣列PCA0的方式選擇寄存器,PCA0MD=0x08即表示選擇系統(tǒng)時(shí)鐘作為計(jì)數(shù)脈沖源且PCA0定時(shí)器/計(jì)數(shù)器溢出中斷禁止。PCA0CN即為PCA控制寄存器,PCA0CN=0x40表示允許PCA0定時(shí)器/計(jì)數(shù)器。PCA0CPMn表示PCA0捕捉/比較寄存器,PCA0CPMn=0x42表示比較器允許,并使用8位PWM輸出方式33

此部分即表示對(duì)PCA進(jìn)行初始化117(6)產(chǎn)生PWM脈寬調(diào)制voidPWM0_set(ucharval){ //高電平占空比為val/256 PCA0CPH0=~val+1;}voidPWM1_set(ucharval){ //高電平占空比為val/256 PCA0CPH1=~val+1;}34(6)產(chǎn)生PWM脈寬調(diào)制voidPWM0_set118

此部分用來(lái)產(chǎn)生PWM脈寬調(diào)制此語(yǔ)句表示對(duì)val按位取反再加1,val越大,則~val越小,即PCA0CPH0也越小,所以高電平占空比就越大,即val與高電平占空比成正比;35

此部分用來(lái)產(chǎn)生PWM脈寬調(diào)制119

(7)電機(jī)正反轉(zhuǎn)及速度的控制voidL_FORD(ucharL_spe_ford){L_MOTO_FORD;PWM0_set(L_spe_ford);}//電機(jī)速度voidR_FORD(ucharR_spe_ford){R_MOTO_FORD;PWM1_set(R_spe_ford);}36

(7)電機(jī)正反轉(zhuǎn)及速度的控制voidL_FORD120

voidL_BACK(uintL_spe_back){L_MOTO_BACK;PWM0_set(L_spe_back);}voidR_BACK(uintR_spe_back){R_MOTO_BACK;PWM1_set(R_spe_back);}voidL_BREAK(){L_MOTO_BREAK;}voidR_BREAK(){R_MOTO_BREAK;}37

voidL_BACK(uintL_spe_back121(8)八路尋跡voidFounding_Line(){ if((P6&0x0F)==0x0F)//終點(diǎn)停

{R_BREAK(); L_BREAK(); fb++;

38(8)八路尋跡voidFounding_Line()122

P6&0x0F進(jìn)行按位與運(yùn)算作用是屏蔽后四路尋跡,避免小車(chē)前進(jìn)過(guò)程中后四路尋跡對(duì)小車(chē)路徑的影響。按位與運(yùn)算,即1&0=0&1=0&0=1,1&1=1,假如P6口的返回值為00100100,與0x0F(即00001111)按位與的結(jié)果為00000100,即P6口前四路返回值不變,后四路返回值全變?yōu)?,也即屏蔽掉后四路尋跡的作用。然后判斷(P6&0x0F)==0x0F,如果成立,則執(zhí)行下面的程序,否則跳到后面的else語(yǔ)句。39

P6&0x0F進(jìn)行按位與運(yùn)算作用是屏蔽后四路尋跡,避免123

if(fb==2) { P1_0=1; lcddisplay1(); delay1ms(210);//延時(shí)4s P1_0=0;delay1ms(25); }40

if(fb==2)124

fb=2表示小車(chē)第二次遇到黑線停,P1_0=1表示水泵放水,然后進(jìn)行第一次液晶顯示屏顯示,延時(shí)4s,P1_0=0表示放水停止,關(guān)閉水泵,然后再進(jìn)行延時(shí)41

fb=2表示小車(chē)第二次遇到黑線停,P1_0=1表示水125

if(fb>=4){P1_0=1; lcddisplay2(); delay1ms(210);//延時(shí)4s P1_0=0; P1_1=1;lcddisplay3();}42

if(fb>=4)126

當(dāng)滿足fb>=4時(shí),執(zhí)行下面的程序,先進(jìn)行水泵放水,然后進(jìn)行第二次液晶顯示屏顯示,延時(shí)4s,關(guān)閉水泵,P1_1=1表示蜂鳴器響,然后再進(jìn)行延時(shí)43

當(dāng)滿足fb>=4時(shí),執(zhí)行下面的程序,先進(jìn)行水泵放水,127

if((fb==1)||(fb==3)){P1_2=1;delay1ms(600); P1_2=0; delay1ms(25);R_FORD(229);delay1ms(1); L_FORD(236);delay1ms(50);//延時(shí)0.5s }44

if((fb==1)||(fb==3))128

當(dāng)fb=1或者是fb=3時(shí),小車(chē)回到起點(diǎn)位置,P1_2=1表示對(duì)小車(chē)進(jìn)行注水,然后延時(shí)一段時(shí)間,注水停止,再延時(shí)25ms,小車(chē)前進(jìn)45

當(dāng)fb=1或者是fb=3時(shí),小車(chē)回到起點(diǎn)位置,P1_129

if(fb==2){L_BACK(240);R_BACK(249); delay1ms(50);//延時(shí)0.5s}}46

if(fb==2)130

else{ if((fb==1)||(fb==3)){if(P6==0x00){R_FORD(229); L_FORD(236);}此語(yǔ)句與前面if((P6&0x0F)==0x0F)對(duì)應(yīng),當(dāng)不滿足條件時(shí),執(zhí)行下面的程序47

else此語(yǔ)句與前面if((P6&0x0F)==0x131

P6=0x00,用二進(jìn)制表示即為00000000,即各路傳感器返回值均為0,表示8路傳感器均未壓黑線,小車(chē)前進(jìn)未跑偏48

P6=0x00,用二進(jìn)制表示即為00000000,即132

if(P6&0x02) { PWM0_set(245);PWM1_set(220); }當(dāng)P6=0x02,用二進(jìn)制表示為00000010時(shí),即前四路傳感器的右邊第二位壓黑線,此種情況下即表示小車(chē)左小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整49

if(P6&0x02)133

if(P6&0x04) { PWM0_set(235);PWM1_set(230); } if(P6&0x02) { PWM0_set(245);PWM1_set(220); }50

if(P6&0x04)134

當(dāng)P6=0x04,用二進(jìn)制表示為00000100時(shí),即前四路傳感器的右邊第三位壓黑線,此種情況下即表示小車(chē)右小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整51

當(dāng)P6=0x04,用二進(jìn)制表示為00000100時(shí),即135

if((P6&0x04)&&(P6&0x08)) { PWM0_set(235);PWM1_set(245); } if((P6&0x02)&&(P6&0x01)) { PWM0_set(255);PWM1_set(215); }52

if((P6&0x04)&&(P6&0x08))136

(P6&0x04)&&(P6&0x08)即表示前四路尋跡的右邊第三、四位尋跡壓黑線,此種情況下即表示小車(chē)右中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整53

(P6&0x04)&&(P6&0x08)即表示前四路尋137

if((P6&0x02)&&(P6&0x01)) { PWM0_set(255);PWM1_set(215); }(P6&0x02)&&(P6&0x01)即表示前四路尋跡的右邊第一、二位尋跡壓黑線,此種情況下即表示小車(chē)左中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整54

if((P6&0x02)&&(P6&0x01))138

if(P6&0x08) { PWM0_set(215);PWM1_set(240); } if(P6&0x01) { PWM0_set(255);PWM1_set(200); } }55

if(P6&0x08)139

當(dāng)P6=0x08,用二進(jìn)制表示為00001000時(shí),即前四路傳感器的右邊第四位壓黑線,此種情況下即表示小車(chē)右大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整56

當(dāng)P6=0x08,用二進(jìn)制表示為00001000時(shí),即140

if(P6&0x01) { PWM0_set(255);PWM1_set(200); } }當(dāng)P6=0x01,用二進(jìn)制表示為00000001時(shí),即前四路傳感器的右邊第一位壓黑線,此種情況下即表示小車(chē)左大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整57

if(P6&0x01)141

if(fb==2) {if(P6==0x00){L_BACK(240);R_BACK(250);} if(P6&0x40) { PWM0_set(230);PWM1_set(250); }58

if(fb==2)142

P6=0x00,用二進(jìn)制表示即為00000000,即各路傳感器返回值均為0,表示8路傳感器均未壓黑線,小車(chē)后退未跑偏當(dāng)P6=0x40,用二進(jìn)制表示為01000000時(shí),即后四路傳感器的右邊第三位壓黑線,此種情況下即表示小車(chē)右小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整59

P6=0x00,用二進(jìn)制表示即為00000000,即各143

if(P6&0x20) { PWM0_set(250);PWM1_set(250); } if((P6&0x40)&&(P6&0x80)) { PWM0_set(220);PWM1_set(250); }60

if(P6&0x20)144

當(dāng)P6=0x20,用二進(jìn)制表示為00100000時(shí),即后四路傳感器的右邊第二位壓黑線,此種情況下即表示小車(chē)左小偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整(P6&0x40)&&(P6&0x80)即表示后四路尋跡的右邊第三、四位尋跡壓黑線,此種情況下即表示小車(chē)右中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整61

當(dāng)P6=0x20,用二進(jìn)制表示為00100000時(shí),即145

if((P6&0x20)&&(P6&0x10)) { PWM0_set(250);PWM1_set(240); } if(P6&0x80) { PWM0_set(200);PWM1_set(250); }62

if((P6&0x20)&&(P6&0x10))146

(P6&0x20)&&(P6&0x10)即表示后四路尋跡的右邊第一、二位尋跡壓黑線,此種情況下即表示小車(chē)左中偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整當(dāng)P6=0x80,用二進(jìn)制表示為10000000時(shí),即后四路傳感器的右邊第四位壓黑線,此種情況下即表示小車(chē)右大偏,然后重新調(diào)整PWM值對(duì)小車(chē)進(jìn)行調(diào)整63

(P6&0x20)&&(P6&0x10)即表示后四路尋147

if(P6&0x10) { PWM0_set(240);PWM1_set(210);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論