電子仿真:模擬交通燈

今天分享一個模擬交通燈實驗,這個實驗和我們平時真實的交通燈還是有些許差別的,比如說在穩定性方面,和真實的交通燈有著天壤之別,而馬路上所用的交通燈是用工控(如PLC)的方式來實現的,在平時運行時極少出問題。

電子仿真:模擬交通燈

由於電子實驗的侷限性,所以筆者更傾向於用電子仿真的方式來做實驗,這樣,大家看完之後也可以做出一樣的實驗現象,要想完成本次實驗只需要兩個軟件,一個是仿真軟件Proteus,另一個是編程軟件Keil-C51。

物料清單

英文名字是電子元器件在Proteus中所對應的代號。

  • 51單片機-AT89C51

  • 電容-CAP

  • 電解電容-CAP-ELEC

  • 12M晶振-CRYSTAL

  • 黃色LED-LED-YELLOW

  • 電阻-RES

  • LED燈-LED

電子仿真:模擬交通燈

原理圖

單片機左側為單片機的最小系統,右側是交通燈的連接方式,他們以共陽極方式連接,所謂共陽極方式是LED燈的陽極都接電源,而陰極接地的方式。當單片機I/O口輸出高電平的時候,由於I/O口之間和VCC之間沒有壓差,所以不會有電流通過,而當I/O口輸出低電平的時候,由於電源和I/O口之間有壓差存在,此時會有電流通過,LED燈會被點亮。

電子仿真:模擬交通燈

程序源代碼

  • #include //頭文件

  • sbit RED_A=P0^0; //把P0.0賦給RED_A

  • sbit YELLOW_A=P0^1; //把P0.1賦給YELLOW_A

  • sbit GREEN_A=P0^2; //把P0.0賦給GREEN_A

  • sbit RED_B=P0^3; //把P0.0賦給RED_B

  • sbit YELLOW_B=P0^4; //把P0.0賦給YELLOW_B

  • sbit GREEN_B=P0^5; //把P0.0賦給GREEN_B

  • uchar Flash_Count = 0;

  • Operation_Type = 1;

  • void Traffic_lignt()

  • {

  • switch(Operation_Type)

  • {

  • case 1:

  • RED_A=1;YELLOW_A=1;GREEN_A=0;

  • RED_B=0;YELLOW_B=1;GREEN_B=1;

  • DelayMS(2000);

  • Operation_Type = 2;

  • break;

  • case 2:

  • DelayMS(200);

  • YELLOW_A=~YELLOW_A;

  • if(++Flash_Count !=10)

  • return;

  • Flash_Count=0;

  • Operation_Type = 3;

  • break;

  • case 3:

  • RED_A=0;YELLOW_A=1;GREEN_A=1;

  • RED_B=1;YELLOW_B=1;GREEN_B=0;

  • DelayMS(2000);

  • Operation_Type = 4;

  • break;

  • case 4:

  • DelayMS(200);

  • YELLOW_B=~YELLOW_B;

  • if(++Flash_Count !=10)

  • return;

  • Flash_Count=0;

  • Operation_Type = 1;

  • break;

  • }

  • }

  • void main() //主函數

  • {

  • while(1)

  • {

  • Traffic_lignt();

  • }

  • }

實驗現象

電子仿真:模擬交通燈


分享到:


相關文章: