单片机课程设计交通灯(源代码)

简介

本此课程设计交通灯系统利用单片机AT89C51作为核心元件,实现了通过信号灯对路面状况的智能控制。系统具有结构简单、可靠性高、成本低、实时性好、安装维护方便等优点,有广泛的应用前景。
交通灯控制器设计主要功能是用单片机控制LED灯模拟指示。模拟东西南北方向的十字路口交通灯信号控制情况。本模拟系统由单片机硬/软件系统,用keil和proteus软件来实现两位8段数码管和LED灯显示系统,较好的模拟了交通路面的控制。
用到的元器件: 51单片机、button、三种led灯、8255A芯片、RESPACK-8、74LS04、两位数码管等

基本功能

1.主干道计时60秒,次干道计时45秒,左转计时15秒,时间到则切换红绿灯;
2.红绿灯不变期间,在七段数码管上显示每秒倒计时;
3.绿灯计时结束后,同方向的黄灯闪烁三秒直至计时到0。
4.期间人行道通行情况随道路的通行状况而改变
5.设置紧急模式:模式一道路全部禁行;模式二道路允许缓慢通行;模式三只允许南北直行;模式四只允许东西直行;模式五只允许南北左转;模式六只允许东西左转。
功能详解
当南北主干道通车时绿灯亮,而东西次干道干道红灯亮,此时南北人行道绿灯亮,东西红灯亮;当60s通车时间到后,主干道绿灯熄灭,黄灯闪烁三秒,3s之后南北左转的绿灯亮起,人行道及东西方向全部红灯;15s后切换为东西次干道通车。此时主干道左转绿灯熄灭,红灯亮,而次干道红灯熄灭,绿灯亮,次干道开始通车;45s通车时间到后,次干道绿灯熄灭,黄灯闪烁三秒,3s之后东西次干道左转绿灯亮起,人行道及东西方向全部红灯;15s后切换为南北主干道通车。此时次干道左转绿灯熄灭,红灯亮,而主干道红灯熄灭,绿灯亮。按照上述如此不断循环。

方案设计

电路模块分布
在这里插入图片描述
基本功能程序图
在这里插入图片描述

源程序

#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char

