基于51单片机控制交通灯的电路图与C语言程序

作者&投稿:兆昆咬 (若有异议请与网页底部的电邮联系)
MCS-51单片机控制交通灯程序和电路图~

注::::::::系统晶振是 11.0592 MHz
ORG 0000H
LJMP START
ORG 0003H ;INT 0 中断入口地址
LJMP INT0
ORG 0040H
START:
MOV SP,#60H
SETB EX0 ;INT 0 中断有效
SETB IT0
SETB EA
LCALL STATUS0 ;初始状态(都是红灯)
CIRCLE: LCALL STATUS1 ;南北绿灯,东西红灯
LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯
LCALL STATUS3 ;南北红灯,东西绿灯
LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE
INT0:
PUSH PSW ;保护现场
PUSH 2
PUSH ACC
MOV DPTR,#8300H
MOV A,#0FH ;南北,东西都亮红灯
MOVX @DPTR,A
MOV R2,#100 ;延时10秒
LCALL DELAY
POP ACC ;恢复现场
MOVX @DPTR,A
POP 2
POP PSW
RETI
STATUS0: ;南北红灯,东西红灯
MOV DPTR,#8300H
MOV A,#0FH
MOVX @DPTR,A
MOV R2,#10 ;延时1秒
LCALL DELAY
RET
STATUS1: ;南北绿灯,东西红灯
MOV DPTR,#8300H
MOV A,#96H ;南北绿灯,东西红灯
MOVX @DPTR,A
MOV R2,#200 ;延时20秒
LCALL DELAY
RET
STATUS2: ;南北绿灯闪转黄灯,东西红灯
MOV DPTR,#8300H
MOV R3,#03H ;绿灯闪3次
FLASH: MOV A,#9FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#96H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH
MOV A,#06H ;南北黄灯,东西红灯
MOVX @DPTR,A
MOV R2,#10 ;延时1秒
LCALL DELAY
RET
STATUS3: ;南北红灯,东西绿灯
MOV DPTR,#8300H
MOV A,#69H
MOVX @DPTR,A
MOV R2,#200 ;延时20秒
LCALL DELAY
RET
STATUS4: ;南北红灯,东西绿灯闪转黄灯
MOV DPTR,#8300H
MOV R3,#03H ;绿灯闪3次
FLASH1: MOV A,#6FH
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
MOV A,#69H
MOVX @DPTR,A
MOV R2,#03H
LCALL DELAY
DJNZ R3,FLASH1
MOV A,#09H ;南北红灯,东西黄灯
MOVX @DPTR,A
MOV R2,#10 ;延时1秒
LCALL DELAY
NOP
RET
DELAY: ;延时子程序
PUSH 2
PUSH 1
PUSH 0
DELAY1: MOV 1,#00H
DELAY2: MOV 0,#0B2H
DJNZ 0,$
DJNZ 1,DELAY2 ;延时 100 mS
DJNZ 2,DELAY1
POP 0
POP 1
POP 2
RET
END

