圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 5551|回復: 4

單晶片魔法車06-聰明聲控車(二)

  [複製鏈接]
magiccar 發表於 2010-2-3 12:55 | 顯示全部樓層 |閱讀模式
現代人看電影都流行首部曲、二部曲,我們做魔法車也得要跟上時代,來做個聲控二代車吧!
第一代聲控車我們用聲音來切換繼電器的開關狀態,而改變魔法車的行進。那二代車就要更有智慧了。

實驗六:聰明聲控車(二代)

實驗內容:開啟電源後魔法車前進,聲控電路處於待命狀態。用當接收到拍手聲時,
     單晶片立即進入聲控模式,計數拍手次數,依1~4下分別做出後退再右
     轉、後退再左轉、直接右轉、直接左轉等動作,非常好玩喔!

使用材料:實驗五的材料,2SC1815(NPN電晶體)*1,10KΩ電阻*1,繼電器*1

電路照片:

為了做到左右馬達都能控制,把一塊實驗板都塞爆了!


聲音感測電路被趕到另一塊實驗板上


程式内容:

  1. /*實驗六:聰明聲控魔法車*/
  2. #include <AT89x051.h>
  3. void delay(unsigned char tmp);        //宣告延時函數
  4. void Go_F();
  5. void Go_B();
  6. void Go_R();
  7. void Go_L();

  8. void main(void)                  //主程式開始
  9. {
  10.         unsigned char chk;        //宣告記錄計數值的變數
  11.         unsigned char chk_time,i;        //宣告設定偵測次數的變數
  12.         P3_0=1;                                //啟始輸入功能
  13.         while(1)                        //無限循環        
  14.         {                                                
  15.                 chk=0;                        //清除計數器
  16.                 chk_time=255;        //設定偵測次數
  17.                 Go_F();                        //魔法車前進
  18.                 while(P3_0==0)        //當有拍手聲時
  19.                 {
  20.                         P1_5=0;                //顯示進入聲控偵測狀態
  21.                         delay(200); //防止重複觸發的延時
  22.                         chk++;   //計數值加1
  23.                         while(chk_time) //繼續偵測255次
  24.                         {
  25.                                 chk_time--;        
  26.                                 i=255;
  27.                                 while(i)
  28.                                 {
  29.                                         i--;
  30.                                         if(P3_0==0)  //再有拍手聲時
  31.                                         {
  32.                                                 chk++;     //計數值再加1
  33.                                                 delay(200);  //防止重複觸發的延時
  34.                                                 chk_time=255; //延長偵測時間
  35.                                         }
  36.                                 }
  37.                         }
  38.                         P1_5=1;                //聲控偵測狀態結束
  39.                 }
  40.                 switch(chk)                //依chk計數值執行
  41.                 {
  42.                 case 1:                        //如果拍1下
  43.                         Go_R();                //右轉
  44.                         delay(255);
  45.                         delay(255);
  46.                         break;                //結束

  47.                 case 2:                        //如果拍2下
  48.                         Go_L();                //左轉
  49.                         delay(255);
  50.                         delay(255);
  51.                         break;                //結束

  52.                 case 3:                        //如果拍3下
  53.                         Go_B();                //倒車
  54.                         delay(255);
  55.                         Go_R();                //右轉
  56.                         delay(255);
  57.                         delay(255);
  58.                         break;                //結束

  59.                 case 4:                        //如果拍4下
  60.                         Go_B();                //倒車
  61.                         delay(255);
  62.                         Go_L();                //左轉
  63.                         delay(255);
  64.                         delay(255);
  65.                         break;                //結束switch判斷
  66.                 }
  67.         }
  68. }
  69. /* 副程式區 */
  70. void Go_F()
  71. {
  72.         P1_2=0;
  73.         P1_3=0;
  74. }
  75. void Go_B()
  76. {
  77.         P1_2=1;
  78.         P1_3=1;
  79. }        
  80. void Go_R()
  81. {
  82.         P1_2=0;
  83.         P1_3=1;
  84. }        
  85. void Go_L()
  86. {
  87.         P1_2=1;
  88.         P1_3=0;
  89. }        
  90. void delay(unsigned char tmp)        //延時函數
  91. {                                                                //改變參數大小,可調整時間
  92.         unsigned char i,j;                        //宣告使用到的變數
  93.         i=tmp;                                                //把呼叫程式式中的參數100指定給變數i
  94.         while(i)                                        //只要i不為0,
  95.         {                                                        //就執行{...}中的指令
  96.                 i--;                                        //把i值減1
  97.                 j=255;                                        // <-+
  98.                 while(j)                                //   |
  99.                 {                                                // 用j值讓程式執行256次的迴圈,到延時效果
  100.                     j--;                                //   |
  101.                 }                                                // <-+
  102.         }
  103. }
複製代碼
IMGP7854.JPG
IMGP7855.JPG
v751953789 發表於 2011-2-22 14:08 | 顯示全部樓層
線路好多喔= =''
 樓主| magiccar 發表於 2011-2-23 10:47 | 顯示全部樓層
v751953789 發表於 2011-2-22 14:08
線路好多喔= =''

對的!要用簡單的零件完成複雜的功能,就容易出現這種情形。
所以很多控制晶片就應運而生囉
s2331369 發表於 2011-4-11 19:22 | 顯示全部樓層
硬體電路可否公布出來?
陕大鹍 發表於 2011-7-31 17:58 | 顯示全部樓層
挺难懂的啊。哈哈
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

QQ|Archiver|手機版|小黑屋|圓創力科技有限公司 IOP Robotic Technology Co.,Ltd Tel: 07-3924582 Fax: 07-3924001

GMT+8, 2024-3-29 01:55 , Processed in 0.028577 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表