C單片機應(yīng)用與C語言程序設(shè)計第三章_第1頁
C單片機應(yīng)用與C語言程序設(shè)計第三章_第2頁
C單片機應(yīng)用與C語言程序設(shè)計第三章_第3頁
C單片機應(yīng)用與C語言程序設(shè)計第三章_第4頁
C單片機應(yīng)用與C語言程序設(shè)計第三章_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章C語言函數(shù)與機器人巡航控制深圳市鷗鵬科技有限公司黃曦2009.3.21摘要任務(wù)一基本巡航動作任務(wù)二勻加速/減速運動任務(wù)三用函數(shù)調(diào)用簡化運動程序任務(wù)四高級主題――用數(shù)組建立復雜運動字符型數(shù)據(jù)數(shù)組switch語句工程素質(zhì)和技能歸納科學精神的培養(yǎng)?

2008Open-Tech.

All

rights

reserved.5/24/2023/任務(wù)一基本巡航動作?

2008Open-Tech.

All

rights

reserved.5/24/2023/向前巡航,持續(xù)時間為3秒。源程序請參照教材第37頁RobotForwardThreeSeconds.c原理:輸出相應(yīng)的脈沖序列,使左側(cè)電機逆時針旋轉(zhuǎn),右側(cè)電機順時針旋轉(zhuǎn)。程序反復執(zhí)行130次,需要3秒時間,機器人也向前運動3秒。嘗試調(diào)節(jié)距離和速度。嘗試通過調(diào)節(jié)高電平脈寬,從而調(diào)節(jié)機器人的運動方向。任務(wù)一基本巡航動作?

2008Open-Tech.

All

rights

reserved.5/24/2023/命令組合,讓機器人向前走、左轉(zhuǎn)、右轉(zhuǎn)和向后走。源程序請參照教材第39頁的ForwardLeftRightBackward.c。嘗試1個輪子不動,另一個輪子全速旋轉(zhuǎn),從而以一個輪子為支點,原地旋轉(zhuǎn)。源程序請參照教材第41頁。任務(wù)二 勻加速/減速運動?

2008Open-Tech.

All

rights

reserved.5/24/2023/編程目的:使機器人的運動更平穩(wěn),增長電機的壽命。編程原理:電機控制信號高電平寬度為1500微秒,如要順時針加速,則

delay_nus()的參數(shù)從1500逐漸減小到1300,如要逆時針旋轉(zhuǎn),則從1500逐漸增大到1700。脈寬變得越快,加/減速的效果就更明顯。for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1){P1_1=1;delay_nus(1500+pulseCount);P1_1=0;P1_0=1;delay_nus(1500-pulseCount);P1_0=0;delay_nms(20);}任務(wù)二 勻加速/減速運動?

2008Open-Tech.

All

rights

