任务4 用计算机来控制机器人的运动
在工业自动化中,经常需要单片机与计算机进行通信连接。一方面,单片机需要读取周边传感器的信息,并把数据传给计算机;另一方面,计算机需要解释和分析传感器数据,然后把分析结果或者决策传给单片机以执行某种操作。
在第1讲中已经知道C51单片机可以通过串口向计算机发送信息,本讲将使用串口和串口调试终端软件,由你从计算机向单片机发送数据来控制机器人的运动。
在本任务中,你需要编程让C51单片机从调试窗口接收两个数据:
(1)由单片机发给伺服电机的脉冲个数;
(2)脉冲宽度(以μs为单位)。
例程:ControlServoWithComputer.c
● 输入、保存、下载并运行程序ControlServoWithComputer.c;
● 验证机器人各个轮子的转动是否同期望的运动一样。
#include<BoeBot.h> #include<uart.h> int main(void) { int Counter; int PulseNumber,PulseDuration; uart_Init(); printf("Program Running!\n"); printf("Please input pulse number:\n"); scanf("%d",&PulseNumber); printf("Please input pulse duration:\n"); scanf("%d",&PulseDuration); for(Counter=1;Counter<=PulseNumber;Counter++) { P1_1=1; delay_nus(PulseDuration); P1_1=0; delay_nms(20); } for(Counter=1;Counter<=PulseNumber;Counter++) { P1_0=1; delay_nus(PulseDuration); P1_0=0; delay_nms(20); } while(1); }
ControlServoWithComputer.c是如何工作的
单片机通过串口从计算机读取输入的数据,需要用到格式输入函数。
scanf函数
scanf函数与printf函数对应,在C51库的stdio.h中定义。下面是它的一般形式:
scanf(“格式控制字符串”,地址列表);
“格式控制字符串”的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。
地址列表中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。如“&a”表示变量a的地址。这个地址是编译系统在存储器中给变量a分配的地址,不必关心具体的地址是多少。
变量的值和变量的地址
这是两个不同的概念,例如:
a=123;
那么:a为变量名,123是变量的值,&a则是变量a的地址。
scanf("%d",&PulseNumber);将会把输入的十进制整数赋给变量PulseNumber。
程序运行过程(如图2-8所示)如下:
图2-8 例程运行过程
(1)首先输出“Program Running!”和“Please input pulse number:”;
(2)程序处于等待状态,等待输入数据;
(3)输入数据给变量PulseNumber;
(4)输出“Please input pulse duration:”;
(5)处于等待状态;
(6)输入数据给变量PulseDuration;
(7)电机运转。
一次输入多个数据
当要求输入数据比较多时,上述方法是不是很麻烦?下面的代码可以让你一次输入两个数据,两个数据之间用空格隔开。
printf("Please input pulse number and pulse duration:\n"); scanf("%d %d",&PulseNumber,&PulseDuration);
想一想,如果要输入3个及以上数据,程序代码段该怎样写呢?