晚上随手写,也未调试,权当看看
程序有不严谨地方还得调试修改
#include
#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 K1=P0^0;
sbit K2 =P0^1;
sbit RLED=P0^2;
sbit YLED=P0^3;
sbit GLED=P0^4;
void Init(void)
{
ET0=1;
TR0=1;
RLED=0; //亮
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S://1S
{
RLED=1;//灭,闪一次
YLED=1;
GLED=1;
}break;
case STATUS_2S://1S
{
RLED=0;//亮,闪一次
YLED=0;
GLED=0;
}break;
case STATUS_3S://1S
{
RLED=1; //灭
YLED=1;
GLED=1;
status_temp=0;
}break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
void Init_Timer0(void)
{
TMOD=0x01;
//ET0=1;
//TR0=1;
EA=1;
TH0=0X3C;
TL0=0XB0; // 未计算,偷楼上的
}
void M_Start(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //红亮
while(status_temp)
{
switch (status)
{
case STATUS_1S:
{
if(status_temp_==1)
{
YLED=0;
}
}break;
case STATUS_2S:
{
if(status_temp_==1)
{
YLED=1;
}
}break;
case STATUS_3S:
{
if(status_temp_==1)
{
YLED=0;
status_temp_=0;
}
}break;
case STATUS_15S://15S灭,绿亮
{
RLED=1;
GLED=0;
}break;
case STATUS_28S:
{
GLED=1;
}break;
case STATUS_29S:
{
GLED=0;
}break;
case STATUS_30S:
{
GLED=1;
status=0;
status_temp_=1;
}break;
}
}
ET0=0;
TR0=0;
status=0;
status_temp=1;
YLED=1;
}
void M_End(void)
{
TH0=0X3C;
TL0=0XB0;
ET0=1;
TR0=1;
RLED=0; //亮 1次
YLED=0;
GLED=0;
while(status_temp)
{
switch (status)
{
case STATUS_1S://1S
{
RLED=1;//灭一次
YLED=1;
GLED=1;
}break;
case STATUS_2S://1S
{
RLED=0;//亮二次
YLED=0;
GLED=0;
}break;
case STATUS_3S://1S
{
RLED=1; ////灭二次
YLED=1;
GLED=1;
}break;
case STATUS_4S://1S
{
RLED=0; ////亮三次
YLED=0;
GLED=0;
}break;
case STATUS_5S://1S
{
RLED=1; ////灭三次
YLED=1;
GLED=1;
status_temp=0;
}break;
}
}
status_temp=1;
ET0=0;
TR0=0;
}
main()
{
Init();//单片机初始化
Init_Timer0();//定时器初始化
while(1)
{
if(K1==0)
M_Start();//模拟开始
if(K2==0)
M_End();//模拟结束
}
}
void interrupt_time0() interrupt 1 //核对头文件,一致就好
{
TH0=0X3C;
TL0=0XB0;
flag++;
if(flag==20)
{
status++;
flag=0;
}
}

思路:

    红灯停,绿灯行,黄灯闪烁提示行人红绿灯即将切换。四个方向各有一个红、黄、绿显示和两个数码管。

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。

三、硬件电路设计

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

四、软件程序(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;                    //关闭所有交通灯

  }

  }

  

 }

}

详情访问:http://hi.baidu.com/hjiannew/



