這是大二的時候做的單片機期末設(shè)計,在交通繁忙的時候可以調(diào)整通行時間
所有資料打包下載:
簡易交通燈設(shè)計.rar
(134.96 KB, 下載次數(shù): 106)
2016-10-18 15:58 上傳
點擊文件名下載附件
下面是proteus仿真原理圖:
可以看得出功能十分全面
下面是單片機源碼:
- #include <REGX52.H>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Time_Show_LED2=P2^1;// 繁忙狀態(tài)數(shù)碼管高位控制
- sbit Time_Show_LED1=P2^0;// 低位控制
- sbit EW_LED2=P2^3; //東西方向數(shù)碼管高位控制
- sbit EW_LED1=P2^2; // 低位控制
- sbit SN_LED2=P2^5; //南北方向數(shù)碼管高位控制
- sbit SN_LED1=P2^4; // 低位控制
- sbit SN_Yellow=P1^6;//南北黃燈
- sbit EW_Yellow=P1^2;//東西黃燈
- sbit EW_Red=P1^3;//東西紅燈
- sbit SN_Red=P1^7;//南北紅燈
- sbit EW_ManGreen=P3^0;//東西人行道綠燈
- sbit SN_ManGreen=P3^1;//南北人行道綠燈
- sbit SN_GREEN_A1=P1^5;//南北直行和右拐綠燈
- sbit EW_RED_B=P1^3;//東西紅燈
- sbit SN_GREEN_A2=P1^4;//南北左拐綠燈
- sbit EW_GREEN_B1=P1^1;//東西直行右拐綠燈
- sbit SN_RED_A=P1^7;//南北紅燈
- sbit EW_GREEN_B2=P1^0;//東西左拐綠燈
-
- sbit Busy_LED=P2^7;//交通繁忙指示燈
- sbit Busy_Btton=P3^6;//交通繁忙按鍵
- sbit Add_Button=P3^3;//時間加
- sbit Reduces_Button=P3^4;//時間減
- bit Flag_SN_Yellow; //南北黃燈標志位
- bit Flag_EW_Yellow;//東西黃燈標志位
- char Time_EW;//東西方向倒計時單元
- char Time_SN;//南北方向倒計時單元
- uchar operation_type=1; //設(shè)置T0中斷服務程序初始值為1
- uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化賦值,正常模式
- uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的變量
- uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰數(shù)碼管0~9段碼
- void Delay(unsigned char cnt)
- {
- unsigned int i,t;
- for(i=0;i<cnt;i++)
- {
- t=115;
- while(--t);
- }
- }
- void Display(void)
- {
- char h,l;
- h=Time_EW/10;
- l=Time_EW%10;
- P0=table[l];
- EW_LED1=1;
- Delay(1);
- EW_LED1=0;
- P0=table[h];
- EW_LED2=1;
- Delay(1);
- EW_LED2=0;
- h=Time_SN/10;
- l=Time_SN%10;
- P0=table[l];
- SN_LED1=1;
- Delay(1);
- SN_LED1=0;
- P0=table[h];
- SN_LED2=1;
- Delay(1);
- SN_LED2=0;
-
- h= EW1/10;
- l= EW1%10;
- P0=table[l];
- Time_Show_LED1=1;
- Delay(2);
- Time_Show_LED1=0;
- P0=table[h];
- Time_Show_LED2=1;
- Delay(2);
- Time_Show_LED2=0;
- }
- /*********外部中斷***********/
- void EXINT0(void)interrupt 0 using 1
- {
- EX0=0; //關(guān)中斷
- if(Add_Button==0) //時間加
- {
- EW1+=5;
- SN1+=5;
- if(EW1>=100)
- {
- EW1=99;
- SN1=79;
- }
- }
- if(Reduces_Button==0) //時間減
- {
- EW1-=5;
- SN1-=5;
- if(EW1<=40)
- {
- EW1=40;
- SN1=20;
- }
-
- }
- if(Busy_Btton==0) //測試按鍵是否按下,按下為繁忙狀態(tài)
- {
- EW1=45;
- SN1=30;
- EWL1=14;
- SNL1=14;
-
- Busy_LED=0;//開繁忙信號燈
-
- }
- EX0=1;//開中斷
- }
-
- /*********定時中斷***********/
- void T0_INT() interrupt 1
- {
- static uchar count;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
-
- if(count==10)
- {
- if(Flag_SN_Yellow==0) //測試南北黃燈標志位
- {
- SN_Yellow=~SN_Yellow;
- }
- if(Flag_EW_Yellow==0) //測試東西黃燈標志位
- {
- EW_Yellow=~EW_Yellow;
- }
- }
- if(count==20)
- {
- Time_EW--;
- Time_SN--;
- if(Flag_SN_Yellow==0)//測試南北黃燈標志位
- {
- SN_Yellow=~SN_Yellow;
- }
- if(Flag_EW_Yellow==0)//測試東西黃燈標志位
- {
- EW_Yellow=~EW_Yellow;
- }
- count=0;
- }
-
- }
- void zhuangtai()
- {
- switch(operation_type)
- {
- /**s1狀態(tài)****/
- case 1: EW_ManGreen=1; //EW人行道禁止
- SN_ManGreen=0;//SN人行道通行
- Flag_EW_Yellow=1; //EW關(guān)黃燈顯示信號
- Time_EW=EW;
- Time_SN=SN;
- while(Time_SN>=5)
- {
- SN_GREEN_A1=0; //SN通行,EW紅燈
- EW_RED_B=0;
- SN_Yellow=1;
- SN_RED_A=1;
- Display();
- }
- operation_type=2;
- break;
-
- /***s2狀態(tài)***/
- case 2: P1=0xff; //關(guān)掉所有燈
- while(Time_SN>=0)
- {
- Flag_SN_Yellow=0; //SN開黃燈信號位
- EW_Red=0; //SN黃燈亮,等待左拐信號,EW紅燈
- Display();
- }
- operation_type=3;
- break;
-
- /***s3狀態(tài)***/
- case 3: Flag_SN_Yellow=1; //SN關(guān)黃燈顯示信號
- Time_SN=SNL;
- while(Time_SN>=5)
- {
- SN_GREEN_A2=0;//SN左拐綠燈亮,EW紅燈
- EW_RED_B=0;
- SN_Yellow=1;
- Display();
- }
- operation_type=4;
- break;
- /***s4狀態(tài)***/
- case 4: P1=0xff;
- while(Time_SN>=0)
- {
- Flag_SN_Yellow=0; //SN開黃燈信號位
- EW_Red=0; //SN黃燈亮,等待停止信號,EW紅燈
-
- Display();
- }
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- operation_type=5;
- break;
- /***s5狀態(tài)***/
- case 5: EW_ManGreen=~EW_ManGreen;//EW人行道通行
- SN_ManGreen=~SN_ManGreen;//SN人行道禁止
- Flag_SN_Yellow=1; //SN關(guān)黃燈顯示信號
- Time_EW=SN;
- Time_SN=EW;
- while(Time_EW>=5)
- {
- EW_GREEN_B1=0; //EW通行,SN紅燈
- SN_RED_A=0;
- EW_Yellow=1;
- EW_RED_B=1;
- Display();
- }
- operation_type=6;
- break;
-
- /***s6狀態(tài)***/
- case 6: P1=0xff;
- while(Time_EW>=0)
- {
- Flag_EW_Yellow=0;//EW開黃燈信號位
- SN_Red=0;//EW黃燈亮,等待左拐信號,SN紅燈
- Display();
- }
- operation_type=7;
- break;
-
- /***s7狀態(tài)***/
- case 7: Flag_EW_Yellow=1; //EW關(guān)黃燈顯示信號
- Time_EW=EWL;
- while(Time_EW>=5)
- {
- EW_GREEN_B2=0 ;//EW左拐綠燈亮,SN紅燈
- EW_RED_B=1;
- SN_RED_A=0;
- EW_Yellow=1;
- Display();
- }
- operation_type=8;
- break;
-
-
-
- /***s8狀態(tài)***/
- case 8: P1=0xff;
- while(Time_EW>=0)
- {
- Flag_EW_Yellow=0; //EN開黃燈信號位
- SN_Red=0;//EW黃燈亮,等待停止信號,SN紅燈
- Display();
- }
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- operation_type=1;
- break;
- }
- }
- void main()
- {
- IT0=1;
- TMOD=0x01; //定時器T0工作于方式1
- TH0=(65536-50000)/256; //定時賦初值
- TL0=(65536-50000)%256;
- EA=1; //開總中斷
- ET0=1; //開定時器中斷
- EX0=1; //開外部INTO中斷
- TR0=1; //啟動定時器
- while(1)
- {
- zhuangtai();
- }
- }
復制代碼
|