C51单片机应用与C语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

任务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个及以上数据,程序代码段该怎样写呢?