交通信号灯控制

  1. 控制要求

  1. 按下启动按钮,交通信号灯开始正常运行;按下停止按钮立即停止;按下闪烁按钮开始闪烁。

  2. 正常运行为在前15秒内南北绿灯亮;15到20秒(5秒)中为南北黄灯闪烁(以每秒亮灭一次),南北绿灯灭;在0到20秒内东西红灯一直点亮;在20到35秒内东西绿灯点亮,东西红灯与南北黄灯灭;35到40秒东西黄灯闪烁(以每秒亮灭一次),东西绿灯灭;20到40秒内南北红灯一直点亮。以此为一个周期循环点亮。

  3. 东西与南北方向的绿灯和红灯都需要进行倒计时显示。

  4. 启动和闪烁在运行时都必须使用停止进行停止,启动与闪烁不可直接进行切换。

  1. 硬件要求

  1. 使用80C51单片机进行控制,7位数码管显示时间。其余可根据自己喜好自行选择。

  2. 此项目选择器件有:7位数码管显示选择两个74HC573作为信号锁存器件;7位数码管用共阴极数码管;用红绿黄灯使用对应颜色的二极管模拟;使用按钮模拟启动、停止和闪烁信号。

  1. 软件使用

  2. 硬件仿真使用protuse 7.8版本。

  3. 单片机编程软件使用keil C51 uVision2。



    具体要求说一下啊,帮你试做一下

    你找我 923361379!

    你去百度里面搜一下
    有这方面的程序的,你可以参考一下啊

    51单片机交通灯红灯绿灯19秒黄灯闪烁三秒
    答:51单片机交通灯红灯绿灯19秒黄灯闪烁三秒可以采用4行4列的矩阵开关显示。用单片机做一交通信号灯控制装置,要求A东西绿灯亮5秒后闪2秒熄灭,黄灯闪2秒后熄灭,红灯亮9秒,B南北绿灯亮5秒后闪2秒熄灭,黄灯闪2秒后熄灭,红灯亮9秒C循环10个开关,2个控制交通灯,共输出3种状态红、绿、黄、全灭...

    跪求51单片机交通灯编程 请帮下谢谢
    答://南北红灯sbit dx_red=P2^3;//东西红灯sbit dx_lv=P2^4;//东西绿灯sbit nb_lv=P2^5;//南北绿灯sbit dx_h=P2^6;//东西黄灯sbit nb_h=P2^7; //南北黄灯/*sbit nb_red=P0^0;sbit dx_red=P0^7;sbit dx_lv=P0^6;sbit nb_lv=P0^1;sbit dx_h=P0^5;sbit nb_...

    单片机中十字路口交通信号灯的过程,内容,原理?
    答:特别是它强大的面向控制能力,使它在工业控制领域,智能仪表、外设控制、家用电器、机器人、军事装置等方面得到了广泛的应用。 考虑到单片机具有物美价廉、灵活方便、还有各种优秀的特点,所以我们从中选择用MCS-51系列单片机AT89C51单片机来实现十字路口交通信号灯的控制。单片机系统的实体和装置,通常由运算器、...

    利用mcs-51单片机指令系统设计一段交通灯轮流点亮的程序
    答:LCALL ROAD2 ;路口2的车直行时各路口灯亮情况 LCALL DLY30s ;延时30秒 LCALL RESET ;恢复8155A 、B口为高电?MOV P1,#0FFH ;恢复P1口高电平 LCALL YELLOW2 ;路口2的车直行-->路口3的车直行黄灯亮情况 LCALL DLY5s ;延时5秒 LCALL RESET ;恢复8155A 、B口为高电?MO...

    51单片机交通灯程序 东西红灯亮60秒,南北绿灯亮55秒 东西绿灯亮55秒,南...
    答:include<reg52.h> sbit dx P1.0 sbit nb P1.1 void delay(void) //误差 0us { unsigned char a,b,c;for(c=167;c>0;c--)for(b=171;b>0;b--)for(a=16;a>0;a--);_nop_; //if Keil,require use intrins.h } void mian(){ char a;while(1){ nb=1;dx=0;f...

    利用51单片机模拟交通灯控制,怎么用数码管显示出来
    答:这最好用静态显示,只需要扩展74HC595即可,每个74HC595可以显示一位数字,它们级联,所以一般只需要4根IO口线即可。老的方案使用74LS164,不过切换时有闪动。

    基于51单片机的现代交通灯Proteus仿真程序,单片机源程序文件。_百度知 ...
    答:MOV R4 ,#05H ;东西黄灯亮,南北红灯亮 LOOP9:MOV A,#14H MOV P1 ,A CLR P3.5 SETB P3.4 MOV R2,#02H LCALL LP ;调显示子程序 MOV R2,#01H ;定时 LCALL DELAY ;调延时子程序,南北红灯亮 MOV A ,#04H MOV P1 ,A CLR P3.4 CLR P3.5 MOV R2,#01H ;...

    单片机交通灯的设计与方法,要具体,只要文字,不要图片谢谢了,大神帮忙啊...
    答:十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8051芯片的P1口设置红...

    如何用单片机设计一个路口交通信号灯?
    答:设计一个路口交通信号灯需要考虑到很多因素,比如交通流量、传感器检测等等。不过,我可以给您提供一些基于单片机的设计方案。例如,基于51单片机的简单交通信号灯控制系统的设计思路和实现方法。该系统由单片机最小系统、交通灯状态显示系统、LED数码显示系统、复位电路和按键操作电路等几大部分组成。另外,还有...

    51单片机交通灯 东西南北红灯亮十秒 高分悬赏 限时速来 用汇编语言 不...
    答:RED_NS EQU P3.0 YELLOW_NS EQU P3.1 GREEN_NS EQU P3.2 RED_EW EQU P3.3 YELLOW_EW EQU P3.4 GREEN_EW EQU P3.5 ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 SETB ET0 SE...