第十六課 創意組合應用 動動腦思考



想一想如何控制小車做下列動作:: 拍手--前進幾秒後 又後退幾秒後停住

-----------------------------------------------------------------------------
用單晶片
http://www.me.tnit.edu.tw/~me017
例題一 閃避前方的障礙物
假若右前方有障礙物, 則左馬達反轉, 左輪後退, 玩具車向左轉 .
假若左前方有障礙物, 則右馬達反轉, 右輪後退, 玩具車向右轉

電路說明:
1 反相器的目的:
2 10KΩ電阻及100μF電容器目的:
在電源開啟時, 讓硬體電路穩定後, 再啟動軟體程式
3 本電路可在創意自走車所附的兩個小麵包板上做出來, 參考右頁圖片.
4 如果要走地面黑色路線 , 請把紅外線感測器朝向地面, 馬達電線的正負端子互換位置 , 程式不必改變. R1改用300Ω
程式 1 ( Keil-C )
本程式已燒錄在創意自走車所附的
#include<at892051.h> // at892051.h 這個檔案裡有各個暫存器對應的記憶位址
main()
{
while (1) // 讓程式反覆執行
{
if (P1_2==1) // 如果右前方有障礙物
P1_3=1; // 左輪反轉
if (P1_2==0) // 如果右前方無障礙物
P1_3=0; // 左輪前進
if (P1_4==1) // 如果左前方有障礙物
P1_5=1; // 右輪反轉
if (P1_4==0) // 如果左前方無障礙物
P1_5=0; // 右輪前進
}
}
例題二 閃避前方的障礙物 (先後退再轉彎)
假若右前方有障礙物, 則車子先後退, 再向左轉 .
假若左前方有障礙物, 則向右轉 (不後退)
#include<at892051.h> // at892051.h 這個檔案裡有各個暫存器對應的記憶位址
void delay(unsigned int dly);
main()
{
while (1) // 讓程式反覆執行
{
if (P1_2==1) // 如果右前方有障礙物
{
P1_3=1; // 左輪反轉
P1_5=1; // 右輪反轉
delay(100); // 讓車子後退一段時間
P1_5=0; //右輪前進,車子開始向左轉
delay(40); // 讓車子轉彎一段時間
}
if (P1_2==0) // 如果右前方無障礙物
P1_3=0; // 左輪前進
delay(1); // 等一段時間, 讓干擾消失
if (P1_4==1) // 如果左前方有障礙物
P1_5=1; // 右輪反轉
delay(1); // 等一段時間, 讓干擾消失
if (P1_4==0) // 如果左前方無障礙物
P1_5=0; // 右輪前進
delay(1); // 等一段時間, 讓干擾消失
}
}
void delay(unsigned int dly) // 延遲時間的副程式
{
dly=dly*300;
while (dly>0)
dly--;
}
例題三 閃避前方的障礙物
假若右前方有障礙物, 則車子左右搖擺五次, 再轉彎前進.
假若左前方有障礙物, 則向右轉 (不後退)
#include<at892051.h>
void delay(unsigned int
dly);
unsigned int aa;
main()
{
while (1)
{
if (P1_2==1)
{
P1_3=1;
P1_5=1;
delay(1);
for (aa=1;aa<=5;aa=aa+1)
{
P1_3=1;
P1_5=0;
delay(40);
P1_3=0;
P1_5=1;
delay(40);
}
P1_5=0;
delay(100);
}
if (P1_2==0)
P1_3=0;
delay(1);
if (P1_4==1)
P1_5=1;
delay(1);
if (P1_4==0)
P1_5=0;
delay(1);
}
}
void delay(unsigned int
dly)
{
dly=dly*300;
while (dly>0)
dly--;
}