原创 自己做的交通灯系统

2008-2-2 14:43 4131 8 10 分类: MCU/ 嵌入式

下图为Proteus的仿真图,有红、绿、黄三灯,带外部中断。


 


点击看大图


 


 


//交通灯,以下为Keil中的代码:
#include
#include
#define UD 1 //定义两个方向,南北 和 东西
#define LR 0
unsigned char STOP="0";
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 StopInt() interrupt 0 //外部中断INT0
{
  STOP = 1;
}
void main()
{
  unsigned char i,j,k;
  unsigned char direction="UD";
  TCON = 0x01;  // INT0 下沿中断
  IE   = 0x81;  // EA =1,  EX0=1
  while(1)
  {
   for(i=20;i>0;i--)  //倒计时
   {
 if(STOP) goto INT0;
 switch(direction)
 {
  case UD:    //如果是南北方向
  {
     if (i>3)
  {  
    P1_0=0;   //南北方向 红灯 1开 0关
   P1_1=0;   //南北方向 黄灯
   P1_2=1;   //南北方向 绿灯
   P1_3=1;   //东西方向 红灯
   P1_4=0;   //东西方向 黄灯
   P1_5=0;   //东西方向 绿灯 
  }
  else    //3秒内黄灯亮
  {
   P1_0=0;
   P1_1=1;
   P1_2=0;
   P1_3=1;
   P1_4=0;
   P1_5=0; 
  }
  break;
  }
  case LR:    //如果是东西方向
  {
     if (i>3)
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;  
    P1_3=0;
   P1_4=0;
   P1_5=1; 
  }
  else
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;
   P1_3=0;
   P1_4=1;
   P1_5=0; 
  }
  break;
  }
 }
 P0_0=num[(i%10)*4+0];   //两位数码的数字显示 南北方向
 P0_1=num[(i%10)*4+1];
 P0_2=num[(i%10)*4+2];
 P0_3=num[(i%10)*4+3];
 P0_4=num[(i/10)*4+0];
 P0_5=num[(i/10)*4+1];
 P0_6=num[(i/10)*4+2];
 P0_7=num[(i/10)*4+3];
 P2_0=num[(i%10)*4+0];   //东西方向
 P2_1=num[(i%10)*4+1];
 P2_2=num[(i%10)*4+2];
 P2_3=num[(i%10)*4+3];
 P2_4=num[(i/10)*4+0];
 P2_5=num[(i/10)*4+1];
 P2_6=num[(i/10)*4+2];
 P2_7=num[(i/10)*4+3];
 for(j=0;j<100;j++) delay10ms();   //软件延时1秒


 INT0:
  if(STOP)
  {
   P1_0=1;
   P1_1=0;
   P1_2=0;
   P1_3=1;
   P1_4=0;
   P1_5=0;
   for(j=10;j>0;j--)
   {
     P0_0=num[(j%10)*4+0];  
   P0_1=num[(j%10)*4+1];
   P0_2=num[(j%10)*4+2];
   P0_3=num[(j%10)*4+3];
   P0_4=num[(j/10)*4+0];
   P0_5=num[(j/10)*4+1];
   P0_6=num[(j/10)*4+2];
   P0_7=num[(j/10)*4+3];
   P2_0=num[(j%10)*4+0];
   P2_1=num[(j%10)*4+1];
   P2_2=num[(j%10)*4+2];
   P2_3=num[(j%10)*4+3];
   P2_4=num[(j/10)*4+0];
   P2_5=num[(j/10)*4+1];
   P2_6=num[(j/10)*4+2];
   P2_7=num[(j/10)*4+3];
   for(k=0;k<100;k++) delay10ms();
   }
   STOP="0";
  }
 }
 direction=(direction+1)%2;  //方向交换
  }
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户174856 2009-3-9 16:49

你好,本人菜鸟。你的c代码我运行了一下怎么有错误的呢?代码两个头文件应该是什么?无错报告主要说P1_0 P1_1......这些端口有错均说undefined indentifier!!到底是什么问题呢!能帮小弟解决一下吗,可发到我邮箱shundelzm@126.com 万分感谢!

用户74185 2008-3-24 19:11

你好: 我的毕业这计就是基于单片机的交通灯的设计,你的protel图能放大一些吗?可以发给我吗?我会非常感谢你的
相关推荐阅读
用户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 (  ...
我要评论
2
8
关闭 站长推荐上一条 /3 下一条