资源文件夹包括:proteus仿真 原理图;keilC语言程序。 资源链接:加我QQ:1271370903
一、设计要求及内容
控制系统主要由AT89C51单片机芯片、时钟电路、复位电路、数字管显示电路、按键电路、发光二极管LED正常情况下,东西直行时间为52s运行时,黄灯闪烁5秒,绿灯左转61秒,黄灯闪烁5秒;然后南北直行70秒s运行时,黄灯闪烁5秒,南北左转64秒,最后黄灯闪烁5秒,依次循环。在特殊交通条件下,交通控制人员需要手动控制系统的运行,并通过按钮调整系统指示。此时,复位电路和按键电路将通过AT89C51单片机将信号传输到驱动电路,驱动电路控制显示信号LED电路中,LED电路将信号传输到复位电路,从而实现循环系统控制过程。
二、模拟器件清单
单片机、排阻、发光二极管 ,晶振 ,电容 ,电阻 ,按键 ,数字管等,网络标号导线
三、组成
单片机最小系统,或最小应用系统,是指由最小元件组成的单片机可以工作的系统。 即时钟电路,是的AT89C51单片不可或缺的电路,在其工作运行时它起到控制信号的作用。时钟信号对单机片内部电路的影响极大,在它的作用下,单片机会遵循基本的设计原则通过时序指令完成工作。本设计通过数据的分析采用频率为12MHz的晶振,22pF的电容。 3.单片机小系统采用上电自动复位和手动按键复位两种方式实现系统复位操作。,就是在AT89C51的引脚RET端接入的电路可以产生复位信号。单片机在工作时将内部数据恢复到原始参数。 数字管时间显示电路 共阴极数码管是所有的LED阴极连接到共同接点COM,而每个led阳极分别是A、B、C、D、E、F、G及DP(小数点),如下图所示。图3-8中的8个led分别与A~DP通过控制各段对应,控制各段led亮灭显示数字。 数码管显示模块采用2位8段LED共阴数码管。数码管的段码线和单片机P0口相连。为了使数码管的显示更加明显,使用驱动模块驱动数码管,驱动模块由4个驱动模块驱动NPN管和4个10K电阻组成。由于对面数字管的显示相同,相对数字管的位选端连接在一起,需要显示数字时选择个位或十位,实现同时显示。74用于数字管的显示HC573锁存器,数码管的段选端连接到锁存器的输出端,东西南北共有4根数码管,连接到第二个锁存器的输出端。锁定功能是将数据输入端与输出端隔离或连接。 U二是段选锁存器,U三是位选锁存器。由于是共阴极数码管,当数码管亮起时位选端的电流为几个LED每个数字管段的驱动电流之和为10ma—15ma,如果直接导入锁定器的引脚可能会损坏引脚或降低锁定器的使用寿命,则选定端的电流会很大。为了减少导入锁定器引脚的电流,使用三极管导入选端的大部分电流GND,极小的电流会导入锁定器的引脚,从而解决这个问题。 本文采用PNP三极管作为驱动器驱动数码管的显示,由于每个发光二极管额定电流3-10UA,因此,电路中的限流电阻被计算为 330欧姆。 其中U当输出端直接在数字管上时,可能会产生较大的电流,烧毁数字管段,因此需要串联一个限流电阻。 不同,可以分为静态显示和动态显示两类。 本设计采用动态显示驱动,数字管动态显示接口是单片机中应用最广泛的显示方式之一。动态驱动是将所有数字管的8个显示笔段连接到同名端,并为每个数字管的公共极 COM增加位选通控制电路,位选通有自己立I/O线路控制,当单片机输出字型码时,所有数字管都接收到相同的字型码,但是个数字管会显示字形取决于单片机对位选择COM端电路的控制,所以只要打开需要显示的数码管的选通控制,改为显示字形,没有选通的数码管就不会亮。每个数字管的点亮时间通过分时轮流控制为1~2毫秒,由于人的视觉暂留现象和发光二极管的余辉效应,虽然个位数管不同时点亮,但只要扫描速度足够快,印象是一组稳定的显示数据,没有闪烁,动态显示效果和静态,可以节省大量的T门端口。日功耗较低。 等待或通行时间由4个8位数字管显示。为了准确倒计时数字管的倒计时,平时不能使用delay方法是使用更准确的定时器来实现倒计时。T0中断的主要工作是每隔一秒减少数字管显示的数字变量,然后根据情况改变显示的数字变量。 我们在设计之初就给出了红绿灯变化的规则:东西的直行时间是52s运行时,黄灯闪烁5秒,绿灯左转61秒,黄灯闪烁5秒;然后南北直行70秒s运行时,黄灯闪烁5秒,南北左转64秒,最后黄灯闪烁5秒,依次循环。 交通灯信号显示模块,采用红黄绿三种LED模拟十字路口的交通灯。通过信号灯电路的设计AT89C51单片机P芯片将控制16个发光二极管的信号模式。红、黄、绿、左转绿灯分别接收单片机P1.3、P1.4、P1.5、P1.8.南北方向的红、黄、绿、左转绿灯分别接收单片机P1.0、P1.1、P1.2、P1.6。 在实际的道路交通中,会出现紧急交通情况。此时,系统难以指挥现场交通状况。此时,需要根据实时交通堵塞情况进行人工系统控制模式。交通人员可以观察和控制,使系统的控制开关发挥作用,使交通恢复当时的适应状态。 除了实现交通灯的基本功能外,还增加了其他控制功能,这些其他功能按键组在一起。该项目共使用两个按钮,每个按钮对应一个特定的功能。例如,第一个按钮(夜间模式):按下此按钮时,关闭定时器,更改显示标志,关闭数字管while在循环中判断此按钮,实现黄灯闪烁。第二个按钮(紧急模式):四个方向的红灯都亮了。 节省按键占用I/O口,也为了消除查询按钮的时间占用,减少CPU因此,按钮采用外部中断的方式,通过74LS148扩展中断。此时只需使用三个I/O使用中断的好处是,只有在触发中断时,程序才能返回执行按键功能,提高程序运行效率。 四、整体仿真图 1. 2、程序流程 3.黄灯模式 4.紧急模式 5.正常模式 五、部分代码
sbit dula=P3^6; // sbit wela=P3^7; // sbit EW=P1^4; //东西黄灯 sbit SN=P1^1; ///南北黄灯 char time1=52; ///初值东西 char time2=52; //初值55秒 char huang=5; ///黄灯时间 char tim11=70,time22=70; //南北时间70s
char zzz=61,aaa=64; //东西,南北左转时间
char t1=60,t2=60,chose=0;
uchar time1_2,temp=0,p=0,tab;
uchar shi1,ge1,shi2,ge2,q;
uchar status,key,flag;
uchar zhuangtai_flag=0;
//共阴极数字显示编码
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code wei[]={
0xfd,0xfe,0xf7,0xfb,
0xdf,0xef,0x7f,0xbf}; //位选
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--) //定时x毫秒
for(j=110;j>0;j--);
}
void display(uint ge1,uint shi1,uint ge2,uint shi2) //数码管显示
{
//显示北
wela=1; //打开位选锁存器
P0=wei[0]; //送入位选码(北个位)
wela=0; //关闭位选锁存器
P0=0; //消影
dula=1; //打开段选锁存器
P0=table[ge1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[1]; //送入位选码(北十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
//显示东西
wela=1; //打开位选锁存器
P0=wei[2]; //送入位选码(东个位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[ge2];
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[3]; //送入位选码(东十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi2];
dula=0; //关闭段选锁存器
delay(1);
}
void key1_6()
{
void dis();
//第一个按键(夜间模式)
if(key==3)
{
p=1;
TR0=0;
if(p)
dis(); //不显示函数
P1=0x12 ;
while(1)
{
P1=0x00;
delay(800);
P1=0x12 ;
delay(800);
}
}
if(key==6)
{
temp=0; //计数值清零
p=0;
TR0=1; //定时器0开始计时
}
//第二个按键
if(key==7) //红灯全亮
{
time1=0;
time2=0;
temp=0; //计数值清零
p=0;
TR0=0;
P1=0x09;
}
}
void dis()
{
wela=1;
P0=0xff;
wela=0;
}
void zhuangtai1()
{
P1=0x21; //刚开始东西通,南北禁行
if(time1<0)
{
time1=huang; //东西黄灯时间准备
time2=huang;
zhuangtai_flag=1; //转状态
}
}
void main()
{
P1=0x21; //刚开始东西通,南北禁行
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //初值
EA=1; //打开总中断
ET0=1; //定时器0允许中断
TR0=1; //定时器0开始计时
EX0=1; //外部中断0允许位
IT0=1; //外部中断0触发方式(下降沿)
while(1)
{
if(flag)
{
switch(status) //判断按键
{
case 0xfc:key=3;break;
case 0xf9:key=6;break;
case 0xf8:key=7;break;
}
key1_6(); //按键程序
flag=0;
}
if(!p)
{
shi1=time1/10; //南北十位
ge1=time1%10; //南北个位
shi2=time2/10; //东西十位
ge2=time2%10; //东西个位
display(ge1,shi1,ge2,shi2); //显示函数
}