機器人程序設計(C語言)第2版PPT完整全套教學課件_第1頁
機器人程序設計(C語言)第2版PPT完整全套教學課件_第2頁
機器人程序設計(C語言)第2版PPT完整全套教學課件_第3頁
機器人程序設計(C語言)第2版PPT完整全套教學課件_第4頁
機器人程序設計(C語言)第2版PPT完整全套教學課件_第5頁
已閱讀5頁,還剩371頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

機器人程序設計(C語言)一種新的C語言學習方式第一章【ch01】一種新的C語言學習方式.pptx【ch02】最簡單的C程序設計--機器人做算術.pptx【ch03】循環(huán)程序設計——讓機器人動起來.pptx【ch04】函數(shù)機器人運動控制.pptx【ch05】選擇結構程序設計機器人觸須導航.pptx【ch06】選擇結構程序設計--機器人紅外導航.pptx【ch07】多分支結構程序設計機器人循線運動.pptx【ch08】結構化程序設計--智能搬運競賽.pptx【ch09】結構化程序設計——擂臺賽.pptx全套可編輯PPT課件單片機和微控制器一臺能夠工作的計算機包括CPU(CentralProcessingUnit,中央處理單元,進行運算和控制,包括運算器和控制器等)、存儲器(如RAM、ROM等)、輸入設備、輸出設備(包括串行/并行接口、USB等)。下述基本智能任務和綜合競賽任務:人機對話,交換信息。完成精確的運動軌跡。安裝傳感器,以探測周邊環(huán)境。基于傳感器信息做出決策。循線完成機器人游歷、智能搬運、擂臺賽等任務。機器人與C語言學習平臺具體步驟包括:①安裝編程開發(fā)環(huán)境。②連接機器人到電池或者供電的電源。③連接教學板到計算機,以便編程調試和交互。④運用C語言編寫第一個單片機程序,運用編譯器編譯生成可執(zhí)行文件,下載到單片機,觀察機器人單片機教學板的執(zhí)行結果。⑤斷開電源。獲得軟件01獲得軟件1.C51單片機C語言集成開發(fā)環(huán)境KeilC語言是美國KeilSoftware公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能、結構性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學易用。2.ISP軟件Progisp是一款免費下載的ISP軟件,不需要專門的安裝即可使用,非常方便。使用該軟件,讀者可以將C語言程序生成的可執(zhí)行文件下載到機器人單片機上。獲得軟件3.串口調試軟件串口調試工具就是串行通信接口調試軟件,集數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、數(shù)據(jù)監(jiān)控、數(shù)據(jù)分析等功能于一身,具有小巧精致、操作簡捷、功能強大的特點,可以在串口通信監(jiān)控、設備通信測試工作中有效提高效率。安裝軟件02安裝軟件安裝KeilμVision4IDE①運行KeilμVision4IDE安裝程序,選擇EvalVersion版進行安裝。②在出現(xiàn)的窗口中一直單擊“Next”按鈕,將程序默認安裝在C:\ProgramFiles\Keil文件夾下。③將安裝包中的“頭文件”文件夾中的文件復制到C:\ProgramFiles\Keil\C5ININC文件夾中。安裝軟件KeilμVision4IDE軟件安裝完成后,會在計算機的桌面上建立一個快捷方式。Progisp和SerialDebugTool.exe軟件都不需要安裝,只需將安裝包復制到計算機上即可。硬件連接03硬件連接C語言教學板需要連接電源來運行,同時需要連接到計算機以便編程和交互。硬件連接連接計算機C語言教學板通過USBA轉B信號線連接到計算機,程序的下載和信息的交互都通過該信號線完成。圖1-3為本書使用的USBA轉B信號線。硬件連接連接計算機硬件連接連接電源在一般的編程和調試時,建議使用6V/2A的電源適配器給C語言教學板供電。當需要機器人進行自主運動或者進行比賽時,用3.7V鋰電池給機器人供電。將鋰電池裝入專門的電池盒時,注意按照標記的電池極性(“+”和“-”)裝入。硬件連接教學板和單片機通電檢查教學板上有一個三位開關(如圖1-4所示),開關撥到“OFF”位時斷開教學板電源。無論是否將電池組或者其他電源連接到教學板上,只要三位開關位于“OFF”位,那么設備就處于關閉狀態(tài)。硬件連接教學板和單片機通電檢查硬件連接現(xiàn)在將三位開關由“OFF"位撥至“1”位,打開教學板電源,如圖1-5所示。教學板和單片機通電檢查硬件連接教學板上有一個二位開關(如圖1-6所示),當需要給單片機下載程序時,需將開關撥到“ISP”位,接通單片機下載通道。教學板程序下載與通信功能的切換第一個程序04第一個程序創(chuàng)建并編輯第一個程序雙擊KeilμVision4IDE的圖標,啟動KeilμVision4IDE,出現(xiàn)如圖1-7所示的窗口,可以通過“Project”菜單的“NewProject”命令新建項目文件。第一個程序創(chuàng)建并編輯第一個程序①在“Project”菜單中選擇“NewμVisionProject”命令(如圖1-8所示),出現(xiàn)如圖1-9所示的對話框。第一個程序創(chuàng)建并編輯第一個程序②在“文件名”文本框中輸入“HelloRobot”,保存在需要的位置(如“E:\C語言程序設計程序”),可不用加后綴名。單擊“保存”按鈕,出現(xiàn)如圖1-10所示的對話框。第一個程序創(chuàng)建并編輯第一個程序③選擇項目芯片的類型。KeilμVision4IDE幾乎支持所有的C51核心單片機,并以列表的形式給出。第一個程序第一個C語言程序:HelloRobot.c#include<uart.h>intmain(void)uart_Init();//串口初始化printf("Hello,thisisamessagefromyourRobot\(n");while(1);第一個程序第一個C語言程序:HelloRobot.c①單擊圖1-12中的“+”,出現(xiàn)如圖1-14所示的列表。第一個程序第一個C語言程序:HelloRobot.c②右鍵單擊“SourceGroup1”,在出現(xiàn)的快捷菜單中選擇“AddFileToGroup”→“SourceGroup1”,出現(xiàn)“AddExistingFilestoGroupSource'Group1'”對話框,從中選擇需要添加的程序文件,如剛才建立的HelloRobot.c;單擊“Add”按鈕,把所選文件添加到項目文件中。第一個程序第一個C語言程序:HelloRobot.c③程序文件添加到項目文件后,這時圖1-14中“SourceGroup1”的前面出現(xiàn)“+”;單擊它,將出現(xiàn)剛才添加的源文件名,如圖1-15所示(注意,圖中顯示的文件名是剛才輸入的文件名)。第一個程序第一個C語言程序:HelloRobot.c第一個程序編譯程序下面生成下載需要的可執(zhí)行文件。生成可執(zhí)行的HEX文件需要對目標工程“Target1”進行編譯設置。單擊KeilμVisionIDE快捷工具欄中的按鈕,Keil的C編譯器根據(jù)要生成的目標文件類型對目標工程項目中的C語言源文件進行編譯。第一個程序程序調試如果程序在編譯過程中出現(xiàn)了錯誤,就不能生成可下載的十六進制執(zhí)行文件。第一個程序程序調試C語言對函數(shù)名稱的大小寫是敏感的,也就是同一個名字不同的大小寫表示的是兩個函數(shù),標準的函數(shù)大小寫寫錯也會提示語法錯誤。比如,將“printf”寫成了“Printf”,編譯時會出現(xiàn)如下警告和錯誤信息:第一個程序程序調試首先警告程序中的Printf沒有函數(shù)原型,后面是錯誤信息,這個函數(shù)需要ANSI型函數(shù)原型。由此可見,一個小小的語法錯誤可以導致編譯時出現(xiàn)很多錯誤信息。總之,語法錯誤相對來說比較容易調試和修改,只要簡單檢查,就可以很快排除,特別是根據(jù)錯誤信息提示進行排除,就會更快。第一個程序下載可執(zhí)行文件到單片機將教學板的二位開關撥至“ISP”位,單擊Progisp快捷方式,打開下載軟件窗口,如圖1-19所示。第一個程序用串口調試軟件查看單片機輸出信息將教學板上的二位開關撥至“USART”位,打開串口調試軟SerialDebugTool.exe,出現(xiàn)串口調試窗口,如圖1-20所示,在左邊的“通信設置”欄的“串口號”列表框中選擇串口“COMxx”后,單擊下面的“連接”按鈕。第一個程序HelloRobot.c是如何工作的C語言是一個非常龐大的系統(tǒng),是為開發(fā)大型程序而準備的。即使是最小的一個程序,其框架結構也很復雜。main()函數(shù)主體中有2行語句:第1行是串口初始化函數(shù)uart_Init(),用來規(guī)定單片機串口是如何與計算機通信的。第一個程序printf()函數(shù)print()函數(shù)稱為格式輸出函數(shù),其功能是按用戶指定的格式,把指定的數(shù)據(jù)輸出顯示。printf()函數(shù)是C語言提供的標準輸出函數(shù),定義在C語言的標準函數(shù)庫中,要使用它,必須包括定義標準函數(shù)庫的頭文件stdio.h。第一個程序“while(1);”的作用while(1)實際上是一個死循環(huán)。HEX文件加載到單片機Flash存儲器上時,是從頭開始往下加載的。斷開電源05斷開電源工程素質和技能歸納本章涉及的主要技能①KeilμVisionIDE(集成開發(fā)環(huán)境)的安裝和使用。②C語言教學板與計算機的連接。③在集成開發(fā)環(huán)境中創(chuàng)建目標工程文件,并添加和編輯C語言源程序。④C語言程序的編譯和可執(zhí)行文件的生成。⑤Progisp下載軟件的使用和程序下載。⑥程序的執(zhí)行和串口調試終端的使用。⑦C語言程序的基本架構和格式輸出函數(shù)printf()的使用。斷開電源工程素質和技能歸納常見錯誤①函數(shù)名稱的大小寫問題。②編輯窗口中可以用中文給程序進行注釋,中文與英文所占的字符數(shù)不一樣,一個漢字要占兩個英文字符的空間。③修改的源文件不是加到了項目工程中的源文件,此時的任何修改都不會反映到項目執(zhí)行結果中。斷開電源科學精神的培養(yǎng)①查找C語言的標準輸入輸出庫函數(shù),了解printf()函數(shù)的總體功能。本章中用到了它的格式符和控制符,介紹了printf()函數(shù)輸出的各種數(shù)據(jù)類型。②了解和掌握C語言支持的各種數(shù)據(jù)類型和如何編寫簡單的程序。機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)最簡單的C程序設計一機器人做算術第二章整型數(shù)據(jù)的運算和結果顯示01首先將HelloRobot.c另存為RobotComputation.c,然后按照第1章的步驟建立一個新的項目,將RobotComputation.c加入項目,并將源程序修改成如下代碼。#include<uart.h>intmain(void)inti;uart_Init();i=7*11;printf("What's7×11?\n");printf("Theansweris:%d\n";i);while(1);整型數(shù)據(jù)的運算和結果顯示將項目編譯、連接、生成執(zhí)行代碼,下載并運行,查看輸出結果是否與圖2-1一樣。整型數(shù)據(jù)的運算和結果顯示RobotComputation.c是如何工作的C語言用關鍵字int定義整型變量。int是英文單詞integer(整數(shù))的前三個字母。整型數(shù)據(jù)的運算和結果顯示整型數(shù)據(jù)的運算和結果顯示變量的定義在程序執(zhí)行過程中,其值可改變的量稱為變量。它們與數(shù)據(jù)類型結合起來分類,可以分為整型變量、浮點變量、字符變量等。整型數(shù)據(jù)的運算和結果顯示變量的定義所有C語言變量必須在使用之前定義。定義變量的一般形式如下:

typevariable_list;整型數(shù)據(jù)的運算和結果顯示變量的定義在C語言中,標志符是對變量、函數(shù)名和其他各種用戶定義對象的命名。整型數(shù)據(jù)的運算和結果顯示變量的定義uart_Init()函數(shù)在第1章已經(jīng)介紹過,這里不再重復。例如,語句i=7*11;整型數(shù)據(jù)的運算和結果顯示變量的定義稱為賦值運算符,由“=”連接的表達式稱為賦值表達式,其后加“;”構成賦值語句,般形式為:

變量=表達式;整型數(shù)據(jù)的運算和結果顯示語句C語言規(guī)定,任何表達式在其末尾加上";"就構成語句。例如:

printf("What's7X11?\n");printf("Theansweris:%d\n";i);整型數(shù)據(jù)的運算和結果顯示語句第一個printf語句輸出雙引號中的字符串作為運算顯示提示,這在第1章中已經(jīng)用到。第二個printf語句先輸出"Theansweris:",再輸出變量i的值。

“%d”就是格式字符串,表示后面要輸出i的值,并且是十進制數(shù)。d是decimal(十進制)的首字母。整型數(shù)據(jù)的運算和結果顯示語句十進制是我們日常表示數(shù)據(jù)的一種方法,所有的數(shù)據(jù)都由10個數(shù)字組成,即由0~9組成。但是計算機為了方便存儲數(shù)據(jù),表示數(shù)據(jù)的原理同人類有些差別,主要采用二進制和十六進制存儲和表示數(shù)據(jù)。整型數(shù)據(jù)的運算和結果顯示算術運算符和整型變量表2-2給出了C語言允許的算術運算符。在C語言中,運算符“+”“-”“*”和“/”的用法與大多數(shù)計算機語言相同,幾乎可以用于C語言定義的任何數(shù)據(jù)類型。浮點型數(shù)據(jù)的運算02浮點型數(shù)據(jù)的運算C語言中的浮點數(shù)(floatingpointnumber)就是平常所說的實數(shù)(realnumber)?,F(xiàn)在來看浮點型數(shù)據(jù)的定義、運算和顯示方法。繼續(xù)將RobotComputaition.c修改成如下代碼:#include<uart.h>intmain(void)floata,b,h;uart_init();a=123456.789;b=a+20;printf("%f\n",b);while(1);浮點型數(shù)據(jù)的運算編譯、下載和運行上述程序,結果為123456.800000。計算機直接將小數(shù)點后的第2位進行了四舍五入。浮點型數(shù)據(jù)的運算系統(tǒng)把一個浮點型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式。實數(shù)123456.789在內存中的存放形式如圖2-2所示。浮點型數(shù)據(jù)的運算這4字節(jié)中究竟用多少位來表示小數(shù)部分,多少位來表示指數(shù)部分,C語言標準并無具體規(guī)定,由各C語言編譯系統(tǒng)自定。不少C語言編譯系統(tǒng)以24位表示小數(shù)部分(包括符號),以8位表示指數(shù)部分(包括指數(shù)的符號)。浮點型數(shù)據(jù)的運算受到表示小數(shù)位的位數(shù)限制,float型數(shù)據(jù)的小數(shù)部分只能接受7位有效數(shù)字,所以第一個123456.789數(shù)字的最后兩位小數(shù)不起作用,最后就顯示123456.8。而在a=123456.789e5時,也是因為小數(shù)部分的有效數(shù)字是7位,加20的運算根本體現(xiàn)不出。浮點型數(shù)據(jù)的運算為了提高浮點數(shù)的表示精度,還可以定義雙精度浮點數(shù)(double)和長雙精度浮點數(shù)(longdouble)。浮點型數(shù)據(jù)的運算通過以上實際編程實踐可知,在編程過程中要避免將一個很大的數(shù)和一個很小的數(shù)直接相加或者相減,否則會將這些“小的數(shù)”丟失。這也是我們學習程序設計時最容易忽略的地方,也是最容易出錯的地方。字符型數(shù)據(jù)03字符型數(shù)據(jù)字符常量字符常量是指用一對單引號括起來的一個字符,如'a'、'9'、'!'。字符常量中的單引號只起到定界作用并不表示字符本身。字符型數(shù)據(jù)字符常量在C語言中,字符是按其對應的ASCII值來存儲的,一個字符占1字節(jié),見表2-3。字符型數(shù)據(jù)ASCIIASCI是美國標準信息交換碼(AmericanStandardCodeforInformationInterchange)的縮寫,用來指定計算機中每個符號對應的代碼,也叫做計算機的內碼(code)。字符型數(shù)據(jù)字符常量C語言中字符常量是按整數(shù)存儲的,所以字符常量可以像整數(shù)一樣在程序中參與相關的運算,如:a'-32;/執(zhí)行結果97-32=65A+32;//執(zhí)行結果65+32=9719'-9;//執(zhí)行結果57-9-48字符型數(shù)據(jù)轉義字符轉義字符是一種特殊的字符常量,以“\”開頭,后跟一個或幾個字符。轉義字符具有特定的含義,不同于字符原有的意義,故稱“轉義”字符。例如,前面各例printf()函數(shù)中用到的“\n”就是一個轉義字符,其意義是“回車換行”。字符型數(shù)據(jù)轉義字符通常使用轉義字符表示用一般字符不便于表示的控制代碼,如用于表示字符常量的單引號(')、用于表示字符串常量的雙引號(")和反斜杠(\)等。表2-4給出了C語言中常用的轉義字符。字符型數(shù)據(jù)字符型數(shù)據(jù)轉義字符廣義地講,C語言字符集中的任何一個字符均可用轉義字符來表示。表中的“\ddd”和“xhh”正是為此而提出的。ddd和hh分別為八進制和十六進制的ASCII值。如“\101”表示字母“A”,“\102”表示字母“B”,“\134”表示反斜杠,"XOA"表示換行等。字符型數(shù)據(jù)字符變量字符變量用來存放字符常量,只能存放一個字符。字符變量的定義形式如下:charcl,c2;字符型數(shù)據(jù)字符變量它表示c1和c2為字符變量,各放入一個字符,因此可以用下面語句對c?、c2賦值:c1='a';c2=A;字符型數(shù)據(jù)字符變量所有C語言編譯系統(tǒng)都規(guī)定用1字節(jié)來存放一個字符,或者說,一個字符變量在內存中占1字節(jié)。字符型數(shù)據(jù)字符變量將字符常量放到字符變量中,實際上并不是把該字符本身放到內存單元中,而是將該字符相應的ASCII值放到存儲單元中。既然在內存中字符數(shù)據(jù)以ASCII值存儲,那么它的存儲形式就與整數(shù)的存儲形式類似,這就使得字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用。字符型數(shù)據(jù)字符變量編寫如下程序,編譯、連接,生成可執(zhí)行文件,下載執(zhí)行,看看運行結果是否同所預計的一樣。#include<uart.h>intmain(void)chara,b,h;uart_init();a=97;b=98;printf("%c%c\n",a,b);printf("%d%d\n",a,b);while(1);字符型數(shù)據(jù)工程素質和技能歸納本章涉及的主要技能①整型數(shù)據(jù)變量的定義和使用,變量的命名規(guī)則。②C語言的運算符、算術表達式和賦值語句。③整型數(shù)據(jù)的輸出格式符。④整型數(shù)據(jù)在內存中的表示方式和表示范圍。⑤浮點型數(shù)據(jù)變量的定義和使用。⑥浮點型數(shù)據(jù)在內存中的表示方法。⑦浮點數(shù)據(jù)的運算和格式顯示。⑧字符型數(shù)據(jù)與ASCII值,字符型數(shù)據(jù)在內存中的存儲方式和輸出。字符型數(shù)據(jù)工程素質和技能歸納常見錯誤①變量名稱定義和規(guī)范問題。C語言程序區(qū)分各種變量名稱的大小寫,同一個名字如果大、小寫不一樣,C語言都將其視為不同的變量。②變量類型一經(jīng)確定,就確定了其能夠表示的最大的數(shù)和最小的數(shù)。如果變量取值超過了這個范圍,就會出現(xiàn)意外的結果。字符型數(shù)據(jù)科學精神的培養(yǎng)①單片機的存儲空間有限,所以它不支持標準C語言支持的長整型、雙精度等數(shù)據(jù)類型。如果程序一定需要,應該怎樣解決這個問題?②通過本章的例子,你是否理解了程序順序執(zhí)行這種基本結構?③如何通過算術運算讓各種字符數(shù)據(jù)之間實現(xiàn)轉換?字符數(shù)據(jù)之間的轉換同通信密碼之間有何關系?機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)循環(huán)程序設計一讓機器人動起來第三章C51單片機的輸入/輸出接口控制機器人運動的伺服電機以不同速度運動是通過單片機的輸入/輸出(I/O)接口輸出不同脈沖序列來實現(xiàn)的。C51系列單片機有4個8位的并行I/O接口:P0、P1、P2和P3。AT89S52引腳:AT89S52有44根引腳,其中32根是I/O端口引腳,如圖3-1所示。其中有29根具備兩種用途(用圓括號寫出),既可作為I/O端口,也可作為控制信號或地址及數(shù)據(jù)線。單燈閃爍控制01為了驗證P1接口的輸出電平是不是由你編寫的程序控制,可以采用一個非常簡單的辦法,就是在想驗證的接口引腳上接一個發(fā)光二極管。當輸出高電平時,發(fā)光二極管滅;輸出低電平時,發(fā)光二極管亮。單燈閃爍控制單燈閃爍控制LED電路元器件(1)紅色發(fā)光二極管,2個。(2)470Ω電阻,2個。單燈閃爍控制LED電路搭建在搭建電路前先認識面包板。教學板前端,那塊白色的、有許多孔或插座的區(qū)域稱為無焊料的面包板。面包板連同它三邊黑色插孔稱為原型區(qū)域,如圖3-2所示。單燈閃爍控制LED電路搭建單燈閃爍控制LED電路搭建在面包板插孔插上元器件,如本任務用到的電阻、LED燈,就可以構成本書例程的電路。元器件靠面包板插孔彼此連接。單燈閃爍控制LED電路搭建面包板上共17列插孔,列與列之間互不相通。整個面包板通過中間槽分為兩塊,它們之間的插座互不相通。每一小列由5個插孔組成,這5個插孔在面包板上是電氣相連的。單燈閃爍控制現(xiàn)在按照圖3-3所示電路,在教學板的面包板上搭建起實際電路。LED電路搭建單燈閃爍控制圖3-3所示的電路原理圖指引你如何連接電路元器件,使用唯一的符號來表示不同的元器件。這些器件符號用細線相連,表示它們是電氣相連的。在電路原理圖中,當兩個器件符號用細線相連時,表示它們之間是電氣連接的。細線還可以將元器件和電壓端口連接。LED電路搭建單燈閃爍控制圖3-4為元器件電路符號與實際元器件的對應圖。元器件符號圖的上方就是該元器件的零件圖。LED電路搭建單燈閃爍控制LED電路搭建根據(jù)圖3-3實際搭建好的電路參考圖3-5所示。單燈閃爍控制LED電路搭建實際搭建電路時應注意:確認發(fā)光二極管的短針腳(陰極)插入面包板,通過電阻與P10相連。確認發(fā)光二極管的長針腳(陽極)插入"+5V"插口,這里+5V就是電路圖上的Vcc。單燈閃爍控制HighLowLed.c是如何工作的與第1章程序相比,本例程多使用了一個頭文件BoeBot.h,其中定義了兩個延時函數(shù);voiddelay_nms(unsignedinti)和voiddelay_nus(unsignedinti)。單燈閃爍控制修飾符unsigned放到int前面,指定后面的變量為無符號數(shù)。如果加上修飾符signed,則指定是“有符號數(shù)”。如果既不指定signed,也不指定為unsigned,則隱含為有符號(signed)。實際上,signed是可以省略的。無符號整型數(shù)據(jù)unsignedint單燈閃爍控制單片機端口引腳信號隨時間的變化可以用時序圖來描述,一個端口引腳的時序圖反應的是其高、低電壓信號與時間的變化關系圖。時序圖簡介機器人伺服電機控制信號02機器人伺服電機控制信號圖3-8所示是高電平持續(xù)1.5ms,低電平持續(xù)20ms,然后不斷重復地控制脈沖序列。該脈沖序列發(fā)給經(jīng)過零點標定后的伺服電機,伺服電機不會旋轉。如果此時電機旋轉,那么表明電機需要標定。機器人伺服電機控制信號由圖3-8、圖3-9和圖3-10可知,控制電機運轉速度的是高電平持續(xù)的時間,當高電平持續(xù)時間為1.3ms時,電機順時針全速旋轉;當高電平持續(xù)時間1.7ms時,電機逆時針全速旋轉。按照任務1中給單片機微控制器編程,使P1端口的兩個引腳(P1_0和P1_1)控制兩個LED燈閃爍,重新給單片機編程,就可以給這兩個引腳發(fā)出伺服電機的控制信號。機器人伺服電機控制信號機器人伺服電機控制信號按照圖3-12所示的伺服電機與教學板的連接原理圖和實際接線圖,將兩個電機的連接線連接到教學板上。具體連接時,注意將P1_0引腳的控制輸出用來控制右邊的伺服電機,P1_1則用來控制左邊的伺服電機。機器人伺服電機控制信號機器人伺服電機控制信號單片機編程發(fā)給伺服電機的高、低電平信號必須具備更精確的時間。機器人伺服電機控制信號用下面的程序片段代替例程HighLowLed.c中相應的程序片段,編譯、連接、執(zhí)行代碼,觀察連接到P1_0腳的機器人輪子是不是逆時針全速旋轉。計數(shù)并控制循環(huán)次數(shù)03計數(shù)并控制循環(huán)次數(shù)for語句最方便的控制一段代碼執(zhí)行次數(shù)的方法是利用for循環(huán),語法如下:for(表達式1;表達式2;表達式3)語句計數(shù)并控制循環(huán)次數(shù)for語句它的執(zhí)行過程如下:(1)求解表達式1。(2)求解表達式2,若其值為真(非0),則執(zhí)行for語句中指定的內嵌語句,然后執(zhí)行第(3)步;若其值為假(0),則結束循環(huán),轉到第(5)步。(3)求解表達式3。(4)轉回第(2)步繼續(xù)執(zhí)行。(5)循環(huán)結束,執(zhí)行for語句下面的一個語句。計數(shù)并控制循環(huán)次數(shù)for語句for語句最簡單的應用形式,也就是最易理解的形式如下:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增/減值)語句計數(shù)并控制循環(huán)次數(shù)自增和自減C語言有兩個很有用的運算符-—自增和自減,即“++”和“_”。運算符“艸”是操作數(shù)加1,而“-”是操作數(shù)減1。換句話說:“x=x+1”同“x++”,“x=x-1”同“x—”。計數(shù)并控制循環(huán)次數(shù)for循環(huán)控制電機的運行時間下面是for循環(huán)的例子,它會使電機運行幾秒鐘。用計算機來控制機器人的運動04用計算機來控制機器人的運動scanf()函數(shù)scanf()函數(shù)與printf()函數(shù)對應,在C語言庫的stdio.h中定義。它的一般形式如下:scanf("格式控制字符串",地址列表);用計算機來控制機器人的運動scanf()函數(shù)程序運行結果如圖3-13所示。①輸出“ProgramRunning!”和“Pleaseinputpulsenumber:”。②程序處于等待狀態(tài),等待輸入數(shù)據(jù)。③在發(fā)送區(qū)(顯示窗口下面的窗口)輸入數(shù)據(jù)并回車,然后單擊“發(fā)送”按鈕,將數(shù)據(jù)發(fā)送給變量PulseNumber。④scanf()函數(shù)收到數(shù)據(jù)后,執(zhí)行下面的語句,輸出“Pleaseinputpulseduration:”。⑤處于等待狀態(tài)。用計算機來控制機器人的運動scanf()函數(shù)程序運行結果如圖3-13所示。⑥在發(fā)送區(qū)再輸入數(shù)據(jù),然后單擊“發(fā)送”按鈕,將數(shù)據(jù)發(fā)送給變量PulseDuration。⑦程序接收到兩個數(shù)據(jù)后執(zhí)行剩余的程序,讓伺服電機運轉。用計算機來控制機器人的運動scanf()函數(shù)用計算機來控制機器人的運動工程素質和技能歸納本章涉及的主要技能①C51系列單片機的引腳定義和分布。②用C51單片機的P1端口的位輸出控制單燈和雙燈閃爍,時序圖的概念,while循環(huán)的引入和延時函數(shù)的使用。③機器人伺服電機的控制脈沖序列,通過給C51編程讓其輸出這些控制脈沖序列。④自增運算符的使用。⑤for循環(huán)的使用以控制機器人的運動。⑥如何通過串口輸入數(shù)據(jù)控制機器人的運動。用計算機來控制機器人的運動科學精神的培養(yǎng)①比較BS2微控制器與C51單片機微控制器輸入、輸出接口的使用方法。②比較C語言程序與BASIC程序的異同,找出它們的共同點。③比較C語言的for循環(huán)和PBASIC的for循環(huán)。④查找C語言的標準輸入/輸出庫函數(shù),了解scanf()函數(shù)的主要功能。⑤有了scanf()函數(shù),能不能寫一個程序,模擬我們日常使用的計算器?機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)函數(shù)——機器人運動控制第四章基本巡航動作01圖4-1定義了機器人的前、后、左、右四個方向:當機器人向前走時,它將走向本頁紙的右邊;當向后走時,會走向紙的左邊;向左轉會使其向紙的頂端移動;向右轉它會朝著本頁紙的底端移動。基本巡航動作基本巡航動作向前巡航按照圖4-1前進方向的定義,機器人向前走時,從機器人的左邊看,它向前走時輪子是逆時針旋轉的;從右邊看,另一個輪子則是順時針旋轉的?;狙埠絼幼飨蚯把埠絝or循環(huán)的參數(shù)控制了發(fā)送給電機的脈沖數(shù)量。由于每個脈沖的時間是相同的,因而for循環(huán)的參數(shù)也控制了伺服電機運行的時間?;狙埠絼幼骰狙埠絼幼飨蚯把埠嚼蹋篟obotForwardThreeSeconds.c(1)確保控制器和伺服電機都已接通電源。(2)輸入、保存、編譯、下載并運行程序RobotForwardThreeSeconds.c?;狙埠絼幼飨蚯把埠絉obotForwardThreeSeconds.c是如何工作的for循環(huán)體中前三行語句使左側電機逆時針旋轉,后續(xù)的三行語句使右側電機順時針旋轉。因此兩個輪子轉向機器人的前端,使機器人向前運動。整個for循環(huán)執(zhí)行130次,大約需要3s,從而機器人也向前運動3s。基本巡航動作向前巡航關于例程調試的一點說明printf()函數(shù)的作用是提示。若你覺得串口線影響了機器人的運動,可以不用此函數(shù)。還有一個進行調試的方法;讓機器人的前端懸空,讓伺服電機空轉。這樣調試起來就方便了,機器人不會到處亂跑。后面的例程調試也是這樣。勻加速、勻減速運動02編寫勻加速運動程序勻加速運動程序片段示例: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);勻加速、勻減速運動編寫勻加速運動程序循環(huán)每重復執(zhí)行一次,變量pulseCount就增加1:第一次循環(huán)時,變量pulseCount的值是10,此時發(fā)給P1_1、P1_0的脈沖的寬度分別為1.51ms、1.49ms;第二次循環(huán)時,變量pulseCount的值是11,此時發(fā)給P1_1、P1_0的脈沖的寬度分別為1.511ms、1.489ms。勻加速、勻減速運動勻加速、勻減速運動編寫勻加速運動程序例程:StartAndStopWithRamping.c#include<BoeBot.h>#include<uart.h>intmain(void)intpulseCount;uart_Init();printf("ProgramRunning!\n");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);for(pulseCount=1;pulseCount<=75;pulseCount++)勻加速、勻減速運動編寫勻加速運動程序P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);for(pulseCount=200;pulseCount>=0;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);while(1);勻加速、勻減速運動編寫勻加速運動程序(1)輸入、保存并運行程序StartAndStopWithRamping.c。(2)驗證機器人是否逐漸加速到全速,保持一段時間,然后逐漸減速到停止。用函數(shù)調用簡化

運動程序03用函數(shù)調用簡化運動程序函數(shù)從函數(shù)定義的角度來看,函數(shù)有兩種①標準函數(shù),即庫函數(shù)。②用戶定義函數(shù),以解決專門需要。不僅要在程序中定義函數(shù)本身,在主調函數(shù)模塊中還必須對該被調函數(shù)進行類型說明,然后才能使用。用函數(shù)調用簡化運動程序函數(shù)從有無返回值角度來看,函數(shù)可以分為兩種①有返回值函數(shù)。函數(shù)被調用執(zhí)行完后將向調用者返回一個執(zhí)行結果,稱為函數(shù)返回值。由用戶定義的返回函數(shù)值的函數(shù),必須在函數(shù)定義中明確返回值的類型。②無返回值函數(shù)。此類函數(shù)用于完成某項特定的處理任務,執(zhí)行完成后不向調用者返回函數(shù)值。用函數(shù)調用簡化運動程序函數(shù)從主調函數(shù)和被調函數(shù)之間數(shù)據(jù)傳送的角度看,函數(shù)也可分為兩種①無參函數(shù)。函數(shù)定義、說明及調用中均不帶參數(shù),主調函數(shù)和被調函數(shù)之間不進行參數(shù)傳送。②有參函數(shù)。在函數(shù)定義及說明時都有參數(shù),稱為形式參數(shù)(簡稱形參)。用函數(shù)調用簡化運動程序函數(shù)main()函數(shù)的返回值其實不難理解,main()函數(shù)執(zhí)行完后,它的返回值是給操作系統(tǒng)的。雖然在main()函數(shù)體內并沒有什么語句來指出返回值的大小,但系統(tǒng)默認的處理方式是:當main()函數(shù)成功執(zhí)行時,它的返回值為1,否則為0。用函數(shù)調用簡化運動程序函數(shù)現(xiàn)在看看下面的函數(shù)定義:voidForward(void)一1inti;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);-用函數(shù)調用簡化運動程序函數(shù)重新定義向前運動函數(shù)如下:voidForward(intPulseCount,intVelocity)?inti;/*速度參數(shù)的值為0~200*/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);用函數(shù)調用簡化運動程序函數(shù)例程:MovementsWithFunctions.c#include<BoeBot.h>#include<uart.h>voidForward(intPulseCount,intVelocity)inti;for(i=1;i<=PulseCount;i++)/*速度參數(shù)的值為0~200/用函數(shù)調用簡化運動程序函數(shù)P1_1=1;delay_nus(1500+Velocity);P1_1=0;P1_0=1;delay_nus(1500-Velocity);P1_0=0;delay_nms(20);用函數(shù)調用簡化運動程序函數(shù)voidLeft(intPulseCount,intVelocity)inti;for(i=1;i<=PulseCount;i++)PI_1=1;delay_nus(1500-Velocity);P1_1=0;P1_0=1;delay_nus(1500-Velocity);P1_0=0;delay_nms(20);速度參數(shù)的值為0~2001用函數(shù)調用簡化運動程序函數(shù)voidRight(intPulseCount,intVelocity)inti: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);速度參數(shù)的值為0~200*/用函數(shù)調用簡化運動程序函數(shù)voidBackward(intPulseCount,intVelocity)inti;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);/*速度參數(shù)的值為0~200*用函數(shù)調用簡化運動程序函數(shù)intmain(void)printf("ProgramRunning!\n");Forward(65,200);Left(26,200);Right(26,200);Backward(65,200);while(1);用數(shù)組進一步簡化函數(shù)調用04用數(shù)組進一步簡化函數(shù)調用將MovementsWithOneFuntion.c程序修改成如下。#include<BoeBot.h>#include<uart.h>voidMove(intcounter,intPC1_pulseWide,intPCO_pulseWide)//同任務4.3一樣intmain(void)用數(shù)組進一步簡化函數(shù)調用intcounter[4]={65,26,26,65};intPClPulse[4]={1700,1300,1700,1300};intPCOPulse[4]={1300,1300,1700,1700};intindex;uart_Init()printf("ProgramRunning!\n");for(index=0;index<4;index++)Move(counter[index],PC1Pulse[index],PCOPulse[index]);while(1);用數(shù)組進一步簡化函數(shù)調用程序是如何工作的數(shù)組在程序設計中,為了處理方便,可以把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。用數(shù)組進一步簡化函數(shù)調用程序是如何工作的類型說明符是任一種基本數(shù)據(jù)類型。數(shù)組名是用戶定義的數(shù)組標志符。方括號中的常量表達式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。用數(shù)組進一步簡化函數(shù)調用程序是如何工作的一維數(shù)組的引用數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量,其標識方法為數(shù)組名后跟一個下標,下標表示了元素在數(shù)組中的順序號(從0開始計數(shù))。數(shù)組元素的一般形式為:

