⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traffic.c

📁 完全可以用的交通灯单片机控制程序。5秒自动提醒功能
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char

sbit led1=P2^0;   //定义各管脚
sbit led2=P2^1;
sbit CO1=P2^2;
sbit CO2=P2^3;
sbit CO3=P2^4;
sbit CO4=P2^5;
sbit K1=P3^1;	 //
sbit K2=P3^2;
sbit K3=P3^3;
sbit K4=P3^4;
sbit K5=P3^5;
sbit beep=P3^6;
uchar second,state;
uchar state=1;    //初始化
uchar urgent=1;
uchar standard;
uchar t1=10;
uchar t2=20;
uchar t3=15;
uchar t4=25;
unsigned char code table[]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 
							0x6D, 0x7D, 0x07, 0x7F, 0x6F};//0-9	   共阴
bit flag =0 ;
uchar stateflag =0;

/*****************************************************************************
**  函数名称:delay()
**  功能描述:延时子程序,大约延时 n MS
**  输  入:  n
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
delay(int n)
{uchar k;int j;
 for(j=n;j>0;j--)
  for(k=125;k>0;k--);
}

/*****************************************************************************
**  函数名称:speaker()
**  功能描述:峰鸣器程序
**  输  入:  
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
speaker()
{
beep=0;delay(100);beep=1;
}


/*****************************************************************************
**  函数名称:speaker1()
**  功能描述:峰鸣器程序,峰鸣警告时间较长
**  输  入:  
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
speaker1()
{
beep=0;delay(2000);beep=1;delay(100);
}
/*****************************************************************************
**  函数名称:timer0()
**  功能描述:中断子程序
**  输  入:  
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void timer0() interrupt 1 using 0
{uchar tcount;
if(urgent!=2)
 {
 TH0=(65536-50000)/256;           //中断设置初始化                   
 TL0=(65536-50000)%256;       
 tcount++;                                
  
  if(tcount==20)
 {tcount=0;second++;
  if(standard-second<=5)
   speaker();
  if(second==standard)
     {second=0;state++;speaker();    //4种交通灯状态的转变
       if(state==5)
         {state=1;
         }
       if(state==1)
        {standard=t1;
        }
       if(state==2)
        {
		standard=t2;
        }
		if(state==3)
        {
		standard=t3;
        }  
	   if(state==4)
        {
		standard=t4;    
        }
  }
 }
}
}

/*****************************************************************************
**  函数名称:key()
**  功能描述:键盘事件显测程序
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void key()
{
	
   if(K1==0)        //按下键1
   {
   		delay(1000);  //软件去抖
     if(K1==0){
       delay(1000);
      if(K1==0){
      delay(1000);
     if(K1==0){
      if(K1==0) 
      urgent++;speaker();
      if(urgent==2)
      {EA=1;ET0=1;TMOD=0x21;TR0=0;second=standard-1;state=6;}
      if(urgent==3)
      {urgent=1;}
      if(urgent==1)
      {EA=1;ET0=1;TMOD=0x21;TR0=1;second=0;state=1;}
    }}}}
  if(K2==0 && urgent!=2)    //按下键2且不处于紧急状态
     {delay(30);
	     if(K2==0) 
		 while(K2==0);
         state++;speaker();
         second=0;
         if(state==5)
         {state=1;
         }
       if(state==1)
        {standard=t1;
        }
       if(state==2)
        {
		standard=t2;
        }
		if(state==3)
        {
		standard=t3;
        }  
	   if(state==4)
        {
		standard=t4;    
        }
   	}

	while((K5 ==0 ||flag == 1)&& urgent!=2 )
	{
		
		EA = 0 ;	
		flag = 1  ;
		if(K5 ==0) 
		{
			delay(30);
			if(K5 == 0)
			{
				stateflag++;				
				if(stateflag==5)
				 stateflag=1;
				
				while(K5 ==0);
			 }
		 }
		 

		if(stateflag ==1)
		{
			if(K4 == 0)
			{
				delay(30);
				if(K4 == 0)
				{
					if(t1<99)
					t1++ ; 
					speaker();
					while(K4==0);
				}
			 }
			 if(K3 == 0)
			{
				delay(30);
				if(K3 == 0)
				{
					if(t1>1)
					t1-- ; 
					speaker();
					while(K3==0);
				}
				
			}
			P1=table[t1%10];   //数码管动态显示
 			 led1=0;
 			 delay(5);
  			led1=1;
 			 P1=table[t1/10];
  			led2=0;
 			 delay(5);
 			 led2=1;

		 }
		if(stateflag ==2)
		{
			if(K4 == 0)
			{
				delay(30);
				if(K4 == 0)
				{
					if(t2<99)
					t2++ ; 
					speaker();
					while(K4==0);
				}
			 }
			 if(K3 == 0)
			{
				delay(30);
				if(K3 == 0)
				{
					if(t2>1)
					t2-- ; 
					speaker();
					while(K3==0);
				}
				
			}
			P1=table[t2%10];   //数码管动态显示
 			 led1=0;
 			 delay(5);
  			led1=1;
 			 P1=table[t2/10];
  			led2=0;
 			 delay(5);
 			 led2=1;

		 }
		 	if(stateflag ==3)
		{
			if(K4 == 0)
			{
				delay(30);
				if(K4 == 0)
				{
					if(t3<99)
					t3++ ; 
					speaker();
					while(K4==0);
				}
			 }
			 if(K3 == 0)
			{
				delay(30);
				if(K3 == 0)
				{
					 if(t3>1)
					t3-- ; 
					speaker();
					while(K3==0);
				}
				
			}
			P1=table[t3%10];   //数码管动态显示
 			 led1=0;
 			 delay(5);
  			led1=1;
 			 P1=table[t3/10];
  			led2=0;
 			 delay(5);
 			 led2=1;

		 }
				if(stateflag ==4)
		{
			if(K4 == 0)
			{
				delay(30);
				if(K4 == 0)
				{
					if(t4<99)
					t4++ ; 
					speaker();
					while(K4==0);
				}
			 }
			 if(K3 == 0)
			{
				delay(30);
				if(K3 == 0)
				{	
					if(t4>1)
					t4-- ; 
					speaker();
					while(K3==0);
				}
				
			}
			P1=table[t4%10];   //数码管动态显示
 			 led1=0;
 			 delay(5);
  			led1=1;
 			 P1=table[t4/10];
  			led2=0;
 			 delay(5);
 			 led2=1;

		 }
		 if(K2==0)
		 {
		 	delay(10);
			if(K2==0)
			{
				flag=0;
				EA=1;
				 stateflag =0;
				break;
			}
		 }	
	} 		 
}		
		  	


/*****************************************************************************
**  函数名称:led()
**  功能描述:数码管倒计时显示程序
**  输  入:  n
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void display(char state)
{if(state!=6)        //首先判断是否紧急状态,整风进行正常的4种状态的自动转变
 {if(state==1)       //S1状态的交通指示灯的亮灭情况
   {P0=0x1e;
    CO1=0;
    CO2=1;
	CO3=0;
	CO4=1;
   }
 if(state==2)        //S2状态的交通指示灯的亮灭情况
   {P0=0x1d;
    CO1=0;
    CO2=1;
	CO3=1;
	CO4=0;
   }
 if(state==3)        //S3状态的交通指示灯的亮灭情况
   {P0=0x33;
    CO1=0;
    CO2=1;
	CO3=0;
	CO4=1;
   }
 if(state==4)        //S4状态的交通指示灯的亮灭情况
   {P0=0x2b;
    CO1=1;
    CO2=0;
	CO3=0;
	CO4=1;
   }
  P1=table[(standard-second)%10];   //数码管动态显示
  led1=0;
  delay(5);
  led1=1;
  P1=table[(standard-second)/10];
  led2=0;
  delay(5);
  led2=1;
}
if(state==6)                //紧急状态的交通灯的亮灭情况及数码管显示99
 {P0=0x1b;
    CO1=0;
    CO2=1;
	CO3=0;
	CO4=1;
    P1=table[9];
    led1=0;
    led2=0;
    speaker1();
 }
}

/*****************************************************************************
**  函数名称:main()
**  功能描述:主程序
**  输  入:
**  输  出:
**  全局变量:
**  调用模块:
**
**----------------------------------------------------------------------------
******************************************************************************/
void main()
{
standard=t1;
 second=0;   //设置初始时间
 TH0=(65536-50000)/256;      //中断设置初始化
 TL0=(65536-50000)%256;
 EA=1;ET0=1;TMOD=0x21;TR0=1; //开中断总开关,计数器0允许中断,设置中断模式,启动计数器0
 while(1)                    //死循环,进入显示,主要是动态显示原理
{
key();
display(state);            //调用交通状态,状态机原理
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -