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

东西道为人行道(20秒),南北道为车行道(60秒),黄灯延时最后三秒时,闪烁并切换。
三、硬件电路设计
此电中路设计采用AT89C51单片机,74LS47(数码管驱动)74LS373(数码管驱动输出锁存),8个数码管显示其延时值,四个红、黄、绿指示灯。硬件设计关键在于,延时显示时,要考虑到当个位数字显示时,要确保十位数字显示输出的不变。因此,可加输出锁存器。在延时最后三秒时,要让黄灯进行闪烁,并同时显示数字(这一步在软件设计上很关键)。
四、软件程序(C语言)
以下是整个设计的软件程序,直接可以编译成。Hex代码。通过以上电路,下载到单片机,可直接运行。
////
//程序名:十字路口交通灯控制
//编写人:黄庭剑
//初写时间:2009年1月2日
//程序功能:南北为车行道,延时60秒;东西方向为人行道,延时20秒,且在最后3秒黄灯显示2秒钟再实现切换
//CPU说明:AT89C51型单片机; 24MHZ晶体振荡器
//完成时间:2009年1月6日
////
#include<stdioh>
#include<reg51h>
#include<intrinsh>
sfr p0 = 0x80;
sfr p1 = 0x90;
sfr p2 = 0xA0;
sfr p3 = 0xb0; //这部分内容其实在“#include<reg51h>”里已经有,但里面定义的必须区分大小写,在这里,因为我程序采用的是小写,reg51h里对各个端口与寄存器的定义都是大写,所以在编译连接时,会报错,所以,在本设计程序里,我只用到了端口,在这里也就只定义了四个,而没有去改reg51h里面的内容。其实两者是一样的。
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://hibaiducom/hjiannew/
面包板,给了八个原件,两个发光二极管,两个电容,两个电阻,两个三级管,怎么连成红绿灯交替闪烁啊!!
设4个地方的开关分别为A、B、C、D,为1表示开关合上;灯为F,1表示灯亮。能在4个不同的地方都可以控制灯的亮灭,即4个地方中如果有奇数个开关合上,灯亮,偶数个开关合上,灯灭。因此可以列出电路的真值表,见表3217。 表3217 A B C D F A B C D f 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0 0 1 0 0 0 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 1 0 0 1 1 1 0 0 0 0 1 0 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 因此可得F(A,B,C,O)=∑m(1,2,4,7,11,13,14),要用双4选1数据选择器实现F,需首先将双4选1数据选择器接成8选1数据选择器的形式,再从4个输入变量中选3个作为地址输入,一个作为数据输入。选择ABC作为地址输入,因此逻辑图见图3292。
按照您所描述的面包板原件,以下是联结电路的一种方案,用以实现红绿灯交替闪烁。
连接方式如下:
首先,将一个发光二极管和一个电容连接在一起。
然后,将这个组合连接到电阻上。
接着,将三级管分别连接到电容和电阻组合的脚上。
将另一个电容连接到关于第一个三级管的汇流极。
再将另一个发光二极管连接到关于第二个三级管的汇流极。
最后,将红色发光二极管的阳极连接到电源正极,将绿色发光二极管的阳极连接到电源负极。
下面是具体的接线方式:
1 将一个150Ω电阻的一端连接到电源正极,并连接一个47μF电容的正极到电阻的另一端。
2 将一个NPN三极管的发射极连接到电阻的一端,将集电极连接到电容的负极上,并将基极连接到另一个47µF电容的负极上。
3 将另一个NPN三极管的收集极连接上述电容的正极,将基极连接到另一个150Ω电阻上,将发射极连接到绿色发光二极管的阳极上。
4 将另一个47µF电容的正极连接到红色发光二极管的阳极上,将其负极连接到另一个150Ω电阻上。

5 将该电阻的另一端连接到另一个NPN三极管的基极上,将发射极连接到另一个47µF电容的负极上,将集电极连接到另一个47µF电容的正极上。
6 将另一个150Ω电阻的一端连接到另一个NPN三极管的集电极上,并将该电阻的另一端接地。
7 将红色发光二极管的阴极连接到另一个NPN三极管的发射极上,将绿色发光二极管的阴极连接到电源负极上。
这样配置后,当开启电源时,红绿灯应该会交替闪烁。
亲,整理不易。对你有帮助的话,请留下你的脚印,采纳,评论或者点赞,是我前进努力的不竭动力。


