![機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第1頁(yè)](http://file4.renrendoc.com/view/97dec71c044a38d4b518f8f057da2b30/97dec71c044a38d4b518f8f057da2b301.gif)
![機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第2頁(yè)](http://file4.renrendoc.com/view/97dec71c044a38d4b518f8f057da2b30/97dec71c044a38d4b518f8f057da2b302.gif)
![機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第3頁(yè)](http://file4.renrendoc.com/view/97dec71c044a38d4b518f8f057da2b30/97dec71c044a38d4b518f8f057da2b303.gif)
![機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第4頁(yè)](http://file4.renrendoc.com/view/97dec71c044a38d4b518f8f057da2b30/97dec71c044a38d4b518f8f057da2b304.gif)
![機(jī)電一體化系統(tǒng)設(shè)計(jì)課件(第7章)_第5頁(yè)](http://file4.renrendoc.com/view/97dec71c044a38d4b518f8f057da2b30/97dec71c044a38d4b518f8f057da2b305.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 入職申請(qǐng)書(shū)的格式
- 2025年中國(guó)石油鉆井工程技術(shù)服務(wù)行業(yè)全景評(píng)估及投資規(guī)劃建議報(bào)告
- 方形可調(diào)內(nèi)徑量規(guī)行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 2025年度城市公共停車(chē)場(chǎng)建設(shè)合同
- 2025年度高速公路隧道施工勞務(wù)分包合同范本
- 自動(dòng)飛刀切片機(jī)行業(yè)深度研究報(bào)告
- 護(hù)士外出進(jìn)修申請(qǐng)書(shū)
- 2025年度建筑水電安裝工程環(huán)保施工合同
- 2025年中國(guó)羽毛球館行業(yè)市場(chǎng)全景調(diào)研及投資規(guī)劃建議報(bào)告
- 2025年度人工智能技術(shù)研發(fā)與應(yīng)用合同違約責(zé)任細(xì)則
- 2025年1月浙江省高考政治試卷(含答案)
- 教體局校車(chē)安全管理培訓(xùn)
- 湖北省十堰市城區(qū)2024-2025學(xué)年九年級(jí)上學(xué)期期末質(zhì)量檢測(cè)綜合物理試題(含答案)
- 2025年上半年重慶三峽融資擔(dān)保集團(tuán)股份限公司招聘6人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 大模型關(guān)鍵技術(shù)與應(yīng)用
- 20以?xún)?nèi)加減法口算題(10000道)(A4直接打印-每頁(yè)100題)
- 海信rsag7.820.1646ip電源與背光電路圖fan7530、fan7602fan
- 深度配煤摻燒方案
- 中藥?kù)F化吸入操作評(píng)分標(biāo)準(zhǔn)
- 學(xué)生個(gè)人成長(zhǎng)檔案實(shí)用模板
- 三一電氣產(chǎn)品外觀通用檢驗(yàn)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論