单片机电路主要完成的任务是控制红绿灯的规律转换,数码管倒计时的显示和中断延时控制。系统整体框图如图2-11所示:
输入接口 繁忙处理电电源电路 单片机控制电路 软件控制电路显示电路 复位电路
图2-11 系统结构图
2.3.1设置模块设计
本设计中,可以设置时间,由时间来控制交通灯亮和灭的状态。设置时间要进行进一步分析,在该程序段的基础上,合理的设置时间。
2.3.2显示模块设计
本设计要用数码管和二极管灯显示,其中数码管显示倒计时情况,二极管显示红绿灯的闪烁情况。 1)倒计时显示
该系统要求完成倒计时的功能。因只需显示数字,所以完全采用数码管显示,路口分别采用一个二位阴极数码管即可。动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。数码管引脚如图2-12所示,显示8时,向数码管引脚接的单片机接口送入7FH,如图2-13所示:
14
图2-12 数码管引脚图 2-13数码管显示8
表2-8 数码管共阴字形码 显示字符 段符号dp,g ,e,d,c,b,a 0 1 2 3 4 00111111 00000110 01011011 01001111 01100110 3FH 06H 5BH 4FH 66H 5 6 7 8 9 共阴代码 显示字符 段符号dp,g f,e,d,c,b,a 01101101 01111101 00000111 01111111 01101111 6DH 7DH 07H 7FH 6FH 共阴代码 2)状态灯显示
该系统要求完成状态灯显示的功能。求于简单,把各个路口的红灯和黄灯设成直行和左拐两个通行方式所共有,也就是说,一个路口只需四个状态灯,一个直行通行的绿灯,一个左拐通行的绿灯,一个共有的红灯,一个共有的黄灯。发光二极管因其驱动电压低、功耗小、寿命长、可靠性高等优点广泛应用于显示电路中。 发光二极管具有单向导电性,红色和黄色一般开启电压在2V左右,绿色开启电压一般为2.2V,正向电流越大,发光越强。使用时,应特别注意不要超过最大功耗、最大正向电流和反向击穿电压等极限参数。 本设计显示模块调用的部分主要程序如下:
void
Display(void) {
Delay(2); Time_Show_LED2=0; Time_Show_LED2=1;
}
15
char h,l; P0=table[h];
h=Time_CA/10; l=Time_CA;
DB_LED2=1; Delay(2); DB_LED2=0;
P0=table[l];
CA_LED2=1; Delay(2); CA_LED2=0;
P0=table[h];
DB_LED1=1; Delay(2); DB_LED1=0; h= CA1/10; l= CA1; P0=table[l]; Time_Show_LED1=1; Delay(2);
P0=table[h];
CA_LED1=1; Delay(2); CA_LED1=0;
h=Time_DB/10; l=Time_DB; P0=table[l];
Time_Show_LED1=0;
P0=table[h]; }
2.3.3复位模块设计
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作,例如复位后PC=0000H,使单片机从第—个单元取指令。无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
2.3.4紧急处理模块设计
紧急情况处理时,我们采用扩展I/O 口方法,在外部中断P32口上扩展三个中断口,分别连接三个按钮。该方案的优点是:使用灵活,并且可提供较多I/O口,节省了AT89C51的中断口资源。
本设计中紧急处理模块调用的部分主要程序如下:
void
{
EX0=0; //关中断
EXINT0(void)interrupt 0 using 1
if(CA1>=100)
{
CA1=99; DB1=79; } }
if(Reduces_Button==0)
16
if(Add_Button==0) //时间加 { CA1+=5; DB1+=5;
//时间减 { CA1-=5; DB1-=5;
if(CA1<=40) {
CA1=40;
//测试按键是否按下,按下为繁忙状态 {
CA1=45;
DB1=30;
CAL1=14; DBL1=14;
Special_LED=0;//关特殊信号灯 Busy_LED=1;//开繁忙信号灯
DB1=20; }
}
}
if(Special_Btton==0)
//测试按键是否按下,按下为特殊状态 {
CA1=75;
if(Nomor_Button==0)
//测试按键是否按下,按下为正常状态 { CA1=60; DB1=40;
CAL1=19; DBL1=19;
Busy_LED=0;//关繁忙信号灯 Special_LED =0;//关特殊信号灯
DB1=55;
CAL1=19; DBL1=19;
Busy_LED=0;//关繁忙信号灯
Special_LED =1;//开特殊信号灯 }
} if(Busy_Btton==0)
EX0=1;//开中断
}
2.4模块实现
本设计由四个模块组成。下面是各模块的实现情况。
2.4.1 设置模块的实现
本设计中我们设置时间长度,由此设置时间长度来调整灯亮和灭的时间长度。利用定时器中断设置, TH0=TH1,(65536-50000)/256,即每0.05秒中断一次。每到第20次中断即过了20*0.05秒=1秒时,使时间的计数值减1,便实现了倒计时的功能。黄灯闪烁同样可以利用定时器中断。每到第10次中断即过了10*0.05秒=0.5秒时,使黄灯标志位反置,即可让黄灯1秒闪烁一次。
17
40S 5S 60S 5S
AC道 红灯亮 黄灯亮 绿灯亮 黄灯亮 BD道 绿灯亮 黄灯亮 红灯亮 黄灯亮
2.4.2 显示模块的实现
本设计中显示模块实现要以数码管和发光二极管实现。
1)以下是发光二极管红灯亮时的图,此时车辆禁止通行。
图2-14 发光二极管红灯亮时的图
2)以下是发光二极管绿灯亮时的图,此时车辆允许通行。
图2-15 发二极管绿灯亮时的图
3)以下是发光二极管黄灯闪烁时的图,此时提醒人们状态灯即将要切换。
图2-16 发光二极管黄灯亮时的图
4)以下是人行道状态指示灯,绿灯亮时允许行人通过。
18