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

📄 0820.c

📁 全功能交通灯设计智能交通灯.rar
💻 C
字号:
///////////////////////////////////////////////////////////////////
//新规则交通灯设计/////////////////////////////////////////////////
//设置P3.0,P3.1,P3.2三个按键调节时间,key1(功能键)/////////////
//调节主次通道的时间,key2(减一键),key3(加一键)///////////////////// 
//增加串口通信,人机互动//////
////黄山////
#include <reg51.h>	  //定义头文件
#include <stdio.h>
#define uchar     unsigned char	 //定义无符号变量
#define uint      unsigned int	   //定义有符号变量
uchar count,key1num,flag,a,zg,zr,y,cg,cr,numzg,numzr,numcg,numcr,countser,flagSer,dyflagSer;
sbit key1=P3^3;
sbit key2=P3^1;
sbit key3=P3^2;
sbit zshi=P3^7;
sbit zge=P3^6;
sbit cshi=P3^5;
sbit  cge=P3^4;
uchar code  dis[]={
							
	0X3f,/*0*/
	0X06,/*1*/
	0X5b,/*2*/
	0X4f,/*3*/
	0X66,/*4*/
	0X6d,/*5*/
	0X7d,/*6*/
	0X07,/*7*/
	0X7f,/*8*/
	0X6f,/*9*/
	0X00,/*NULL*/
};			   //0-9位七段共阴数码管显示


void delay(uint c)	  //延时子程序
{
   uint i,j;
    for(i=0;i<c;i++)
	  for(j=0;j<100;j++);
	
}

void init()	   //初始化子程序
{
	TMOD=0x21;//设置定时器0为工作方式1
	TH0=(65536-10000)/256;
	TL0=(65536-10000)%256;
	TH1=0xfd;
	TL1=0xfd;
	EA=1;//开总中断
	ET0=1;//开定时器0中断
	TR0=1;//启动定时器0
	TR1=1;
	REN=1; //允许串口中断,采用串口中断法
	SM0=0;
	SM1=1;
	ES=1;//中断
	y=3;
	zg=30;
	zr=23;
	cg=20;
	cr=33;

	P3=0xff;
	P2=0x00;
	P1=0x00;

}
void guan()	 //消影子程序
{
	zshi=1;
	cshi=1;
	zge=1;
	cge=1;

}
void display(uchar dat_z,dat_c)	 //显示子程序
{

			zshi=1;
			P1=dis[(dat_z)%10];
			zshi=0;
			delay(5);
	 guan();
	
			zge=1;
			P1=dis[(dat_z)/10];
			zge=0;
			delay(5);
	guan();	   

			cshi=1;
			P2=dis[(dat_c)%10];
			cshi=0;;
			delay(5);
	guan();
			cge=1;
			P2=dis[(dat_c)/10];
			cge=0;
			delay(5);
				
}
void displayy(uchar dat)
{
	 		zshi=1;
			P1=dis[dat];
			zshi=0;
			delay(5);
	guan();	

		cshi=1;
			P2=dis[dat];
			cshi=0;
			delay(5);
				guan();	
}
void displayz(uchar dat_z)
{
	  			zshi=1;
			P1=dis[(dat_z)%10];
			zshi=0;
			delay(5);
	 guan();
	
			zge=1;
			P1=dis[(dat_z)/10];
			zge=0;
			delay(5);
	guan();	
}
void displayc(uchar dat_c)
{
	
			cshi=1;
			P2=dis[(dat_c)%10];
			cshi=0;;
			delay(5);
	guan();
			cge=1;
			P2=dis[(dat_c)/10];
			cge=0;
			delay(5);
	guan();			
}
void keyscan()
{
	if(key1==0)
	{
		delay(5);
		if(key1==0)
		{
		    while(!key1)
			{
				if(flag==0)
				 {
				 	display(zg,cr);	
				 }
				 if(flag==2)
				 {
				 	display(cg,zr);
				 }
			}	
			key1num++;
				if(key1num==1)
		{
			TR0=0;

		}
		if(key1num==3)
		{
			TR0=1;
			key1num=0;
		}

		}
	
	}
	if(key1num!=0)
	{
		if(key1num==1)
		{
			if(key2==0)
			{
				delay(2);
				if(key2==0)
				{	
				  while(!key2)
				   {
						if(flag==0)
						 {
						 	displayz(zg);	
						 }
						 if(flag==2)
						 {
						 	displayz(cg);
						 }
					}
					 if(flag==0)
						 {
						 	zg++;	
						 }
						 if(flag==2)
						 {
						 	cg++;
						 }
			
				}
			
			}

				if(key3==0)
				{
					delay(5);
					if(key3==0)
					{
						while(!key3)
						{
									if(flag==0)
								 {
								 	displayz(zg);	
								 }
								 if(flag==2)
								 {
								 	displayz(cg);
								 }
						}
					
						 if(flag==0)
						 {
						 	zg--;	
						 }
						 if(flag==2)
						 {
						 	cg--;
						 }
					  } 
						
				}
		}

		if(key1num==2)
		{
			if(key2==0)
			{
				delay(5);
				if(key2==0)
				{
					 while(!key2)
						{
							if(flag==0)
						 {
						 	displayc(cr);	
						 }
						 if(flag==2)
						 {
						 	displayc(zr);
						 }
						}
						if(flag==0)
						 {
						 	cr++;	
						 }
						 if(flag==2)
						 {
						 	zr++;
						 }
				}
			}
			if(key3==0)
			{
				delay(5);
				if(key3==0)
				{
					while(!key3)
					{
						 	if(flag==0)
						 {
						 	displayc(cr);	
						 }
						 if(flag==2)
						 {
						 	displayc(zr);
						 }
					}
						if(flag==0)
						 {
						 	cr--;	
						 }
						 if(flag==2)
						 {
						 	zr--;
						 }
				}
			}
		}

	}
}

/*
 void keyscan()	//键盘扫描子程序,KEY1功能键,KEy2减一键,KEY3加一键
{
	
	if(key1==0)
	{
		delay(5);
		if(key1==0)
		{
			key1num++;
			while(!key1)
			{
				display(num,num1);
			}
			if(key1num==1)
			{
				TR0=0;
			}
			if(key1num==3)
			{
				key1num=0;
				TR0=1;
			}
		}
	}
	if(key1num!=0)	//先判断功能设置键
	{
		if(key2==0)
		{
			delay(5);
			if(key2==0)
			{
				if(key1num==1)
				{
					while(!key2)
					{
						displayz(num);		  
					}
					num++;
					if(num==56)
					{
						num=0;
					}
				}
				if(key1num==2)
				{
					while(!key2)
					{
						displayc(num1);

					}
						num1++;
						if(num1==56)
						num1=0;
				}
			}
		}
		if(key3==0)			 //减一键
		{
			delay(5);
			if(key3==0)
			{
				if(key1num==1)
				{
					while(!key3)
					{
						displayz(num);
					}
					num--;
					if(num==0)
					{
						num=56;
					}
				}
				if(key1num==2)
				{
					while(!key3)
					{
						displayc(num1);

					}
					num1--;
					if(num1==0)
					num1=56;
				}
			}
		}
	}


}			   */
void shuanfa()
{
	if(count==8)	//自动倒计时功能
		{
			count=0;
				if(flag==0)
			{
				zg--;cr--;
				if(zg>cr)
				{
					if(cr==0)
					{
						if(zg>3)
						{
					//	 flag=0;
						 cr=zg;
						 y=4;
						}
						if(zg==3)
						{
							flag=1;
							y=4;
						}
						
					}
				}
				if(zg<cr)
				{
					if(zg==0)
					{
						if(cr>3)
						{
				//		  flag=0;
						  zg=cr;
						  y=4;
						}
						if(cr==3)
						{
							flag=1;
							y=4;
						}
					}
				}
				if(zg==cr)
				{
					flag=0;
					if(zg==0)
					{
						flag=1;
					}
					y=4;
				}

			 }

			 if(flag==1)
			 {
			 	y--;
				if(y==0)
				{
					flag=2;
				}
			 }
			 if(flag==2)
			 {
			 	zr--;cg--;
				if(zr>cg)
				{
					if(cg==0)
					{
						if(zr>3)
						{
					//	 flag=2;
						 cg=zr;
						 y=4;
						}
						if(zr==3)
						{
							flag=3;
							y=4;
						}
						
					}
				}
				if(zr<cg)
				{
					if(zr==0)
					{
						if(cg>3)
						{
				//		  flag=2;
						  zr=cg;
						  y=4;
						}
						if(cg==3)
						{
							flag=3;
							y=4;
						}
					}
				}
				if(zr==cg)
				{
					flag=2;
					if(zr==0)
					{
						flag=3;
					}
				}

			 }
			 if(flag==3)
			 {
			 	y--;
				if(y==0)
				{
					flag=0;
					zr=23;zg=30;cr=33;cg=20;
				}
			 }
			
		}

		if(key1num!=0)
		{
		   if(key1num==1)
		   {
		   		if(flag==0)
						 {
						 	displayz(zg);	
						 }
						 if(flag==2)
						 {
						 	displayz(cg);
						 }
		   }
		   if(key1num==2)
		   {
		   			if(flag==0)
						 {
						 	displayc(cr);	
						 }
						 if(flag==2)
						 {
						 	displayc(zr);
						 }
		   }
		}	  
		if(key1num==0)
		{
			 if(flag==0)
			 {
			 	P0=0xdd;//红灯
			 	display(zg,cr);	
			 }
			 if(flag==1)					  
			 {
			 		P0=0xd4;
			 		displayy(y);
			 }
			 if(flag==2)
			 {
			 	P0=0xeb;
			 	display(cg,zr);
			 }
			 if(flag==3)
			 {
			 	P0=0xe2;//黄灯
			 	displayy(y);
			 }
		 
		}		
	
}
void serPort()
{
 	if(countser==1)
	{
		    ES=0;
			countser=0;
			SBUF=a;
			while(!TI);
			TI=0;
			ES=1;

		
	
		if(a==0x11)
		{
			flagSer=1;	  //标志位
			TR0=0;	  //停止计数器
		}
		if(a==0xff)
		{
			TR0=1;	   //标志位
			flagSer=0;	   //启动
		key1num=0;
		}
		if(flagSer==1)
		{
			if(a==0x01)
			{
			  key1num=1;
			  dyflagSer=1;
			  a=0;
			}
			 if(a==0x02)
			 {
			   key1num=2;
			   dyflagSer=2;
			   a=0;
			 }
			 if(dyflagSer==1)
			 {
			 	       if(flag==0)
						 {
						 	zg=SBUF;	
						 }
						 if(flag==2)
						 {
						      cg=SBUF;
						 }
			 }
			 if(dyflagSer==2)
			 {
			 	  	if(flag==0)
						 {
						 	cr=SBUF;	
						 }
						 if(flag==2)
						 {
						 	zr=SBUF;
						 }
			 }
		}
	}

}

void main()			//程序主函数
{
	
	init();		//初始化程序
	while(1)
	{
		keyscan();
		shuanfa();
		serPort();
	
	 }
}
void t0(void ) interrupt 1  //定时器T0	中断计时用
{
	TH0=(65535-50000)/256;
	TL0=(65535-50000)%256;
	count++;	
}
////////////////////////////////////////////
//串口通信////////////////
//发送0x00,数码管停止,发送0xff,计时起动///
//发送0x01,设置主通道的时间//////////
//发送0x02   设置次通道的时间////////
void ser() interrupt 4
{
	RI=0;
//	P1=SBUF;
	a=SBUF;
	countser=1;
}

⌨️ 快捷键说明

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