EDN首页   博客首页

日志档案

发表于 2008-6-1 23:38:21

2

标签: 单片机  交通灯  Proteus  Keil  仿真  

交通灯-双向六车道

以前做一个交通灯的仿真,但是比较简单。现在这个是双向六车道的,也不太难,但感觉还不错吧!呵呵

(附件有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;  //方向改变
  }
}

点击开大图

 

点击下载

系统分类: 单片机   |   用户分类: 仿真(Proteus+Keil)   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(273)    回复(0)  

投一票您将和博主都有获奖机会!