如何用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
看名字

c51单片机c语言交通灯的程序
使用C语言为C51单片机编写交通灯控制程序是完全可行的,通过合理地设置定时器、I\/O端口以及逻辑控制,可以实现交通灯的定时切换和状态显示。接下来,我将详细解释如何为C51单片机使用C语言编写交通灯控制程序。首先,我们需要了解C51单片机的基本结构和资源,包括其I\/O端口、定时器\/计数器等。通常,交通灯系...

如何用c语言编程在单片机上做交通信号灯
(1)电路连接图:三、软件程序(C语言) 以下是整个设计的软件程序,直接可以编译成*。Hex代码。通过以上电路,下载到单片机,可直接运行。\/\/***\/\/\/程序名:十字路口交通灯控制\/\/编写人:黄庭剑\/\/初写时间:2009年1月2日\/\/程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后...

求用C语言编写的交通灯程序,C51单片机控制,无左转右转
define OFF 1 \/\/1的时候灯亮 \/\/管脚定义 \/\/南北道 黄灯亮3秒 红灯亮 30秒 黄灯3秒 绿灯38秒 \/\/东西道 黄灯亮3秒 绿灯亮 28秒 黄灯3秒 红灯40秒 sbit PortDX_Yellow = P1^0; \/\/东西方向黄灯 sbit PortDX_Red = P1^1; \/\/东西方向红灯 sbit PortDX_Green = P1^2; \/\/东西方向...

c51单片机c语言交通灯的程序
void logo(); \/\/开机LOGO void Buzzer();\/\/主程序 void main(){ TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;\/\/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5;while(1){ key(); \/\/调用按键扫描程序 display(); \/\/调用显示程序 ...

用51单片机编写城市道路交通灯c语言程序,有左转右转
case 4: \/\/南北向黄灯开始闪烁,绿灯关闭 LEDsng=0x0;LEDsns=0x0;if(++Time_Count!=8) return;Time_Count=0;YELLOW_B=~YELLOW_B;GREEN_A=0;if(++Flash_Count!=10) return; \/\/闪烁 Flash_Count=0;Operation_Type=1;break;} } void t1_isr() interrupt 3 { TR1=0;TH1=(65536-3000...

c语言模拟交通灯控制
c语言模拟交通灯控制 任务4模拟交通灯控制一、任务目的通过对模拟交通灯控制系统的制作,掌握定时器和中断系统的综合应用,进一步熟练软、硬件联调方法。二、任务要求设计并实现单片机交通灯控制系统,将... 任务4模拟交通灯控制一、 任务目的通过对模拟交通灯控制系统的制作,掌握定时器和中断系统的综合应用,进一步熟练软...

...帮忙设计一个交通灯控制的C语言程序。谢谢。。(汇编指令太麻烦咯...
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...

如何用单片机制作交通灯
源程序中用6行sbit对东西和南北向的红、黄、绿指示灯分别进行定义,这样便于对它们进行单独控制。本例交通指示灯切换时间设置的较短,这样可在调试的时候较快观察到运行效果,可在调试运行本例后修改代码,使指示灯切换过程更接近于实际的交通指示灯切换过程。源程序代码:\/\/--- \/\/ 名称:LED模拟交...

用单片机模拟控制控制交通信号灯。 题目如下; 只要做出来,分不是问题...
要实现灯闪烁。红灯、绿灯、黄灯的点亮持续时间可以通过串口来修改,并在下一个循环中更新数值。作 者:温子祺 修改日期:2010\/5\/4 说 明:代码注释与讲解详见《51单片机C语言创新教程》温子祺等著,北京航空航天大学出版社 \/ include "stc.h"typedef unsigned char UINT8;typedef unsigned i...

C51单片机程序设计题,要求用C语言做,模拟交通灯控制单片机电路,答案要...
程序有不严谨地方还得调试修改 include <REGX51.H> define STATUS_1S1 define STATUS_2S2 define STATUS_3S3 define STATUS_4S4 define STATUS_5S5 define STATUS_15S15 define STATUS_28S28 define STATUS_29S29 define STATUS_30S30 unsigned char flag,status,status_temp=1,status_temp_;sbit ...

相似回答