- C51單片機應用與C語言程序設計
- 秦志強編著
- 829字
- 2019-01-01 05:55:32
任務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個及以上數據,程序代碼段該怎樣寫呢?