在任务2中,你已经知道如何使用循环语句让微控制器不断产生零点标定信号。当然,你在编 写某个程序时,肯定并不总是需要机器人永远执行同一个操作或者说任务,而只希望它执行一段指 定的时间或者执行一些固定的次数。这时,你就要在PBASIC 程序中用于到变量。
变量用来保存数值。后面的机器人程序很大程度上都要依赖使用变量。用变量保存数值的最主 要的作用就是程序能用这些变量来计数。一旦你的程序能计数,你就能控制和跟踪事件发生的次数。
用变量存储数值,数学运算和计数
变量可以用来储存数值。PBASIC语言在使用一个变量之前,要先给该变量起一个名字,并说
基础机器人制作与编程 明该变量的大小类型。这叫声明一个变量。声明一个变量的PBASIC语法如下:
variableName VAR Size
实际声明变量时,你用你自己起的名字代替variableName,Size用来说明变量的大小类型,
PBASIC程序中可以声明的变量类型如下:
Bit — 存储0或者1;
Bib — 用来存储0到15之间的任意数值;
Byte — 用来存储0到255之间的任意数值;
Word — 用来存储0到65535之间的任意数值,或者-32768到32767之间的任意数值。
注意:为何有上述特定的变量类型大小呢?请参考二进制的说明。
下面的例程包含两个“word”大小的变量:
value VAR Word
anotherValue VAR Word
在声明变量之后,你也可以对它初始化,即给它一个初始值。
value = 500
anotherValue = 2000
在“value = 500”中,符号“=”是个运算符。你可以利用其它一些运算符和变量进行数学运 算。在这里有两个乘法运算的例子:
value = 10 * value
anotherValue = 2 * value 程序示例: VariablesAndSimpleMath.bs2
这个例程演示了如何对变量进行声明、初始化和运算。
z 在运行程序之前,对DEBUG指令要显示的内容进行预测。
z 输入、保存并运行程序VariablesAndSimpleMath.bs2。
z 和你的预测进行对比,解释所有的不相同的原因。
' VariablesAndSimpleMath.bs2
' Declare variables and use them to solve a few arithmetic problems.
' {$STAMP BS2}
' {$PBASIC 2.5}
value VAR Word ' Declare variables anotherValue VAR Word
value = 500 ' Initialize variables anotherValue = 2000
DEBUG ? value ' Display values DEBUG ? anotherValue
value = 10 * anotherValue ' Perform operations DEBUG ? value ' Display values again
DEBUG ? anotherValue END
程序VariablesAndSimpleMath.bs2是如何工作的
下面的代码定义了两个字变量:value 和 anotherValue。
value VAR Word ' Declare variables anotherValue VAR Word
然后,初始化变量,即给刚刚声明的变量赋上你决定的初始值。这两条指令执行后,value的 值是500,anotherValue的值是2000。
基础机器人制作与编程 value = 500 ' Initialize variables
anotherValue = 2000
随后的DEBUG指令帮助你了解初始化变量后每个变量存储的数值,因为给value赋值是500,
anotherValue赋值2000,因此DEBUG指令向调试终端发送信息:“value = 500” 和 “anotherValue
= 2000”并显示。
DEBUG ? value ' Display values DEBUG ? anotherValue
这里又新引入了一个DEBUG指令的格式说明字符“?”,该格式说明字符用在一个变量名之 前,使DEBUG终端显示其名称,以及存储在该变量中的数值,然后回车。这样对于查询一个变量 的内容非常方便。
下面三行的疑问是:调试终端将显示什么?答案是value的值是anotherValue的10倍,因为 anotherValue的值是2000,那么value就是20000,而变量anotherValue不变。.
value = 10 * anotherValue ' Perform operations DEBUG ? value ' Display values again
DEBUG ? anotherValue 该你了――用负数计算
如果你想做一些包含负数的计算,你可以使用DEBUG指令的SDEC格式说明来显示。下面的 例子能通过修改程序VariablesAndSimpleMath.bs2得到。
z 删除程序VariablesAndSimpleMath.bs2的下面部分:
value = 10 * anotherValue ' Perform operations DEBUG ? value ' Display values again
z 改成如下代码:
value = value - anotherValue ' Answer = -1500
DEBUG "value = ", SDEC value, CR ' Display values again z 运行更改后的程序并验证value的值是否由500变为-1500。
计数并控制循环次数
最方便的控制一段代码执行次数的方法是利用FOR…NEXT循环,语法如下:
FOR Counter = StartValue TO EndValue {STEP StepValue} … NEXT
省略号“…”表示你可以在FOR 和NEXT之间放一条或多条的程序指令。使用前面的循环前 要确保先声明一个变量替代参数Counter。参数StartValue 和EndValue可以是数值也可以是变 量。语法描述中位于大括号{ }之间的东西,表示是可选参数。换句话说,没有它FOR…NEXT仍将 工作,但是你可以将之用于一些特殊目的。
你没有必要一定要将变量命名为“counter”,例如,你可以用“myCounter”
myCounter VAR Word
下面是一个用myCounter来计数的FOR…NEXT循环例程。每执行一次循环,它会显示 myCounter的值。
例程: CountToTen.bs2
z 输入、保存并运行程序CountToTen.bs2。
' CountToTen.bs2
' Use a variable in a FOR...NEXT loop.
' {$STAMP BS2}
' {$PBASIC 2.5}
myCounter VAR Word FOR myCounter = 1 TO 10
基础机器人制作与编程 DEBUG ? myCounter
PAUSE 500 NEXT
DEBUG CR, "All done!"
END
该你了――不同的初始值和终值以及计数步长 你可以给变量StartValue 和EndValue 赋不同的值 z 修改FOR…NEXT循环如下:
FOR myCounter = 21 TO 9 DEBUG ? myCounter PAUSE 500
NEXT
z 运行修改后的程序。BASIC Stamp往下计数代替了往上计数,你注意到了吗?只要 StartValue的值大于EndValue,程序就会这样运行。
还记得可选参数{STEP StepValue}吗? 你可以用它来使myCounter以不同步长计数,而不是 按9, 10, 11…这样每次增1来计数。例如,你可以让它每次增加2(9, 11,13…)或增加5 (10, 15, 20…) 或任何你给出的StepValue,递增或递减都可以。下面的例子是以3为步长向下计数。
z 增加STEP 3到FOR…NEXT循环,如下所示:
FOR myCounter = 21 TO 9 STEP 3 DEBUG ? myCounter
PAUSE 500 NEXT
z 运行更改后的程序,验证是否以3为步长递减。