#define PA	 XBYTE[0x7F00]   //PA端口地址
#define PB	 XBYTE[0x7F01]		
#define PC	 XBYTE[0x7F02]
#define COM	 XBYTE[0x7F03]

	uchar temp,aa,nn;
	
	sbit shi=P3^0;
	sbit ge=P3^1;	/*对要使用的单片机各个口进行定义*/
	bit flag=0;
   sbit key1=P2^0;
	sbit key2=P2^1;
	sbit key3=P2^2;
   sbit key4=P2^3;
   sbit key5=P2^4;
   sbit key6=P3^3;
	uchar code table[]={
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71};         /*将数字0123456789的16进制数定义成数组用以显示*/
   //定义所有函数
	void delay(uint z);
	void disp(uint n);
	void  xint0();
	void  xint1();
	void timer0();
	void nb_flash(void);
	void dx_flash(void);
	void nanbei();
	void dongxi();                 
   void nanbeizuo();
	void dongxizuo();
   void dongxizuogreen();
	void nanbeizuogreen();
	void  dongxigreen();
	void  nanbeigreen();
	void allred();
	void allyellow();
	//主函数
	void main()        
	{
		uint num;
		num=0;
		aa=0;
		COM =0x82;        //PA口输出,PB口输入,PC口输出
		TMOD=0x01;        //定时器工作方式1
		TH0=(65536-50000)/256;
		TL0=(65536-50000)%256;
		EA=1;            //开启总中断
		ET0=1;           //开启定时器中断
		TR0=1;           //开启定时器0
		EX0=1;           //外部中断0允许标志
		IT0=0;           //外部中断0电平触发
		EX1=1;           //外部中断1允许标志
		IT1=0; 		     //外部中断1电平触发
		
		while(1){
			 nanbei();
			 nb_flash();
			 nanbeizuo();
			 dongxi();
			 dx_flash();
			 dongxizuo();
	  }
		
  }

	void delay(uint z)                    //延时函数
	{
		uint x,y;
		for(x=z;x>0;x--)
			for(y=110;y>0;y--);
	}

	void timer0() interrupt 1            //定时器0中断
	{
		TH0=(65536-50000)/256;
		TL0=(65536-50000)%256;
		aa++;
		if(aa==18)
		{
			aa=0;
			flag=1;
		}	
		
	}
	void disp(uint n)                    //数码管显示函数
	{
	  while(!flag)
	  {
		  ge=0;
		  PC=table[n%10];
		  delay(50);
		  shi=1;ge=1;
		  shi=0;
		  PC=table[n/10];
		  delay(50);
		  shi=1;ge=1;
	   }
	  if(flag==1)
	     flag=0;
	}
	void nanbei()                    //南北绿灯东西红灯及数码管显示
	{		//南北通行
		uint num;
			num=60;
			disp(num);
		   
			while(num<=60&&num>0)
			{	PA=0xd8;
				num--;
			   P1=0xe1;
				disp(num);			
			}			
	}
	void nanbeizuo()                    //南北方向左转及数码管显示
	{		uint num;
			num=15;
		   
			disp(num);
			while(num<=15&&num>0)
			{	P1=0xe4; 	
				num--;
			     PA=0xe9;
			   disp(num);			
			}
	}
	void dongxizuo()                     //东西方向左转及数码管显示
	{		uint num;			
	 		num=15; 
		   
			while(num<=15&&num>0)
			{	P1=0xe4;
				PA=0xea;	  
				disp(num);
				num--;
			}
	}
	void dongxi()                     //东西绿灯南北红灯及数码管显示
	{		uint num;
        
	 		num=45;
		   disp(num);
			while(num<=45&&num>0)
			{	
            PA=0xe4;	
				P1=0xcc;	  
				disp(num);
				num--;
			}
	}
	void nb_flash(void)              //南北方向黄灯闪烁及数码管显示
	{
		uint a;
		
		for(a=3;a>0;a--)
		{	PA=0xd8;
			disp(a);
			P1=0xe2;
	 		
	 		delay(100);
			P1=0xe0;
			
		}
	}
	void dx_flash(void)                //东西方向黄灯闪烁及数码管显示
	{
		uint a;
		
		for(a=3;a>0;a--)
		{	 PA=0xe4;
			 disp(a);
			 P1=0xd4;
			 delay(100);
			 P1=0xa4;
			 
		}
	}
void  xint0()  interrupt 0               //外部中断0
{	
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
   if(key1==0){
		if(key1==0)
		{
			delay(20);
			allred();
			
		}
	}	
	if(key2==0){
		if(key2==0)
		{
			
			delay(20);
			allyellow();
			
		}		
	}
	if(key3==0){
		if(key3==0)
		{
			delay(20);
			nanbeigreen();
		}		
	}
	if(key4==0){
		if(key4==0)
		{
			delay(20);
			dongxigreen();
		}		
	}
	if(key5==0){
		if(key5==0)
		{
			delay(20);
			nanbeizuogreen();
		}		
	}
	
} 
void  allred()                         //南北东西方向全部红灯   
{			
	      
			P1=0xe4;
	      PC=0x00;
         PA=0xe8;  			
			return;
}
void  allyellow()                       //南北东西方向全部黄灯   
{		
	      
		   P1=0xd2;
	      PC=0x00;
         PA=0x00;  			
			return;
}

void  nanbeizuogreen()                    //南北方向左转绿灯  
{			
			P1=0xe4;
	      PC=0x00;
         PA=0xe9;  			
			return;
}
void  dongxizuogreen()                    //东西方向左转绿灯  
{			
			P1=0xe4;
	      PC=0x00;
         PA=0xea;  			
			return;
}

void  nanbeigreen()                       //南北方向绿灯  
{			
			P1=0xe1;
	      PC=0x00;
         PA=0xe8;  
			return;
}
void  dongxigreen()                       //东西方向绿灯  
{			
			P1=0xcc;
	      PC=0x00;
         PA=0xe8;  	
			return;
}
void  xint1()  interrupt 2                     //外部中断1
{	
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
  	dongxizuogreen();
}

运行结果:
在这里插入图片描述
在这里插入图片描述
源代码+Proteus仿真图+实验报告:https://download.csdn.net/download/weixin_43889532/12505623

有问题请在评论区留言!

猜你喜欢

转载自blog.csdn.net/weixin_43889532/article/details/106784362