|
單片機(jī)交通燈 含代碼和仿真
單片機(jī)源程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- /*****定義控制位**********************/
- sbit Time_Show_LED2=P2^5; //Time_Show_LED2控制位
- sbit Time_Show_LED1=P2^4; //Time_Show_LED1控制位
- sbit EW_LED2=P2^3; //EW_LED2控制位
- sbit EW_LED1=P2^2; //EW_LED1控制位
- sbit SN_LED2=P2^1; //SN_LED2控制位
- sbit SN_LED1=P2^0; //SN_LED1控制位
- sbit SN_Yellow=P1^6; //SN黃燈
- sbit EW_Yellow=P1^2; //EW黃燈
- sbit EW_Red=P1^3; //EW紅燈
- sbit SN_Red=P1^7; //SN紅燈
- sbit SNleft_led=P2^7; //南北左拐指示燈
- sbit SNright_led=P2^6; //南北右拐指示燈
- sbit EWleft_led=P3^1; //東西左拐指示燈
- sbit EWright_led=P3^0; //東西右拐指示燈
-
- sbit Add_Button=P3^4; //時(shí)間加
- sbit Reduces_Button=P3^5; //時(shí)間減
- sbit QZ_EW_Btton=P3^6; //EW方向強(qiáng)制直行按鍵
- sbit QZ_SN_Btton=P3^7; //SN方向強(qiáng)制直行按鍵
- bit Flag_SN_Yellow; //SN黃燈標(biāo)志位
- bit Flag_EW_Yellow; //EW黃燈標(biāo)志位
- bit QZ_EW; //EW強(qiáng)制通行標(biāo)志
- bit QZ_SN; //SN強(qiáng)制通行標(biāo)志
- char Time_EW; //東西方向倒計(jì)時(shí)單元
- char Time_SN; //南北方向倒計(jì)時(shí)單元
- 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};
- //0~~~~9段選碼
- uchar code LIGHT[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};
- //交通信號(hào)燈控制代碼
- /*****延時(shí)函數(shù)**********************/
- void Delay(uchar a)
- {
-
- while(a--);
- }
- /*****顯示函數(shù),顯示倒計(jì)時(shí)的值**********************/
- void Display(void)
- {
- char h,l;
- h=Time_EW/10; //EW方向計(jì)時(shí)的十位數(shù)
- l=Time_EW%10; //EW方向計(jì)時(shí)的個(gè)位數(shù)
- P0=table[l]; //顯示EW計(jì)時(shí)時(shí)間的低位
- EW_LED2=1;
- Delay(2);
- EW_LED2=0;
- P0=table[h]; //顯示EW計(jì)時(shí)時(shí)間的高位
- EW_LED1=1;
- Delay(2);
- EW_LED1=0;
- h=Time_SN/10; //SN方向計(jì)時(shí)的十位數(shù)
- l=Time_SN%10; //SN方向計(jì)時(shí)的個(gè)位數(shù)
- P0=table[l]; //顯示SN計(jì)時(shí)時(shí)間的低位
- SN_LED2=1;
- Delay(2);
- SN_LED2=0;
- P0=table[h]; //顯示SN計(jì)時(shí)時(shí)間的高位
- SN_LED1=1;
- Delay(2);
- SN_LED1=0;
-
- h= EW1/10; //直行時(shí)間的十位
- l= EW1%10; //直行時(shí)間的個(gè)位
- P0=table[l]; //時(shí)間的個(gè)位顯示
- Time_Show_LED1=1;
- Delay(2);
- Time_Show_LED1=0;
- P0=table[h]; //時(shí)間的十位顯示
- Time_Show_LED2=1;
- Delay(2);
- Time_Show_LED2=0;
- }
- /*****外部中斷0,用來(lái)增加或減少通行時(shí)間值**********************/
- void EXINT0(void) interrupt 0
- {
- EA = 0; //關(guān)中斷
- if(Add_Button==0) //時(shí)間加
- {
- EW1+=5; //通行時(shí)間加5s
- SN1+=5;
- if(EW1>=100) //通行時(shí)間不得大于100s,80s
- {
- EW1=99;
- SN1=79;
- }
- }
- if(Reduces_Button==0) //時(shí)間減
- {
- EW1-=5; //通行時(shí)間減5s
- SN1-=5;
- if(EW1<=40) //通行時(shí)間不得小于40s,20s
- {
- EW1=40;
- SN1=20;
- }
- }
- EA = 1; //開(kāi)中斷
- }
-
- /*****外部中斷2,用來(lái)強(qiáng)制通行**********************/
- void EXINT1(void) interrupt 2
- {
- EA = 0;
- if(QZ_EW_Btton==0) //EW方向強(qiáng)制通行按鍵是否按下
- {
- Delay(2);
- if(QZ_EW_Btton==0)
- {
- QZ_EW = ~QZ_EW; //
- QZ_SN = 0;
- }
- }
- if(QZ_SN_Btton==0) //測(cè)試按鍵是否按下,按下為特殊狀態(tài)
- {
- Delay(2);
- if(QZ_SN_Btton==0)
- {
- QZ_SN = ~QZ_SN;
- QZ_EW = 0;
- }
- }
- EA = 1;
- }
- /*****定時(shí)器中斷,用來(lái)為倒計(jì)時(shí)單元提供時(shí)鐘信號(hào)**********************/
- void timer0(void)interrupt 1
- {
- static uchar count;
- TH0=(65536-20000)/256;
- TL0=(65536-20000)%256;
- count++;
-
- if(count==10)
- {
- if(Flag_SN_Yellow==1) //測(cè)試SN黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1) //測(cè)試EW黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- }
- if(count==20)
- {
- Time_EW--;
- Time_SN--;
- if(Flag_SN_Yellow==1) //測(cè)試SN黃燈標(biāo)志位
- {SN_Yellow=~SN_Yellow;}
- if(Flag_EW_Yellow==1) //測(cè)試EW黃燈標(biāo)志位
- {EW_Yellow=~EW_Yellow;}
- count=0;
- }
- }
- /*****主函數(shù)**********************/
- void main(void)
- {
- QZ_EW = 0;
- QZ_SN = 0;
- IT0=1; //INT0負(fù)跳變觸發(fā)
- IT1=1; //INT0負(fù)跳變觸發(fā)
- TMOD=0x01; //定時(shí)器工作于方式1
- TH0=(65536-50000)/256; //定時(shí)器賦初值
- TL0=(65536-50000)%256;
- EA=1; //CPU開(kāi)中斷總允許
- ET0=1; //開(kāi)定時(shí)中斷
- EX0=1; //開(kāi)外部INTO中斷
- EX1=1; //開(kāi)外部INT1中斷
- TR0=1; //啟動(dòng)定時(shí)
- while(1)
- {
- /*******SN通行,EW紅燈*** ***************/
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號(hào)
- Time_EW=EW;
- Time_SN=SN;
- while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[0]; //SN通行,EW紅燈
- SNleft_led=0; SNright_led=0;
- EWleft_led=0; EWright_led=0;
- Display();}
- /*******SN黃燈亮,等待左拐信號(hào),EW紅燈***/
- P1=0x00;
- while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
- {Flag_SN_Yellow=1; //SN開(kāi)黃燈信號(hào)位
- EW_Red=1; //SN黃燈亮,等待左拐信號(hào),EW紅燈
- SNleft_led=0; SNright_led=0;
- EWleft_led=0; EWright_led=0;
- Display();
- }
- /*******SN左拐綠燈亮,EW紅燈*************/
- Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
- Time_SN=SNL;
- while(Time_SN>=15&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[2];
- SNleft_led=1; SNright_led=0;
- EWleft_led=0; EWright_led=0; //SN左拐綠燈亮,右拐紅燈亮,EW紅燈
- Display();}
- /*******SN黃燈亮,等待右拐信號(hào),EW紅燈***/
- P1=0x00;
- while(Time_SN>=10&QZ_EW == 0&QZ_SN == 0)
- {Flag_SN_Yellow=1; //SN開(kāi)黃燈信號(hào)位
- EW_Red=1; //SN黃燈亮,等待右拐信號(hào),EW紅燈
- SNleft_led=1; SNright_led=0;
- EWleft_led=0; EWright_led=0; //SN左拐綠燈亮,右拐紅燈亮,EW紅燈
- Display();}
- /*******SN右拐綠燈亮,EW紅燈*************/
-
- while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[2];
- SNleft_led=0; SNright_led=1;
- EWleft_led=0; EWright_led=0; //SN右拐綠燈亮,左拐紅燈亮,EW紅燈
- Display();}
- /*******SN黃燈亮,等待停止信號(hào),EW紅燈******/
- P1=0x00;
- while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)
- {Flag_SN_Yellow=1; //SN開(kāi)黃燈信號(hào)位
- EW_Red=1; //SN黃燈亮,等待停止信號(hào),EW紅燈
- SNleft_led=0; SNright_led=1;
- EWleft_led=0; EWright_led=0; //SN右拐綠燈亮,左拐紅燈亮,EW紅燈
- Display();}
- /***********賦值**********/
- EW=EW1;
- SN=SN1;
- EWL=EWL1;
- SNL=SNL1;
- /*******EW通行,SN紅燈******************/
- Flag_SN_Yellow=0; //SN關(guān)黃燈顯示信號(hào)
- Time_EW=SN;
- Time_SN=EW;
- while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[4]; //EW通行,SN紅燈
- SNleft_led=0; SNright_led=0;
- EWleft_led=0; EWright_led=0;
- Display();}
- /*****EW黃燈亮,等待左拐信號(hào),SN紅燈****/
- P1=0X00;
- while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)
- {Flag_EW_Yellow=1; //EW開(kāi)黃燈信號(hào)位
- SN_Red=1; //EW黃燈亮,等待左拐信號(hào),SN紅燈
- SNleft_led=0; SNright_led=0;
- EWleft_led=0; EWright_led=0;
- Display();}
- /*******EW左拐綠燈亮,SN紅燈**********/
- Flag_EW_Yellow=0; //EW關(guān)黃燈顯示信號(hào)
- Time_EW=EWL;
- while(Time_EW>=15&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[6];
- SNleft_led=0; SNright_led=0;
- EWleft_led=1; EWright_led=0; //EW左拐綠燈亮,右拐紅燈亮,SN紅燈
- Display();}
-
- /*****EW黃燈亮,等待右拐信號(hào),SN紅燈****/
- P1=0X00;
- while(Time_EW>=10&QZ_EW == 0&QZ_SN == 0)
- {Flag_EW_Yellow=1; //EW開(kāi)黃燈信號(hào)位
- SN_Red=1; //EW黃燈亮,等待右拐信號(hào),SN紅燈
- SNleft_led=0; SNright_led=0;
- EWleft_led=1; EWright_led=0; //EW左拐綠燈亮,右拐紅燈亮,SN紅燈
- Display();}
- /*******EW右拐綠燈亮,SN紅燈**********/
-
- while(Time_EW>=5&QZ_EW == 0&QZ_SN == 0)
- {P1=LIGHT[6];
- SNleft_led=0; SNright_led=0;
- EWleft_led=0; EWright_led=1; //EW右拐綠燈亮,左拐紅燈亮,SN紅燈
- Display();}
- /****EW黃燈亮,等待停止信號(hào),SN紅燈***/
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
交通燈再修改.rar
(89.4 KB, 下載次數(shù): 68)
2018-7-9 19:10 上傳
點(diǎn)擊文件名下載附件
基于單片機(jī)的交通燈
|
評(píng)分
-
查看全部評(píng)分
|