




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言原来可以这样学——机器人辅助项目实践中科鸥鹏智能科技有限公司()2013年4月©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/201内容第一讲:机器人所使用的一些软件:下载软件,串口调试软件及开发软件和单片机的通讯显示第二讲:数据类型、运算符与表达式:机器人做算术题第三讲:C程序的循环控制:表情流水灯和机器人简单运动第四讲:函数与机器人的运动控制:机器的运动第五讲:选择结构程序设计:让机器人根据感知运动第六讲:选择结构程序设计:机器人红外导航第七讲:多分支结构程序设计:机器人游中国第八讲:综合设计:机器人智能搬运竞赛©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/202嵌入式C语言集成开发环境C语言教学机器人控制板与教学机器人©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/203C语言集成开发环境嵌入式C程序编辑与编译环境:KeiluVision双击KeiluVisionIDE的图标,启动KeiluVisionIDE程序,你会得到图1-1所示的KeiluVision2IDE的主界面。通过用Project菜单中的NewProject命令建立项目文件,过程如下:
图1-1KeiluVisionIDE的主界面©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2041.点击Project,会出现图1-2所示的菜单画面,然后选择“NewProject”,将出现图1-3所示对话框。
图1-2Project菜单画面图1-3CreateNewProject对话框在电脑任意位置如“桌面”新建一个文件夹,将其命一个名字,如“11”。在文件名中输入如“HelloRoBot”,保存在你想保存的位置(如桌面\11)。可不用加后缀名,点击“保存”,后会出现图1-4所示的窗口。创建你的第一个机器人程序©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/205这里要求我们选择芯片的类型,KeiluVision2IDE几乎支持所有的51核心单片机,并以列表的形式给出。本教材使用的是Atmel公司的AT89S52,在KeiluVision2IDE提供的数据库(Database)列表中找到此款芯片,然后点击确定,会出现图1-11所示的窗口,询问你是否加载8051启动代码,在这里我们选择“否”,不加载。(如果你选择“是”,对你的程序没有任何影响。若你感兴趣,可选择“是”,看看编译器加载了哪些代码。)之后会出现图1-5画面,此时即得到了项目文件。
图1-4单片机型号选择窗口©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/206
图1-5是否加载8051启动代码提示窗口图1-6目标工程窗口点击按钮(或通过“File->New”操作)为该项目新建一个C语言程序文件,保存后弹出图1-7所示的对话窗口,将文件保存在项目文件夹中,在文件类型中填写.C(这里.C为文件扩展名,表示此文件类型为C语言源文件),因为你下面将采用C语言编写第一个程序。
图1-7C语言源文件保存对话框©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/207
例程:HelloRoBot.c#include<uart.h>intmain(void){uart_Init();//串口初始化
printf("Hello,thisisamessagefromyourRobot\n");while(1);}
将该例程键入KeiluVisionIDE的编辑器,并以文件名HelloRoBot.c保存。添加该文件到目标工程项目了,其具体添加过程如下:
1.单击图1-6中的“+”,将出现图1-8所示的列表;
2.然后右键点击“SourceGroup1”,在出现的菜单下选择“AddFileToGroup“SourceGroup1”,出现AddFilestoGroupSource‘Group1’对话框。在该对话框中选择需要添加的程序文件,如刚才建立HelloRoBot.c,单击Add按钮,把所选文件添加到项目文件中。一次可添加多个文件。
3.程序文件添加到项目文件中去后,这时上图中“SourceGroup1”的前面将出现一个“+”号;单击它将出现刚才添加的源文件名,如图1-9所示(注意:图中显示的文件名是刚才输入的文件名)。创建你的第一个机器人程序©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/208
图1-8添加C语言文件到目标工程图1-9添加了C语言文件的目标工程双击源文件即可显示源文件的编辑界面。下面来产生下载需要的可执行文件。要产生可执行的.Hex文件,需要对目标工程“Target1”进行编译设置,右键点击“Target1”,选择“Optionfortarget‘Target1’”。点击“output”,选择其中的“CreateHEXFile”,如图1-10所示,然后点击KeiluVisionIDE
快捷工具栏中的,Keil的C编译器开始根据要生成的目标文件类型对目标工程项目中的C语言源文件进行编译。图1-10设置目标工程的编译输出文件类型©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/209图1-11编译过程的输出提示信息©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2010把编译生成的HEX文件下载到AT89S52单片机上USBASP下载器与AVR_fighter下载软件:第二步:选择需要调入的程序的.hex文件第一步:选择所需要的芯片类型第三步:确保开发板供电正常和线路连接正确。点击该按钮使程序下载到开发板上。下载线USB-ASP©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2011用串口调试软件显示USB串口连接线与串口调试软件USB-串口线第一步:选择与“设备管理器”中端口号相匹配的串口号。第二步:点击“连接”。©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2012第一个机器人程序:机器人通过PC显示屏同你打招呼创建与编辑你的第一个机器人程序编译、连接与生成机器人可执行文件下载执行文件到机器人控制器(AT89S52单片机)用串口调试软件查看机器人同你打招呼的信息#include<uart.h>intmain(void){
uart_Init();//串口初始化
printf("Hello,thisisamessagefromyourRobot\n");while(1);}©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2013该项目要点:
头文件:#include<>在编译过程中用来将下面程序中需要用到的标准数据类型(如以后会讲的int,char)和由C语言编译器提供的一些标准输入/输出函数(如printf)等包括进来,生成可执行代码。本例程中的头文件uart.h就包含了本例程中以及后面例程中都要用到的uart_Init()函数的定义和实现。uart_Init()是串口调试环境能现实的串口初始化函数。C语言程序必须以main函数作为程序的起点,通常称之为主函数。任何函数都是由返回值类型(int)函数名(参数如void){函数体}组成。printf函数称为格式输出函数,其功能是按用户指定的格式,把指定的数据显示输出。该函数是C语言提供的标准输出函数,定义在C语言的标准函数库中。“\n”是一个向调试终端发送回车命令的控制符
#include<uart.h>intmain(void){inti;uart_Init();i=7*11;printf("What's7X11?\n");printf("Theansweris:%d\n",i);while(1);}
总结
©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2014机器人做算术:数据类型、运算符与表达式简单项目设计:直接在程序中加入算术表达式,用串口调试助手输出运算结果不断更改数据类型和运算表达式,熟悉和掌握C程序的数据类型、运算符和输出格式等,同时进一步掌握程序的编辑、编译、下载和调试方法。新的学习内容整数、实数,基本四则运算符和表达式。#include<uart.h>intmain(void){inti;uart_Init();i=7*11;printf("What's7X11?\n");printf("Theansweris:%d\n",i);while(1);}输出结果©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2015机器人做算术题:数据类型、运算符与表达式复杂项目设计:设计程序,用串口调试助手输入两个数据,程序计算着两个数据的加减乘除的运算结果,并将表达式在串口调试助手中打印出来按复位键重新运行程序,再来一次修改程序,让机器人做完一次运算后自动重复询问计算。修改程序,进行实数(浮点数)的四则运算。#include<uart.h>intmain(void){inta,b;uart_Init();printf(“Inputthe1stnumber:”);scanf(“%d”,&a);printf(“Inputthe2ndnumber:”);scanf(“%d”,&b);printf(“aхb=%d\n
“,a*b);
printf(“a/b=%d\n
“,a*b);
printf(“a+b=%d\n
“,a*b);
printf(“a-b=%d\n
“,a*b);while(1);}©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2016机器人做算术题:数据类型、运算符与表达式总结归纳C语言的数据类型常量与变量整型数据:短整型、整型和长整型,有符号和无符号浮点型数据:单精度(float),双精度(double)和长双精度(longdouble)字符型数据算术运算符和算术表达式©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2017循环程序设计:让机器人动起来LED灯与单片机的连接电路图现在自己动手,先给机器人装上一盏LED灯搭接电路的面包板介绍和线路搭建©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2018
循环程序设计:让机器人动起来
编写程序,让LED进行闪烁#include<BoeBot.h>#include<uart.h>intmain(void){uart_Init();//初始化串口
printf("TheLEDconnectedtoP1_0isblinking!\n");
while(1){
P1_0=1;//P1_0输出高电平
delay_nms(500);//延时500msP1_0=0;//P1_0输出低电平
delay_nms(500);//延时500ms}}
时间从左到右增长,高、低电压信号随着时间在0V或5V间变化。这个时序图显示的是刚才实验中的1000ms的高、低电压信号片段。右边的省略号表示的是这些信号是重复出现的。时序图简介时序图反应的是单片机输出高、低电压信号与时间的关系图,实际上也体现了单片机程序代码的执行顺序。修改程序,给机器人多装几盏灯,如何实现一次点亮?©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2019该项目要点:#include<BoeBot.h>:该头文件中定义了两个延时函数:voiddelay_nms()毫秒级的延时与voiddelay_nus()毫秒级的延时。while(表达式){循环体语句}while(1):当表达式为非0值时,不停的执行while语句中的内嵌语句,其特点是先判断表达式,后执行语句。P1_0=1:这是51单片机定义的IO的方式,使用方式是PX(0~3)_N(0~7)=?。AT89S52有4组IO,每个IO为8位,从0~7。循环程序设计:让机器人动起来©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2020安装伺服电机伺服电机与教学底板的连线原理图(左)和实际接线示意图(右)知识点:工程连线图识别课程解析循环程序设计:让机器人动起来©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2021循环程序设计:让机器人动起来伺服电机控制信号零点标定信号时序图知识点:零点标定信号while(1){P1_0=1;//P1_0输出高电平
delay_nus(1500);//延时1.5msP1_0=0;//P1_0输出低电平
delay_nus(20000);//延时20ms}课程解析©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2022
测试伺服电机1.3ms的控制脉冲序列使电机顺时针全速旋转1.7ms的连续脉冲序列使电机逆时针全速旋转while(1){P1_0=1;delay_nus(1300);P1_0=0;
P1_1=1;delay_nus(1700);P1_1=0;
delay_nus(20000);}知识点:加深循环语句的了解和电机在运动控制中的应用C语言的循环控制:让机器人动起来©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2023实现方式:通过控制循环的执行次数就可以控制运动距离或者时间for循环
for(表达式1;表达式2;表达式3)语句按如下方式理解for(循环变量赋初值;循环条件;循环变量增值)语句for(Counter=1;Counter<=100;Counter++){P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);}FOR语句:直接控制循环次数C程序的循环控制:让机器人动起来项目:让机器人运动一段距离停下或者运动一段时间停下©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2024伺服电机旋转规定的时间for循环
for(表达式1;表达式2;表达式3)语句按如下方式理解for(循环变量赋初值;循环条件;循环变量增值)语句for(Counter=1;Counter<=100;i++){P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);}
知识点:输出端口的使用
FOR语句、延时及脉冲的实现方式要让电机运行2.17秒,for循环为什么执行100次?循环程序设计:让机器人动起来©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2025函数与机器人运动控制机器人的四个基本动作全速前进一段距离全速后退一段距离全速左转一个角度全速右转一个角度编写程序实现机器人全速前进#include<BoeBot.h>#include<uart.h>intmain(void){ intcounter; uart_Init();printf("ProgramRunning!\n");for(counter=0;counter<=130;counter++)//向前
{ P1_1=1; delay_nus(1700);P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); }While(1);}通过例程,可以观察到机器人正全速前进行驶一段距离,这个例程巩固了FOR循环的使用,下面可以自己修改例程,让机器人的全速后退一段距离,机器人全速左转一段距离,机器人全速右转一段距离如何实现机器人的全速前进呢?语句中显示让左侧电机逆时针旋转,右侧电机顺时针旋转©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2026匀加速运动程序片段示例: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:电机的速度也在逐渐增加。到执行第190次循环时,变量pulseCount的值是200,此时发给P1_1、P1_0的脉冲的宽度分别为1.7ms、1.3ms,电机全速运转。函数与机器人的运动控制把上述片段代替前面的全速前进的程序,看是什么样的效果?试试看吧©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2027函数与机器人运动控制为了简化程序的编写,将机器人的四个基本动作程序各定义成一个函数全速前进一段距离——voidForward(intsteps)全速后退一段距离——voidBackward(intsteps)全速左转一个角度——voidTurnLeft(intsteps)全速右转一个角度——voidTurnRight(intsteps)Forward,Backward等是定义函数的名称后面括号中的数据类型函数带的参数类型,决定函数执行时的运动大小。函数可以不带参数,即括号里面可以是空的,但必须有括号。定义函数带的参数可以有多个,多个参数定义之间需用逗号隔开。函数前面的void表示函数执行完,没有返回值,这个void是定义函数类型的标识符之一。还有很多其它的函数标识符。函数定义时必须有类型标识符。示例voidForward(intsteps){for(inti=0;i<steps;i++) {……}}©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2028函数与机器人运动控制有时用函数调用发现一直重复调用,才能完成一个机器人的运动控制,如果机器人有更复杂的运动,那将调用更多,更为繁琐。所以这里要用到一种新的数据类型——数组。示例VoidMove(intcounter,intPC1_pulseWide,intPC0_pulseWide){………….}Intmain(void){Intcounter[4]={65,26,26,65};intPC1_pulseWide[4]={1700,1300,1700,1300}intPC0_pulseWide[4]={1300,1300,1700,1700}Intindex;Uart_Init();Printf(“Running!\n”);For(index=0;index<4;index++)Move(couter[index],intPC1_pulseWide[index].intPC0_pulseWide[index]);While(1);}数组的定义:类型说明符数组名[常量表达式]数组定义以后需要给数组中的各个元素赋值,其方法如下类型说明符数组名[常量表达式]={值,值,….值};©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2029
选择结构程序设计:机器人的触觉导航
触须传感器示意图和电路图:触须安装示意图触须电路原理图©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2030选择结构程序设计——机器人的触角导航胡须参考接线图安装好胡须的机器人在接线时,用到了2个上拉电阻。此电阻起到限流的作用,之所以用到上拉电阻是因为AT89S52的I/O口驱动能力不够。同时与之对应的还有下拉电阻,与地相连,可把电平拉至低位©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2031voidRight_Turn(void){inti;for(i=1;i<=26;i++) { P1_1=1; delay_nus(1700);P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); }}voidBackward(void){inti;for(i=1;i<=65;i++) { P1_1=1; delay_nus(1300);P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); }}#include<BoeBot.h>#include<uart.h>intP1_4state(void)//获取P1_4的状态,右胡须{ return(P1&0x10)?1:0;}intP2_3state(void)//获取P2_3的状态,左胡须{ return(P2&0x08)?1:0;}voidForward(void){P1_1=1; delay_nus(1700);P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20);}voidLeft_Turn(void){inti;for(i=1;i<=26;i++) { P1_1=1; delay_nus(1300);P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); }}选择结构程序设计——机器人的触觉导航©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2032intmain(void){ uart_Init(); printf("ProgramRunning!\n");
while(1) { if((P1_4state()==0)&&(P2_3state()==0)) { Backward();//向后
Left_Turn();//向左
Left_Turn();//向左
} elseif(P1_4state()==0) { Backward();//向后
Left_Turn();//向左
}elseif(P2_3state()==0) { Backward();//向后
Right_Turn();//向右
} else Forward();//向前
}}选择结构程序设计——机器人的触觉导航©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2033
选择结构程序设计:机器人的触觉导航
本项目要点:
if语句根据给定的条件进行判断,以决定执行某个分支程序段。if语句其中之一的形式为:
if(表达式1)
语句1;elseif(表达式2)语句2;
else
语句3;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2,否则执行下面语句。?操作符
C语言提供了一个可以代替某些“if-else”语句的简便易用的操作符“?”。该操作符是三元的,其一般形式为:表达式1?表达式2:表达式3它的执行过程如下:先求解表达式1,如果为真(非0),则求解表达式2,并把表达式2的结果作为整个条件表达式的值;如果表达式1的值为假(0),则求解表达式3,并把表达式3的值作为整个条件表达式的值。
(P1&0x10)?1:0的意思就是先将P1寄存器的内容同0x10按位进行“与”运算,如果结果非0,则整个表达式的取值就为1;如果结果为0,则整个表达式的值为0。©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2034选择结构程序设计:机器人红外导航一:元件清单
(1)两个红外检测器
(2)两个红外LED(带套筒)
(3)两个470欧电阻
(4)连接线若干二:红外检测的原理:
红外发射管发射红外光线,遇到障碍物,红外光从物体反射回来,红外检测器检测到反射回来的红外光线,并发出信号表明检测到红外光线。VccGNDSIN红外检测器的符合和实物图红外LED的符合和实物图©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2035选择结构程序设计——机器人红外导航IR组原理图IR组实物连接图©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2036选择结构程序设计——机器人红外导航#include<BoeBot.h>#include<uart.h>#include<intrins.h>#defineLeftIRP1_2//左边红外接收连接到P1_2#defineRightIRP3_5//右边红外接收连接到P3_5#defineLeftLaunchP1_3//左边红外发射连接到P1_3#defineRightLaunchP3_6//右边红外发射连接到P3_6voidIRLaunch(unsignedcharIR){intcounter;if(IR=='L')//左边发射
for(counter=0;counter<38;counter++){LeftLaunch=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();LeftLaunch=0;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}if(IR=='R')//右边发射
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_();}}intmain(void){intpulseLeft,pulseRight;intirDetectLeft,irDetectRight;uart_Init();printf("ProgramRunning!\n");do{IRLaunch('R');//右边发射
irDetectRight=RightIR;//IRLaunch('L');//左边发射
irDetectLeft=LeftIR;//
if((irDetectLeft==0)&&(irDetectRight==0))//向后退
{pulseLeft=1300;pulseRight=1700;}elseif((irDetectLeft==0)&&(irDetectRight==1))//右转
{pulseLeft=1700;pulseRight=1700;}elseif((irDetectLeft==1)&&(irDetectRight==0))//左转
{pulseLeft=1300;pulseRight=1300;}else//前进
{pulseLeft=1700;pulseRight=1300;}P1_1=1;delay_nus(pulseLeft);P1_1=0;P1_0=1;delay_nus(pulseRight);P1_0=0;delay_nms(20);}while(1);}©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2037选择结构程序设计——机器人红外导航本项目要点1:宏定义宏定义的作用:用一个简单的名称代替一个长的字符串,或者用一个有意义的名字代替一些无规则、无意义的字符串,从而方便程序的阅读、理解和修改。宏定义的一般形式为
#define标识符字符串
2:do…..while语句在C语言中,直到型循环控制语句是do…while,它的一般形式为:
do语句while(表达式)其中语句通常为复合语句,成为循环体Do….while语句的基本特点是:先执行后判断。因此循环体至少被执行一次。©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2038多分支结构程序设计——机器人游中国QTI传感器实物图QTI传感器的接口QTI传感器固定到铜螺柱一端QTI传感器安装到小车上的示意图©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2039多分支结构程序设计——机器人游中国安装好的QTI传感器QTI传感器输出接口在教学板上的连接©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2040机器人游中国案例示例#include<uart.h>#include<BoeBot.h>Intright90stepa=48;Intleft90steps=48;IntUTurnsteps=48;IntGet_4QTI_State(void){ReturnP1&0xf0;}VoidMoveAStep(intLeftP,intRightP){P1_1=1;Delay_nus(LeftP);P1_1=0;P1_0=1;Delay_nus(RightP);P1_0=0;delay_nms(20);}VoidRightTurn(intsteps){Inti;For(i=0;i<steps;i++)MoveAStep(1700,1500);}VoidLeftTurn(intsteps){For(i=0;i<steps;i++)MoveAStep(1500,1300);}voidRotate(intsteps){intifor(i=0;i<steps;i++)MoveAStep(1700,1700);}voidBackward(intsteps){IntIfor(i=0;i<steps;i++)MoveAStep(1300,1700);}VoidFollow_Line(void){intQTIState;intLeftPulse,RightPulse;QTIState=Get_4QTI_State();printf(“4QTI=%4d”,QTIState);switch(QTIState){case0x10:LeftPulse=1700;RightPulse=1700;break;case0x30:LeftPulse=1700;RightPulse=1500;break;case0x20:LeftPulse=1700;RightPulse=1300;break;
case0x40:LeftPulse=1700;RightPulse=1300;break;case0x60:LeftPulse=1700;RightPulse=1300;break;case0x80:LeftPulse=1300;RightPulse=1300;break;case0xc0:LeftPulse=1500;RightPulse=1300;break;
Case0xe0:if(whereamI==7)Forward(crossSteps);ElseLeftTurn(left90Steps);LeftPulse=1500;RightPulse=1500;Break;Case0x70:RightTurn(right90Steps);LeftPulse=1500;RightPulse=1500;Break;Case0xf0:Switch(whereamI){Case5:Case9:Forward(crossSteps);LeftPulse=1500;RightPulse=1500;break;Case6:Case8:Case10:case11:Case15:LeftTurn(left90Steps);Leftpulse=1500;RightPulse=1500;Break;Dafault::RightTurn(right90Steps);LeftPulse=1500;RightPulse=1500;Break;}Case0x00:Switch(whereamI){case0:Forward(crossSteps);Break;Case15:LeftPulse=1500;RightPulse=1500;Break;Default:Rotate(UTurnSteps);whereamI++;Break;}Dafualt:LeftPulse=1500;RightPulse=1500;Break;}MoveAStep(LeftPulse,RightPulse);©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2041深圳广州昆明拉萨成都重庆西安乌鲁木齐北京南京上海杭州台北福州武汉长沙机器人游中国图纸©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2042多分支结构程序设计——机器人游中国本项目要点:一:QTI传感器的使用
QTI传感器的原理以及在现实生活和工业生产中的运用。二:对项目算法的研究三:Switch语句
Switch语句的一般形式为:Switch(表达式){
case常量表达式1:语句1;break;
……….case常量表达式n:语句n:break;Defult:语句n+1;break;}四:修改游中国程序的算法,看用数组如何实现?©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2043综合设计——机器人的智能搬运竞赛机器人智能搬运场地图纸©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2044机器人智能搬运的器件智能搬运所需要的器件循线传感器、搬运手抓和机器人,这是三个基本套件机器人循线传感器搬运手抓©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2045综合设计——机器人的智能搬运竞赛安装好的搬运机器人©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2046机器人搬运案例该程序仅是搬运机器人比赛一个案例,采用方式是通过QTI传感器沿黑色道路循迹将色块搬运到对应堆放区。堆放区从左到右固定颜色依次为:黄白红黑蓝因为比赛规则要求比赛时任意拿出五个色块中的3个色块进行比赛并随机放置在ACE位置所以用QTI循迹的方式来搬运色块就有5*3种方式。以下案例是演示的是ACE位置上依次为蓝黄红时循迹案例#include<reg52.h> #include"Global.h"#include"delay.h"#include"QTI.h"#include"motion.h"©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2047智能搬运案例#defineDIR_LEFT0 //跨线方向:左#defineDIR_RIGHT1 //跨线方向:右
voidrun_online(uint8_tsteps){ while(steps) { //中线控制
//机器人右偏判断 x10x或1000 if((P22_state()&&(!P23_state()))||(P21_state()&&(!P22_state())&&(!P23_state())&&(!P24_state()))) { motor_motion(1530,1300,1); //左转修正
} //机器人左偏判断 x01x或0001 elseif(((!P22_state())&&P23_state())||((!P21_state())&&(!P22_state())&&(!P23_state())&&P24_state())) { motor_motion(1700,1470,1); //右转修正
}elseif(P21_state()&&P22_state()&&P23_state()&&P24_state()) //到十字路口,1111 { break; //退出循环,下一个任务
} else { motor_motion(1700,1350,1); //前进
steps--; } } }©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2048智能搬运案例voidgoto_across1(){ while(1) { //中线控制
//机器人右偏判断x10x或1000 /* if((P22_state()&&(!P23_state()))||(P21_state()&&(!P22_state())&&(!P23_state())&&(!P24_state()))) { motor_motion(1500,1500,1);//停止
} //机器人左偏判断x01x或0001 elseif(((!P22_state())&&P23_state())||((!P21_state())&&(!P22_state())&&(!P23_state())&&P24_state())) { motor_motion(1500,1500,1);//停止
} //xxx111 else*/ if(P23_state()&&P24_state()&&P16_state()) { break; //停止
} else //其他情况
{ motor_motion(LEFT_FWD,RIGHT_FWD,1); //前进
} } }©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2049智能搬运案例//沿着线走到十字路口voidgoto_across(){ while(1) { //中线控制
//机器人右偏判断x10x或1000 if((P22_state()&&(!P23_state()))||(P21_state()&&(!P22_state())&&(!P23_state())&&(!P24_state()))) { motor_motion(1500,1300,1); //左转修正
} //机器人左偏判断x01x或0001 elseif(((!P22_state())&&P23_state())||((!P21_state())&&(!P22_state())&&(!P23_state())&&P24_state())) { motor_motion(1700,1500,1); //右转修正
} // 1111 elseif(P21_state()&&P22_state()&&P23_state()&&P24_state()) //到十字路口,1111 { break; //退出循环,下一个任务
} else //其他情况
{ motor_motion(LEFT_FWD,RIGHT_FWD,1); //前进
} } }©2008Open-Tech.Allrightsreserved.2023/3/20©2008Open-Tech.Allrightsreserved.2023/3/2050智能搬运案例//放置物块voidput_material(){ while(1) { //中线控制
//机器人右偏判断 0x10xx或01000x if((!P14_state())&&P22_state()&&(!P23_state())||(!P14_state())&&P21_state()&&(!P22_state())&&(!P23_state())&&(!P24_state())) { motor_motion(1500,1300,1); //左转修正
} //机器人左偏判断 xx01x0或x00010 elseif((!P16_state())&&((!P22_state())&&P23_state(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 驾驶员体检报销流程
- 2024年特许金融分析师考试财务分析题试题及答案
- 第八章 作业38 功能关系及其应用-2025版高一物理必修二
- 陕西省西安市长安区2024-2025学年高三上学期一模语文试题
- 老年人口腔保健知识宣教
- 地产广告画面规范
- 卷1-2025年中考地理高频考题(广东专用)(解析版)
- 2025年广东省初中学业水平考试仿真卷(三)(解析版)
- 目标明确的2024年特许金融分析师考试试题及答案
- 法律环境对投资的影响试题及答案
- 《高速公路服务区开放设置技术要求》
- 新思想引领新征程新青年建功新时代-(第二版)
- 【MOOC】中国传统艺术-篆刻、书法、水墨画体验与欣赏-哈尔滨工业大学 中国大学慕课MOOC答案
- 【MOOC】游戏引擎原理及应用-中国传媒大学 中国大学慕课MOOC答案
- 2024年江西省公务员录用考试《行测》真题及答案解析
- 国家安全教育高教-第六章坚持以经济安全为基础
- 提取句子主干和划分句子成分专项练习
- 信息检索与利用课件 第7章 网络信息检索(上)
- 2025新译林版英语七年级下单词默写表
- 走近核科学技术学习通超星期末考试答案章节答案2024年
- 绿化苗木组织供应及售后服务方案
评论
0/150
提交评论