原创 交通灯-双向六车道

2008-6-1 23:38 3904 6 7 分类: MCU/ 嵌入式

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


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


点击开大图


 


点击下载

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2013-3-25 11:25

大哥 附件用不了啊 求详解啊

相关推荐阅读
用户124183 2010-10-04 18:48
[Craftor原创]基于Verilog的I2C总线驱动设计
摘要:此版本的设计中,笔者将协议里对总线的操作细分为4个,即起始(Start)、写(Write)、读(Read)、停止(Stop),并给对应的操作编码:起始(1000)、写(0100)、读(0010)...
用户124183 2010-09-03 10:42
4/8/16/32/64位乘法器的设计
4/8/16/32/64位乘法器的设计,单个时钟周期运算出结果。思路如下:4位乘法器a,b输入,y输出。使用case语句,对于输入a,y输出是b输入的16种可能。单个周期内可以输出结果。8位乘法器a,...
用户124183 2010-09-02 15:32
除法器的设计与仿真(Verilog&VHDL)
最近在做算法,要用到除法。本来想使用除法器的IP核,但发现Xilinx的除法器IP核是流水线的,如果是批量的数做除法,自然是很快,也很方便。而我的算法中需要将前一次的结果算出来之后,再到下一次运算里做...
用户124183 2010-08-06 09:58
Modelsim中添加Xilinx仿真库
不少朋友在刚接触Xilinx的FPGA时,对仿真库的编译和使用不是很了解,而官方的说明也不是很详细,而且看起来有些费劲,这里Craftor给出在Modelsim中编译和使用Xilinx库的详细教程,P...
用户124183 2010-08-02 22:51
周末写了个51单片机软核
为了弥补这段时间的罪过,这个周末决定做宅男,写程序。其实酝酿51软核已经有好几个月时间了,之前是因为在一个地方卡住了,中间停止了。上周五上班的时候突然来了灵感,一下子想通了,呵呵代码不长,1000多行...
用户124183 2010-06-19 15:41
深入研究Modelsim之使用do文件仿真(1)
Modelsim的仿真功能非常强大,本文介绍使用do脚本仿真单个Verilog或者VHDL文件的操作过程,希望对大家有用!以带时钟和复位信号的计数器为例,代码如下:module counter (  ...
我要评论
1
6
关闭 站长推荐上一条 /3 下一条