利用51單片機對十字路口交通燈進行設計,東西方向和南北方向都為三十秒,分別設計三個按鍵進行時間控制。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
捕獲.PNG (90.68 KB, 下載次數: 76)
下載附件
2018-12-17 11:30 上傳
單片機源程序如下:
- #include<reg52.h>
- #include"delay.h"
- /*************************函數聲明**************************/
- void show(); //顯示函數
- void init();
- /************************端口定義**************************/
- sbit k1=P3^7; // K1 時間加
- sbit k2=P3^6; // K2 時間減
- sbit k3=P3^5; // K3 暫停,確認
- sbit led_red_a=P2^0; //
- sbit led_red_b=P2^2; //
- sbit led_green_a=P2^1; //
- sbit led_green_b=P2^3; //
- sbit WX_a_1=P2^4; //
- sbit WX_a_2=P2^5; //
- sbit WX_b_1=P2^6; //
- sbit WX_b_2=P2^7; //
- /************************變量定義**************************/
- char temp1 = 30; // 初始紅綠燈時間
- uchar temp2; //產生1秒 計數變量
- uchar temp4=30; //存儲時間更改變量
- uchar flag1=0; //a,b,兩個方向紅路燈切換標志
- uchar flag2=0; //暫停標志
- /**********************數組定義***************************/
- uchar tab_dx[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰,不帶小數點
- /************************顯示**************************/
- void show()
- {
-
- if(flag1==0) //a 紅燈亮 綠燈滅 b 紅燈滅 綠燈亮
- {
- led_red_a=0;
- led_red_b=1;
- led_green_a=1;
- led_green_b=0;
- }
- else //a 紅燈滅 綠燈亮 b 紅燈亮 綠燈滅
- {
- led_red_a=1;
- led_red_b=0;
- led_green_a=0;
- led_green_b=1;
- }
-
- if(flag1==0)
- {
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=1;
- WX_b_2=0;
-
- P0=tab_dx[temp1%10];
- delayxms(3);
- P0=0x00;
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=0;
- WX_b_2=1;
-
- P0=tab_dx[temp1/10];
- delayxms(3);
- P0=0x00;
- }
- else
- {
- WX_a_1=1;
- WX_a_2=0;
- WX_b_1=1;
- WX_b_2=1;
-
- P0=tab_dx[temp1%10];
- delayxms(3);
- P0=0x00;
- WX_a_1=0;
- WX_a_2=1;
- WX_b_1=1;
- WX_b_2=1;
-
- P0=tab_dx[temp1/10];
- delayxms(3);
- P0=0x00;
- }
- }
- /************************顯示1**************************/
- void show_1()
- {
- static uchar kk;
- kk++;
- led_red_a=0;
- led_red_b=0;
- led_green_a=1;
- led_green_b=1;
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=1;
- WX_b_2=0;
-
- P0=tab_dx[temp4%10];
- delayxms(kk/126);
- P0=0x00;
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=0;
- WX_b_2=1;
-
- P0=tab_dx[temp4/10];
- delayxms(kk/126);
- P0=0x00;
-
- WX_a_1=1;
- WX_a_2=0;
- WX_b_1=1;
- WX_b_2=1;
-
- P0=tab_dx[temp4%10];
- delayxms(kk/126);
- P0=0x00;
- WX_a_1=0;
- WX_a_2=1;
- WX_b_1=1;
- WX_b_2=1;
-
- P0=tab_dx[temp4/10];
- delayxms(kk/126);
- P0=0x00;
- }
- /************************按鍵檢測**************************/
- void key()
- {
- if(k1==0) //時間加
- {
- delayxms(10);
- while(k1==0) ;
- temp4++;
- temp1=temp4;
- if(temp4==91)
- {
- temp4=0;
- }
- }
- if(k2==0) // 時間減
- {
- delayxms(10);
- while(k2==0);
- temp4--;
- temp1=temp4;
- if(temp4==-1)
- {
- temp4=90;
- }
- }
- if(k3==0) // 暫停,確認
- {
- delayxms(10);
- while(k3==0);
- flag2=~flag2;
- }
- }
- /************************中斷初始化**************************/
- void init()
- {
- TMOD=0x11; //設置定時器0,1為工作方式1
- TH0=(65536-50000)/256; //初值
- TL0=(65536-50000)%256;
- // TH1=(65536-50000)/256; //初值
- // TL1=(65536-50000)%256;
- EA=1; //打開中斷總開關
- ET0=1; //開定時器0中斷
- // ET1=1; //開定時器1中斷
- TR0=1; //啟動定時器0
- EX0 = 1; /* 允許外部中斷0中斷 */
- PX0 = 1; /* 外部中斷0為高優先級 */
- }
- /************************************************************
- 主函數
- *************************************************************/
- void main()
- {
- init();
- while(1)
- {
- key();
- if(flag2==0)
- {
- TR0=1;
- show(); //顯示函數
- }
- else
- {
- TR0=0;
- show_1(); //顯示函數
- }
- }
- }
- /* ----------------- t0中斷函數 ----------------- */
- void time1() interrupt 1
- {
- TH0=(65536-50000)/256; //
- TL0=(65536-50000)%256;
- temp2++;
- if(temp2 == 20)
- {
- temp2=0;
- temp1=temp1-1;
- if(temp1==-1)
- {
- temp1=temp4;
- flag1=~flag1;
- }
- }
-
- }
- /* ----------------- 外部中斷函數 ----------------- */
- int0_srv( ) interrupt 0 using 2
- {
- uchar a,b,c,d;
- int i;
- for (i = 0;i<10000;i++);
- if ( INT0 ==0)
- {
- a=led_red_a; //保留指示燈狀態
- b=led_red_b;
- c=led_green_a;
- d=led_green_b;
- while(INT0==0)
- {
- led_red_a=0;
- led_red_b=0;
- led_green_a=1;
- led_green_b=1; /* 使兩邊亮起紅燈 */
- if(flag1==0)
- {
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=1;
- WX_b_2=0;
-
- P0=tab_dx[temp1%10];
- delayxms(3);
- P0=0x00;
- WX_a_1=1;
- WX_a_2=1;
- WX_b_1=0;
- WX_b_2=1;
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
交通燈.zip
(88.14 KB, 下載次數: 56)
2018-12-17 11:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|