结队作业第一次

#include<reg51.h>
/*********************显示子函数**************************/

void Display()

{

char h,l;

h=Time_EW/10;

l=Time_EW%10;

P2=table[l];

EW_LED2=0;

Delay(2);

EW_LED2=1;

P2=table[h];

EW_LED1=0;

Delay(2);

EW_LED1=1;

h=Time_SN/10;

l=Time_SN%10;

P2=table[l];

SN_LED2=0;

Delay(2);

SN_LED2=1;

P2=table[h];

SN_LED1=0;

Delay(2);

SN_LED1=1;

紧急中断程序,全红灯10s

if(Special_Btton==0) //紧急情况下,全红灯10S

{

uchar i;

for(i=0;i<50;i++) //循环50次

{Flag_SN_Yellow=0;

Flag_EW_Yellow=0;

P1=0xEE;

Delay(200); //延时200ms

}

}

}

/**********************外部0中断服务程序************************/

void EXINT0(void)interrupt 0 using 1

{

EX0=0; //关中断

if(Reduces_Button==0) //时间减

{

EW1-=5;

SN1-=5;

if(EW1<=25)

{

EW1=25;

SN1=15;

}

}

EX0=1;//开中断

}

/**********************外部1中断服务程序************************/

void EXINT1(void)interrupt 2 using 1

{

EX1=0; //关中断

if(Add_Button==0) //时间加

{

EW1+=5;

SN1+=5;

if(EW1>=45)

{

EW1=45;

SN1=35;

}

}

EX1=1;//开中断

}

/**********************T0中断服务程序*******************/

void timer0(void)interrupt 1 using 1

{

static uchar count;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

count++;

if(count==10)

{

if(Flag_SN_Yellow==1) //测试南北黄灯标志位

{SN_Yellow=~SN_Yellow;}

if(Flag_EW_Yellow==1) //测试东西黄灯标志位

{EW_Yellow=~EW_Yellow;}

}

if(count==20)

{

Time_EW--;

Time_SN--;

if(Flag_SN_Yellow==1)//测试南北黄灯标志位

{SN_Yellow=~SN_Yellow;}

if(Flag_EW_Yellow==1)//测试东西黄灯标志位

{EW_Yellow=~EW_Yellow;}

count=0;

}

}

主程序,利用中断调用,将不同的交通灯情况列成s1-s7情况

/*********************主程序开始**********************/

void main(void)

{

IT0=1; //INT0负跳变触发

IT1=1; //INT1负跳变触发

TMOD=0x01; //定时器工作于方式1

TH0=(65536-50000)/256;//定时器赋初值50ms

TL0=(65536-50000)%256;

EA=1; //CPU开中断总允许

ET0=1;//开定时中断

EX0=1;//开外部INTO中断

EX1=1;//开外部INT1中断

TR0=1;//启动定时

Flag_SN_Yellow=0; //SN关黄灯显示信号

Flag_EW_Yellow=0; //EW关黄灯显示信号

Time_EW=TZ;

Time_SN=TZ;

P1=0xFF;

while(Time_SN>=0)

{

EW_Red=0; //全红灯3S 0xEE

SN_Red=0;

Display();

}

while(1)

{ /*******S0状态**********/

Flag_EW_Yellow=0; //EW关黄灯显示信号

Time_EW=EW1;

Time_SN=SN1;

while(Time_SN>=0)

{P1=S[0]; //SN通行,EW红灯 0xBE

Display();}

/*******S1状态**********/

/*P1=0xFF;

while(Time_SN>=0)

{Flag_SN_Yellow=1; //SN开黄灯信号位

EW_Red=0; //SN黄灯亮,等待左拐信号,EW红灯 0xDE

Display();}

/*******S2状态**********/

Flag_SN_Yellow=0; //SN关黄灯显示信号

Time_SN=SNL;

while(Time_SN>=3)

{P1=S[2];//SN左拐绿灯和直行绿灯亮,EW红灯 0x3E

Display();}

/*******S3状态**********/

P1=0xFF;

while(Time_SN>=0)

{Flag_SN_Yellow=1;//SN开黄灯信号位

EW_Red=0; //SN黄灯亮,等待停止信号,EW红灯 0xDE

Display();}

/***********赋值**********/

EW=EW1;

SN=SN1;

EWL=EWL1;

SNL=SNL1;

/*******S4状态**********/

Flag_SN_Yellow=0; //SN关黄灯显示信号

Time_EW=SN;

Time_SN=EW;

while(Time_EW>=0)

{P1=S[4]; //EW通行,SN红灯 0xEB

Display();}

/*******S5状态**********/

/*P1=0XFF;

while(Time_EW>=0)

{Flag_EW_Yellow=1;//EW开黄灯信号位

SN_Red=0;//EW黄灯亮,等待左拐信号,SN红灯 0xED

Display();}

/*******S6状态**********/

Flag_EW_Yellow=0;//EW关黄灯显示信号 0xE3

Time_EW=EWL;

while(Time_EW>=3)

{P1=S[6];//EW左拐绿灯亮,SN红灯

Display();}

/*******S7状态**********/

P1=0xFF;

while(Time_EW>=0)

{Flag_EW_Yellow=1; //EN开黄灯信号位

SN_Red=0;//EW黄灯亮,等待停止信号,SN红灯 0xE7

Display();}

/***********赋值**********/

EW=EW1;

SN=SN1;

EWL=EWL1;

SNL=SNL1;

}

}

猜你喜欢

转载自www.cnblogs.com/wwx0/p/12716698.html