單晶片魔法車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--; // |
} // <-+
}
}
熱騰騰的程式給您送上來了囉!
(老師,我有問題!)如果不用程式來控制,電路要如何做呢?(這。。。你是來亂的嗎?) 上面的程式可能已經把你搞得暈頭轉向了吧!這是老師故意的啦!
因為前面的都很容易,再來個來個震撼教育,保證可以提神醒腦。
其實程的的寫法是很多元化,因為每個人的思考模式不一樣,製作出來的程式風格也會不同,
下面這段程式功能跟實驗四一樣,雖然比原程式寫法簡單,但達成的功能可不含糊,甚至更準確。
你們可以看一看,找出差別在那裏?
/*實驗四:神奇光控魔法車*/
#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 static/image/common/back.gif
還是好複雜。= =''
看不懂的地方可以提出來問啊!
頁:
[1]