以前做一个交通灯的仿真,但是比较简单。现在这个是双向六车道的,也不太难,但感觉还不错吧!呵呵
(附件有PROTEUS的仿真图)
KEIL中的C代码如下:
//交通灯 双向六车道 By Craftor
#include
#include
unsigned char num[40]={ 1,1,1,1,
1,1,1,0,
1,1,0,1,
1,1,0,0,
1,0,1,1,
1,0,1,0,
1,0,0,1,
1,0,0,0,
0,1,1,1,
0,1,1,0,}; //数字0~9 共阴
void delay10ms(void) //延时10ms
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void main()
{
unsigned char i,j;
unsigned char direction="0";
while(1)
{
for(i=20;i>0;i--)//倒计时20秒
{
switch(direction)
{
case 0: //南北主方向
{
if(i>10) //南北直行+右拐
{
P0_0=1; P2_0=0;
P0_1=1; P2_1=0;
P0_2=0; P2_2=0;
P0_3=0; P2_3=1;
P0_4=1; P2_4=0;
P0_5=1; P2_5=0;
P0_6=0; P2_6=1;
P0_7=1; P2_7=0;
if(i<=10+3) P0_7=0; //三秒内右拐黄灯亮
}
else //南北直行+左拐
{
P0_0=1; P2_0=1;
P0_1=1; P2_1=0;
P0_2=0; P2_2=0;
P0_3=1; P2_3=0;
P0_4=0; P2_4=0;
P0_5=0; P2_5=1;
P0_6=1; P2_6=1;
P0_7=1; P2_7=0;
if(i<=3) P0_1=0; //三秒内左拐黄灯亮
}
break;
}
case 1: //东西主方向
{
if(i>10) //东西直行+右拐
{
P0_0=1; P2_0=0;
P0_1=1; P2_1=0;
P0_2=1; P2_2=1;
P0_3=0; P2_3=1;
P0_4=1; P2_4=0;
P0_5=1; P2_5=0;
P0_6=0; P2_6=1;
P0_7=1; P2_7=0;
if(i<=10+3) P2_7=1; //三秒内右拐黄灯亮
}
else //东西直行+左拐
{
P0_0=0; P2_0=0;
P0_1=1; P2_1=0;
P0_2=1; P2_2=1;
P0_3=1; P2_3=0;
P0_4=1; P2_4=1;
P0_5=0; P2_5=1;
P0_6=1; P2_6=0;
P0_7=1; P2_7=0;
if(i<=3) P2_1=1; //三秒内左拐黄灯亮
}
break;
}
}
P1_0=num[(i%10)*4+0]; //两位数码数字显示倒计时
P1_1=num[(i%10)*4+1];
P1_2=num[(i%10)*4+2];
P1_3=num[(i%10)*4+3];
P1_4=num[(i/10)*4+0];
P1_5=num[(i/10)*4+1];
P1_6=num[(i/10)*4+2];
P1_7=num[(i/10)*4+3];
for(j=0;j<100;j++) delay10ms(); //软件延时1秒
}
direction=(direction+1)%2; //方向改变
}
}
用户377235 2013-3-25 11:25
大哥 附件用不了啊 求详解啊