当前位置:首页 >> 初二数学 >> 机器人足球C语言教程

机器人足球C语言教程


6.1 C 语言快速指南

6.1.1 快速入门 C 程序都是由函数定义和数据对象定义组成。 而函数定义包括数据对象定义、 语句和表达式。

例:一个只定义了 main()函数的简单 C 程序。 void main() { printf("Hello, robot!\n"); while(1){} } 所有的函数都必须有

一个返回值类型说明。main()函数不返回值,返回值 类型为空 void。其他的返回值类型还有整型(int)、浮点型(float)等。 紧接着函数说明的是函数名(在上面的例子中是 main ),接着是圆括号里 的函数参数(或入参),虽然 main 函数没有参数,但还是需要一对空圆括号。 函数参数说明之后是前花括号“{”,它标明实际函数代码开始位置。花括 号对“{ }”用于标出函数定义范围。 接下来是函数体,包含一系列C语句,它们完成某些指定功能。例子中只有 一句:printf(格式化输出)。它将在 LCD 显示屏上输出“Hello,robot!”。 “\n”表示行结束符。 printf 语句以分号";"结束。所有的C语句都必须用分号“;”结束。初学 者常犯的错误是漏掉语句后面的分号“;”。 后花括号"}"表示 main 函数结束。 让我们看另一个例子,来学习C更多的特性。下面的代码定义了一个 sound 函数,它让机器人叫 n 下,并返回检测到的音量值。 int sound(int n) { int i; for(i=0;i<n;i++) beep(); return(micphone()); } 此函数被说明为整型(int),也就是它将返回一个整型值,这个值是由话筒 检测函数 microphone()检测到的。紧接着是函数名 sound,sound 后面括号中的 是参数,此函数只有一个整型参数 n。请注意说明一个参数类型与说明一个函数 类型是类似的,也有整型、浮点型等类型。

1

在一个函数中定义的参数变量,如 sound 函数中的 n,只在这个函数中有效。 别的函数也可以定义使用与之同名的参数变量,而不会相互干扰。 sound 函数的函数体定义在大括号中,它定义了一个局部变量 i,用于循环 计数;接着是一条 for 循环语句,循环的内容是发声语句 beep();每循环一次 i 增加 1,直至 i=n,循环结束;最后是返回语句 return,这条语句表示退出函数 并返回它后面的 C 表达式的值,本例中返回的是声音检测函数 micphone()检测 到的值。 让我们再来看一个 main 函数例子,它调用了 sound 函数。(可下载到机器 人里运行) void main() { int b; b = sound(10); printf(“%d\n”,b); while(1){} } int sound(int n) { int i; for(i=0;i<n;i++) beep(); return(micphone()); } 这段代码调用了前面定义的 sound 函数,让机器人叫 10 下,并将 sound(10) 的返回值在机器人液晶屏上显示出来。
6.2 C 语言教程

6.2.1 数据对象
(1) 数据对象简介

在 C 程序设计中变量和常量是基本的数据对象。在 C 程序的数据定义部分, 需列出要使用的变量,并声明其类型,必要时还需设置初始值。 (1) 变量
变量名

变量名必须由字母或下划线开始, 区分大小写 。 语言的关键字, if, C 如 while 等,不能用于变量名。此外,变量名和函数名不能相同。 例:A, B1, my_name, light1, _count 都是有效的变量名。
变量定义

在 C 语言中,可以在最顶层(在任何一对花括号之外,即函数外)或块(用花 括号括起的 C 语句,如函数体内)的起始处定义变量。通常,变量以如下形式定 义: <类型> <变量名>; 例:int a; 定义了一个整型变量 a。 或 <类型> <变量名>=<初始值>; 例:float P=1.5; 定义了一个浮点型变量 P,并初始化为 1.5。
2

在 C 中, <类型>可为整型(int)、 长整型(long)、 浮点数型(float)、 字符型(char) 或指针类型,它决定所定义变量的存储方式和运算方法。这是定义变量的一般形 式。
局部和全局作用范围

如果一个变量在函数内定义或作为函数的参数,它的作用范围是局部的,即该 变量只在函数定义范围内有效。 如果一个变量在函数外定义,则它是全局变量。该变量定义对所有函数有效, 即在整个程序范围内都可以使用。 此外,若局部变量名与全局变量名或其它函数名相同,则在该局部变量作 用范围内不能使用相应的全局变量或函数。
变量初始化

局部变量和全局变量可在定义时初始化。若不给出初始值,变量初始化为零。 所有的全局变量必须初始化为常量。局部变量可被初始化为任意表达式的值, 包括任意的全局变量、函数调用、函数参数或已初始化的局部变量。 此处给出初始化的简单例子: int i=50; /* 定义 i 为全局整型变量---初始值为 50 */ long j=100L; /* 定义 j 为全局长整型变量---初始值 为 100 */ float PI=3.14159; /* 定义 PI 为全局浮点变量---初始值为 3.14159 */ float permeter(float r) /*定义周长函数 permeter*/ { int x; /* 定义 x 为局部整型变量---初始值 为 0 */ float y=PI; /* 定义 y 为局部整型变量---初始值为 PI */ y = 2.0 * PI * r; return y; } 任何时候只要运行函数,该函数中包含的局部变量将被初始化。 任何时候只要复位情况出现,全局变量将会初始化。复位情况包括: 代码下载; 主程序 main()运行; 系统硬件复位(按能力风暴上的复位按钮或打开电源开关时)。
(1) 常量

什么是常量? 程序运行过程,其值不能被改变的量称为常量。常量区分为不同的类型: a) 整型常量 整型常量可定义为十进制形式(如,255 或-1)。可定义为使用"0x"前缀的十 六进制形式(如,0x1fff),还可定义为一种非标准但常用的使用"0b"前缀的二进 制形式(如,0b1001001),但不支持使用零前缀的八进制常量。 b) 长整型常量 通过在十进制整数后加上后缀" L "或" l "(字母 L 的大小写)可创建长整型 常量。例如,0L 是长整型的零。虽然"L"的大小写均可使用,但大写形式更具有 可读性。
3

