單晶片魔法車06-聰明聲控車(二)
現代人看電影都流行首部曲、二部曲,我們做魔法車也得要跟上時代,來做個聲控二代車吧!第一代聲控車我們用聲音來切換繼電器的開關狀態,而改變魔法車的行進。那二代車就要更有智慧了。
https://www.youtube.com/watch?v=buxOLC_XZ90
實驗六:聰明聲控車(二代)
實驗內容:開啟電源後魔法車前進,聲控電路處於待命狀態。用當接收到拍手聲時,
單晶片立即進入聲控模式,計數拍手次數,依1~4下分別做出後退再右
轉、後退再左轉、直接右轉、直接左轉等動作,非常好玩喔!
使用材料:實驗五的材料,2SC1815(NPN電晶體)*1,10KΩ電阻*1,繼電器*1
電路照片:
為了做到左右馬達都能控制,把一塊實驗板都塞爆了!{:2_33:}
聲音感測電路被趕到另一塊實驗板上:Q
程式内容:
/*實驗六:聰明聲控魔法車*/
#include <AT89x051.h>
void delay(unsigned char tmp); //宣告延時函數
void Go_F();
void Go_B();
void Go_R();
void Go_L();
void main(void) //主程式開始
{
unsigned char chk; //宣告記錄計數值的變數
unsigned char chk_time,i; //宣告設定偵測次數的變數
P3_0=1; //啟始輸入功能
while(1) //無限循環
{
chk=0; //清除計數器
chk_time=255; //設定偵測次數
Go_F(); //魔法車前進
while(P3_0==0) //當有拍手聲時
{
P1_5=0; //顯示進入聲控偵測狀態
delay(200); //防止重複觸發的延時
chk++; //計數值加1
while(chk_time) //繼續偵測255次
{
chk_time--;
i=255;
while(i)
{
i--;
if(P3_0==0) //再有拍手聲時
{
chk++; //計數值再加1
delay(200);//防止重複觸發的延時
chk_time=255; //延長偵測時間
}
}
}
P1_5=1; //聲控偵測狀態結束
}
switch(chk) //依chk計數值執行
{
case 1: //如果拍1下
Go_R(); //右轉
delay(255);
delay(255);
break; //結束
case 2: //如果拍2下
Go_L(); //左轉
delay(255);
delay(255);
break; //結束
case 3: //如果拍3下
Go_B(); //倒車
delay(255);
Go_R(); //右轉
delay(255);
delay(255);
break; //結束
case 4: //如果拍4下
Go_B(); //倒車
delay(255);
Go_L(); //左轉
delay(255);
delay(255);
break; //結束switch判斷
}
}
}
/* 副程式區 */
void Go_F()
{
P1_2=0;
P1_3=0;
}
void Go_B()
{
P1_2=1;
P1_3=1;
}
void Go_R()
{
P1_2=0;
P1_3=1;
}
void Go_L()
{
P1_2=1;
P1_3=0;
}
void delay(unsigned char tmp) //延時函數
{ //改變參數大小,可調整時間
unsigned char i,j; //宣告使用到的變數
i=tmp; //把呼叫程式式中的參數100指定給變數i
while(i) //只要i不為0,
{ //就執行{...}中的指令
i--; //把i值減1
j=255; // <-+
while(j) // |
{ // 用j值讓程式執行256次的迴圈,到延時效果
j--; // |
} // <-+
}
}
線路好多喔= ='' v751953789 發表於 2011-2-22 14:08 static/image/common/back.gif
線路好多喔= =''
對的!要用簡單的零件完成複雜的功能,就容易出現這種情形。
所以很多控制晶片就應運而生囉:D 硬體電路可否公布出來? 挺难懂的啊。哈哈
頁:
[1]