-
实验内容及要求
交通信号系统是保障交通安全高效的重要设施,为了利于司机更好的判断,很多交通信号灯系统在原来的系统基础上设置了倒计时显示器。本实验利用7段数码管作倒计时显示器,设计一个改进型的交通信号灯系统,要求如下:
- 本设计用于南北、东西向交叉的十字路口,每组信号灯由红、黄、绿三个信号灯组成,倒计时为10秒以内,信号灯的显示规则参照真实的交通信号灯,如图所示:
- 信号灯有三种工作模式,分别是:正常工作模式、全黄闪模式、全红模式。正常模式工作过程为:两个方向的信号灯依次:绿高亮10s—>黄灯闪3次,每次1sà红灯亮10s,两个方向的信号交替进行;全黄闪模式工作过程为两个方向的黄灯同时闪烁,为慢行状态;全红模式为两个方向的红灯同时亮,为禁止通行模式。注意:延时用定时器实现。
- 模式切换通过设计按扭进行。
- 在keil中利用C51进行程序设计,利用ptotues设计电路并进行仿真。
-
涉及的主要知识点
- C51程序设计。
- 7段数据管的编码与显示原理。
- Keil及protues软件的使用。
- 定时器/计数器原理。
-
提示及预备知识
- 以LED灯作为信号灯,以IO口进行驱动。
- 输入对应IO的电平判断按钮的状态。
- 定时器的方式进行延时,可参考书上的例子,如实例1。
- 参考流程图如下:
实物图如下:
部分代码:
#include <REGX51.H>
char arr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//½«0~9µÄÊý×Ö´æÈëarrÊý×éÖÐ
//ÑÓʱ1msµÄ´úÂë
void Delay(unsigned int time)
{
unsigned int j=0;
for ( ;time;time--)
for(j=0;j<125;j++);
}
//ÓÉÄÏÏò±±µÄaÃëµÄµ¹¼Æʱ
void Time1(unsigned int a){
char i;
for(i=a;i>=0;i--){
P3=arr[i];
Delay(1000);
}
}
//ÓÉÎ÷Ïò¶«µÄbÃëµ¹¼Æʱ
void Time2(unsigned int b){
char i;
for(i=b;i>=0;i--){
P1=arr[i];
Delay(1000);
}
}
void main(){
unsigned int i;
//ÏÈÈÃËùÓеĵÆϨÃð
P2_0=0;
P2_1=0;
P2_2=0;
P2_3=0;
P2_4=0;
P2_5=0;
P3=0;
P1=0;
while(1){
//»ÆµÆÉÁ˸
if(P2_6==0)//P2_6¿ØÖƻƵÆÉÁ˸µÄ¿ª¹Ø±ÕºÏ
{
P2_3=0;
while(1)
{
P2_1=1;
P2_4=1;
Delay(1000);//ÑÓʱ1S
P2_1=0;
P2_4=0;
Delay(1000);//ÑÓʱ1S
if(P2_6!=0)
break;
}
}
//È«ºì
if(P2_7==0){//P2_7¿ØÖƺìµÆµÄ¿ª¹Ø±ÕºÏ
while(1){
P3=arr[0]; //ָʾµÆÁÁ0
P1=arr[0];
P2_0=1;
P2_3=1;
if(P2_7!=0){
P2_0=0;
P2_3=0;
break;}
}
}
P2_3=1;//ʹÓÉÎ÷¶«µÄ·¿ÚÏòÁÁºì
P2_2=1;
Time1(9);
P2_2=0;
for(i=0;i<3;i++){
P2_1=1;
P3=arr[3-i];
Delay(1000);//»ÆµÆÿ1sÉÁÒ»´Î
P2_1=0;
P3=0;
Delay(1000);
}
P2_0=1; //ÓÉÄÏÏò±±µÄºìµÆ¿ªÊ¼ÁÁ
//ÓÉÎ÷Ïò¶«µÄÐźŵÆ
P2_3=0;
P2_5=1;
Time2(9); //Â̵ÆÁÁµ¹¼Æʱ10s
P2_5=0;
//»ÆµÆÉÁÈý´Î
for(i=0;i<3;i++){
P2_4=1;
P1=arr[3-i];
Delay(1000);//ÑÓʱ1s
P2_4=0;
P1=0;
Delay(1000);
}
P2_3=1;
P2_0=0;
}
}
运行结果: