




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
機(jī)器人程序設(shè)計(jì)(C語言)一種新的C語言學(xué)習(xí)方式第一章【ch01】一種新的C語言學(xué)習(xí)方式.pptx【ch02】最簡單的C程序設(shè)計(jì)--機(jī)器人做算術(shù).pptx【ch03】循環(huán)程序設(shè)計(jì)——讓機(jī)器人動起來.pptx【ch04】函數(shù)機(jī)器人運(yùn)動控制.pptx【ch05】選擇結(jié)構(gòu)程序設(shè)計(jì)機(jī)器人觸須導(dǎo)航.pptx【ch06】選擇結(jié)構(gòu)程序設(shè)計(jì)--機(jī)器人紅外導(dǎo)航.pptx【ch07】多分支結(jié)構(gòu)程序設(shè)計(jì)機(jī)器人循線運(yùn)動.pptx【ch08】結(jié)構(gòu)化程序設(shè)計(jì)--智能搬運(yùn)競賽.pptx【ch09】結(jié)構(gòu)化程序設(shè)計(jì)——擂臺賽.pptx全套可編輯PPT課件單片機(jī)和微控制器一臺能夠工作的計(jì)算機(jī)包括CPU(CentralProcessingUnit,中央處理單元,進(jìn)行運(yùn)算和控制,包括運(yùn)算器和控制器等)、存儲器(如RAM、ROM等)、輸入設(shè)備、輸出設(shè)備(包括串行/并行接口、USB等)。下述基本智能任務(wù)和綜合競賽任務(wù):人機(jī)對話,交換信息。完成精確的運(yùn)動軌跡。安裝傳感器,以探測周邊環(huán)境?;趥鞲衅餍畔⒆龀鰶Q策。循線完成機(jī)器人游歷、智能搬運(yùn)、擂臺賽等任務(wù)。機(jī)器人與C語言學(xué)習(xí)平臺具體步驟包括:①安裝編程開發(fā)環(huán)境。②連接機(jī)器人到電池或者供電的電源。③連接教學(xué)板到計(jì)算機(jī),以便編程調(diào)試和交互。④運(yùn)用C語言編寫第一個(gè)單片機(jī)程序,運(yùn)用編譯器編譯生成可執(zhí)行文件,下載到單片機(jī),觀察機(jī)器人單片機(jī)教學(xué)板的執(zhí)行結(jié)果。⑤斷開電源。獲得軟件01獲得軟件1.C51單片機(jī)C語言集成開發(fā)環(huán)境KeilC語言是美國KeilSoftware公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。2.ISP軟件Progisp是一款免費(fèi)下載的ISP軟件,不需要專門的安裝即可使用,非常方便。使用該軟件,讀者可以將C語言程序生成的可執(zhí)行文件下載到機(jī)器人單片機(jī)上。獲得軟件3.串口調(diào)試軟件串口調(diào)試工具就是串行通信接口調(diào)試軟件,集數(shù)據(jù)發(fā)送、數(shù)據(jù)接收、數(shù)據(jù)監(jiān)控、數(shù)據(jù)分析等功能于一身,具有小巧精致、操作簡捷、功能強(qiáng)大的特點(diǎn),可以在串口通信監(jiān)控、設(shè)備通信測試工作中有效提高效率。安裝軟件02安裝軟件安裝KeilμVision4IDE①運(yùn)行KeilμVision4IDE安裝程序,選擇EvalVersion版進(jìn)行安裝。②在出現(xiàn)的窗口中一直單擊“Next”按鈕,將程序默認(rèn)安裝在C:\ProgramFiles\Keil文件夾下。③將安裝包中的“頭文件”文件夾中的文件復(fù)制到C:\ProgramFiles\Keil\C5ININC文件夾中。安裝軟件KeilμVision4IDE軟件安裝完成后,會在計(jì)算機(jī)的桌面上建立一個(gè)快捷方式。Progisp和SerialDebugTool.exe軟件都不需要安裝,只需將安裝包復(fù)制到計(jì)算機(jī)上即可。硬件連接03硬件連接C語言教學(xué)板需要連接電源來運(yùn)行,同時(shí)需要連接到計(jì)算機(jī)以便編程和交互。硬件連接連接計(jì)算機(jī)C語言教學(xué)板通過USBA轉(zhuǎn)B信號線連接到計(jì)算機(jī),程序的下載和信息的交互都通過該信號線完成。圖1-3為本書使用的USBA轉(zhuǎn)B信號線。硬件連接連接計(jì)算機(jī)硬件連接連接電源在一般的編程和調(diào)試時(shí),建議使用6V/2A的電源適配器給C語言教學(xué)板供電。當(dāng)需要機(jī)器人進(jìn)行自主運(yùn)動或者進(jìn)行比賽時(shí),用3.7V鋰電池給機(jī)器人供電。將鋰電池裝入專門的電池盒時(shí),注意按照標(biāo)記的電池極性(“+”和“-”)裝入。硬件連接教學(xué)板和單片機(jī)通電檢查教學(xué)板上有一個(gè)三位開關(guān)(如圖1-4所示),開關(guān)撥到“OFF”位時(shí)斷開教學(xué)板電源。無論是否將電池組或者其他電源連接到教學(xué)板上,只要三位開關(guān)位于“OFF”位,那么設(shè)備就處于關(guān)閉狀態(tài)。硬件連接教學(xué)板和單片機(jī)通電檢查硬件連接現(xiàn)在將三位開關(guān)由“OFF"位撥至“1”位,打開教學(xué)板電源,如圖1-5所示。教學(xué)板和單片機(jī)通電檢查硬件連接教學(xué)板上有一個(gè)二位開關(guān)(如圖1-6所示),當(dāng)需要給單片機(jī)下載程序時(shí),需將開關(guān)撥到“ISP”位,接通單片機(jī)下載通道。教學(xué)板程序下載與通信功能的切換第一個(gè)程序04第一個(gè)程序創(chuàng)建并編輯第一個(gè)程序雙擊KeilμVision4IDE的圖標(biāo),啟動KeilμVision4IDE,出現(xiàn)如圖1-7所示的窗口,可以通過“Project”菜單的“NewProject”命令新建項(xiàng)目文件。第一個(gè)程序創(chuàng)建并編輯第一個(gè)程序①在“Project”菜單中選擇“NewμVisionProject”命令(如圖1-8所示),出現(xiàn)如圖1-9所示的對話框。第一個(gè)程序創(chuàng)建并編輯第一個(gè)程序②在“文件名”文本框中輸入“HelloRobot”,保存在需要的位置(如“E:\C語言程序設(shè)計(jì)程序”),可不用加后綴名。單擊“保存”按鈕,出現(xiàn)如圖1-10所示的對話框。第一個(gè)程序創(chuàng)建并編輯第一個(gè)程序③選擇項(xiàng)目芯片的類型。KeilμVision4IDE幾乎支持所有的C51核心單片機(jī),并以列表的形式給出。第一個(gè)程序第一個(gè)C語言程序:HelloRobot.c#include<uart.h>intmain(void)uart_Init();//串口初始化printf("Hello,thisisamessagefromyourRobot\(n");while(1);第一個(gè)程序第一個(gè)C語言程序:HelloRobot.c①單擊圖1-12中的“+”,出現(xiàn)如圖1-14所示的列表。第一個(gè)程序第一個(gè)C語言程序:HelloRobot.c②右鍵單擊“SourceGroup1”,在出現(xiàn)的快捷菜單中選擇“AddFileToGroup”→“SourceGroup1”,出現(xiàn)“AddExistingFilestoGroupSource'Group1'”對話框,從中選擇需要添加的程序文件,如剛才建立的HelloRobot.c;單擊“Add”按鈕,把所選文件添加到項(xiàng)目文件中。第一個(gè)程序第一個(gè)C語言程序:HelloRobot.c③程序文件添加到項(xiàng)目文件后,這時(shí)圖1-14中“SourceGroup1”的前面出現(xiàn)“+”;單擊它,將出現(xiàn)剛才添加的源文件名,如圖1-15所示(注意,圖中顯示的文件名是剛才輸入的文件名)。第一個(gè)程序第一個(gè)C語言程序:HelloRobot.c第一個(gè)程序編譯程序下面生成下載需要的可執(zhí)行文件。生成可執(zhí)行的HEX文件需要對目標(biāo)工程“Target1”進(jìn)行編譯設(shè)置。單擊KeilμVisionIDE快捷工具欄中的按鈕,Keil的C編譯器根據(jù)要生成的目標(biāo)文件類型對目標(biāo)工程項(xiàng)目中的C語言源文件進(jìn)行編譯。第一個(gè)程序程序調(diào)試如果程序在編譯過程中出現(xiàn)了錯(cuò)誤,就不能生成可下載的十六進(jìn)制執(zhí)行文件。第一個(gè)程序程序調(diào)試C語言對函數(shù)名稱的大小寫是敏感的,也就是同一個(gè)名字不同的大小寫表示的是兩個(gè)函數(shù),標(biāo)準(zhǔn)的函數(shù)大小寫寫錯(cuò)也會提示語法錯(cuò)誤。比如,將“printf”寫成了“Printf”,編譯時(shí)會出現(xiàn)如下警告和錯(cuò)誤信息:第一個(gè)程序程序調(diào)試首先警告程序中的Printf沒有函數(shù)原型,后面是錯(cuò)誤信息,這個(gè)函數(shù)需要ANSI型函數(shù)原型。由此可見,一個(gè)小小的語法錯(cuò)誤可以導(dǎo)致編譯時(shí)出現(xiàn)很多錯(cuò)誤信息。總之,語法錯(cuò)誤相對來說比較容易調(diào)試和修改,只要簡單檢查,就可以很快排除,特別是根據(jù)錯(cuò)誤信息提示進(jìn)行排除,就會更快。第一個(gè)程序下載可執(zhí)行文件到單片機(jī)將教學(xué)板的二位開關(guān)撥至“ISP”位,單擊Progisp快捷方式,打開下載軟件窗口,如圖1-19所示。第一個(gè)程序用串口調(diào)試軟件查看單片機(jī)輸出信息將教學(xué)板上的二位開關(guān)撥至“USART”位,打開串口調(diào)試軟SerialDebugTool.exe,出現(xiàn)串口調(diào)試窗口,如圖1-20所示,在左邊的“通信設(shè)置”欄的“串口號”列表框中選擇串口“COMxx”后,單擊下面的“連接”按鈕。第一個(gè)程序HelloRobot.c是如何工作的C語言是一個(gè)非常龐大的系統(tǒng),是為開發(fā)大型程序而準(zhǔn)備的。即使是最小的一個(gè)程序,其框架結(jié)構(gòu)也很復(fù)雜。main()函數(shù)主體中有2行語句:第1行是串口初始化函數(shù)uart_Init(),用來規(guī)定單片機(jī)串口是如何與計(jì)算機(jī)通信的。第一個(gè)程序printf()函數(shù)print()函數(shù)稱為格式輸出函數(shù),其功能是按用戶指定的格式,把指定的數(shù)據(jù)輸出顯示。printf()函數(shù)是C語言提供的標(biāo)準(zhǔn)輸出函數(shù),定義在C語言的標(biāo)準(zhǔn)函數(shù)庫中,要使用它,必須包括定義標(biāo)準(zhǔn)函數(shù)庫的頭文件stdio.h。第一個(gè)程序“while(1);”的作用while(1)實(shí)際上是一個(gè)死循環(huán)。HEX文件加載到單片機(jī)Flash存儲器上時(shí),是從頭開始往下加載的。斷開電源05斷開電源工程素質(zhì)和技能歸納本章涉及的主要技能①KeilμVisionIDE(集成開發(fā)環(huán)境)的安裝和使用。②C語言教學(xué)板與計(jì)算機(jī)的連接。③在集成開發(fā)環(huán)境中創(chuàng)建目標(biāo)工程文件,并添加和編輯C語言源程序。④C語言程序的編譯和可執(zhí)行文件的生成。⑤Progisp下載軟件的使用和程序下載。⑥程序的執(zhí)行和串口調(diào)試終端的使用。⑦C語言程序的基本架構(gòu)和格式輸出函數(shù)printf()的使用。斷開電源工程素質(zhì)和技能歸納常見錯(cuò)誤①函數(shù)名稱的大小寫問題。②編輯窗口中可以用中文給程序進(jìn)行注釋,中文與英文所占的字符數(shù)不一樣,一個(gè)漢字要占兩個(gè)英文字符的空間。③修改的源文件不是加到了項(xiàng)目工程中的源文件,此時(shí)的任何修改都不會反映到項(xiàng)目執(zhí)行結(jié)果中。斷開電源科學(xué)精神的培養(yǎng)①查找C語言的標(biāo)準(zhǔn)輸入輸出庫函數(shù),了解printf()函數(shù)的總體功能。本章中用到了它的格式符和控制符,介紹了printf()函數(shù)輸出的各種數(shù)據(jù)類型。②了解和掌握C語言支持的各種數(shù)據(jù)類型和如何編寫簡單的程序。機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)最簡單的C程序設(shè)計(jì)一機(jī)器人做算術(shù)第二章整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示01首先將HelloRobot.c另存為RobotComputation.c,然后按照第1章的步驟建立一個(gè)新的項(xiàng)目,將RobotComputation.c加入項(xiàng)目,并將源程序修改成如下代碼。#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ù)的運(yùn)算和結(jié)果顯示將項(xiàng)目編譯、連接、生成執(zhí)行代碼,下載并運(yùn)行,查看輸出結(jié)果是否與圖2-1一樣。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示RobotComputation.c是如何工作的C語言用關(guān)鍵字int定義整型變量。int是英文單詞integer(整數(shù))的前三個(gè)字母。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示變量的定義在程序執(zhí)行過程中,其值可改變的量稱為變量。它們與數(shù)據(jù)類型結(jié)合起來分類,可以分為整型變量、浮點(diǎn)變量、字符變量等。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示變量的定義所有C語言變量必須在使用之前定義。定義變量的一般形式如下:
typevariable_list;整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示變量的定義在C語言中,標(biāo)志符是對變量、函數(shù)名和其他各種用戶定義對象的命名。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示變量的定義uart_Init()函數(shù)在第1章已經(jīng)介紹過,這里不再重復(fù)。例如,語句i=7*11;整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示變量的定義稱為賦值運(yùn)算符,由“=”連接的表達(dá)式稱為賦值表達(dá)式,其后加“;”構(gòu)成賦值語句,般形式為:
變量=表達(dá)式;整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示語句C語言規(guī)定,任何表達(dá)式在其末尾加上";"就構(gòu)成語句。例如:
printf("What's7X11?\n");printf("Theansweris:%d\n";i);整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示語句第一個(gè)printf語句輸出雙引號中的字符串作為運(yùn)算顯示提示,這在第1章中已經(jīng)用到。第二個(gè)printf語句先輸出"Theansweris:",再輸出變量i的值。
“%d”就是格式字符串,表示后面要輸出i的值,并且是十進(jìn)制數(shù)。d是decimal(十進(jìn)制)的首字母。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示語句十進(jìn)制是我們?nèi)粘1硎緮?shù)據(jù)的一種方法,所有的數(shù)據(jù)都由10個(gè)數(shù)字組成,即由0~9組成。但是計(jì)算機(jī)為了方便存儲數(shù)據(jù),表示數(shù)據(jù)的原理同人類有些差別,主要采用二進(jìn)制和十六進(jìn)制存儲和表示數(shù)據(jù)。整型數(shù)據(jù)的運(yùn)算和結(jié)果顯示算術(shù)運(yùn)算符和整型變量表2-2給出了C語言允許的算術(shù)運(yùn)算符。在C語言中,運(yùn)算符“+”“-”“*”和“/”的用法與大多數(shù)計(jì)算機(jī)語言相同,幾乎可以用于C語言定義的任何數(shù)據(jù)類型。浮點(diǎn)型數(shù)據(jù)的運(yùn)算02浮點(diǎn)型數(shù)據(jù)的運(yùn)算C語言中的浮點(diǎn)數(shù)(floatingpointnumber)就是平常所說的實(shí)數(shù)(realnumber)。現(xiàn)在來看浮點(diǎn)型數(shù)據(jù)的定義、運(yùn)算和顯示方法。繼續(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);浮點(diǎn)型數(shù)據(jù)的運(yùn)算編譯、下載和運(yùn)行上述程序,結(jié)果為123456.800000。計(jì)算機(jī)直接將小數(shù)點(diǎn)后的第2位進(jìn)行了四舍五入。浮點(diǎn)型數(shù)據(jù)的運(yùn)算系統(tǒng)把一個(gè)浮點(diǎn)型數(shù)據(jù)分成小數(shù)部分和指數(shù)部分分別存放。指數(shù)部分采用規(guī)范化的指數(shù)形式。實(shí)數(shù)123456.789在內(nèi)存中的存放形式如圖2-2所示。浮點(diǎn)型數(shù)據(jù)的運(yùn)算這4字節(jié)中究竟用多少位來表示小數(shù)部分,多少位來表示指數(shù)部分,C語言標(biāo)準(zhǔn)并無具體規(guī)定,由各C語言編譯系統(tǒng)自定。不少C語言編譯系統(tǒng)以24位表示小數(shù)部分(包括符號),以8位表示指數(shù)部分(包括指數(shù)的符號)。浮點(diǎn)型數(shù)據(jù)的運(yùn)算受到表示小數(shù)位的位數(shù)限制,float型數(shù)據(jù)的小數(shù)部分只能接受7位有效數(shù)字,所以第一個(gè)123456.789數(shù)字的最后兩位小數(shù)不起作用,最后就顯示123456.8。而在a=123456.789e5時(shí),也是因?yàn)樾?shù)部分的有效數(shù)字是7位,加20的運(yùn)算根本體現(xiàn)不出。浮點(diǎn)型數(shù)據(jù)的運(yùn)算為了提高浮點(diǎn)數(shù)的表示精度,還可以定義雙精度浮點(diǎn)數(shù)(double)和長雙精度浮點(diǎn)數(shù)(longdouble)。浮點(diǎn)型數(shù)據(jù)的運(yùn)算通過以上實(shí)際編程實(shí)踐可知,在編程過程中要避免將一個(gè)很大的數(shù)和一個(gè)很小的數(shù)直接相加或者相減,否則會將這些“小的數(shù)”丟失。這也是我們學(xué)習(xí)程序設(shè)計(jì)時(shí)最容易忽略的地方,也是最容易出錯(cuò)的地方。字符型數(shù)據(jù)03字符型數(shù)據(jù)字符常量字符常量是指用一對單引號括起來的一個(gè)字符,如'a'、'9'、'!'。字符常量中的單引號只起到定界作用并不表示字符本身。字符型數(shù)據(jù)字符常量在C語言中,字符是按其對應(yīng)的ASCII值來存儲的,一個(gè)字符占1字節(jié),見表2-3。字符型數(shù)據(jù)ASCIIASCI是美國標(biāo)準(zhǔn)信息交換碼(AmericanStandardCodeforInformationInterchange)的縮寫,用來指定計(jì)算機(jī)中每個(gè)符號對應(yīng)的代碼,也叫做計(jì)算機(jī)的內(nèi)碼(code)。字符型數(shù)據(jù)字符常量C語言中字符常量是按整數(shù)存儲的,所以字符常量可以像整數(shù)一樣在程序中參與相關(guān)的運(yùn)算,如:a'-32;/執(zhí)行結(jié)果97-32=65A+32;//執(zhí)行結(jié)果65+32=9719'-9;//執(zhí)行結(jié)果57-9-48字符型數(shù)據(jù)轉(zhuǎn)義字符轉(zhuǎn)義字符是一種特殊的字符常量,以“\”開頭,后跟一個(gè)或幾個(gè)字符。轉(zhuǎn)義字符具有特定的含義,不同于字符原有的意義,故稱“轉(zhuǎn)義”字符。例如,前面各例printf()函數(shù)中用到的“\n”就是一個(gè)轉(zhuǎn)義字符,其意義是“回車換行”。字符型數(shù)據(jù)轉(zhuǎn)義字符通常使用轉(zhuǎn)義字符表示用一般字符不便于表示的控制代碼,如用于表示字符常量的單引號(')、用于表示字符串常量的雙引號(")和反斜杠(\)等。表2-4給出了C語言中常用的轉(zhuǎn)義字符。字符型數(shù)據(jù)字符型數(shù)據(jù)轉(zhuǎn)義字符廣義地講,C語言字符集中的任何一個(gè)字符均可用轉(zhuǎn)義字符來表示。表中的“\ddd”和“xhh”正是為此而提出的。ddd和hh分別為八進(jìn)制和十六進(jìn)制的ASCII值。如“\101”表示字母“A”,“\102”表示字母“B”,“\134”表示反斜杠,"XOA"表示換行等。字符型數(shù)據(jù)字符變量字符變量用來存放字符常量,只能存放一個(gè)字符。字符變量的定義形式如下:charcl,c2;字符型數(shù)據(jù)字符變量它表示c1和c2為字符變量,各放入一個(gè)字符,因此可以用下面語句對c?、c2賦值:c1='a';c2=A;字符型數(shù)據(jù)字符變量所有C語言編譯系統(tǒng)都規(guī)定用1字節(jié)來存放一個(gè)字符,或者說,一個(gè)字符變量在內(nèi)存中占1字節(jié)。字符型數(shù)據(jù)字符變量將字符常量放到字符變量中,實(shí)際上并不是把該字符本身放到內(nèi)存單元中,而是將該字符相應(yīng)的ASCII值放到存儲單元中。既然在內(nèi)存中字符數(shù)據(jù)以ASCII值存儲,那么它的存儲形式就與整數(shù)的存儲形式類似,這就使得字符型數(shù)據(jù)和整型數(shù)據(jù)之間可以通用。字符型數(shù)據(jù)字符變量編寫如下程序,編譯、連接,生成可執(zhí)行文件,下載執(zhí)行,看看運(yùn)行結(jié)果是否同所預(yù)計(jì)的一樣。#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ù)工程素質(zhì)和技能歸納本章涉及的主要技能①整型數(shù)據(jù)變量的定義和使用,變量的命名規(guī)則。②C語言的運(yùn)算符、算術(shù)表達(dá)式和賦值語句。③整型數(shù)據(jù)的輸出格式符。④整型數(shù)據(jù)在內(nèi)存中的表示方式和表示范圍。⑤浮點(diǎn)型數(shù)據(jù)變量的定義和使用。⑥浮點(diǎn)型數(shù)據(jù)在內(nèi)存中的表示方法。⑦浮點(diǎn)數(shù)據(jù)的運(yùn)算和格式顯示。⑧字符型數(shù)據(jù)與ASCII值,字符型數(shù)據(jù)在內(nèi)存中的存儲方式和輸出。字符型數(shù)據(jù)工程素質(zhì)和技能歸納常見錯(cuò)誤①變量名稱定義和規(guī)范問題。C語言程序區(qū)分各種變量名稱的大小寫,同一個(gè)名字如果大、小寫不一樣,C語言都將其視為不同的變量。②變量類型一經(jīng)確定,就確定了其能夠表示的最大的數(shù)和最小的數(shù)。如果變量取值超過了這個(gè)范圍,就會出現(xiàn)意外的結(jié)果。字符型數(shù)據(jù)科學(xué)精神的培養(yǎng)①單片機(jī)的存儲空間有限,所以它不支持標(biāo)準(zhǔn)C語言支持的長整型、雙精度等數(shù)據(jù)類型。如果程序一定需要,應(yīng)該怎樣解決這個(gè)問題?②通過本章的例子,你是否理解了程序順序執(zhí)行這種基本結(jié)構(gòu)?③如何通過算術(shù)運(yùn)算讓各種字符數(shù)據(jù)之間實(shí)現(xiàn)轉(zhuǎn)換?字符數(shù)據(jù)之間的轉(zhuǎn)換同通信密碼之間有何關(guān)系?機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)循環(huán)程序設(shè)計(jì)一讓機(jī)器人動起來第三章C51單片機(jī)的輸入/輸出接口控制機(jī)器人運(yùn)動的伺服電機(jī)以不同速度運(yùn)動是通過單片機(jī)的輸入/輸出(I/O)接口輸出不同脈沖序列來實(shí)現(xiàn)的。C51系列單片機(jī)有4個(gè)8位的并行I/O接口:P0、P1、P2和P3。AT89S52引腳:AT89S52有44根引腳,其中32根是I/O端口引腳,如圖3-1所示。其中有29根具備兩種用途(用圓括號寫出),既可作為I/O端口,也可作為控制信號或地址及數(shù)據(jù)線。單燈閃爍控制01為了驗(yàn)證P1接口的輸出電平是不是由你編寫的程序控制,可以采用一個(gè)非常簡單的辦法,就是在想驗(yàn)證的接口引腳上接一個(gè)發(fā)光二極管。當(dāng)輸出高電平時(shí),發(fā)光二極管滅;輸出低電平時(shí),發(fā)光二極管亮。單燈閃爍控制單燈閃爍控制LED電路元器件(1)紅色發(fā)光二極管,2個(gè)。(2)470Ω電阻,2個(gè)。單燈閃爍控制LED電路搭建在搭建電路前先認(rèn)識面包板。教學(xué)板前端,那塊白色的、有許多孔或插座的區(qū)域稱為無焊料的面包板。面包板連同它三邊黑色插孔稱為原型區(qū)域,如圖3-2所示。單燈閃爍控制LED電路搭建單燈閃爍控制LED電路搭建在面包板插孔插上元器件,如本任務(wù)用到的電阻、LED燈,就可以構(gòu)成本書例程的電路。元器件靠面包板插孔彼此連接。單燈閃爍控制LED電路搭建面包板上共17列插孔,列與列之間互不相通。整個(gè)面包板通過中間槽分為兩塊,它們之間的插座互不相通。每一小列由5個(gè)插孔組成,這5個(gè)插孔在面包板上是電氣相連的。單燈閃爍控制現(xiàn)在按照圖3-3所示電路,在教學(xué)板的面包板上搭建起實(shí)際電路。LED電路搭建單燈閃爍控制圖3-3所示的電路原理圖指引你如何連接電路元器件,使用唯一的符號來表示不同的元器件。這些器件符號用細(xì)線相連,表示它們是電氣相連的。在電路原理圖中,當(dāng)兩個(gè)器件符號用細(xì)線相連時(shí),表示它們之間是電氣連接的。細(xì)線還可以將元器件和電壓端口連接。LED電路搭建單燈閃爍控制圖3-4為元器件電路符號與實(shí)際元器件的對應(yīng)圖。元器件符號圖的上方就是該元器件的零件圖。LED電路搭建單燈閃爍控制LED電路搭建根據(jù)圖3-3實(shí)際搭建好的電路參考圖3-5所示。單燈閃爍控制LED電路搭建實(shí)際搭建電路時(shí)應(yīng)注意:確認(rèn)發(fā)光二極管的短針腳(陰極)插入面包板,通過電阻與P10相連。確認(rèn)發(fā)光二極管的長針腳(陽極)插入"+5V"插口,這里+5V就是電路圖上的Vcc。單燈閃爍控制HighLowLed.c是如何工作的與第1章程序相比,本例程多使用了一個(gè)頭文件BoeBot.h,其中定義了兩個(gè)延時(shí)函數(shù);voiddelay_nms(unsignedinti)和voiddelay_nus(unsignedinti)。單燈閃爍控制修飾符unsigned放到int前面,指定后面的變量為無符號數(shù)。如果加上修飾符signed,則指定是“有符號數(shù)”。如果既不指定signed,也不指定為unsigned,則隱含為有符號(signed)。實(shí)際上,signed是可以省略的。無符號整型數(shù)據(jù)unsignedint單燈閃爍控制單片機(jī)端口引腳信號隨時(shí)間的變化可以用時(shí)序圖來描述,一個(gè)端口引腳的時(shí)序圖反應(yīng)的是其高、低電壓信號與時(shí)間的變化關(guān)系圖。時(shí)序圖簡介機(jī)器人伺服電機(jī)控制信號02機(jī)器人伺服電機(jī)控制信號圖3-8所示是高電平持續(xù)1.5ms,低電平持續(xù)20ms,然后不斷重復(fù)地控制脈沖序列。該脈沖序列發(fā)給經(jīng)過零點(diǎn)標(biāo)定后的伺服電機(jī),伺服電機(jī)不會旋轉(zhuǎn)。如果此時(shí)電機(jī)旋轉(zhuǎn),那么表明電機(jī)需要標(biāo)定。機(jī)器人伺服電機(jī)控制信號由圖3-8、圖3-9和圖3-10可知,控制電機(jī)運(yùn)轉(zhuǎn)速度的是高電平持續(xù)的時(shí)間,當(dāng)高電平持續(xù)時(shí)間為1.3ms時(shí),電機(jī)順時(shí)針全速旋轉(zhuǎn);當(dāng)高電平持續(xù)時(shí)間1.7ms時(shí),電機(jī)逆時(shí)針全速旋轉(zhuǎn)。按照任務(wù)1中給單片機(jī)微控制器編程,使P1端口的兩個(gè)引腳(P1_0和P1_1)控制兩個(gè)LED燈閃爍,重新給單片機(jī)編程,就可以給這兩個(gè)引腳發(fā)出伺服電機(jī)的控制信號。機(jī)器人伺服電機(jī)控制信號機(jī)器人伺服電機(jī)控制信號按照圖3-12所示的伺服電機(jī)與教學(xué)板的連接原理圖和實(shí)際接線圖,將兩個(gè)電機(jī)的連接線連接到教學(xué)板上。具體連接時(shí),注意將P1_0引腳的控制輸出用來控制右邊的伺服電機(jī),P1_1則用來控制左邊的伺服電機(jī)。機(jī)器人伺服電機(jī)控制信號機(jī)器人伺服電機(jī)控制信號單片機(jī)編程發(fā)給伺服電機(jī)的高、低電平信號必須具備更精確的時(shí)間。機(jī)器人伺服電機(jī)控制信號用下面的程序片段代替例程HighLowLed.c中相應(yīng)的程序片段,編譯、連接、執(zhí)行代碼,觀察連接到P1_0腳的機(jī)器人輪子是不是逆時(shí)針全速旋轉(zhuǎn)。計(jì)數(shù)并控制循環(huán)次數(shù)03計(jì)數(shù)并控制循環(huán)次數(shù)for語句最方便的控制一段代碼執(zhí)行次數(shù)的方法是利用for循環(huán),語法如下:for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句計(jì)數(shù)并控制循環(huán)次數(shù)for語句它的執(zhí)行過程如下:(1)求解表達(dá)式1。(2)求解表達(dá)式2,若其值為真(非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行第(3)步;若其值為假(0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。(3)求解表達(dá)式3。(4)轉(zhuǎn)回第(2)步繼續(xù)執(zhí)行。(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句。計(jì)數(shù)并控制循環(huán)次數(shù)for語句for語句最簡單的應(yīng)用形式,也就是最易理解的形式如下:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增/減值)語句計(jì)數(shù)并控制循環(huán)次數(shù)自增和自減C語言有兩個(gè)很有用的運(yùn)算符-—自增和自減,即“++”和“_”。運(yùn)算符“艸”是操作數(shù)加1,而“-”是操作數(shù)減1。換句話說:“x=x+1”同“x++”,“x=x-1”同“x—”。計(jì)數(shù)并控制循環(huán)次數(shù)for循環(huán)控制電機(jī)的運(yùn)行時(shí)間下面是for循環(huán)的例子,它會使電機(jī)運(yùn)行幾秒鐘。用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動04用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動scanf()函數(shù)scanf()函數(shù)與printf()函數(shù)對應(yīng),在C語言庫的stdio.h中定義。它的一般形式如下:scanf("格式控制字符串",地址列表);用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動scanf()函數(shù)程序運(yùn)行結(jié)果如圖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)。用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動scanf()函數(shù)程序運(yùn)行結(jié)果如圖3-13所示。⑥在發(fā)送區(qū)再輸入數(shù)據(jù),然后單擊“發(fā)送”按鈕,將數(shù)據(jù)發(fā)送給變量PulseDuration。⑦程序接收到兩個(gè)數(shù)據(jù)后執(zhí)行剩余的程序,讓伺服電機(jī)運(yùn)轉(zhuǎn)。用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動scanf()函數(shù)用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動工程素質(zhì)和技能歸納本章涉及的主要技能①C51系列單片機(jī)的引腳定義和分布。②用C51單片機(jī)的P1端口的位輸出控制單燈和雙燈閃爍,時(shí)序圖的概念,while循環(huán)的引入和延時(shí)函數(shù)的使用。③機(jī)器人伺服電機(jī)的控制脈沖序列,通過給C51編程讓其輸出這些控制脈沖序列。④自增運(yùn)算符的使用。⑤for循環(huán)的使用以控制機(jī)器人的運(yùn)動。⑥如何通過串口輸入數(shù)據(jù)控制機(jī)器人的運(yùn)動。用計(jì)算機(jī)來控制機(jī)器人的運(yùn)動科學(xué)精神的培養(yǎng)①比較BS2微控制器與C51單片機(jī)微控制器輸入、輸出接口的使用方法。②比較C語言程序與BASIC程序的異同,找出它們的共同點(diǎn)。③比較C語言的for循環(huán)和PBASIC的for循環(huán)。④查找C語言的標(biāo)準(zhǔn)輸入/輸出庫函數(shù),了解scanf()函數(shù)的主要功能。⑤有了scanf()函數(shù),能不能寫一個(gè)程序,模擬我們?nèi)粘J褂玫挠?jì)算器?機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)函數(shù)——機(jī)器人運(yùn)動控制第四章基本巡航動作01圖4-1定義了機(jī)器人的前、后、左、右四個(gè)方向:當(dāng)機(jī)器人向前走時(shí),它將走向本頁紙的右邊;當(dāng)向后走時(shí),會走向紙的左邊;向左轉(zhuǎn)會使其向紙的頂端移動;向右轉(zhuǎn)它會朝著本頁紙的底端移動?;狙埠絼幼骰狙埠絼幼飨蚯把埠桨凑請D4-1前進(jìn)方向的定義,機(jī)器人向前走時(shí),從機(jī)器人的左邊看,它向前走時(shí)輪子是逆時(shí)針旋轉(zhuǎn)的;從右邊看,另一個(gè)輪子則是順時(shí)針旋轉(zhuǎn)的?;狙埠絼幼飨蚯把埠絝or循環(huán)的參數(shù)控制了發(fā)送給電機(jī)的脈沖數(shù)量。由于每個(gè)脈沖的時(shí)間是相同的,因而for循環(huán)的參數(shù)也控制了伺服電機(jī)運(yùn)行的時(shí)間?;狙埠絼幼骰狙埠絼幼飨蚯把埠嚼蹋篟obotForwardThreeSeconds.c(1)確保控制器和伺服電機(jī)都已接通電源。(2)輸入、保存、編譯、下載并運(yùn)行程序RobotForwardThreeSeconds.c。基本巡航動作向前巡航RobotForwardThreeSeconds.c是如何工作的for循環(huán)體中前三行語句使左側(cè)電機(jī)逆時(shí)針旋轉(zhuǎn),后續(xù)的三行語句使右側(cè)電機(jī)順時(shí)針旋轉(zhuǎn)。因此兩個(gè)輪子轉(zhuǎn)向機(jī)器人的前端,使機(jī)器人向前運(yùn)動。整個(gè)for循環(huán)執(zhí)行130次,大約需要3s,從而機(jī)器人也向前運(yùn)動3s?;狙埠絼幼飨蚯把埠疥P(guān)于例程調(diào)試的一點(diǎn)說明printf()函數(shù)的作用是提示。若你覺得串口線影響了機(jī)器人的運(yùn)動,可以不用此函數(shù)。還有一個(gè)進(jìn)行調(diào)試的方法;讓機(jī)器人的前端懸空,讓伺服電機(jī)空轉(zhuǎn)。這樣調(diào)試起來就方便了,機(jī)器人不會到處亂跑。后面的例程調(diào)試也是這樣。勻加速、勻減速運(yùn)動02編寫勻加速運(yùn)動程序勻加速運(yù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);勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序循環(huán)每重復(fù)執(zhí)行一次,變量pulseCount就增加1:第一次循環(huán)時(shí),變量pulseCount的值是10,此時(shí)發(fā)給P1_1、P1_0的脈沖的寬度分別為1.51ms、1.49ms;第二次循環(huán)時(shí),變量pulseCount的值是11,此時(shí)發(fā)給P1_1、P1_0的脈沖的寬度分別為1.511ms、1.489ms。勻加速、勻減速運(yùn)動勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序例程:StartAndStopWithRamping.c#include<BoeBot.h>#include<uart.h>intmain(void)intpulseCount;uart_Init();printf("ProgramRunning!\n");for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序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++)勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序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)勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序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);勻加速、勻減速運(yùn)動編寫勻加速運(yùn)動程序(1)輸入、保存并運(yùn)行程序StartAndStopWithRamping.c。(2)驗(yàn)證機(jī)器人是否逐漸加速到全速,保持一段時(shí)間,然后逐漸減速到停止。用函數(shù)調(diào)用簡化
運(yùn)動程序03用函數(shù)調(diào)用簡化運(yùn)動程序函數(shù)從函數(shù)定義的角度來看,函數(shù)有兩種①標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。②用戶定義函數(shù),以解決專門需要。不僅要在程序中定義函數(shù)本身,在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進(jìn)行類型說明,然后才能使用。用函數(shù)調(diào)用簡化運(yùn)動程序函數(shù)從有無返回值角度來看,函數(shù)可以分為兩種①有返回值函數(shù)。函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)果,稱為函數(shù)返回值。由用戶定義的返回函數(shù)值的函數(shù),必須在函數(shù)定義中明確返回值的類型。②無返回值函數(shù)。此類函數(shù)用于完成某項(xiàng)特定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。用函數(shù)調(diào)用簡化運(yùn)動程序函數(shù)從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看,函數(shù)也可分為兩種①無參函數(shù)。函數(shù)定義、說明及調(diào)用中均不帶參數(shù),主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。②有參函數(shù)。在函數(shù)定義及說明時(shí)都有參數(shù),稱為形式參數(shù)(簡稱形參)。用函數(shù)調(diào)用簡化運(yùn)動程序函數(shù)main()函數(shù)的返回值其實(shí)不難理解,main()函數(shù)執(zhí)行完后,它的返回值是給操作系統(tǒng)的。雖然在main()函數(shù)體內(nèi)并沒有什么語句來指出返回值的大小,但系統(tǒng)默認(rèn)的處理方式是:當(dāng)main()函數(shù)成功執(zhí)行時(shí),它的返回值為1,否則為0。用函數(shù)調(diào)用簡化運(yùn)動程序函數(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ù)調(diào)用簡化運(yùn)動程序函數(shù)重新定義向前運(yùn)動函數(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ù)調(diào)用簡化運(yùn)動程序函數(shù)例程:MovementsWithFunctions.c#include<BoeBot.h>#include<uart.h>voidForward(intPulseCount,intVelocity)inti;for(i=1;i<=PulseCount;i++)/*速度參數(shù)的值為0~200/用函數(shù)調(diào)用簡化運(yùn)動程序函數(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ù)調(diào)用簡化運(yùn)動程序函數(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ù)調(diào)用簡化運(yùn)動程序函數(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ù)調(diào)用簡化運(yùn)動程序函數(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ù)調(diào)用簡化運(yùn)動程序函數(shù)intmain(void)printf("ProgramRunning!\n");Forward(65,200);Left(26,200);Right(26,200);Backward(65,200);while(1);用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用04用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用將MovementsWithOneFuntion.c程序修改成如下。#include<BoeBot.h>#include<uart.h>voidMove(intcounter,intPC1_pulseWide,intPCO_pulseWide)//同任務(wù)4.3一樣intmain(void)用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用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ù)組進(jìn)一步簡化函數(shù)調(diào)用程序是如何工作的數(shù)組在程序設(shè)計(jì)中,為了處理方便,可以把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用程序是如何工作的類型說明符是任一種基本數(shù)據(jù)類型。數(shù)組名是用戶定義的數(shù)組標(biāo)志符。方括號中的常量表達(dá)式表示數(shù)據(jù)元素的個(gè)數(shù),也稱為數(shù)組的長度。用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用程序是如何工作的一維數(shù)組的引用數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量,其標(biāo)識方法為數(shù)組名后跟一個(gè)下標(biāo),下標(biāo)表示了元素在數(shù)組中的順序號(從0開始計(jì)數(shù))。數(shù)組元素的一般形式為:
數(shù)組名[下標(biāo)]用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用程序是如何工作的用數(shù)組元素作為函數(shù)實(shí)參調(diào)用函數(shù)數(shù)組元素作為實(shí)參與變量或者實(shí)際數(shù)據(jù)作為實(shí)參是一樣的,直接將元素?cái)?shù)據(jù)傳送給函數(shù)。用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用工程素質(zhì)和技能歸納本章涉及的主要技能①歸納機(jī)器人的基本巡航動作并給C51單片機(jī)編程實(shí)現(xiàn)這些基本動作。②用牛頓力學(xué)和運(yùn)動學(xué)知識分析機(jī)器人的運(yùn)動行為。③采用勻變速運(yùn)動改善機(jī)器人的基本運(yùn)動行為。④用C語言的函數(shù)實(shí)現(xiàn)機(jī)器人的基本動作、函數(shù)的定義和調(diào)用方法。⑤分析機(jī)器人基本動作函數(shù)的實(shí)現(xiàn)特點(diǎn),用一個(gè)函數(shù)定義機(jī)器人的所有行為。⑥用數(shù)組存儲機(jī)器人的動作序列,用數(shù)組元素作為實(shí)參調(diào)用運(yùn)動函數(shù)。用數(shù)組進(jìn)一步簡化函數(shù)調(diào)用科學(xué)精神的培養(yǎng)①比較各種實(shí)現(xiàn)機(jī)器人基本動作程序的優(yōu)缺點(diǎn),以及后續(xù)程序的可擴(kuò)展性。②查閱相關(guān)數(shù)據(jù)了解數(shù)組元素的初始化方法。③既然有一維數(shù)組,就應(yīng)該有兩維數(shù)組、三維數(shù)組。查閱相關(guān)參考書,了解兩維數(shù)組的定義和使用方法,并嘗試用兩維數(shù)組簡化任務(wù)4.4中的程序。機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)選擇結(jié)構(gòu)程序設(shè)計(jì)機(jī)器人觸須導(dǎo)航第五章安裝并測試
機(jī)器人觸須01安裝并測試機(jī)器人觸須編程讓機(jī)器人通過觸須導(dǎo)航前,必須先安裝并測試觸須。安裝機(jī)器人觸須所需的硬件元器件如圖5-1所示,包括:①金屬絲(觸須),2根。②平頭M3×5盤頭螺釘,2個(gè)。③13mm銅螺柱,2個(gè)。④M3尼龍墊圈,2個(gè)。⑤3-pin公-公接頭,2個(gè)。⑥220Ω電阻,2個(gè)。⑦10kQ電阻,2個(gè)。安裝并測試機(jī)器人觸須安裝并測試機(jī)器人觸須安裝觸須(1)拆掉連接主板到前支架的兩顆螺釘。(2)參考圖5-2,進(jìn)行下面的操作。(3)23mm銅螺柱穿過主板上的圓孔,擰進(jìn)主板下面的螺柱中,擰緊。(4)兩個(gè)螺釘依次穿過M3尼龍墊圈擰進(jìn)銅螺柱中。(5)把須狀金屬絲的其中一個(gè)勾在尼龍墊圈之上,另一個(gè)勾在尼龍墊圈之下,調(diào)整它們的位置,使它們橫向交叉但不接觸。(6)擰緊螺釘?shù)姐~螺柱上。(7)參考圖5-3,搭建觸須電路。安裝并測試機(jī)器人觸須安裝觸須安裝并測試機(jī)器人觸須測試觸須觀察圖5-3所示的觸須電路示意圖,顯然每條觸須都是一個(gè)機(jī)械式的、接地(GND)常開的開關(guān)。觸須接地是因?yàn)榻虒W(xué)板外圍的鍍金孔都連接到GND。銅螺柱和螺釘給觸須提供電氣連接。安裝并測試機(jī)器人觸須測試觸須上拉電阻上拉電阻就是與電源相連并起到拉高電平作用的電阻,還起到限流的作用。圖5-3中的10kΩ電阻即為上拉電阻。其實(shí),第3章單燈閃爍控制任務(wù)中就用到了上拉電阻,因?yàn)锳T89S52的I/O接口驅(qū)動能力不夠強(qiáng),不能使LED點(diǎn)亮。安裝并測試機(jī)器人觸須位操作運(yùn)算符位操作運(yùn)算符用于對字節(jié)或字中的位(bit)進(jìn)行測試、置位或移位處理,如表5-1所示。安裝并測試機(jī)器人觸須if語句if語句根據(jù)給定的條件進(jìn)行判斷,以決定執(zhí)行某個(gè)分支程序段。if語句的基本形式為:if(表達(dá)式)語句1;else語句2;安裝并測試機(jī)器人觸須操作符?:C語言提供了一個(gè)可以代替某些“if-else”語句的簡便易用的操作符“?:”。該操作符是三元的,其一般形式為:表達(dá)式1?表達(dá)式2:表達(dá)式3安裝并測試機(jī)器人觸須操作符?:在搞清楚整個(gè)程序的執(zhí)行原理后,按照下面的步驟實(shí)際執(zhí)行程序,對觸須進(jìn)行測試。(1)接通教學(xué)板和伺服電機(jī)的電源。(2)輸入、保存并運(yùn)行程序TestWhiskers.c。(3)這個(gè)例程要用到調(diào)試終端,所以當(dāng)程序運(yùn)行時(shí)要確保串口電纜已連接好。(4)檢查圖5-3所示電路,弄清楚哪條觸須是左觸須,哪條是右觸須。(5)注意調(diào)試終端的顯示值,此時(shí)顯示為“右邊觸須的狀態(tài):1左邊觸須的狀態(tài):1”,如圖5-6所示。安裝并測試機(jī)器人觸須操作符?:(6)按下右觸須,使其接觸到3-pin轉(zhuǎn)接頭上,顯示為“右邊觸須的狀態(tài):0左邊觸須的狀態(tài):1”,如圖5-7所示。(7)把左觸須接到3-pin轉(zhuǎn)接頭上,顯示為“右邊觸須的狀態(tài):1左邊觸須的狀態(tài):0”,如圖5-8所示。(8)同時(shí)把兩個(gè)觸須接到各自的3-pin轉(zhuǎn)接頭上,顯示為“右邊觸須的狀態(tài):0左邊觸須的狀態(tài):0”,如圖5-9所示。(9)如果兩個(gè)觸須都通過測試,則繼續(xù)下面的內(nèi)容。否則檢查程序或電路中存在的錯(cuò)誤。安裝并測試機(jī)器人觸須操作符?:安裝并測試機(jī)器人觸須操作符?:通過觸須導(dǎo)航02通過觸須導(dǎo)航編程使機(jī)器人基于觸須導(dǎo)航為了實(shí)現(xiàn)這些功能,需要編程讓機(jī)器人來做出選擇,此時(shí)要用到if語句的標(biāo)準(zhǔn)形式,即if-else-if形式,它可以進(jìn)行多分支選擇,其一般形式為:if(表達(dá)式1)語句1;elseif(表達(dá)式2)語句2;elseif(表達(dá)式3)語句3;elseif(表達(dá)式n-1)語句n-1;語句n;通過觸須導(dǎo)航關(guān)系與邏輯運(yùn)算符關(guān)系與邏輯運(yùn)算符概念如表5-2所示,關(guān)鍵是True(真)和Flase(假)。C語言中,非0為True;0為Flase。使用關(guān)系與邏輯運(yùn)算符的表達(dá)式對Flase和True分別返回值0和1。通過觸須導(dǎo)航關(guān)系與邏輯運(yùn)算符通過觸須導(dǎo)航關(guān)系與邏輯運(yùn)算符賦值運(yùn)算符“=”與關(guān)系運(yùn)算符“==”賦值運(yùn)算符“=”用來給變量賦值;關(guān)系運(yùn)算符“==”判斷兩個(gè)值是否是相等的關(guān)系。邏輯與運(yùn)算符“&&”相當(dāng)于BASIC語言中的AND運(yùn)算符。邏輯與的運(yùn)算規(guī)則如下:/若A、B為真,則A&&B為真通過觸須導(dǎo)航關(guān)系與邏輯運(yùn)算符例程:RoamingWithWhiskers.c(1)打開主板和伺服電機(jī)的電源。(2)輸入、保存并運(yùn)行程序RoamingWithWhiskers.c。(3)嘗試讓機(jī)器人行走,當(dāng)在其路線上遇到障礙物時(shí),它將后退、旋轉(zhuǎn)并轉(zhuǎn)向另一個(gè)方向。#include<BoeBot.h>#include<uart.h>通過觸須導(dǎo)航觸須導(dǎo)航機(jī)器人怎樣行走主程序中的語句首先檢查觸須的狀態(tài)。如果兩個(gè)觸須都觸動了,即PI_4state()和P2_3state()都為0,那么調(diào)用Backward(),緊接著調(diào)用Left_Turn()兩次;如果只是右觸須被觸動,即只有P2_3state()=0,那么調(diào)用Backward(),再調(diào)用Left_Turn();如果左觸須被觸動,即只有P1_4state()=0,那么調(diào)用Backward(),再調(diào)用Right_Turn();如果兩個(gè)觸須都沒有觸動,那么在else中調(diào)用Forward()語句。機(jī)器人進(jìn)入死區(qū)后的人工智能決策03機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)修改RoamingWithWhiskers.c,讓機(jī)器人碰到上述問題時(shí)逃離死區(qū),技巧是記下觸須交替觸動的總次數(shù)。其關(guān)鍵是程序必須記住每個(gè)觸須的前一次觸動狀態(tài),并與當(dāng)前觸動狀態(tài)對比。如果狀態(tài)相反,就在交替總數(shù)上加1。機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)條件成立(條件為真),那么檢查包含于這個(gè)條件之內(nèi)的另一個(gè)條件。下面是用偽代碼說明條件嵌套語句的用法。if(condition1)commandsforcondition1if(condition2)機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)commandsforbothcondition2andconditionlelsecommandsforconditionlbutnotcondition2elsecommandsfornotcondition1機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)例程:EscapingCorners.c本例程使機(jī)器人在第4次或第5次交替探測到墻角后,完成一個(gè)U形拐彎,哪一個(gè)觸須先被觸動。(1)輸入、保存并運(yùn)行程序EscapingCorners.c。(2)在機(jī)器人行走時(shí),輪流觸動它的觸須,測試該程序。機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)EscapingCorners.c是如何工作的由于該程序是經(jīng)RoamingWithWhiskers.c修改而來的,下面只討論與探測和逃離墻角相關(guān)的新特征。intcounter=1;intold2=1;intold3=0;機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)三個(gè)變量用于探測墻角。int型變量counter用來存儲交替探測的次數(shù)。程序中設(shè)定的交替探測的最大值為4,int型變量old2、old3存儲觸須舊的狀態(tài)值。機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)首先要檢查的是,是否有且只有一根觸須被觸動。簡單的方法就是詢問“是否P1_4state()不等于P2_3state()",判斷語句如下:
if(P1_4state()!=P2_3state())機(jī)器人進(jìn)入死區(qū)后的人工智能決策編程逃離墻角死區(qū)如果發(fā)現(xiàn)觸須連續(xù)4次被觸動,那么計(jì)數(shù)值置1,并且進(jìn)行U形拐彎。if(counter>4)counter=1;Backward();LeftTurn();Left_Turn();機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序04機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序continue語句continue的一般形式為:continue;其作用是結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序continue語句利用continue語句編寫的機(jī)器人運(yùn)動函數(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++;}機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序工程素質(zhì)和技能歸納本章涉及的主要技能①接觸型傳感器作為輸入反饋與C51單片機(jī)的編程實(shí)現(xiàn)。②C51單片機(jī)并行I/O口的特殊功能寄存器的概念和使用。③C語言條件判斷語句的使用。④C語言各種運(yùn)算符的使用,包括位運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符及操作符?等。機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序工程素質(zhì)和技能歸納本章涉及的主要技能⑤機(jī)器人的觸覺導(dǎo)航策略的實(shí)現(xiàn)。⑥條件判斷語句的嵌套與機(jī)器人的智能決策等。⑦循環(huán)內(nèi)continue語句的使用。機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序工程素質(zhì)和技能歸納在一個(gè)邏輯表達(dá)式中如果有多個(gè)邏輯運(yùn)算符,甚至有關(guān)系運(yùn)算符和算術(shù)運(yùn)算時(shí),則優(yōu)先次序如下:i.邏輯非的優(yōu)先級最高,邏輯與次之,邏輯或最低。ii.邏輯與和邏輯或低于關(guān)系運(yùn)算符,邏輯非高于算術(shù)運(yùn)算符,即按照優(yōu)先級從高到低的順序是邏輯非高于算術(shù)運(yùn)算符,算術(shù)運(yùn)算符高于關(guān)系運(yùn)算符,關(guān)系運(yùn)算符高于邏輯與和邏輯或,邏輯與和邏輯或高于賦值運(yùn)算符。機(jī)器人行進(jìn)過程中的碰撞保護(hù)程序工程素質(zhì)和技能歸納i.若a=4,則la的值為0。ii.若a=5,b=10,則a&&b的值為1。iii.5&&13的值為1。iv實(shí)際上,邏輯運(yùn)算符兩側(cè)的運(yùn)算對象不但可以是0和1,或者是0和非0的整數(shù),也可以是字符型、實(shí)型或者指針型等。系統(tǒng)最終以0和非0來判斷它們屬于“真”或者“假”。機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)選擇結(jié)構(gòu)程序設(shè)計(jì)一機(jī)器人紅外導(dǎo)航第六章使用紅外發(fā)射器和接收器探測道路紅外前燈在機(jī)器人上建立的紅外探測物體系統(tǒng)在許多方面就像汽車的前燈系統(tǒng)。使用紅外發(fā)射器和接收器探測道路紅外二極管發(fā)射紅外光,如果機(jī)器人前面有障礙物,紅外光從物體反射回來,相當(dāng)于機(jī)器人眼睛的紅外檢測(接收)器,檢測到反射回的紅外光,并發(fā)出信號來表明檢測到從物體反射回紅外光。機(jī)器人的大腦——單片機(jī)AT89S52基于該傳感器的輸入控制伺服電機(jī)。搭建并測試IR發(fā)射和探測器對01本任務(wù)將搭建并測試紅外線發(fā)射和檢測器對。本章需要用到的新部件如圖6-2所示。搭建并測試IR發(fā)射和探測器對搭建并測試IR發(fā)射和探測器對元器件清單(1)紅外檢測器,2個(gè)。(2)IRLED(帶套筒),2個(gè)。(3)470Ω電阻,2個(gè)。(4)連接線,若干。搭建并測試IR發(fā)射和探測器對搭建紅外前燈電路板的每個(gè)角安裝一個(gè)IR組(IRLED和檢測器)。(1)斷開主板和伺服系統(tǒng)的電源。(2)在教學(xué)板上建立如圖6-3所示的電路,可參考實(shí)物連接圖,如圖6-4所示。搭建并測試IR發(fā)射和探測器對搭建紅外前燈搭建并測試IR發(fā)射和探測器對搭建紅外前燈測試紅外檢測器讓每個(gè)IRLED探測器組工作的關(guān)鍵是發(fā)送1ms頻率為38.5kHz的紅外信號,然后立刻將IR探測器的輸出存儲到一個(gè)變量中。例如,它發(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)打開教學(xué)板的電源。(2)輸入、保存并運(yùn)行程序TestLeftIrPair.c。(3)保持機(jī)器人與通信電纜的連接,因?yàn)樾栌谜{(diào)試終端來測試IR組。(4)放一個(gè)物體,如手或一張紙,距離左側(cè)IR組2~3cm處,見圖6-1。搭建并測試IR發(fā)射和探測器對例程:TestLeftlrPair.c(5)驗(yàn)證:放一個(gè)物體在IR組前時(shí),調(diào)試終端是否會顯示“irDetecfLeft=0”?將物體移開時(shí),它是否顯示“irDetectLeft=1”(如圖6-5所示)?(6)如果調(diào)試終端顯示的是預(yù)料的值,沒發(fā)現(xiàn)物體,則顯示1;發(fā)現(xiàn)物體,則顯示0,轉(zhuǎn)到例程后的“該你了”部分。(7)如果調(diào)試終端顯示的不是預(yù)料的值,試試按排錯(cuò)部分的步驟進(jìn)行排錯(cuò)。搭建并測試IR發(fā)射和探測器對排錯(cuò)①如果調(diào)試終端顯示的不是預(yù)料的值,檢查電路和輸入的程序。②如果總是得到0,甚至當(dāng)沒有物體在機(jī)器人前面時(shí)也是0,可能是附近的物體反射了紅外光。③如果機(jī)器人前面沒有物體時(shí),絕大多數(shù)時(shí)間讀數(shù)是1,但偶爾是0,這可能是附近的熒光燈的干擾。關(guān)掉附近的熒光燈,重新測試。搭建并測試IR發(fā)射和探測器對排錯(cuò)搭建并測試IR發(fā)射和探測器對函數(shù)延時(shí)的不精確性如果把KeiluVision4IDE安裝在C盤,將在C:\ProgramFiles\Keil\C51\INC目錄下發(fā)現(xiàn)頭文件“INTRINS.H”。這個(gè)頭文件中聲明了一個(gè)空函數(shù)_nop_(void),它能準(zhǔn)確延時(shí)一個(gè)機(jī)器周期,即約1μs。探測和避開障礙物02探測和避開障礙物有關(guān)IR檢測器的趣事是它們的輸出與觸須的輸出非常相像。沒有檢測到物體時(shí),輸出為高電平;檢測到物體時(shí),輸出為低電平。本任務(wù)是更改程序RoamingWithWhiskers.c,使它適合IR檢測器。探測和避開障礙物進(jìn)行IR探測時(shí)要使用AT89S52的4個(gè)引腳:P1_2、P1_3、P3_5和P3_6。探測和避開障礙物宏定義宏定義的一般形式為:#define標(biāo)識符字符串探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避下一個(gè)例程與RoamingWithWhiskers.c相似:更改旁邊的名稱和描述,加入兩個(gè)變量來存儲IR檢測器的狀態(tài)。intirDetectLeftintirDetectRight探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避下一個(gè)例程與RoamingWithWhiskers.c相似:更改旁邊的名稱和描述,加入兩個(gè)變量來存儲IR檢測器的狀態(tài)。intirDetectLeftintirDetectRight探測和避開障礙物改變觸須程序,使其適合IR檢測和躲避設(shè)計(jì)一個(gè)函數(shù)voidIRLaunch(unsignedcharIR)來進(jìn)行紅外發(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)打開教學(xué)板的電源。(2)保存并運(yùn)行程序。(3)機(jī)器人的運(yùn)動與運(yùn)行程序RoamingWithWhiskers.c時(shí)相比,是不是除了不需接觸,其他都非常像。高性能的IR導(dǎo)航03高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞探測障礙物很重要的一點(diǎn)是在機(jī)器人撞到它之前給機(jī)器人留有繞開它的空間。如果前方有障礙物,機(jī)器人會使用脈沖命令避開,然后探測,如果物體還在,再使用另一個(gè)脈沖來避開它。機(jī)器人能持續(xù)使用電機(jī)驅(qū)動脈沖和探測,直到它繞開障礙物,它會繼續(xù)發(fā)送向前行走的脈沖。高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞例程:FastIrRoaming.c輸入、保存并運(yùn)行程序FastIrRoaming.c。高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞高性能的IR導(dǎo)航在每個(gè)脈沖之間采樣,以避免碰撞高性能的IR導(dǎo)航FastIrRoaming.c是如何工作的這個(gè)程序使用稍微不同的方法來使用驅(qū)動脈沖。除了兩個(gè)存儲IR檢測器輸出的狀態(tài),它還使用兩個(gè)整型變量來設(shè)置發(fā)送的脈沖持續(xù)時(shí)間。intpulseLeft,pulseRight;intirDetectLeft,irDetectRight;高性能的IR導(dǎo)航do...while語句在C語言中,直到型循環(huán)控制語句是“do...while”,它的一般形式為:do語句while(表達(dá)式);俯視的探測器04俯視的探測器到目前為止,當(dāng)機(jī)器人探測到前面有障礙物時(shí),主要使機(jī)器人做避讓動作。也有一些場合,當(dāng)沒有檢測到障礙物時(shí),機(jī)器人也必須采取避讓動作。(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ā)射功率,使機(jī)器人在本任務(wù)中看得近一些。用絕緣帶模擬桌子的邊沿俯視的探測器用絕緣帶模擬桌子的邊沿俯視的探測器邊沿探測編程編程使機(jī)器人在桌面行走而不會走到桌邊,只需修改程序FastfrRoaming.c中的if..else語句。主要的修改是,當(dāng)iDetectLeft和irDetectRight的值都是0時(shí),表明在桌子表面檢測到物體(桌面),機(jī)器人向前行走。俯視的探測器邊沿探測編程例程:AvoidTableEdge.c(1)打開程序FastIrRoaming.c并另存為AvoidTableEdge.c。(2)修改它使其與下面例程匹配。(3)打開主板與電機(jī)的電源。(4)在帶絕緣帶邊框的場地上測試程序。俯視的探測器AvoidTableEdge.c是如何工作的在程序中加入一個(gè)for循環(huán)來控制每次發(fā)送多少脈沖,加入一個(gè)變量pulseCount作為循環(huán)的次數(shù):intpulseCount;俯視的探測器本章涉及的主要技能①紅外傳感器作為輸入反饋與單片機(jī)的編程實(shí)現(xiàn)。②C語言#define指令的使用。③do..while循環(huán)控制語句的使用。④高性能紅外線導(dǎo)航及邊沿探測的實(shí)現(xiàn)。工程素質(zhì)和技能歸納機(jī)器人程序設(shè)計(jì)(C語言)感謝觀看機(jī)器人程序設(shè)計(jì)(C語言)多分支結(jié)構(gòu)程序設(shè)計(jì)機(jī)器人循線運(yùn)動第七章QTI傳感器及其
通信接口01QTI傳感器及其通信接口本項(xiàng)目使用的QTI(QuickTrackInfrared)傳感器如圖7-2所示。它的工作原理同第6章的紅外發(fā)射器和接收器的原理相同,只是對兩個(gè)電路進(jìn)行了封裝,并用一個(gè)信號線來實(shí)現(xiàn)對紅外光的發(fā)射和接收控制,節(jié)約了單片機(jī)微控制器的寶貴接口(引腳)資源。QTI傳感器及其通信接口QTI傳感器及其通信接口本項(xiàng)目所用QTI傳感器的性能參數(shù)如下。①工作溫度:-40℃~85℃。②工作電壓:5V。③連續(xù)電流:50mA。④功耗:100mW。⑤最佳探測距離:5~10mm。⑥最佳距離下最大散射角度:65°。⑦響應(yīng)時(shí)間:上升沿時(shí)間10μs,下降沿時(shí)間50μs。QTI傳感器及其通信接口QTI傳感器的引腳如圖7-3所示,將傳感器的光電管擺正,如圖7-3上圖所示,從上到下,3個(gè)引腳依次為GND、VCC、SIG;其背面有具體的標(biāo)記如圖7-3下圖所示:SIG,信號輸出;VCC,5V直流電源;GND,電源地線。QTI傳感器及其通信接口安裝QTI傳感器到機(jī)器人前端02安裝QTI傳感器到機(jī)器人前端本項(xiàng)目使用的QTI循線套件中包含4組QTI傳感器。要使兩輪機(jī)器人完成線跟蹤功能,最少需要使用2組,當(dāng)然也可以使用3組或者4組,甚至更多。使用不同數(shù)目的QTI傳感器可以獲得不同性能的線跟蹤功能。這里將4個(gè)QTI傳感器全部安裝到兩輪教育機(jī)器人上。安裝QTI傳感器到機(jī)器人前端首先,將4個(gè)QTI傳感器分別用M3螺釘固定到相應(yīng)桿件上,如圖7-4所示。安裝QTI傳感器到機(jī)器人前端用圖7-4左側(cè)的螺絲將4組QTI傳感器安裝模組固定到機(jī)器人前端,如圖7-5所示。安裝QTI傳感器到機(jī)器人前端再用套件中附帶QTI的引腳連接到機(jī)器人的3-pin引腳上,將所有QTI傳感器的GND連接至教學(xué)控制板上的GND,VCC連接到教學(xué)控制板上的+5V,然后將SIG連接到C51單片機(jī)的4個(gè)I/O端口上(見圖7-5)。安裝QTI傳感器到機(jī)器人前端編寫QTI傳感器的測試程序03編寫QTI傳感器的測試程序連接好電路,接下來編寫一個(gè)測試程序,以檢查各QTI傳感器是否連接正確,并正常工作。參考觸須測試程序和紅外傳感測試程序,可以編寫一個(gè)程序,完成如下功能:(1)讀取每個(gè)QTI傳感器信號腳的電平高低。(2)將讀取的結(jié)果通過串口送到PC顯示。編寫QTI傳感器的測試程序測試程序:Test4QTI.c編寫QTI傳感器的測試程序測試程序:Test4QTI.c編寫QTI傳感器的測試程序測試程序:Test4QTI.c程序先進(jìn)行串口初始化,再將P0_7、P0_6、P0_5和P0_4四個(gè)I/O端口的狀態(tài)送入串口,這里的左、中、右是按照機(jī)器人本身的方向確定的。此時(shí)若已經(jīng)將機(jī)器人與PC的串口連接,則打開串口調(diào)試工具,便可以在軟件界面看到如圖7-7所示的信息。編寫QTI傳感器的測試程序測試程序:Test4QTI.c設(shè)計(jì)算法,實(shí)現(xiàn)
機(jī)器人無接觸游歷04設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷如果機(jī)器人沒有安裝觸須傳感器,那么可以通過判斷4個(gè)QTI傳感器是否全部檢測到白色來確定機(jī)器人是否到達(dá)了某個(gè)景點(diǎn)。當(dāng)機(jī)器人到達(dá)某個(gè)景點(diǎn)時(shí),機(jī)器人直接掉頭。根據(jù)傳感器的安裝方式和檢測值,不難確定機(jī)器人線跟蹤算法:(1)檢測4個(gè)傳感器的返回值。(2)根據(jù)傳感器的返回值,決定機(jī)器人的運(yùn)動方式。(3)不斷重復(fù)步驟1和步驟2。設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷RobotTourChina.c是如何工作的呢?先定義3個(gè)全局變量:設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷RobotTourChina.c是如何工作的呢?先定義3個(gè)全局變量:設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷switch語句switch語句是一種多分支選擇語句,其一般形式如下:設(shè)計(jì)算法,實(shí)現(xiàn)機(jī)器人無接觸游歷執(zhí)行調(diào)試①機(jī)器人不能正常停下。②如果將機(jī)器人放到起始點(diǎn),那么不能正常開始啟動,必須將傳感器放到黑線上才行。③如果傳感器一切工作正常,沒有意外,那么機(jī)器人并不能游覽完所有景點(diǎn):如它不會去武漢,但是會繞著西安不停運(yùn)動,進(jìn)入死循環(huán),再也出不來。④最麻煩的是,QTI傳感器會因?yàn)橥饨绛h(huán)境光的影響而導(dǎo)致靈敏度不一樣。修改算法實(shí)現(xiàn)
機(jī)器人游歷05修改算法實(shí)現(xiàn)機(jī)器人游歷解決問題①~③的簡捷方式是讓機(jī)器人能夠跟蹤和記錄到過的景點(diǎn),當(dāng)?shù)竭_(dá)一些特殊的路口位置時(shí),根據(jù)當(dāng)前到過的景點(diǎn)采取同任務(wù)7.4算法中描述的不同動作。根據(jù)任務(wù)7.4中的基本算法,先確定機(jī)器人游歷的順序:起始點(diǎn)(深圳)→福州→臺北→杭州→上?!暇錆h→北京→烏魯木齊→西安→重慶→成都→拉薩→昆明→廣州→長沙→深圳(起始點(diǎn))。修改算法實(shí)現(xiàn)機(jī)器人游歷根據(jù)以上確定的機(jī)器人游歷路線,按照任務(wù)7.4中的運(yùn)動算法執(zhí)行,算法需要進(jìn)行如下修改:(1)當(dāng)機(jī)器人從南京返回后,碰到十字路口不能右拐,而應(yīng)該直行。(2)機(jī)器人到達(dá)武漢返回后,碰到十字路口機(jī)器人必須左拐,而不能按照原來默認(rèn)情況的右拐。(3)機(jī)器人從北京返回后,碰到兩個(gè)有左轉(zhuǎn)的丁字路口都必須直行,不能左拐。(4)機(jī)器人從烏魯木齊返回后,碰到第一個(gè)十字路口必須左拐,而不是右拐,碰到第二個(gè)十字路口仍要左拐,到達(dá)西安。(5)機(jī)器人從西安返回后,碰到十字路口必須直行,而不能右拐。修改算法實(shí)現(xiàn)機(jī)器人游歷(6)機(jī)器人從重慶返回后,碰到十字路口必須左拐,而不是右拐。(7)從重慶返回的第一個(gè)十字路口左拐后前進(jìn)碰到第二個(gè)十字路口繼續(xù)左拐到達(dá)成都。(8)從成都返回后碰到第一個(gè)十字路口,只能左拐。(9)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人事經(jīng)理兼職合同范例
- 數(shù)字經(jīng)濟(jì)下的會計(jì)角色轉(zhuǎn)變計(jì)劃
- 創(chuàng)造性課堂教學(xué)的探索計(jì)劃
- 腫瘤護(hù)理宣教科普
- 創(chuàng)建領(lǐng)先的教育品牌計(jì)劃
- 人教版七年級上冊教學(xué)設(shè)計(jì)2.1.2 海洋對人類的影響001
- 電氣安全培訓(xùn)知識課件
- 實(shí)踐基地與社區(qū)合作項(xiàng)目計(jì)劃
- 第二單元第11課《網(wǎng)絡(luò)安全基礎(chǔ)》教學(xué)設(shè)計(jì) 2023-2024學(xué)年青島版(2019)初中信息技術(shù)第一冊
- 胃癌術(shù)后胰瘺護(hù)理
- 人教版五年級數(shù)學(xué)下冊全冊教案含教學(xué)反思
- 2022國家供暖規(guī)定法規(guī)
- 【歷史】三國兩晉南北朝時(shí)期的科技與文化(課件) 2024-2025學(xué)年七年級歷史上(部編版2024)
- 2025年園林綠化工(高級)考試題庫及答案
- 2024春四年級上下冊音樂測試專項(xiàng)測試題及答案
- 多發(fā)傷骨折護(hù)理查房
- 中建二測考試題庫及答案
- 中建預(yù)制構(gòu)件吊裝安全專項(xiàng)施工方案
- 華東師范大學(xué)《外國人文經(jīng)典(下)》2021-2022學(xué)年第一學(xué)期期末試卷
- 基礎(chǔ)護(hù)理及病房管理
- 辦理拆遷事項(xiàng)委托書
評論
0/150
提交評論