c) 浮点数型常量 浮点数可使用科学计数法 (例, " 10e3" 或"10E3") 或用小数点分段。例如, 浮点数零可以"0.","0.0"或"0E1"的形式给出,而不能仅仅用"0"。由于能力风 暴智能机器人无浮点运算硬件,浮点运算将比整型运算慢,要节省地使用浮点运 算。 d) 字符型与字符串型常量 单引号括起的字符型常量的值是其 ASCII 码值 (例: 'x',它的值是 120)。 字符串型常量用成对的双引号定义,如,"This is a robot."。 e) NULL NULL 是一个特殊常量,NULL 具有零值,可对指针或数组变量赋值,或进行 比较(将在后面说明)。通常,其它常量是不能转成指针类型,所以很多情况下 要用到 NULL。 例如,为检查指针是否已初始化,需要将其与 NULL 进行比较,避免试图对空指 针读写。又如,在一个链表结构中,每个元素包含一个数值和指向下一个元素的 指针,为了找到链表的结尾,就需将指向下一个元素的指针与 NULL 进行比较。
(1) 数据类型

16 位整型 16 位整型由 int 类型标识符表示。其取值范围从-32,768 到+32,767(十进制 数)。 32 位整型 32 位整型由 long 类型标识符表示。其取值范围从-2,147,483,648 到 +2,147,483,647(十进制数)。 32 位浮点型 32 位浮点型由 float 类型标识符表示。 约有七位有效数字, 其范围从 10^-38 到 10^38。 8 位字符型 8 位字符型是由 char 类型标识符表示, 字符的取值一般是标准 ASCII 字符集 中的可打印字符,但不是绝对的。字符型变量可表示任意的 8 位整数。 指针 C 中的指针是表示内存地址的十六位整数。 处理内存中变量值的方式有计算、 传递以及通过指针引用其在内存中的地址。 数组 数组用于储存同类型的数据序列(即所有的数组元素有相同的数据类型)。 定 义数组时需指定其长度(即数组元素的个数)。数组中的元素可像其它变量一样 进行设置和存取。
(1) 指针

指针用以指明变量在内存中的地址。指针对于处理对象非常有用,但要非常小 心。代码中的指针必须指向内存中的有效对象。试图引用无效的内存地址会导致 系统崩溃。大部份熟知的操作系统在试图存取非法访问的内存时,会给出像“保 护错误”或“地址冲突”这样的警告信息。 a) 指针安全 C 支持从函数返回指针或使用指针数组。这样增加了误用指针的概率。但是只要 遵循一些简单的原则,便可有效地避免此问题。

4

首先,在使用指针前,判断其是否等于 NULL(一种特殊的零指针)总是必要的。 定义指针变量时必须将其初始化为 NULL,许多未赋值的指针可以用此法判别。 其次,不要在函数体外引用指向该函数内局部变量的指针。函数运行结束时, 其局部变量内存全部释放。因此,对这些指针的引用不仅会返回不正确的值,而 且会导致严重的数据破坏。 一个好的解决办法是绝不从函数中返回局部变量的地 址,而且决不用生存期大于函数本身的对象(全局指针,数组)来存储局部变量的 地址。全局变量和主函数中的变量一旦定义,地址就已固定,其指针可视为安全 的。 C 的类型检查有助于检错,但不能防止所有的指针错误,需要非常小心。 b) 指针定义和使用 对给定类型对象的指针定义,类似于一般对象的类型定义,只是在变量名前加 上*。 存取指针指向的变量的值需在表达式前加上* 操作符以计算指针值。该操作 称为“间接引用”。在变量、数组元素前加上& 操作符可得到变量的地址。 例:下面的语句定义 X 和 Xptr: long X;/*定义一个长整型变量 X*/ long *pW;/*注:pW 是指针。*pW 是一个长整型变量,是 pW 所指的对象*/ 使用给定类型变量与给定类型变量的指针有两个主要的区别: (1) 存储空间分配 ―― 定义某一类型的对象(如长整型的 x)意味着分配 存储变量所需的内存空间。由于 C 中长整型数在内存中占四个字节,所 以 x 占了四个字节。 然而, pW 这样的指针不需要占用与所指对象一样 像 的字节数。所以使用指针可以节省内存空间。 (2) 初始值 ―― 即使未初始化,引用指针以外的变量通常是安全的。但在 安全使用指针之前必须赋给合法的地址值,否则可能产生错误。 假设,前面定义 X 和*pW 语句之后有如下两条语句: X=50L; *pW=50L; 第一条语句是有效的:它将 x 的值设为 50L。第二条语句不正确,pW 还没有正 确初始化,该语句会破坏内存。 下面的指令序列说明如何使用指针、* 操作符以及& 操作符,并且可以看到一 旦对指针赋以内存地址,其“间接引用”等同于所指对象。 Int X=50L; /* 声明整型数 X,并对 X 的赋值为 50 */ int *Xptr; /* 定义整型指针 Xptr */ Xptr=&X; /* 将 X 的地址赋给 Xptr */ printf(“*Xptr = %d\n”,*Xptr); /* 可以看到*Xptr 等同于 X,*Xptr 的 值为 50 */ X=100L; /* X 值设为 100 */ printf(“%d\n”,*Xptr); /* 可以看到*Xptr 的值也跟着变为 100 */ *Xptr=200L; /* 将*Xptr 值设为 200 */ printf(“X=%d\n”,X); /* 将 Xptr 所指对象的值设为 200,即此时 X=200L */ c) 指针作为参数传递
5

指针可传给函数, 且函数可改变指针所指向的对象值。 术语称之为 “引用传递” 。 对变量的引用或变量的指针可传给被调用的函数。与之相反的是值传递,变 量的值传给所调用的函数。值传递是函数调用的标准方法。 下例定义了一个检测光线亮度的函数 getlight,参数为一整型指针 maxlight。 该函数比较检测到的亮度值和传递进来的历史上最亮的亮度值, 并把最亮的值存 在指针所指的变量*maxlight 中。多次调用该函数后,变量*maxlight 里保存的 就是多次检测结果中最亮的值。 int getlight(int *maxlight) { int light= 0; /*定义一个整型变量 light*/ light = photo(1); /*将左光敏检测值存在 light*/ if(light < *maxlight) * maxlight = light; /* 光敏检测值小代表亮 */ return light; /*函数 getlight 返回左光敏检 测值*/ } d) 从函数返回指针 可以从函数返回指针。像定义其他类型指针一样,在函数名前加上星号*可定义 函数返回值是指针类型,不妨称之为指针函数。 例:累计左右碰撞的次数可以用下面的方法实现。(该代码只是用于示范指针 函数的用法) int left, right, other; int *dirptr(int dir) /* 注:dirptr 是函数,返回值 是指针 */ { if(dir==1) { return(&left); } /* 将 left 的地址返回给函数 dirptr (1) */ if(dir==2) { return(&right);} /* 将 right 的地址返回给函数 dirptr (2 )*/ return(&other); } 当函数 dirptr()的参数 dir 为 1 时, 返回指向全局变量 left 的指针 (即 left 的地址);参数 dir 为 2 时,返回指向全局变量 right 的指针;参数 dir 为其余 值时返回全局变量 other 的指针。 使用碰撞计数时可以这样调用:“*dirptr(bump())++;”,于是 bump()检测 值为 1 时, left 增加 1; bump()检测值为 2 时, right 增加 1。 碰撞检测函数 bump() 的含义可以参看库函数说明。
6) 数组

C 支持字符数组、整型数组、长整型数组、浮点型数组、结构数组、指针数组、 和数组指针。使用数组的的主要好处在于可为同类型的多个实例分配空间,向函 数传入任意数目的参数,以及在一组数上进行迭代运算。

6

a) 数组的定义和初始化 数组使用方括号进行定义。如下语句定义了一个有十个整型变量的数组: int light[10]; 在该数组中,元素计数从 0 到 9。通过在方括号中加入索引号存取数组元素。 light[4]表示数组 light 中的第五个元素(以零为基数)。 数组初始化如未定义,则全为零。数组亦可在定义时初始化,方法为在花括号 内用逗号隔开各数组元素初始值。 若在定义时给出初始化信息而未在方括号内指 定数组大小,则数组长度由给出的数组元素的个数而定。例如, int light[]= {0, 40, 50, 68, 117, 201}; 创建一个有六个整数的数组,light [0] 为 0,light [1] 为 40,等等。 如果定义了数组长度,并且初始数据也给定,则初始数据的长度不应超过定义 的数组长度,否则将产生错误。另外如果定义了数组长度,而初始元素的个数小 于这个长度,则余下的元素初始化为 0。 字符型数组为文本串。对字符型数组初始化有特殊的语法。数组的字符值括在 双引号内: char string[]= "Hello robot"; 这种形式创建一个叫作 string 的字符型的数组, 其中字符为 ASCII 码值。 另外, 字符型数组以 0 结尾。这种结尾形式的字符数组可以作为供显示输出的字符串。 字符数组也可以用花括号形式来初始化,但这种情况不会自动地以 null 结尾。 一般在输出不以 null 结尾的字符数组时将导致错误。 b) 数组作为参数传递 当一个数组以变量的形式传递给一个函数时,实际上是传递了数组指针,而不 是传递了数组本身。如果函数修改了作为参数的数组,则原数组亦被修改,这是 因为在内存中只有数组的一个实例。 在标准C中,有两种途径来声明一个数组型参数:数组或数组元素类型的指针。 作为例子,下面函数参数为一个下标和一个数组,返回由下标定义的数组元素。 int get(int index, int array[]) { return array[index]; } 此处用方括号声明参数 array 为一个整数数组的指针。 当传递一个数组变量给一个函数时,实际上是传递了数组指针的值而不是其中 的一个元素,所以不用方括号。参见下面完整的例子: int light[10]= {0, 40, 50, 68, 117, 201}; int height[]={11,12,13,14,15}; void main() { int a,b; a=get(3, light); b=get(2,height); printf("a=%d b=%d\n",a,b); } int get(int index, int array[])
7

{ return array[index]; } 6.2.2 语句与表达式 语句是组成 C 程序基本成分之一,包括表达式、赋值、函数调用或控制语句。 运算符施加于特定类型对象之上,指明了将如何对它进行处理。 表达式组合变量及常量产生新值。
1) 运算符