數(shù)組名[下標]用數(shù)組進一步簡化函數(shù)調用程序是如何工作的用數(shù)組元素作為函數(shù)實參調用函數(shù)數(shù)組元素作為實參與變量或者實際數(shù)據(jù)作為實參是一樣的,直接將元素數(shù)據(jù)傳送給函數(shù)。用數(shù)組進一步簡化函數(shù)調用工程素質和技能歸納本章涉及的主要技能①歸納機器人的基本巡航動作并給C51單片機編程實現(xiàn)這些基本動作。②用牛頓力學和運動學知識分析機器人的運動行為。③采用勻變速運動改善機器人的基本運動行為。④用C語言的函數(shù)實現(xiàn)機器人的基本動作、函數(shù)的定義和調用方法。⑤分析機器人基本動作函數(shù)的實現(xiàn)特點,用一個函數(shù)定義機器人的所有行為。⑥用數(shù)組存儲機器人的動作序列,用數(shù)組元素作為實參調用運動函數(shù)。用數(shù)組進一步簡化函數(shù)調用科學精神的培養(yǎng)①比較各種實現(xiàn)機器人基本動作程序的優(yōu)缺點,以及后續(xù)程序的可擴展性。②查閱相關數(shù)據(jù)了解數(shù)組元素的初始化方法。③既然有一維數(shù)組,就應該有兩維數(shù)組、三維數(shù)組。查閱相關參考書,了解兩維數(shù)組的定義和使用方法,并嘗試用兩維數(shù)組簡化任務4.4中的程序。機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)選擇結構程序設計機器人觸須導航第五章安裝并測試

