单片机交通灯程序带车流量Word格式文档下载.docx
《单片机交通灯程序带车流量Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机交通灯程序带车流量Word格式文档下载.docx(14页珍藏版)》请在冰点文库上搜索。
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
voiddelayms(uintxms);
intDX_Num=23,NB_Num=10;
//数码管显示数字
intnumt0;
//定时器计时
intJS_NB_Num,JS_DX_Num;
intNB_Num_GREEN,DX_Num_GREEN;
intXZ=0;
//按键2选择
intBJ=0;
//按键1选择
intJS=0;
//按键5选择
intTemp1=1;
//中断是否
inttemp=1;
//数码管是否循环
//intflag=0;
intDX_Flag=0,NB_Flag=1;
//红绿灯状态
intDX_RED=33,DX_GREEN=15,DX_YELLOW=3;
//红绿灯时间
intNB_RED=38,NB_GREEN=10,NB_YELLOW=3;
intNB_BLUE=10,DX_BLUE=10;
//左转时间
voiddisplay(ucharnum1dis,ucharnum2dis);
voidkeyscan();
voidinit()//中断红绿灯初始化函数
{
Beer=1;
//蜂鸣器关断
TMOD=0x01;
//中断程序初始化
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
//EX1=1;
//开外部中断1
//IT1=1;
//外部中断下降沿触发
//EX0=1;
//开外部中断0
//IT0=1;
DX_Red=0;
//红绿灯初始化
DX_Yellow=1;
DX_Green=1;
NB_Red=1;
NB_Yellow=1;
NB_Green=0;
}
voidmain()//主函数
init();
while
(1)
{
keyscan();
if(temp==1)
{
display(NB_Num,DX_Num);
}
}
voiddisplay(ucharnum1dis,ucharnum2dis)//数码管显示函数
{
intNB_Shi,NB_Ge,DX_Shi,DX_Ge;
NB_Shi=num1dis/10;
NB_Ge=num1dis%10;
DX_Shi=num2dis/10;
DX_Ge=num2dis%10;
P0=table[NB_Shi];
//送十位段选数据
P2=0xfe;
delayms(3);
P0=table[NB_Ge];
P2=0xfd;
P0=table[DX_Shi];
P2=0xfb;
P0=table[DX_Ge];
P2=0xf7;
voidkeyscan()//按键扫描函数
if(key1==0)
{
delayms(10);
if(key1==0)
{
if(BJ==0)
{
BJ=1;
Beer=0;
Temp1=2;
temp=2;
NB_Blue=1;
DX_Blue=1;
DX_Yellow=1;
DX_Green=1;
DX_Red=0;
NB_Yellow=1;
NB_Green=1;
NB_Red=0;
while(!
key1);
}
elseif(BJ==1)
{
Beer=1;
BJ=0;
NB_Red=1;
NB_Green=0;
DX_Num=DX_RED-10;
NB_Num=NB_GREEN;
NB_Flag=1;
DX_Flag=0;
temp=1;
Temp1=1;
}
}
if(key2==0)
if(key2==0)
if(XZ==0)
XZ=1;
EA=0;
DX_Num=DX_RED;
key2);
elseif(XZ==1)
{
DX_Green=0;
DX_Red=1;
XZ=2;
DX_Num=DX_GREEN;
NB_Num=NB_RED;
elseif(XZ==2)
XZ=0;
EA=1;
}
if(key3==0)
if(key3==0)
if(XZ==1)
DX_Num++;
DX_RED++;
NB_Num++;
NB_GREEN++;
key3);
elseif(XZ==2)
DX_Num++;
DX_GREEN++;
NB_RED++;
if(key4==0)
if(key4==0)
DX_Num--;
DX_RED--;
NB_Num--;
NB_GREEN--;
key4);
DX_Num--;
DX_GREEN--;
NB_RED--;
if(key5==0)
if(key5==0)
if(JS==0)
JS=1;
DX_Num=0;
NB_Num=0;
EX1=1;
IT1=1;
EX0=1;
IT0=1;
key5);
elseif(JS==1)
JS=0;
//DX_Green=1;
//DX_Red=0;
if(NB_Num>
5)
{
if(DX_Num>
{
NB_Num_GREEN=NB_GREEN;
DX_Num_GREEN=DX_GREEN;
JS_NB_Num=NB_Num;
JS_DX_Num=DX_Num;
NB_GREEN=JS_NB_Num*(NB_Num_GREEN+DX_Num_GREEN)/(JS_NB_Num+JS_DX_Num);
DX_GREEN=NB_Num_GREEN+DX_Num_GREEN-NB_GREEN;
NB_RED=NB_GREEN+23;
DX_RED=DX_GREEN+23;
}
}
EX1=0;
IT1=0;
EX0=0;
//关外部中断0
IT0=0;
//关外部中断下降沿触发
DX_Num=DX_RED-10;
NB_Num=NB_GREEN;
NB_Flag=1;
DX_Flag=0;
Temp1=1;
temp=1;
voiddelayms(uintxms)//延时函数
uinti,j;
for(i=xms;
i>
0;
i--)//i=xms即延时约xms毫秒
for(j=110;
j>
j--);
voidT0_time()interrupt1
numt0++;
if(BJ==1)
P2=0xff;
if(numt0>
4)
numt0=0;
Beer=~Beer;
if(Temp1==1)
if(numt0>
20)
numt0=0;
NB_Num--;
DX_Num--;
if(NB_Num<
1)
if(NB_Flag==1)
NB_Flag=2;
NB_Num=NB_YELLOW;
NB_Green=1;
NB_Yellow=0;
}
elseif(NB_Flag==2)
NB_Flag=0;
NB_Yellow=1;
NB_Red=0;
NB_Blue=0;
elseif(NB_Flag==0)
NB_Red=1;
NB_Green=0;
DX_Blue=1;
}
if(DX_Num<
if(DX_Flag==0)
DX_Flag=1;
DX_Red=1;
DX_Green=0;
NB_Blue=1;
elseif(DX_Flag==1)
DX_Flag=2;
DX_Num=DX_YELLOW;
DX_Green=1;
DX_Yellow=0;
elseif(DX_Flag==2)
DX_Num=DX_RED;
DX_Red=0;
DX_Blue=0;
voidT1EXT()interrupt2//使用了外部中断1的键盘扫描子函数
EX1=0;
NB_Num++;
}
EX1=1;
voidT0EXT()interrupt0//使用了外部中断1的键盘扫描子函数
EX0=0;
if(JS==1)
{if(numt0>
DX_Num++;
EX0=1;
}