如何用c语言编程在单片机上做交通信号灯

以单片机为核心,设计一个简单交通灯控制系统,设A车道与B车道交叉组成十字路口,A是主道,B是支道。设计要求如下:
(1) 用发光二极管模拟交通信号灯、两个方向分别设置红、绿、黄3种通行指示灯,用按键开关模拟车辆检测信号。
(2) 正常情况下,A、B两车道轮流放行, A车道放行40秒,其中5秒用于警告,B车道放行25秒,其中5秒用于警告。有计时牌显示路口通行转换剩余时间。
(3) 在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15秒;在A车道放行期间,若B车道有车而A车道无车,按下开关K2使B车道放行15秒。
(4) 有特种车辆如119、120通过路口时,系统可转为特种车辆放行,其他车辆禁止通行的状态,15s后系统恢复正常管理。
(5) 两个方向放行的时间可以通过键盘设置。
用c语言写 由于本人c语言十分。。。单片机型号AT89C51 所以希望各位大哥帮帮忙啊 是我们的课程设计 跪求程序啊 万分感谢

硬件电路设计

此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。

(1)电路连接图:

三、软件程序(C语言)

    以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。

//*****************************//
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换.
//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器
//完成时间:2009年1月6日
//*****************************//
#include<stdio.h>
#include<reg51.h>
#include<intrins.h>
sfr p0   = 0x80;
sfr p1   = 0x90;
sfr p2   = 0xA0;
sfr p3   = 0xb0;      //这部分内容其实在“#include<reg51.h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51.h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51.h里面的内容。其实两者是一样的。
sbit  sw      = p0^0;
sbit   OE    =P0^6;
sbit   LE    =P0^7;  //74LS373锁存器控制端定义
char  display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的数码管时间显示调用,利用74L74BCD码,8位驱动输出;

//函数声明 begin
void  delay1(int count);
void  delay_long(int  number1,int number2);
void    people_car_drive();
//函数声明end
//***********************//延时子程序
void  delay1(int  count)
 { int  i;
   for(i=count;i>0;i--)
       { ;} 
 }
void  delay_long(int  number1,int number2)
  {
   int a,b;
 for(a=number1;a>0;a--)
   {
    for(b=number2;b>0;b--)
     { _nop_();     }
   }
    
  }
//**********************//延时子程序
 void   people_car_drive()
 {
   int   p_1=2,i,j=9,p_2=6;    //****************//行人通行时,延时20秒
          p2=0x09;                     //南北红灯亮
       p3=0x24;                     //东西绿灯亮
    
  while(p_1-->0)
     { LE=1;
    OE=0;
    if(p_1==0){OE=1;}            //当十位数减到0时,只显示个位数
    p1=display[p_1];
    delay1(1000);
    LE=0;  
    j=9;
     for(i=10;i>0;i--)
   { 
     if(p_1==0&&j==3)break;     //减到3时退出循环,让其黄灯闪烁显示
     p1=display[j--];
     delay_long(16000,2);
  if(sw==1)return;   
   }
   
     } 
   
//*******************************************************************************//
                  
     p2=0x12;                  //南北黄灯闪烁三秒,以提醒行人注意
     p3=0x12; 
  p1=display[3]; 
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;     
  delay_long(14000,1);
    
  p2=0x12;
  p3=0x12;
  p1=display[2];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
  
  p2=0x12;
  p3=0x12;
  p1=display[1];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
//*****************以下是车辆通行时延时60秒//
 
   p2=0x24;                 //南北绿灯亮
   p3=0x09;                 //东西红灯亮
  
     while(p_2-->0)
     { LE=1;
    OE=0;
    if(p_2==0){OE=1;}       //当十位数减到0时,只显示个位数
    p1=display[p_2];
    delay1(1000);
    LE=0;
    j=9;
     for(i=10;i>0;i--)
   { 
  if(p_2==0&&j==3)break;  //减到2时退出循环
     p1=display[j--];
     delay_long(16000,2);
  if(sw==1)return;     
   }
     }
   
     p2=0x12;                //南北黄灯闪烁三秒,以提醒行人注意
     p3=0x12; 
  p1=display[3]; 
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;     
  delay_long(14000,1);
    
  p2=0x12;
  p3=0x12;
  p1=display[2];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);
  
  p2=0x12;
  p3=0x12;
  p1=display[1];
  delay_long(8000,1);
  p2=0x00;     
     p3=0x00;
  delay_long(14000,1);    //南北黄灯闪烁三秒完毕
 }
 
 void  main()               //主函数入口处
{
       p0=0x01;
       p1=0x00;
       p2=0x00;
       p3=0x00;               //初始化各端口
 { while(1) 
  {
     if(sw==0)
    {  people_car_drive();}
else
  {
   p2=0x00;
   p3=0x00;                    //关闭所有交通灯
  }
  }
  
 }
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-26
点错了,不好意思,过来看看高手们的编程思路。
第2个回答  2011-05-20

#include <reg51.h>

#define uchar unsigned char

#define uint  unsigned int

sbit RED_A    = P0^0;

sbit YELLOW_A = P0^1;

sbit GREEN_A  = P0^2;

sbit RED_B    = P0^3;

sbit YELLOW_B = P0^4;

sbit GREEN_B  = P0^5;

uchar Flash_Count = 0, Operation_Type=1;

void DelayMS(uint x)

{

 uchar i;

 while (x--) for (i=0;i<120;i++);

}

void Traffic_Light()

{

 switch (Operation_Type)

 {

  case 1:

   RED_A=1;YELLOW_A=1;GREEN_A=0;

   RED_B=0;YELLOW_B=1;GREEN_B=1;

   DelayMS(2000);

   Operation_Type=2;

   break;

  case 2:

   DelayMS(300);

   YELLOW_A=!YELLOW_A;GREEN_A=1;

   if(++Flash_Count!=10) return;

   Flash_Count=0;

   Operation_Type=3;

   break;

  case 3:

   RED_A=0;YELLOW_A=1;GREEN_A=1;

   RED_B=1;YELLOW_B=1;GREEN_B=0;

   DelayMS(2000);

   Operation_Type=4;

   break;

  case 4:

   DelayMS(300);

   YELLOW_B=!YELLOW_B;GREEN_B=1;

   if(++Flash_Count!=10) return;

   Flash_Count=0;

   Operation_Type=1;

   break;

 }

}

void main()

{

 while(1) Traffic_Light();

}

第3个回答  2011-05-19
看名字
相似回答