reserved.5/24/2023/例程:電機速度逐漸增加到全速然后逐步減小的實現(xiàn)。源代碼參照教材第43頁的StartAndStopWithRamping.c嘗試更改變量pulseCount的變化值,調(diào)節(jié)加速度或減速度。嘗試更改變量pulseCount的變化上限,調(diào)節(jié)加速或減速的持續(xù)時間。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.5/24/2023/C語言提供了強大的函數(shù)定義功能。一個C程序就是由一個主函數(shù)和若干個其它函數(shù)構(gòu)成,由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以相互調(diào)用。同一個函數(shù)可以被一個或多個函數(shù)調(diào)用任意多次。無論機器人要執(zhí)行何種動作,都離不開前面討論的各種基本動作。為了各種應(yīng)用程序方便使用這些基本動作程序,你可以將這些基本動作放在函數(shù)中,供其它函數(shù)調(diào)用來簡化程序。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.5/24/2023/函數(shù)的種類從函數(shù)的定義來看:標準函數(shù),即庫函數(shù),由集成開發(fā)環(huán)境提供。用戶自定義函數(shù),解決自己的專門需要。從函數(shù)有無返回值來看:有返回值函數(shù)。無返回值函數(shù)。從主調(diào)函數(shù)和被調(diào)函數(shù)來看:無參數(shù)函數(shù)。有參數(shù)函數(shù)。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.5/24/2023/函數(shù)的形式:類型標識符函數(shù)名(形式參數(shù)列表){聲明部分語句}其中類型標識符和函數(shù)名稱為函數(shù)頭。類型標識符指明了本函數(shù)的類型,函數(shù)的類型實際上是函數(shù)返回值的類型。函數(shù)名是由用戶定義的標識符。函數(shù)名后有一個括號(不可少寫),若函數(shù)無參數(shù),則括號內(nèi)可不寫內(nèi)容或?qū)憽皏oid”;若有參數(shù),則形式參數(shù)列表給出各種類型的變量,各參數(shù)之間用逗號間隔。{}中的內(nèi)容稱為函數(shù)體。函數(shù)體中的聲明部分,是對函數(shù)體內(nèi)部用到的變量的類型說明。在很多情況下都不要求函數(shù)有返回值,此時函數(shù)類型符可以寫為void。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/main函數(shù)是不能被其它函數(shù)調(diào)用的,那它的返回值類型int是怎么回事呢?–其實不難理解,main函數(shù)執(zhí)行完之后,它的返回值是給操作系統(tǒng)的。雖然在main函數(shù)體內(nèi)并沒有什么語句來指出返回值的大小,但系統(tǒng)默認的處理方式是:當main函數(shù)成功執(zhí)行,它的返回值為1;否則為0。任務(wù)三 用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/下邊的Forward函數(shù)可以使機器人向前運動1.5秒。該函數(shù)是無形參、無返回值的函數(shù),沒有太大的使用價值。void

Forward(void){int

i;for(i=1;i<=65;i++){P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);}}任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/給前面一頁的Forward函數(shù)增加脈沖數(shù)和速度等兩個參數(shù),從而可以靈活的設(shè)置這些參數(shù),讓函數(shù)成為一個真正有用的模塊。void

Forward(int

PulseCount,int

Velocity)/*

Velocity

should

be

between

0

and

200

*/{int

i;for(i=1;i<=PulseCount;i++){P1_1=1;delay_nus(1500+Velocity);P1_1=0;P1_0=1;delay_nus(1500-Velocity);P1_0=0;delay_nms(20);}}任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/注釋:在函數(shù)定義的下方,有一行注釋,提醒我們使用該函數(shù)的時候,速度是在0到200之間。除“//”外,C語言還提供了另一種語句注釋符——“/*”和“*/”。“/*”和“*/”必須成對使用,在它們之間的內(nèi)容將被注釋掉。它的作用范圍比“//”大:“//”僅僅對它所在的一行起注釋作用;但“/*…*/”可以對多行注釋。注釋是你在學習程序設(shè)計時要養(yǎng)成的良好習慣。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/完整的使用向前、左轉(zhuǎn)、右轉(zhuǎn)和向后四個函數(shù)的例程。源碼參照教材第48頁的MovementsWithFuncitons.c該例程的效果與任務(wù)1的ForwardLeftRightBackward.c產(chǎn)生的效果是一致的。在該程序中,除了main函數(shù)以外,其他的四個函數(shù)代表了四個方向,具有相同的形參——脈沖個數(shù)和速度參數(shù)。這四個函數(shù)的功能是可以集成在同一個函數(shù)中的。任務(wù)三用函數(shù)調(diào)用簡化運動程序?

2008Open-Tech.

All

rights

reserved.7/27/2023/直接用一個子函數(shù)實現(xiàn)方向、脈沖個數(shù)和速度的控制。源代碼參照教材第51頁的MovementsWithOneFunciton.c嘗試修改程序,讓機器人走正方形。/任務(wù)四高級主題——用數(shù)組建立復雜運動到目前為止你已經(jīng)試過三種不同的編程方法來使機

器人向前走,左轉(zhuǎn),右轉(zhuǎn)和向后走。每種方法都有

它的優(yōu)點,但是如果你要讓機器人執(zhí)行一個更長,

更復雜的動作時用這些方法都很麻煩。下面要介紹的兩個例子將用子函數(shù)來實現(xiàn)每個簡單的動作,將復

雜的運動存儲在數(shù)組中,然后在程序執(zhí)行過程中讀

出并解碼。避免了重復調(diào)用一長串子函數(shù)。這里,

你要用到C語言的一種新的數(shù)據(jù)類型——數(shù)組。前面,你只用到了C語言的基本數(shù)據(jù)類型之一的整型數(shù)據(jù),以int作為類型說明符。另外一種基本數(shù)據(jù)類型是字符型,以char作為類型說明符。?2008Open-Tech.Allrightsreserved.5/18/2023任務(wù)四高級主題——用數(shù)組建立復雜運動字符型數(shù)據(jù)字符常量字符常量是指用一對單引號括起來的一個字符。字符常量中的單引號只起到定界作用并不表示字符本身。單引號中的字符不能是單引號(‘)和反斜杠(\),它們特有的表示法在轉(zhuǎn)義字符中介紹。在C語言中,字符是按照對應(yīng)的ASCII碼值來存儲的。–ASCII碼–ASCII是美國標準信海息交換碼(AmericanStandardCodeforInformationInterchange)的縮寫,用來制坊訂計算機中每渡個符凱號對應(yīng)的代碼苗,這免也叫凱做計幟算機艦的內(nèi)碼死(c槐od捎e)。?2008Open-Tech.Allrightsr寶結(jié)ese島r辣ve底d.5/形18/2心023菊htt脫p:他//班www物.s忘zope恭n.董cn僑

/任務(wù)四高級主題——用數(shù)組建立復雜運動字符型數(shù)據(jù)量的雙撇號(“)和反斜杠(\)轉(zhuǎn)義字符轉(zhuǎn)義字符是一種特殊的字符常量,以反斜杠“\”開頭,后跟一個或幾個字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,故稱“轉(zhuǎn)義”字符。通常轉(zhuǎn)使義字符用轉(zhuǎn)義字符含義表示用一ASC般II值(字十進制)符不便于表示?2008Open-Tech.Allrightsreserved.5/18/2023/的控制\代b碼,如退用格(BS于)表示字符00常8

量的單撇號(‘)\n換行(LF)010、用于\表t示字符水平串制表(常HF)\\反斜杠092等。\’ 單引號字符

039\”雙引號字符034\0空字符(NULL)\ddd任意字符三位八進制\xhh任意字符二位十六進制任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/字符型數(shù)據(jù)字符變量字符變量用來存放字符常量,注意只能存放一個字符。字符變量的定義形式如下:charc1,c2;它表示c1和c2為字符變量,各放入一字字符。因此可以用下面語句對c1、c2賦值:c1=’a’;c2=’A’;任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/數(shù)組在程序設(shè)計中,為了處理方便,可以把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。一個數(shù)組可以分解為多個數(shù)組元素,根據(jù)數(shù)組元素數(shù)據(jù)類型的不同,數(shù)組可以分為多種不同類型。數(shù)組又分為一維數(shù)組、二維數(shù)組甚至三維數(shù)組。本節(jié)只會用到一維數(shù)組。任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/一維數(shù)組一維數(shù)組的定義方式為:類型說明符順數(shù)組名[常量表達式];類型說明符是任一種基本數(shù)據(jù)類型。數(shù)組名是用戶定義的數(shù)組標識符。方括號中的常量表達式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。一維數(shù)組的賦值初始化賦值的一般方式類型說明符糕數(shù)組名[常量表達式]={值,值……值};其中在{}中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號間隔。例如:下面的語句定義了一個字符型數(shù)組,該數(shù)組有10個元素,并對這10個元素進行了初始化。charNavigation[10]={'F','L','F','F','R','B','L','B','B','Q'};任務(wù)4高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/一維數(shù)組的引用數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量,其標識方法繭為數(shù)組名后跟一個下標,下標表示了元素在數(shù)組中的順序號(從0開始計數(shù))。數(shù)組元素的一般形式為:數(shù)組名[下標]其中下標只能為整秘型常量或整型表達式。若為小數(shù)時,系統(tǒng)碼將自動取整。例如:Navigation[0](第一個字符:‘F’)Navigation[5](第六個字符:‘B’)任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/字符串和字符串結(jié)束標志字符串常量是指用一對雙引號括起來的一串字符。如“China”、“OPEN”、“A”、“333212-6589”等。雙引號只起定界作用。雙引號括起的字符串中不能是雙引號(“)和反斜杠(\)。在C語言中沒有專門的字符串變量,通常用一個字符數(shù)組來存放一個字符串。字符串常量在存儲時,系統(tǒng)自動在字符串的末尾加一個“串結(jié)束標志”,即ASCII碼值為0的字符NULL,常用“\0”表示。因此在程序中,長度為n字符的字符串常量在內(nèi)存中占有n+1個字節(jié)的存儲空間。任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/例程:采用字符數(shù)組定義一系列復雜的運動。源代碼請參照教材第55頁的NavigationWithSwitch.c將程序編譯并燒寫入單片機,打開電源,讓程序運行。觀察機器人是否走了一個矩形?如果是梯形,需要調(diào)節(jié)for循環(huán)中的循環(huán)次數(shù),使其精準的旋轉(zhuǎn)90°。任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/NavigationWithSwitch.c是如何工作的?在主函數(shù)中定義了一維字符數(shù)組。charNavigation[10]={'F','L','F','F','R','B','L','B','B','Q'};在這個數(shù)組中,’F’表示向前運動,’L’表示向左轉(zhuǎn),’R’表示向右轉(zhuǎn),‘B’表示向后退,’Q’表示程序結(jié)束。在定義數(shù)組之后,定義了int型的變量address,用來作為訪問數(shù)組的索引。接著是一個while循環(huán),條件是當前訪問的數(shù)組值不為’Q’時,才運行

while循環(huán)體中的程序,同時,每次執(zhí)行switch語句后,都要更新address,以使下次循環(huán)時,執(zhí)行新的運動。任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/switch語句switch語句是s一w種慈t多蒸ch分嗚支表選達擇語式叨句),{其一般形式如下:case常量表達式1:語句1;break;case常量表達式2:語句2;break;…case常量表達式n:語句n;break;default:語句n+1;break;其語意是,計}算表達式的值,逐個與其后的表達式值相比較,當表達式的值與常量表達式的值相等時,即執(zhí)行其后的語句。如表達式的值與所有case后的常量表達式均不相同時,則執(zhí)行default后的語句。任務(wù)四高級主題——用數(shù)組建立復雜運動?2008Open-Tech.Allrightsreserved.5/18/2023/在本例程中:當Navigation[address]為’F’時,執(zhí)行向前運動的函數(shù)Forward();當Navigation[address]為’L’時,執(zhí)行向左轉(zhuǎn)的函數(shù)Left_Turn();當Navigation[address]為’R’時,執(zhí)行向右轉(zhuǎn)的函數(shù)Right_Turn();當Navigation[address]為’B’時,執(zhí)行向后運動的函數(shù)Backward()。嘗試一下:可以更改現(xiàn)有的數(shù)組和增加數(shù)組的長度來獲取新的運動路線。試著更改,增加或刪除數(shù)組中的字符,重新運行程序,記?。簲?shù)組中的最后字符應(yīng)該是“Q”。更改數(shù)組使機器人進行熟悉的向前,左,右和后一系列的運動。任務(wù)四高級主題——用數(shù)組建立復雜運動例程NavigationWithValues.c源代碼參照教材第58頁。在本例程中,將不使用子函數(shù),而是使用三個整型數(shù)組來存儲控制機器人運動的三個變量,即循環(huán)的次數(shù)和控制左右電機運動的兩個參數(shù)。intPulses_Count[5]={65,26,26,65,0};intPulses_Left[4]={1700,1300,1700,1300};intPulses_Right[4]={1300,1300,1700,1700};address作為訪問數(shù)組的索引值,在程序中,每次用address提取一組數(shù)據(jù)。即

Pulse_Count[address],Pulse_Left[address],Pulse_Right[address]。這些

數(shù)據(jù)放在下面的代碼塊中,作為運動一次的參數(shù)。address通過加1的運算,從而獲取到下次運動的參數(shù)。for(intcounter=1;counter<=Pulses_Count[address];counter++){P1_1=1;delay_nus(Pulses_Left[address]);P1_1=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論