【课程设计】信号交通灯

一、设计内容
设计一个交通信号灯,具体要求为:
(1)初始状态为两个方向的红灯全亮,时间6秒;
(2)主干道绿灯亮,支干道红灯亮,主干道通车,时间为20秒;
(3)主干道黄灯闪烁,支干道红灯亮,时间为6秒;
(4)主干道红灯亮,支干道绿灯亮,支干道通车,时间为15秒;
(5)主干道红灯亮,支干道黄灯闪烁,时间为6秒;
(6)循环显示。
二、设计原理
让12个led灯按照每三个排列在四个方向,分别表示主干道和支干道,然后用单片机的P0口的2,3,4,5,6,7引脚控制LED灯,输入高电平即可点亮led灯,用P0口的0,1引脚控制共阳极数码管的段选,采用的是两个7段数码管一起的,一共有10个引脚,剩余的8个引脚用单片机的P2口进行控制,设置初始状态为六个红灯同时亮,时间为6秒,进入到设置的循环中去;其中有复位电路和紧急中断电路,当复位电路的按键被按下的时候,数码管和led灯结束当前的状态,回到设置的初始状态,然后继续进行循环。当紧急中断电路的按键被按下的时候,六个红灯同时亮起,数码管不显示,并保存中断前的状态,当中断按键再次被按下的时候,数码管和led灯回到保存的状态,继续进行下去。

#include<reg51.h>   //我们对51单片机编程,要引用头函数

sbit led_A=P0^0;   //数码管位
sbit led_B=P0^1;   //数码管位

//***************led指示灯引脚定义*****************//
sbit dx_R=P0^2;
sbit dx_Y=P0^3;
sbit dx_G=P0^4;

sbit nb_R=P0^7;
sbit nb_Y=P0^6;
sbit nb_G=P0^5;

bit flag=0;
sbit key_stop=P3^3;

char N=20;	 //初始时间是20
char tab_disp[]={
    
    0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳极码表

/*延时子函数*/
void delay(int t ){
    
    while(t--);}
/*显示子函数*/
void display(char dat)
{
    
    
	led_A=led_B=0;	 //先位灭显
	P2=0XFF;   //再段灭显
	P2=tab_disp[dat/10]; //赋显示的数
	if(dat/10)led_A=1;	 
	delay(1000);	//延时
	
	P2=0XFF;led_A=led_B=0; //段灭显	位灭显
	P2=tab_disp[dat%10]; //赋显示的数
	led_B=1;	  
	delay(1000);   //延时
}
//这个是循环显示60遍显示的函数
void deal(char m)
{
    
    
	int t=60;
	while(t--)display(m);  //循环显示60遍显示的函数
}

void KEY()									  //按键函数
{
    
    
	unsigned char save;						  //定义保存灯状态的变量
	if(key_stop==0)							  //按键是否按下
	{
    
    
		delay(20);							  //延时去抖
		if(key_stop==0)						  //再次判断按键是否按下
		{
    
    
			flag=1;							  //紧急状态标志位置1,进入紧急通行状态
			save=P0;						  //保存灯的状态
			P0=0x84;						  //全部亮红灯
			while(key_stop==0);				  //按键释放,当按键一直按下的时候,程序就会一直执行这里,直到按键按下
			while(flag==1)					  //如果是紧急状态就一直执行下面的程序
			{
    
    
				if(key_stop==0)				  //在紧急状态时判断按键是否按下
				{
    
    
					delay(50);				  //延时去抖
					if(key_stop==0)			  //再次判断按键是否按下
					{
    
    
						flag=0;				  //紧急状态标志位清零,退出紧急状态
						P0=save;			  //LED灯恢复到之前状态
						while(key_stop==0);	  //按键释放
					}
				}
			}
		}
	}
}

/*主函数*/
void main(void)
{
    
    
	char i;
	EA=1;      //全局中断开关        
	IT1=1;	   //外部中断下降沿有效
	EX1=1;
	while(1)
	{
    
    
			N = 6;//初始时间是6
			dx_R = 1; dx_Y = 0; dx_G = 0;	
			nb_R = 1; nb_Y = 0; nb_G = 0;
			for(i=N;i>0;i--)	 //一秒一秒的减
			{
    
    
				deal(i);
				KEY();
			}


			N=20;   //时间变20
			dx_R=1;dx_Y=0;dx_G=0;	//指示灯0是亮,1是灭
			nb_R=0;nb_Y=0;nb_G=1;	//指示灯0是亮,1是灭
			for(i=N;i>0;i--)	 //一秒一秒的减
			{
    
    
				deal(i);
				KEY();
			}
	
			dx_R=1;dx_Y=0;dx_G=0;	//指示灯0是亮,1是灭
			nb_R=0;nb_Y=1;nb_G=0;	//指示灯0是亮,1是灭
			N=6;				   //时间变成6
			for(i=N;i>0;i--)	  //一秒一秒的减
			{
    
    
				deal(i);
				KEY();
			}
	
			dx_R=0;dx_Y=0;dx_G=1;	//指示灯0是亮,1是灭
			nb_R=1;nb_Y=0;nb_G=0;	//指示灯0是亮,1是灭
			N=15;					//时间变成15
			for(i=N;i>0;i--)		  //一秒一秒的减
			{
    
    
				deal(i);
				KEY();
			}
			dx_R=0;dx_Y=1;dx_G=0;	//指示灯0是亮,1是灭
			nb_R=1;nb_Y=0;nb_G=0;  //指示灯0是亮,1是灭
			N=6;				   //时间变成6
			for(i=N;i>0;i--)	   //一秒一秒的减
			{
    
    
				deal(i);
				KEY();
			}	
	}

猜你喜欢

转载自blog.csdn.net/weixin_43762735/article/details/108377709