每种数据类型都有自己的运算符集以决定可以对其采用的运算。 a) 整型运算 整型数支持以下运算: 加法+,减法-,乘法*,除法/ (1) 算术运算 (2) 比较运算 大于>,小于<,等于==,大于等于>=,小于等于<=,不等 于!= (3) 位运算 按位或 |,按位与 &,按位异或 ^,按位取反 ~ (4) 布尔运算 逻辑或 | |,逻辑与&&,逻辑非 ! C 语句在使用布尔值时,总是把整数零作为假(false),任何非零值作为真 (true)。布尔运算符返回零作为假,而返回 1 作为真。 布尔运算符 && 和 | |一旦得到最终表达式的结果,就会终止整个表达式的 计算。例如,在表达式 a&&b 中,若 a 是假,则结果必为假而无需计算 b。因而 该 && 运算符不会对 b 求值。 b) 长整型 整型运算所支持的运算符集中部分可用于长整型: 算术加+, 算术减-, 算术乘*, 及整型比较运算符。长整型不支持位运算,布尔运算及算术除法。 c) 浮点数 浮点运算支持如下类型: (1) 算术运算 加法+,减法-,乘法*,除法/ (2) 比较运算 大于>,小于<,等于==,大于等于>=,小于等于<=,不等 于!= (3) 数学函数 C 支持的三角运算,对数运算和指数运算。详情见浮点运 算函数部分。 d) 字符 当字符数组的一个元素被引用时,整型运算符自动强制把该字符元素转成整型 进行处理。在字符数组中存入一个值时,该值将被强制从 16 位整数转成 8 位字 符型(截去高 8 位)。
2) 赋值运算与表达式

最基本的赋值运算符是=。下面的语句将 a 的值加 2。 a = a + 2; 简写形式 a + = 2; 可执行同样的操作。 同样的用法的运算符有: + * / % << >> & ^ |
3) 自增运算符与自减运算符

自增算符"++"对变量进行增量操作。例如,语句"a++"等于"a=a+1"或"a+=1"。 使用自增运算符的语句是有值的。例如,语句 a=3;
8

printf("a=%d ++a=%d\n", a, ++a); 会显示"a=3 ++a=4."。由此可知,++a 是先执行"a=a+1"的操作,再将它的值 打印出来。 若自增运算符放在变量名后,则先计算表达式的值,再进行自增操作。则如下 语句 a = 3; printf("a=%d a++=%d\n", a, a++); 会显示 "a=3 a++=3" 但此语句执行后 a 的值已是 4。 自减运算符"--"的使用类似于自增运算符。
4) 数据存取运算符

& :单个的 & 符号用于对变量和数组的引用,返回其在内存中的地址。 该运算符不能用于在内存中没有固定地址的表达式。 *:表达式中的单个 * 符号用于返回指针所指变量的值。这种操作称为“间接引 用”。 例: int a, *aptr; aptr = &a; /*变量 a 的地址赋值给指针变量 aptr */ /*把 10 赋值给指针 aptr 所指变量*/ *aptr =10; printf("addr=0x%x a=%d\n",&a, *aptr); 显示结果:addr=0x0102 a=10 [表达式] 在数组类型(数组变量或函数返回的数组指针)之后出现,检查方括号括起的 表达式的值是否在数组边界内,并且返回对该数组元素的引用。
5) 运算优先级和次序

下面简要地给出 C 运算符的优先级与结合原则。越排在前面的运算符其优先级 越高。同行的运算符优先级相同,运算次序由结合方向决定。 运算符 结合方向 () [] 自左向右 自右向左 ! ~ ++ -- - ( 类型 ) * / % + << >> < <= > >= == != & ^ | && || = += -= *= /= %= , 例如:a = b + a * 3 / 4 – c; 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右 自左向右 自右向左 |= 自右向左 自左向右

>>=

<<=

&=

^=

9

运算次序是:先计算 a * 3 / 4,再计算 b + ,之后计算 – c,最后是把计算 结果赋值给 a。 6.2.3 控制语句
1) 控制语句

单个的 C 语句以分号结束。一组语句可用花括号组合成复合语句块。语句块内 可定义局部变量。

2)

IfIf-else

if else 语句用于选择。其语法为: if (表达式) { 语句 1;} else { 语句 2;} 该语句执行时,先计算 if 后面的表达式,若表达式的值不等于零(如逻辑真), 则执行语句 1,若表达式的值等于零,则执行语句 2。
3) While

while 循环语法如下: while (表达式) { 语句;} while 开始就先计算表达式的值。若为假(零),则跳过语句。若为真(非零), 则执行语句。然后再次计算表达式的值,执行同样的检查。直到表达式值为零, 终止循环。 在 C 中用 while 很容易创建永远循环: while (1) { 语句;} 这是因为表达式的值为 1,永真的缘故。
4) For

for 循环语法如下: for (表达式 1;表达式 2;;表达式 3) { 语句} 它等同于如下的 while 循环: 表达式 1; while (表达式 2) { 语句; 表达式 3; } 典型地,表达式 1 为赋值操作,表达式 2 为相关的表达式,表达式 3 为某种方 式的自增或自减操作。例如,如下代码从 0 计数到 99,并同时输出各数字: int i; for (i= 0; i < 100; i++) { printf("%d\n", i); wait(0.1); }
5) Break

在 while 或 for 循环中可用 break 提前终止循环或跳出死循环。
10

6.2.4 屏幕显示 printf 函数语法如下: printf(格式字符串, [参数 1] , ... , [参数 N] )
1) 屏幕显示例子

例 1:显示消息。下面语句在屏幕上输出文本串。 printf("Hello, world!\n"); 在该例中,格式控制字符串只是简单地向屏幕输出。末尾的\n 字符表明是行结 束。 例 2: 显示数字。下面的语句显示整型变量 n 的值和简短的信息。 int n; printf("Value is %d\n", n); 格式符%d 用于十进制整数格式化输出。 例 3: 显示二进制数。下面的语句将整型变量 n 以二进制数的形式输出。 printf("Value is %b\n", n); 格式符%b 用于二进制整数格式化输出。只有该整数的低 8 位被输出。 例 4: 显示浮点数。下面的语句将浮点型变量 x 以浮点数形式输出。 float x; printf("Value is %f\n", x); 格式符%f 用于格式化输出浮点数。 注意如果用特殊格式%f 输出一个整型变量将 会出错。 例 5: 以十六进制方式显示两数。 int a,b; printf("A=%x B=%x\n", a, b); 格式符%x 用于十六进制方式格式化输出整型数。
2) 格式化字符汇总

%d:输出类型:int 描述:十进制整数 %x:输出类型:int 描述:十六进制整数 %b:输出类型:int 描述:低位字节为二进制数 %c:输出类型:int 描述:低位字节为 ASCII 字符 %f:输出类型:float 描述:浮点数 %s:输出类型:char[ ] 描述:字符数组(字符串)
6.3 能力风暴库函数

能量风暴库函数与机器人的硬件有关。 由于能力风暴系列机器人在传感器和 执行器配置上有差别,主板电路也不完全相同,造成所使用的操作系统和库函数 有细微差异。在下面库函数介绍时会注明适用的机器人型号。如未加注释,表示 该库函数适用于 MF10/UF10 机器人型号。目前已生产的机器人型号有 AS-InfoX、 AS-InfoM、AS-M、AS-MII、AS-UII、AS-UIII、AS-MIII、AS-EI。 6.3.1 执行器函数 void SetMoto(int channel,int speed) 需要设定的电机电机功率,其中设置负数表示反转。unsigned char channel 为 需要设定的电机通道编号。范围:MOTO_0,MOTO_1,MOTO_2,MOTO_3。int speed 需 要设定的电机电机功率,其中设置负数表示反转。范围:-100~100。 void stop()

11

关闭所有电机,停止运动。 Void StopMoto(int num) 关闭编号为 num 的电机。 void wait(float sec) 延时 sec 秒后再执行后面的语句。sec 是一个浮点数。 int printf(const char *fmt, ...) 在机器人的 LCD 屏幕上显示字符串。 6.3.2 传感器检测函数 int AI(int channel) 读模拟口上传感器的值。channel 的范围是 0-26。返回值是 0 到 255 间的整 数值。 int Get_Button( int num) 获取编号为 num 的按钮的状态。返回 0 或 1。 int Compass_Degree( ) 指南针检测。返回值是 0-360 间的整数值。 int DI( int channel ) 读取数字输入口状态。返回值为 0~255 的数字量。 int seconds( ) 以秒的形式返回系统时间。返回值为浮点数,精度为 0.001 秒。 Void ResetTime( ) 将系统时间复位清零。 Int EyeInMax() 读取复眼最大值。 Int EyeChMax() 去读复眼最大值编号。 EyeInMaxEx( num) Int EyeInMaxEx(int num) 读取地址为 num 的扩展复眼最大值。 EyeChMaxEx( num) Int EyeChMaxEx(int num) 读取地址为 num 的扩展复眼最大值编号。 6.3.3 通讯函数 void SCI_Set(unsigned char ucPort,unsigned int uiBaud,unsigned char iCHK, unsigned unsigned char iData, unsigned int iStop) 串口初始化设置函数, unsigned int iPort 需要初始化的串口编号, unsigned int iBaud 波特率设定,unsigned char iCHK 校验位设定,unsigned int iData 数 据长度设定,unsigned int iStop 停止位设定。 void SCI_Send(unsigned int ucPort, unsigned char ucdata) 向串口 ucPort 发送一个 0-255 之间的整数 ucdata。 int SCI_Receive(unsigned char ucPort) 从串口 ucPort 读取一个字符。 unsigned char serial_check(unsigned char ucPort) 检测串口是否收到数据。 6.3.4 其他函数 void SetDO(int Channel,int State)

12

控制数字输出口状态,Channel 表示数字输出口序号,取值 0~6,status 表示数 字输出口状态,1 表示接通,0 表示断开。 Void ResetTime( ) 将系统时间复位清零。 SetServo( Channel, Speed) Void SetServo(int Channel,int Rot,int Speed) 设置伺服电机的速度与旋转角度, Channel 为电机编号, Rot 为伺服电机 旋转角度,Speed 为伺服电机旋转速度。 MCLK_Config( Hz) Void MCLK_Config(int Hz) 设置时钟频率为 Hz。 void TimerInit(int TimeTick , void (*FuncCallfp)(void)) 将某个函数作为时钟回调函数。 int AnalogDI(int Channel) 模拟端口复用为数字口通道的输入,cChannel 为通道号,范围 0-11,返 回 0 或 1。

13


更多相关文档:

用C语言机器人编程

另外,如果用 C 语言机器人 编程,学生就能对不同的机器人套装用同一方式来编写程序。 那么,究其原因,为何大家都不愿意用 C 语言编写程序呢?笔者分析,应该有...

我的第一个机器人足球程序

基于C语言的电脑机器人足球... 暂无评价 5页 2.00元 机器人足球Robocup仿真系统...我的第一个机器人足球程序我的第一个机器人足球程序隐藏>> // Strategy.cpp...

机器人协会C语言培训资料

c语言资料c语言资料隐藏>> 机器人协会 C 语言培训资料 现在大家学C语言已经有...可能大家现在 体会不会太深,因为大家现在的程序不是很大,大概在一两百行左右,...

能力风暴机器人编程_图文

第一节 图形化交互式 C 语言简介 4.1.1 VJC 简介图形化交互式 C 语言 (...中, 不仅可以用直观的流程图编程, 也可以用 JC 语言编写更高级的机器人程序。...

《机器人3D仿真系统》使用教程_图文

也可以直接在打开程序编辑器的时候选择用C语言为机器人编写程序为。共 100 页...仿真系统》使用教程 第二十二课学习任务 过人 本节课学习模拟机器人足球过人的...

仿真机器人教案_图文

了解能力风暴教学机器人的身体结构。 了解和应用能力风暴教学机器人的仿真教学环境...对 于代码编程需要C语言基础,对于一般的小学生不做要求,只要求掌 握图形化编程...

VJC教程

本书还详细讲解了 VJC 编程语言。VJC 编程语言又称为机器人 C 语言,是一种易学 易用的编程语言。读完该书,再去学标准的 C 语言程序设计,就易如反掌了。 ...

机器人实验实验报告_图文

我在实验中主要负责编写程序。由于之前对 C 语言掌握的不错,所以对这一 部分...机器人足球实验报告 10页 免费 机器人实验报告 6页 免费 机器人技术实验报告...

广茂达机器人灭火程序(纯C语言版)

广茂达机器人灭火程序(纯C语言版)_机械/仪表_工程科技_专业资料。广茂达机器人灭火...广茂达机器人足球项目 48页 1下载券 灭火机器人参考程序1 2页 免费喜欢...

机器人配置1

应用软件支持标准流 程图编程和标准C语言编程,流程...可存储3个以上1万条语句的程序,能在控 制器上设置...球机器人 AS-MF2011足球 一、控制器部分*1: (1...
更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com