基于Proteus仿真51交通灯毕设Word格式文档下载.doc
《基于Proteus仿真51交通灯毕设Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《基于Proteus仿真51交通灯毕设Word格式文档下载.doc(13页珍藏版)》请在冰豆网上搜索。
uchardatab;
//定时器中断次数
sbitk1=P1^6;
//定义5组开关
sbitk2=P1^7;
sbitk3=P2^7;
sbitk4=P3^0;
sbitk5=P3^1;
sbitYellow_nb=P2^5;
//南北黄灯标志
sbitYellow_dx=P2^2;
//东西黄灯标志
sbitGreen_nb=P2^4;
sbitGreen_dx=P2^1;
sbitRed_nb=P2^6;
sbitRed_dx=P2^3;
sbitBuzz=P3^7;
bitBuzzer_Indicate;
bittime=0;
//灯状态循环标志
bitset=1;
//调时方向切换键标志
ucharcodetable[10]={ //共阴极字型码
0x3f,//--0
0x06,//--1?
0x5b,//--2?
0x4f,//--3
0x66,//--4?
0x6d,//--5
0x7d,//--6
0x07,//--7?
0x7f,//--8
0x6f,//--9//0x00//--NULL
};
//函数的声明部分
voiddelay(intms);
//延时子程序
voidkey();
//按键扫描子程序
voidkey_to1();
//键处理子程序
voidkey_to2();
voidkey_to3();
voiddisplay();
//显示子程序
voidlogo();
//开机LOGO
voidBuzzer();
//主程序
voidmain()
{
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
EX0=1;
EX1=1;
logo();
P2=0Xc3;
//开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;
while
(1)
{
key();
//调用按键扫描程序
display();
//调用显示程序
Buzzer();
}
}
//函数的定义部分
voidkey() //按键扫描子程序
if(k1!
=1)
{
delay(10);
if(k1!
{
while(k1!
{
key_to1();
for(n=0;
n<
40;
n++)
{display();
}
}
}
if(k2!
if(k2!
while(k2!
key_to2();
}
if(k3!
=1)
{
TR0=1;
//启动定时器
Buzzer_Indicate=0;
sec_nb=set_timenb;
//从中断回复,仍显示设置过的数值
sec_dx=set_timedx;
if(time==0)
{P2=0X99;
sec_nb=sec_dx+5;
}
else{P2=0xC3;
sec_dx=sec_nb+5;
}
if(k4!
{
if(k4!
{
while(k4!
=1);
set=!
set;
}
if(k5!
{
delay(10);
if(k5!
{
while(k5!
=1)
key_to3();
}
voiddisplay()//显示子程序
{
buf[1]=sec_dx/10;
//第1位东西秒十位
buf[2]=sec_dx%10;
//第2位东西秒个位
buf[3]=sec_nb/10;
//第3位南北秒十位
buf[0]=sec_nb%10;
//第4位南北秒个位
P1=0xff;
//初始灯为灭的
P0=0x00;
P1=0xfe;
//片选LCD1
P0=table[buf[1]];
delay
(1);
P1=0xff;
P1=0xfd;
//片选LCD2
P0=table[buf[2]];
delay
(1);
P1=0xff;
P1=0Xfb;
//片选LCD3
P0=table[buf[3]];
P1=0xff;
P1=0Xf7;
P0=table[buf[0]];
//片选LCD4
voidtime0(void)interrupt1using1//定时中断子程序
b++;
if(b==19) //定时器中断次数
{ b=0;
sec_dx--;
sec_nb--;
if(sec_nb<
=5&
&
time==0)//东西黄灯闪
{Green_nb=0;
Yellow_nb=!
Yellow_nb;
}
if(sec_dx<
time==1)//南北黄灯闪
{Green_dx=0;
Yellow_dx=!
Yellow_dx;
}
if(sec_dx==0&
sec_nb==5)
sec_dx=5;
if(sec_nb==0&
sec_dx==5)
sec_nb=5;
if(time==0&
sec_nb==0)
{P2=0x99;
time=!
time;
sec_nb=set_timenb;
sec_dx=set_timenb+5;
if(time==1&
sec_dx==0)
{P2=0Xc3;
sec_dx=set_timedx;
sec_nb=set_timedx+5;
}
voidkey_to1() //键盘处理子程序之+
TR0=0;
//关定时器
if(set==0)
set_timenb++;
//南北加1S
else
set_timedx++;
//东西加1S
if(set_timenb==100)
set_timenb=1;
if( set_timedx==100)
set_timedx=1;
//加到100置1
sec_nb=set_timenb;
//设置的数值赋给东西南北
sec_dx=set_timedx;
voidkey_to2() //键盘处理子程序之-
//关定时器
if(set==0)
set_timenb--;
//南北减1S
set_timedx--;
//东西减1S
if(set_timenb==0)
set_timenb=99;
if( set_timedx==0)
set_timedx=99;
//减到1重置99
sec_nb=set_timenb;
voidkey_to3()//键盘处理之紧急车通行
TR0=0;
P2=0Xc9;
sec_dx=00;
sec_nb=00;
Buzzer_Indicate=1;
voidint0(void)interrupt0using1 //只允许东西通行
Buzzer_Indicate=0;
sec_dx=00;
sec_nb=00;
voidint1(void)interrupt2using1 //只允许南北通行
P2=0X99;
voidlogo()//开机的Logo"
----"
{for(n=0;
50;
{
P0=0x40;
P1=0xfe;
delay
(1);
P1=0xfd;
P1=0Xfb;
P1=0Xf7;
P1=0xff;
voidBuzzer()
if(Buzzer_Indicate==1)
Buzz=!
Buzz;
elseBuzz=0;
voiddelay(intms) //延时子程序
uintj,k;
for(j=0;
j<
ms;
j++)
for(k=0;
k<
124;
k++);