magiccar 發表於 2010-2-3 12:55

單晶片魔法車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

線路好多喔= =''

magiccar 發表於 2011-2-23 10:47

v751953789 發表於 2011-2-22 14:08 static/image/common/back.gif
線路好多喔= =''

對的!要用簡單的零件完成複雜的功能,就容易出現這種情形。
所以很多控制晶片就應運而生囉:D

s2331369 發表於 2011-4-11 19:22

硬體電路可否公布出來?

陕大鹍 發表於 2011-7-31 17:58

挺难懂的啊。哈哈
頁: [1]
查看完整版本: 單晶片魔法車06-聰明聲控車(二)