magiccar 發表於 2010-1-27 22:47

單晶片魔法車04-神奇光控車

在上個實驗中,我們讓光感測器的信號進到89C2051中,透過我們的程式讓兩個LED燈做出相反的動作,但卻沒用到任何反相器。因此我們知道利用程式的規劃,能減少實體電路的空間,卻仍有同樣的功能,很神奇吧!
接下來的實驗當然就要讓科學魔法車動起來了,但可不是照到光就動或是轉彎這樣而已喔!否則就太對不起單晶片神奇的程式功能了!開動了。。。

實驗四:神奇光控魔法車

實驗內容:我們要讓科學魔法車在手影摭住光源後,指示燈會開始閃爍計數,如果
     連續不斷達6次時,就啟動繼電器讓魔法車前進,指示燈恆亮。
     如果在行進中,用手影摭住光源,指示燈會也開始閃爍計數,當連續不
     斷達3次時,就關閉繼電器讓魔法車停止,指示燈熄滅。

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

電路照片:

看!我們只要動動頭腦,就能讓光控電路變得只占用一點點的空間


這個是狀態指示燈


這部份是輸出放大電路


空照圖一張,夠清楚了吧!


/*實驗四:神奇光控魔法車*/
#include <AT89x051.h>
void delay(unsigned char tmp); //宣告延時函數
void main(void)      //主程式開始
{
unsigned char chk; //初始值設定
bit car_on;   //
P3_0=1;    //啟始輸入功能
P1_2=0;    //關閉繼電器
car_on=0;   //清除行車狀態
while(1)   //無限循環
{      
if(P3_0==0)   //當沒有黑影時
{
    P1_5=~car_on;//LED顯示行車狀態,加"~"是反相的意思
          //(如果car_on是"1",那P1_5就變成"0"囉!)
    chk=0;    //清除計數器
}else      //當有黑影時
{
    P1_5=0;       //LED亮
    delay(100);     //
    P1_5=1;       //LED滅
    delay(100);   //
    chk++;        //計數器加1
    if(car_on==0)   //當車子停止時
  {
      if(chk==6)  //當計數器累加到6
      {
      P1_2=1;   //啟動繼電器
      car_on=1;  //設定行車狀態=1
        chk=0;    //清除計數器
      }
  }else  //當車正在行進
  {
      if(chk==3)    //當計數器累加到3
      {
      P1_2=0;   //關閉繼電器
      car_on=0;  //清除行車狀態
      chk=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--;       //   |
  }         // <-+
 }
}

熱騰騰的程式給您送上來了囉!


(老師,我有問題!)如果不用程式來控制,電路要如何做呢?(這。。。你是來亂的嗎?)

magiccar 發表於 2010-2-2 14:57

上面的程式可能已經把你搞得暈頭轉向了吧!這是老師故意的啦!
因為前面的都很容易,再來個來個震撼教育,保證可以提神醒腦。
其實程的的寫法是很多元化,因為每個人的思考模式不一樣,製作出來的程式風格也會不同,
下面這段程式功能跟實驗四一樣,雖然比原程式寫法簡單,但達成的功能可不含糊,甚至更準確。
你們可以看一看,找出差別在那裏?


/*實驗四:神奇光控魔法車*/
#include <AT89x051.h>
void delay(unsigned char tmp); //宣告延時函數
void main(void)     //主程式開始
{
 unsigned char chk; //記錄計數值的變數
 P3_0=1;        //啟始輸入功能
 P1_2=0;        //關閉繼電器
 while(1)        //無限循環
 {      
 chk=0;       //清除計數器
  P1_5=~P1_2;   //LED顯示繼電器狀態
  while(P3_0==0) //當有黑影時計數
 {
     chk++;   //計數器加1
     P1_5=~P1_5; //LED亮-滅一次
     delay(200);
     P1_5=~P1_5;
     delay(200);
 }
 switch(chk) //依chk值執行對應程式段
 {
 case 3:      //如果chk=3
     P1_2=0; //關閉繼電器
     break;  //結束判斷
 case 6:      //如果chk=6
     P1_2=1;   //啟動繼電器
     break;  //結束判斷
 }      //結束switch
 }
}
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:11

還是好複雜。= =''

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

v751953789 發表於 2011-2-22 14:11 static/image/common/back.gif
還是好複雜。= =''

看不懂的地方可以提出來問啊!
頁: [1]
查看完整版本: 單晶片魔法車04-神奇光控車