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

📄 main.c

📁 这是一个关于关键路口智能立体交通灯系统的c程序
💻 C
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint  unsigned int

////////////////////////////////////
//I/O 口定义
sbit	CI_GREEN=P1^0;
sbit	ZHU_GREEN=P1^1;
sbit	CI_ZUO=P1^2;
sbit	ZHU_ZUO=P1^3;
sbit	CI_RED=P1^4;
sbit	ZHU_RED=P1^5;
sbit	CI_YELLOW=P1^6;
sbit	ZHU_YELLOW=P1^7;

sbit	ZHU_LED1=P3^4;
sbit	ZHU_LED2=P3^5;
sbit	CI_LED1=P3^6;
sbit	CI_LED2=P3^7;


////////////////////////////
//位变量定义
bit		bFlag10ms;
bit 	bResponse;
bit		bShan;

////////////////////////////
//字节变量定义
uchar ucKey;
uchar ucNextKey;
uchar ucSetState,ucDispState;
uchar ucZhuTime,ucZhuZhuan,ucCiTime,ucCiZhuan;
uchar ucZhuTimeDisp,ucCiTimeDisp;
uchar ucMiaoCount;
uchar ucShanCount;

////////////////////////////
//常量定义
#define SET_KEY 0xee
#define UP_KEY	0xde
#define DOWN_KEY 0xdd

uchar code DISP_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

////////////////////////////
union 
{
	uchar ucTime0Buf[2];
	uint  uiTime0;
}intChar;

//函数申明
void intSys();
uchar testKey(void);
uchar readKey();
dealKey(uchar tempkey);
void StateCov(void);
void display();
void dispSM(uchar x,uchar y);
delay();

/////////////////////////////////////////////////////////////////////////
void main(void)
{
	uchar temp;
	intSys();
	while(1)
	{
		if(bFlag10ms==1)
		{
			bFlag10ms=0;	
			temp=testKey();
			if(temp!=0xff)
			{
				ucKey=readKey();
				if(ucKey!=0xff)
				{
					dealKey(ucKey);
				}
			}
			else
			{
				bResponse=0;
			}
			if(ucMiaoCount==0)
			{
				ucMiaoCount=99;
				StateCov();
			}
			else
			{
				ucMiaoCount--;
			}
			display();
		}
	}	
}


void timeSer(void) interrupt 1 using 1
{
	TH0=intChar.ucTime0Buf[0];
	TL0=intChar.ucTime0Buf[1];
	bFlag10ms=1;
}

void UARTSer(void) interrupt 4 using 1
{

}

/*********************************************************
*函数名:intSys
*函数功能:系统初始化,包括内存单元、定时器、串行口、中断
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void intSys() 
{

	ucNextKey=0xff;
	ucSetState=ucDispState=0;
	ucZhuTime=20;
	ucZhuZhuan=18;
	ucCiTime=15;
	ucCiZhuan=12;
	ucMiaoCount=99;
	ucShanCount=19;
	ucDispState=0;
	ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
	ucZhuTimeDisp=ucZhuTime;	
	P1=0xff;
	ZHU_GREEN=0;
	CI_RED=0;
	ZHU_LED1=0;
	ZHU_LED2=0;
	CI_LED1=0;
	CI_LED2=0;
	bResponse=0;
	TMOD=0x21;
	intChar.uiTime0=0xffff-10000;
	TH0=intChar.ucTime0Buf[0];
	TL0=intChar.ucTime0Buf[1];
	TR0=1;
	TH1=0xfd;	
	TL1=0xfd;	
	TR1=1;
	SCON=0x50;
	ET0=1;
	ES=1;
	EA=1;
}

/*********************************************************
*函数名:testKey
*函数功能:键盘测试函数,测试键盘是否有键按下
*入口参数:无
*出口参数:返回0xff表示无键按下,否则有键按下
*创建时间:
*创建人:
*修改时间:
**********************************************************/
uchar testKey(void)
{
	uchar i;	
	P0=0xf0;
	i=P0;
	i=i|0x0f;
	return i;
}

/*********************************************************
*函数名:readKey
*函数功能:键盘键值读取函数
*入口参数:无
*出口参数:返回0xff表示无键按下,否则返回对应按键键值
*创建时间:
*创建人:
*修改时间:
**********************************************************/
uchar readKey()
{
	uchar i,j;
	P0=0xf0;
	i=P0;
	P0=0x0f;
	j=P0;
	i=i+j;
	if(ucNextKey==i)
	{
		if(bResponse==0)
		{
			bResponse=1;
			return i;
		}
		else
			return 0xff;			
	}
	else
	{
		ucNextKey=i;
		bResponse=0;
		return 0xff;
	}
}

/*********************************************************
*函数名:dealKey
*函数功能:键盘键值处理函数
*入口参数:键盘键值
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
dealKey(uchar tempKey)
{
	switch(tempKey)
	{
		case SET_KEY:
		{
			if(ucSetState==4)
			{
				ucSetState=0;
				ucDispState=0;
				ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
				ucZhuTimeDisp=ucZhuTime;	
				P1=0xff;
				ZHU_GREEN=0;
				CI_RED=0;
			}		
			else
			{
				ucSetState++;
			}
			break;
		}
		case UP_KEY:
		{
			switch(ucSetState)
			{
				case 0:
				{
					break;
				}
				case 1:
				{
					if(ucZhuTime<80)
						ucZhuTime++;
					break;
				}
				case 2:
				{
					if(ucZhuZhuan<80)
						ucZhuZhuan++;
					break;
				}
				case 3:
				{
					if(ucCiTime<80)
						ucCiTime++;
					break;
				}
				case 4:
				{
					if(ucCiZhuan<80)
						ucCiZhuan++;
					break;
				}
			}
			break;
		}
		case DOWN_KEY:
		{
			switch(ucSetState)
			{
				case 0:
				{
					break;
				}
				case 1:
				{
					if(ucZhuTime>5)
						ucZhuTime--;
					break;
				}
				case 2:
				{
					if(ucZhuZhuan>5)
						ucZhuZhuan--;
					break;
				}
				case 3:
				{
					if(ucCiTime>5)
						ucCiTime--;
					break;
				}
				case 4:
				{
					if(ucCiZhuan>5)
						ucCiZhuan--;
					break;
				}
				default:
					break;
			}
			break;
		}
		default:
			break;
	}			
}

/*********************************************************
*函数名:stateCov
*函数功能:显示状态转换函数
*入口参数:键盘键值
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void StateCov(void)
{
	if(ucSetState==0)
	{
		switch(ucDispState)
		{
			case 0:    //主通道绿灯状态结束判断
			{
				if(ucZhuTimeDisp==1)
				{
					ucDispState++;
					ucZhuTimeDisp=3;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 1:	//主通道黄灯状态结束判断
			{
				if(ucZhuTimeDisp==1)
				{
					ucDispState++;
					ucZhuTimeDisp=ucZhuZhuan;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 2:	//主通道左转弯绿灯状态结束判断
			{
				if(ucZhuTimeDisp==1)
				{
					ucDispState++;
					ucZhuTimeDisp=3;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 3:	//主通道左转弯绿灯闪烁状态结束判断
			{
				if(ucZhuTimeDisp==1)
				{
					ucDispState++;
					ucZhuTimeDisp=ucCiTime+ucCiZhuan+6;
					ucCiTimeDisp=ucCiTime;
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 4:	//次通道绿灯状态结束判断
			{
				if(ucCiTimeDisp==1)
				{
					ucDispState++;
					ucCiTimeDisp=3;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 5:	//次通道黄灯状态结束判断
			{
				if(ucCiTimeDisp==1)
				{
					ucDispState++;
					ucCiTimeDisp=ucCiZhuan;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 6:	//次通道左传绿灯状态结束判断
			{
				if(ucCiTimeDisp==1)
				{
					ucDispState++;
					ucCiTimeDisp=3;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			case 7:	//次通道左传绿灯闪烁状态结束判断
			{
				if(ucCiTimeDisp==1)
				{
					ucDispState=0;
					ucCiTimeDisp=ucZhuTime+ucZhuZhuan+6;
					ucZhuTimeDisp=ucZhuTime;	
				}	
				else
				{
					ucZhuTimeDisp--;
					ucCiTimeDisp--;
				}
				break;
			}
			default:
				break;
		}
	}
}

/*********************************************************
*函数名:display
*函数功能:灯和数码管显示函数
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void display()
{
	uchar x,y;
	if(ucShanCount==0)
	{
		ucShanCount=19;
		bShan=~bShan;
	}
	else
	{
		ucShanCount--;
	}
	switch(ucSetState)
	{
		case 0:
		{
			x=ucZhuTimeDisp;
			y=ucCiTimeDisp;
			switch(ucDispState)
			{
				case 0:
				{
					P1=0xff;
					ZHU_GREEN=0;
					CI_RED=0;
					break;
				}
				case 1:
				{
					P1=0xff;
					ZHU_YELLOW=0;
					CI_RED=0;
					break;
				}
				case 2:
				{
					P1=0xff;
					ZHU_ZUO=0;
					CI_RED=0;
					break;
				}
				case 3:
				{
					P1=0xff;
					ZHU_ZUO=bShan;
					CI_RED=0;
					break;
				}
				case 4:
				{
					P1=0xff;
					ZHU_RED=0;
					CI_GREEN=0;
					break;
				}
				case 5:
				{
					P1=0xff;
					ZHU_RED=0;
					CI_YELLOW=0;
					break;
				}
				case 6:
				{
					P1=0xff;
					ZHU_RED=0;
					CI_ZUO=0;
					break;
				}
				case 7:
				{
					P1=0xff;
					CI_ZUO=bShan;
					ZHU_RED=0;
					break;
				}
				default:
					break;
			}
			break;			
		}
		case 1:
		{
			P1=0xff;
			ZHU_YELLOW=0;
			CI_YELLOW=0;
			ZHU_GREEN=0;
			x=ucZhuTime;
			y=ucCiTime;
			break;			
		}
		case 2:
		{
			P1=0xff;
			ZHU_YELLOW=0;
			CI_YELLOW=0;
			ZHU_ZUO=0;
			x=ucZhuZhuan;
			y=ucCiZhuan;
			break;			
		}
		case 3:
		{
			P1=0xff;
			ZHU_YELLOW=0;
			CI_YELLOW=0;
			CI_GREEN=0;
			x=ucZhuTime;
			y=ucCiTime;
			break;			
		}
		case 4:
		{
			P1=0xff;
			ZHU_YELLOW=0;
			CI_YELLOW=0;
			CI_ZUO=0;
			x=ucZhuZhuan;
			y=ucCiZhuan;
			break;			
		}
		default:
			break;
	}
	dispSM(x,y);
}

/*********************************************************
*函数名:dispSM
*函数功能:数码管显示驱动函数
*入口参数:无
*出口参数:无
*创建时间:
*创建人:
*修改时间:
**********************************************************/
void dispSM(uchar x,uchar y)
{
	uchar i,j;
	i=x/10;
	j=x%10;
	ZHU_LED1=0;
	P2=DISP_TAB[i];
	ZHU_LED1=1;
	delay();
	ZHU_LED1=0;
	ZHU_LED2=0;
	P2=DISP_TAB[j];
	ZHU_LED2=1;
	delay();
	ZHU_LED2=0;

	i=y/10;
	j=y%10;
	CI_LED1=0;
	P2=DISP_TAB[i];
	CI_LED1=1;
	delay();
	CI_LED1=0;
	CI_LED2=0;
	P2=DISP_TAB[j];
	CI_LED2=1;
	delay();
	CI_LED2=0;
}

//////////////////////////////////////////
delay()
{
	uint i;
	for(i=200;i>0;i--);
}

⌨️ 快捷键说明

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