機器人觸須01安裝并測試機器人觸須編程讓機器人通過觸須導航前,必須先安裝并測試觸須。安裝機器人觸須所需的硬件元器件如圖5-1所示,包括:①金屬絲(觸須),2根。②平頭M3×5盤頭螺釘,2個。③13mm銅螺柱,2個。④M3尼龍墊圈,2個。⑤3-pin公-公接頭,2個。⑥220Ω電阻,2個。⑦10kQ電阻,2個。安裝并測試機器人觸須安裝并測試機器人觸須安裝觸須(1)拆掉連接主板到前支架的兩顆螺釘。(2)參考圖5-2,進行下面的操作。(3)23mm銅螺柱穿過主板上的圓孔,擰進主板下面的螺柱中,擰緊。(4)兩個螺釘依次穿過M3尼龍墊圈擰進銅螺柱中。(5)把須狀金屬絲的其中一個勾在尼龍墊圈之上,另一個勾在尼龍墊圈之下,調整它們的位置,使它們橫向交叉但不接觸。(6)擰緊螺釘?shù)姐~螺柱上。(7)參考圖5-3,搭建觸須電路。安裝并測試機器人觸須安裝觸須安裝并測試機器人觸須測試觸須觀察圖5-3所示的觸須電路示意圖,顯然每條觸須都是一個機械式的、接地(GND)常開的開關。觸須接地是因為教學板外圍的鍍金孔都連接到GND。銅螺柱和螺釘給觸須提供電氣連接。安裝并測試機器人觸須測試觸須上拉電阻上拉電阻就是與電源相連并起到拉高電平作用的電阻,還起到限流的作用。圖5-3中的10kΩ電阻即為上拉電阻。其實,第3章單燈閃爍控制任務中就用到了上拉電阻,因為AT89S52的I/O接口驅動能力不夠強,不能使LED點亮。安裝并測試機器人觸須位操作運算符位操作運算符用于對字節(jié)或字中的位(bit)進行測試、置位或移位處理,如表5-1所示。安裝并測試機器人觸須if語句if語句根據(jù)給定的條件進行判斷,以決定執(zhí)行某個分支程序段。if語句的基本形式為:if(表達式)語句1;else語句2;安裝并測試機器人觸須操作符?:C語言提供了一個可以代替某些“if-else”語句的簡便易用的操作符“?:”。該操作符是三元的,其一般形式為:表達式1?表達式2:表達式3安裝并測試機器人觸須操作符?:在搞清楚整個程序的執(zhí)行原理后,按照下面的步驟實際執(zhí)行程序,對觸須進行測試。(1)接通教學板和伺服電機的電源。(2)輸入、保存并運行程序TestWhiskers.c。(3)這個例程要用到調試終端,所以當程序運行時要確保串口電纜已連接好。(4)檢查圖5-3所示電路,弄清楚哪條觸須是左觸須,哪條是右觸須。(5)注意調試終端的顯示值,此時顯示為“右邊觸須的狀態(tài):1左邊觸須的狀態(tài):1”,如圖5-6所示。安裝并測試機器人觸須操作符?:(6)按下右觸須,使其接觸到3-pin轉接頭上,顯示為“右邊觸須的狀態(tài):0左邊觸須的狀態(tài):1”,如圖5-7所示。(7)把左觸須接到3-pin轉接頭上,顯示為“右邊觸須的狀態(tài):1左邊觸須的狀態(tài):0”,如圖5-8所示。(8)同時把兩個觸須接到各自的3-pin轉接頭上,顯示為“右邊觸須的狀態(tài):0左邊觸須的狀態(tài):0”,如圖5-9所示。(9)如果兩個觸須都通過測試,則繼續(xù)下面的內容。否則檢查程序或電路中存在的錯誤。安裝并測試機器人觸須操作符?:安裝并測試機器人觸須操作符?:通過觸須導航02通過觸須導航編程使機器人基于觸須導航為了實現(xiàn)這些功能,需要編程讓機器人來做出選擇,此時要用到if語句的標準形式,即if-else-if形式,它可以進行多分支選擇,其一般形式為:if(表達式1)語句1;elseif(表達式2)語句2;elseif(表達式3)語句3;elseif(表達式n-1)語句n-1;語句n;通過觸須導航關系與邏輯運算符關系與邏輯運算符概念如表5-2所示,關鍵是True(真)和Flase(假)。C語言中,非0為True;0為Flase。使用關系與邏輯運算符的表達式對Flase和True分別返回值0和1。通過觸須導航關系與邏輯運算符通過觸須導航關系與邏輯運算符賦值運算符“=”與關系運算符“==”賦值運算符“=”用來給變量賦值;關系運算符“==”判斷兩個值是否是相等的關系。邏輯與運算符“&&”相當于BASIC語言中的AND運算符。邏輯與的運算規(guī)則如下:/若A、B為真,則A&&B為真通過觸須導航關系與邏輯運算符例程:RoamingWithWhiskers.c(1)打開主板和伺服電機的電源。(2)輸入、保存并運行程序RoamingWithWhiskers.c。(3)嘗試讓機器人行走,當在其路線上遇到障礙物時,它將后退、旋轉并轉向另一個方向。#include<BoeBot.h>#include<uart.h>通過觸須導航觸須導航機器人怎樣行走主程序中的語句首先檢查觸須的狀態(tài)。如果兩個觸須都觸動了,即PI_4state()和P2_3state()都為0,那么調用Backward(),緊接著調用Left_Turn()兩次;如果只是右觸須被觸動,即只有P2_3state()=0,那么調用Backward(),再調用Left_Turn();如果左觸須被觸動,即只有P1_4state()=0,那么調用Backward(),再調用Right_Turn();如果兩個觸須都沒有觸動,那么在else中調用Forward()語句。機器人進入死區(qū)后的人工智能決策03機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)修改RoamingWithWhiskers.c,讓機器人碰到上述問題時逃離死區(qū),技巧是記下觸須交替觸動的總次數(shù)。其關鍵是程序必須記住每個觸須的前一次觸動狀態(tài),并與當前觸動狀態(tài)對比。如果狀態(tài)相反,就在交替總數(shù)上加1。機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)條件成立(條件為真),那么檢查包含于這個條件之內的另一個條件。下面是用偽代碼說明條件嵌套語句的用法。if(condition1)commandsforcondition1if(condition2)機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)commandsforbothcondition2andconditionlelsecommandsforconditionlbutnotcondition2elsecommandsfornotcondition1機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)例程:EscapingCorners.c本例程使機器人在第4次或第5次交替探測到墻角后,完成一個U形拐彎,哪一個觸須先被觸動。(1)輸入、保存并運行程序EscapingCorners.c。(2)在機器人行走時,輪流觸動它的觸須,測試該程序。機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)EscapingCorners.c是如何工作的由于該程序是經(jīng)RoamingWithWhiskers.c修改而來的,下面只討論與探測和逃離墻角相關的新特征。intcounter=1;intold2=1;intold3=0;機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)三個變量用于探測墻角。int型變量counter用來存儲交替探測的次數(shù)。程序中設定的交替探測的最大值為4,int型變量old2、old3存儲觸須舊的狀態(tài)值。機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)首先要檢查的是,是否有且只有一根觸須被觸動。簡單的方法就是詢問“是否P1_4state()不等于P2_3state()",判斷語句如下:

if(P1_4state()!=P2_3state())機器人進入死區(qū)后的人工智能決策編程逃離墻角死區(qū)如果發(fā)現(xiàn)觸須連續(xù)4次被觸動,那么計數(shù)值置1,并且進行U形拐彎。if(counter>4)counter=1;Backward();LeftTurn();Left_Turn();機器人行進過程中的碰撞保護程序04機器人行進過程中的碰撞保護程序continue語句continue的一般形式為:continue;其作用是結束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。機器人行進過程中的碰撞保護程序continue語句利用continue語句編寫的機器人運動函數(shù)如下:voidMoveWithProtect(intcounter,intPC1_pulseWide,intPC0_pulseWide)inti=0;while(i<counter)if(P1_4state()==0)||(P2_3state()==0))continue;P1_1=1;delay_nus(PCl_pulseWide);P1_1=0;P1_0=1;delay_nus(PCO_pulseWide);P1_0=0;delay_nms(20);i++;}機器人行進過程中的碰撞保護程序工程素質和技能歸納本章涉及的主要技能①接觸型傳感器作為輸入反饋與C51單片機的編程實現(xiàn)。②C51單片機并行I/O口的特殊功能寄存器的概念和使用。③C語言條件判斷語句的使用。④C語言各種運算符的使用,包括位運算符、關系運算符、邏輯運算符及操作符?等。機器人行進過程中的碰撞保護程序工程素質和技能歸納本章涉及的主要技能⑤機器人的觸覺導航策略的實現(xiàn)。⑥條件判斷語句的嵌套與機器人的智能決策等。⑦循環(huán)內continue語句的使用。機器人行進過程中的碰撞保護程序工程素質和技能歸納在一個邏輯表達式中如果有多個邏輯運算符,甚至有關系運算符和算術運算時,則優(yōu)先次序如下:i.邏輯非的優(yōu)先級最高,邏輯與次之,邏輯或最低。ii.邏輯與和邏輯或低于關系運算符,邏輯非高于算術運算符,即按照優(yōu)先級從高到低的順序是邏輯非高于算術運算符,算術運算符高于關系運算符,關系運算符高于邏輯與和邏輯或,邏輯與和邏輯或高于賦值運算符。機器人行進過程中的碰撞保護程序工程素質和技能歸納i.若a=4,則la的值為0。ii.若a=5,b=10,則a&&b的值為1。iii.5&&13的值為1。iv實際上,邏輯運算符兩側的運算對象不但可以是0和1,或者是0和非0的整數(shù),也可以是字符型、實型或者指針型等。系統(tǒng)最終以0和非0來判斷它們屬于“真”或者“假”。機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)選擇結構程序設計一機器人紅外導航第六章使用紅外發(fā)射器和接收器探測道路紅外前燈在機器人上建立的紅外探測物體系統(tǒng)在許多方面就像汽車的前燈系統(tǒng)。使用紅外發(fā)射器和接收器探測道路紅外二極管發(fā)射紅外光,如果機器人前面有障礙物,紅外光從物體反射回來,相當于機器人眼睛的紅外檢測(接收)器,檢測到反射回的紅外光,并發(fā)出信號來表明檢測到從物體反射回紅外光。機器人的大腦——單片機AT89S52基于該傳感器的輸入控制伺服電機。搭建并測試IR發(fā)射和探測器對01本任務將搭建并測試紅外線發(fā)射和檢測器對。本章需要用到的新部件如圖6-2所示。搭建并測試IR發(fā)射和探測器對搭建并測試IR發(fā)射和探測器對元器件清單(1)紅外檢測器,2個。(2)IRLED(帶套筒),2個。(3)470Ω電阻,2個。(4)連接線,若干。搭建并測試IR發(fā)射和探測器對搭建紅外前燈電路板的每個角安裝一個IR組(IRLED和檢測器)。(1)斷開主板和伺服系統(tǒng)的電源。(2)在教學板上建立如圖6-3所示的電路,可參考實物連接圖,如圖6-4所示。搭建并測試IR發(fā)射和探測器對搭建紅外前燈搭建并測試IR發(fā)射和探測器對搭建紅外前燈測試紅外檢測器讓每個IRLED探測器組工作的關鍵是發(fā)送1ms頻率為38.5kHz的紅外信號,然后立刻將IR探測器的輸出存儲到一個變量中。例如,它發(fā)送38.5kHz信號給連接到P1_3的IR發(fā)射器,然后用整型變量irDetectLeft存儲連接到P1_2的IR探測器的輸出上。搭建并測試IR發(fā)射和探測器對測試紅外檢測器for(counter=0;counter<38;counter++)P1_3=1;delay_nus(13);P1_3=0;delay_nus(13);irDetectLeft=P1_2state();搭建并測試IR發(fā)射和探測器對搭建并測試IR發(fā)射和探測器對例程:TestLeftlrPair.c(1)打開教學板的電源。(2)輸入、保存并運行程序TestLeftIrPair.c。(3)保持機器人與通信電纜的連接,因為需用調試終端來測試IR組。(4)放一個物體,如手或一張紙,距離左側IR組2~3cm處,見圖6-1。搭建并測試IR發(fā)射和探測器對例程:TestLeftlrPair.c(5)驗證:放一個物體在IR組前時,調試終端是否會顯示“irDetecfLeft=0”?將物體移開時,它是否顯示“irDetectLeft=1”(如圖6-5所示)?(6)如果調試終端顯示的是預料的值,沒發(fā)現(xiàn)物體,則顯示1;發(fā)現(xiàn)物體,則顯示0,轉到例程后的“該你了”部分。(7)如果調試終端顯示的不是預料的值,試試按排錯部分的步驟進行排錯。搭建并測試IR發(fā)射和探測器對排錯①如果調試終端顯示的不是預料的值,檢查電路和輸入的程序。②如果總是得到0,甚至當沒有物體在機器人前面時也是0,可能是附近的物體反射了紅外光。③如果機器人前面沒有物體時,絕大多數(shù)時間讀數(shù)是1,但偶爾是0,這可能是附近的熒光燈的干擾。關掉附近的熒光燈,重新測試。搭建并測試IR發(fā)射和探測器對排錯搭建并測試IR發(fā)射和探測器對函數(shù)延時的不精確性如果把KeiluVision4IDE安裝在C盤,將在C:\ProgramFiles\Keil\C51\INC目錄下發(fā)現(xiàn)頭文件“INTRINS.H”。這個頭文件中聲明了一個空函數(shù)_nop_(void),它能準確延時一個機器周期,即約1μs。探測和避開障礙物02探測和避開障礙物有關IR檢測器的趣事是它們的輸出與觸須的輸出非常相像。沒有檢測到物體時,輸出為高電平;檢測到物體時,輸出為低電平。本任務是更改程序RoamingWithWhiskers.c,使它適合IR檢測器。探測和避開障礙物進行IR探測時要使用AT89S52的4個引腳:P1_2、P1_3、P3_5和P3_6。探測和避開障礙物宏定義宏定義的一般形式為:#define標識符字符串探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避下一個例程與RoamingWithWhiskers.c相似:更改旁邊的名稱和描述,加入兩個變量來存儲IR檢測器的狀態(tài)。intirDetectLeftintirDetectRight探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避下一個例程與RoamingWithWhiskers.c相似:更改旁邊的名稱和描述,加入兩個變量來存儲IR檢測器的狀態(tài)。intirDetectLeftintirDetectRight探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避設計一個函數(shù)voidIRLaunch(unsignedcharIR)來進行紅外發(fā)射。voidIRLaunch(unsignedcharIR)intcounter;if(IR=='L')//左邊發(fā)射for(counter=0;counter<38;counter++)LeftLaunch=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_0;LeftLaunch=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();nop_(0);_nop_();_nop_();_nop_(0;_nop_();_nop_();探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避if(IR=='R')//右邊發(fā)射for(counter=0;counter<38;counter++)RightLaunch=1;_nop_();_nop_();_nop_();_nop_();nop_();_nop_();nop_();nop_();nop_();nop_();_nop_();_nop_();RightLaunch=0;_nop_(;_nop_();_nop_();_nop_();_nop_();_nop_(;nop_();_nop_();nop_();_nop_();_nop_();_nop_();探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避例程:RoamingWithlr.c(1)打開教學板的電源。(2)保存并運行程序。(3)機器人的運動與運行程序RoamingWithWhiskers.c時相比,是不是除了不需接觸,其他都非常像。高性能的IR導航03高性能的IR導航在每個脈沖之間采樣,以避免碰撞探測障礙物很重要的一點是在機器人撞到它之前給機器人留有繞開它的空間。如果前方有障礙物,機器人會使用脈沖命令避開,然后探測,如果物體還在,再使用另一個脈沖來避開它。機器人能持續(xù)使用電機驅動脈沖和探測,直到它繞開障礙物,它會繼續(xù)發(fā)送向前行走的脈沖。高性能的IR導航在每個脈沖之間采樣,以避免碰撞例程:FastIrRoaming.c輸入、保存并運行程序FastIrRoaming.c。高性能的IR導航在每個脈沖之間采樣,以避免碰撞高性能的IR導航在每個脈沖之間采樣,以避免碰撞高性能的IR導航在每個脈沖之間采樣,以避免碰撞高性能的IR導航在每個脈沖之間采樣,以避免碰撞高性能的IR導航FastIrRoaming.c是如何工作的這個程序使用稍微不同的方法來使用驅動脈沖。除了兩個存儲IR檢測器輸出的狀態(tài),它還使用兩個整型變量來設置發(fā)送的脈沖持續(xù)時間。intpulseLeft,pulseRight;intirDetectLeft,irDetectRight;高性能的IR導航do...while語句在C語言中,直到型循環(huán)控制語句是“do...while”,它的一般形式為:do語句while(表達式);俯視的探測器04俯視的探測器到目前為止,當機器人探測到前面有障礙物時,主要使機器人做避讓動作。也有一些場合,當沒有檢測到障礙物時,機器人也必須采取避讓動作。(1)斷開主板和伺服系統(tǒng)的電源。(2)使R組向外向下,如圖6-6所示。俯視的探測器俯視的探測器(1)卷裝黑色聚氯乙烯絕緣帶,19mm寬。(2)一張白色招貼板,56cm×71cm。推薦材料俯視的探測器(1)如圖6-7所示,建立一塊有絕緣帶邊界的場地。使用至少3條絕緣帶,絕緣帶邊之間連接緊密,沒有白色露出來。(2)用1k2(或2kQ)電阻代替圖6-3中的R3(R4),這樣就減少了通過IRLED的電流,從而降低了發(fā)射功率,使機器人在本任務中看得近一些。用絕緣帶模擬桌子的邊沿俯視的探測器用絕緣帶模擬桌子的邊沿俯視的探測器邊沿探測編程編程使機器人在桌面行走而不會走到桌邊,只需修改程序FastfrRoaming.c中的if..else語句。主要的修改是,當iDetectLeft和irDetectRight的值都是0時,表明在桌子表面檢測到物體(桌面),機器人向前行走。俯視的探測器邊沿探測編程例程:AvoidTableEdge.c(1)打開程序FastIrRoaming.c并另存為AvoidTableEdge.c。(2)修改它使其與下面例程匹配。(3)打開主板與電機的電源。(4)在帶絕緣帶邊框的場地上測試程序。俯視的探測器AvoidTableEdge.c是如何工作的在程序中加入一個for循環(huán)來控制每次發(fā)送多少脈沖,加入一個變量pulseCount作為循環(huán)的次數(shù):intpulseCount;俯視的探測器本章涉及的主要技能①紅外傳感器作為輸入反饋與單片機的編程實現(xiàn)。②C語言#define指令的使用。③do..while循環(huán)控制語句的使用。④高性能紅外線導航及邊沿探測的實現(xiàn)。工程素質和技能歸納機器人程序設計(C語言)感謝觀看機器人程序設計(C語言)多分支結構程序設計機器人循線運動第七章QTI傳感器及其

通信接口01QTI傳感器及其通信接口本項目使用的QTI(QuickTrackInfrared)傳感器如圖7-2所示。它的工作原理同第6章的紅外發(fā)射器和接收器的原理相同,只是對兩個電路進行了封裝,并用一個信號線來實現(xiàn)對紅外光的發(fā)射和接收控制,節(jié)約了單片機微控制器的寶貴接口(引腳)資源。QTI傳感器及其通信接口QTI傳感器及其通信接口本項目所用QTI傳感器的性能參數(shù)如下。①工作溫度:-40℃~85℃。②工作電壓:5V。③連續(xù)電流:50mA。④功耗:100mW。⑤最佳探測距離:5~10mm。⑥最佳距離下最大散射角度:65°。⑦響應時間:上升沿時間10μs,下降沿時間50μs。QTI傳感器及其通信接口QTI傳感器的引腳如圖7-3所示,將傳感器的光電管擺正,如圖7-3上圖所示,從上到下,3個引腳依次為GND、VCC、SIG;其背面有具體的標記如圖7-3下圖所示:SIG,信號輸出;VCC,5V直流電源;GND,電源地線。QTI傳感器及其通信接口安裝QTI傳感器到機器人前端02安裝QTI傳感器到機器人前端本項目使用的QTI循線套件中包含4組QTI傳感器。要使兩輪機器人完成線跟蹤功能,最少需要使用2組,當然也可以使用3組或者4組,甚至更多。使用不同數(shù)目的QTI傳感器可以獲得不同性能的線跟蹤功能。這里將4個QTI傳感器全部安裝到兩輪教育機器人上。安裝QTI傳感器到機器人前端首先,將4個QTI傳感器分別用M3螺釘固定到相應桿件上,如圖7-4所示。安裝QTI傳感器到機器人前端用圖7-4左側的螺絲將4組QTI傳感器安裝模組固定到機器人前端,如圖7-5所示。安裝QTI傳感器到機器人前端再用套件中附帶QTI的引腳連接到機器人的3-pin引腳上,將所有QTI傳感器的GND連接至教學控制板上的GND,VCC連接到教學控制板上的+5V,然后將SIG連接到C51單片機的4個I/O端口上(見圖7-5)。安裝QTI傳感器到機器人前端編寫QTI傳感器的測試程序03編寫QTI傳感器的測試程序連接好電路,接下來編寫一個測試程序,以檢查各QTI傳感器是否連接正確,并正常工作。參考觸須測試程序和紅外傳感測試程序,可以編寫一個程序,完成如下功能:(1)讀取每個QTI傳感器信號腳的電平高低。(2)將讀取的結果通過串口送到PC顯示。編寫QTI傳感器的測試程序測試程序:Test4QTI.c編寫QTI傳感器的測試程序測試程序:Test4QTI.c編寫QTI傳感器的測試程序測試程序:Test4QTI.c程序先進行串口初始化,再將P0_7、P0_6、P0_5和P0_4四個I/O端口的狀態(tài)送入串口,這里的左、中、右是按照機器人本身的方向確定的。此時若已經(jīng)將機器人與PC的串口連接,則打開串口調試工具,便可以在軟件界面看到如圖7-7所示的信息。編寫QTI傳感器的測試程序測試程序:Test4QTI.c設計算法,實現(xiàn)

機器人無接觸游歷04設計算法,實現(xiàn)機器人無接觸游歷如果機器人沒有安裝觸須傳感器,那么可以通過判斷4個QTI傳感器是否全部檢測到白色來確定機器人是否到達了某個景點。當機器人到達某個景點時,機器人直接掉頭。根據(jù)傳感器的安裝方式和檢測值,不難確定機器人線跟蹤算法:(1)檢測4個傳感器的返回值。(2)根據(jù)傳感器的返回值,決定機器人的運動方式。(3)不斷重復步驟1和步驟2。設計算法,實現(xiàn)機器人無接觸游歷設計算法,實現(xiàn)機器人無接觸游歷RobotTourChina.c是如何工作的呢?先定義3個全局變量:設計算法,實現(xiàn)機器人無接觸游歷RobotTourChina.c是如何工作的呢?先定義3個全局變量:設計算法,實現(xiàn)機器人無接觸游歷switch語句switch語句是一種多分支選擇語句,其一般形式如下:設計算法,實現(xiàn)機器人無接觸游歷執(zhí)行調試①機器人不能正常停下。②如果將機器人放到起始點,那么不能正常開始啟動,必須將傳感器放到黑線上才行。③如果傳感器一切工作正常,沒有意外,那么機器人并不能游覽完所有景點:如它不會去武漢,但是會繞著西安不停運動,進入死循環(huán),再也出不來。④最麻煩的是,QTI傳感器會因為外界環(huán)境光的影響而導致靈敏度不一樣。修改算法實現(xiàn)

機器人游歷05修改算法實現(xiàn)機器人游歷解決問題①~③的簡捷方式是讓機器人能夠跟蹤和記錄到過的景點,當?shù)竭_一些特殊的路口位置時,根據(jù)當前到過的景點采取同任務7.4算法中描述的不同動作。根據(jù)任務7.4中的基本算法,先確定機器人游歷的順序:起始點(深圳)→福州→臺北→杭州→上海→南京→武漢→北京→烏魯木齊→西安→重慶→成都→拉薩→昆明→廣州→長沙→深圳(起始點)。修改算法實現(xiàn)機器人游歷根據(jù)以上確定的機器人游歷路線,按照任務7.4中的運動算法執(zhí)行,算法需要進行如下修改:(1)當機器人從南京返回后,碰到十字路口不能右拐,而應該直行。(2)機器人到達武漢返回后,碰到十字路口機器人必須左拐,而不能按照原來默認情況的右拐。(3)機器人從北京返回后,碰到兩個有左轉的丁字路口都必須直行,不能左拐。(4)機器人從烏魯木齊返回后,碰到第一個十字路口必須左拐,而不是右拐,碰到第二個十字路口仍要左拐,到達西安。(5)機器人從西安返回后,碰到十字路口必須直行,而不能右拐。修改算法實現(xiàn)機器人游歷(6)機器人從重慶返回后,碰到十字路口必須左拐,而不是右拐。(7)從重慶返回的第一個十字路口左拐后前進碰到第二個十字路口繼續(xù)左拐到達成都。(8)從成都返回后碰到第一個十字路口,只能左拐。(9)

溫馨提示

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

評論

0/150

提交評論