單片機控制的交通燈。仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (28.09 KB, 下載次數: 50)
下載附件
2018-12-4 03:03 上傳
單片機源程序如下:
- #include <REG51.H>
- unsigned char t0,t1; //定義全局變量,用來保存延時時間循環次數
- void delay0_5s1()
- {
- for(t0=0;t0<0x0a;t0++) // 采用全局變量t0作為循環控制變量
- {
- TH1=0x3c; // 設置定時器初值
- TL1=0xb0;
- TR1=1; // 啟動T1
- while(!TF1); // 查詢計數是否溢出,即定時50ms時間到,TF1=1
- TF1=0; // 50ms定時時間到,將定時器溢出標志位TF1清零
- }
- }
- //函數功能:實現0.5秒~128秒延時,延時時間為0.5秒×t
- void delay_t1(unsigned char t)
- {
- for(t1=0;t1<t;t1++) // 采用全局變量t0作為循環控制變量
- delay0_5s1();
- }
- //函數功能:外部中斷0中斷函數,緊急情況處理,當CPU響應外部中斷
- //0的中斷請求時,自動執行該函數,實現兩個方向紅燈同時亮10秒
- void int_0() interrupt 0 // 緊急情況中斷
- {
- unsigned char i,j,k,l,m;
- i=P1; // 保護現場,暫存P1口、t0、t1、TH1、TH0
- j=t0;
- k=t1;
- l=TH1;
- m=TH0;
- P1=0xdb; // 兩個方向都是紅燈
- delay_t1(20); // 延時10秒
- P1=i; // 恢復現場,恢復進入中斷前P1口、t0、t1、TH1、TH0
- t0=j;
- t1=k;
- TH1=l;
- TH0=m;
- }
- //函數功能:外部中斷1中斷函數,特殊情況處理,當CPU響應外部中斷
- //1的中斷請求時,自動執行該函數,實現A道放行5秒
- void int_1() interrupt 2 // 特殊情況中斷
- {
- unsigned char i,j,k,l,m;
- EA=0; //關中斷
- i=P1; // 保護現場,暫存P1口、t0、t1、TH1、TH0
- j=t0;
- k=t1;
- l=TH1;
- m=TH0;
- EA=1; // 開中斷
- P1=0xf3; // A道放行
- delay_t1(10); // 延時5秒
- EA=0; // 關中斷
- P1=i; // 恢復現場,恢復進入中斷前P1口、t0、t1、TH1、TH0
- t0=j;
- t1=k;
- TH1=l;
- TH0=m;
- EA=1; //開中斷
- }
- void main() //主函數
- {
- unsigned char k;
- TMOD=0x10; // T1工作在方式1
- EA=1; // 開放總中斷允許位
- EX0=1; // 開外部中斷0中斷允許位
- IT0=1; // 設置外部中斷0為下降沿觸發
- EX1=1; // 開外部中斷1中斷允許位
- IT1=1; // 設置外部中斷1為下降沿觸發
- while(1) {
- P1=0xf3; // A綠燈,B紅燈,延時5秒
- delay_t1(10);
- for(k=0;k<3;k++) // A綠燈閃爍3次
- {
- P1=0xf3;
- delay0_5s1(); // 延時0.5秒
- P1=0xfb;
- delay0_5s1(); // 延時0.5秒
- }
- P1=0xeb; // A黃燈,B紅燈,延時2秒
- delay_t1(4);
- P1=0xde; // A紅燈,B綠燈,延時5秒
- delay_t1(10);
- for(k=0;k<3;k++) // B綠燈閃爍3次
- {
- P1=0xde;
- delay0_5s1(); // 延時0.5秒
- P1=0xdf;
- delay0_5s1(); // 延時0.5秒
- }
- P1=0xdd; // A紅燈,B黃燈,延時2秒
- delay_t1(4);
- }
- }
復制代碼
所有資料51hei提供下載:
四組交通燈.rar
(66.71 KB, 下載次數: 24)
2018-12-3 20:52 上傳
點擊文件名下載附件
交通燈 下載積分: 黑幣 -5
|