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

📄 jiaotongdeng.c

📁 这是一款简易的模拟交通灯加上后面的键控等功能。。用二级管显示。。。。调试可用
💻 C
字号:
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int

sbit dula=P2^6;
sbit wela=P2^7;

sbit NSGreen=P1^0;
sbit NYellow=P1^1;
sbit SYellow=P2^0;
sbit NSRed=P1^2;
sbit NSBlue=P1^3;

sbit WEGreen=P1^4;
sbit WYellow=P1^5;
sbit EYellow=P2^1;
sbit WERed=P1^6;
sbit WEBlue=P1^7;

uchar code table_dula[]={
		0x3f,0x06,0x5b,0x4f,
		0x66,0x6d,0x7d,0x07,
		0x7f,0x6f,0x77,0x7c,
		0x39,0x5e,0x79,0x71};
uchar table_deng[]={12,8,20};

uchar miltimes = 0;//记录十毫秒
uchar seccount = 0;//记录秒
uchar Redsec;
uchar NYellowsec;
uchar SYellowsec;
uchar Yellowsec;
uchar WYellowsec;
uchar EYellowsec;
uchar Greensec;

uchar time,flash,num,key;
void display_NS(uchar);
void display_WE(uchar);
uchar keyscan();
uchar keyshow();
void display(uchar);
/*****外部中断0初始化*********/
void ini_0()
{
	EA=1;
	EX0=1;
	IT0=1;
}

void int0() interrupt 0
{
	uchar i;
	for(i=0;i<3;i++)
	{
		
	}	
}
void delay(uint z)
{
		uint x,y;
		for(x=z;x>0;x--)
		  {
			for(y=110;y>0;y--)
				{}
          }
}

void ini()
{
	TMOD=0X01;
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void chushihua()
{
	Greensec=table_deng[0];
	Yellowsec=table_deng[1];
	Redsec=table_deng[2];
	NYellowsec=WYellowsec=Yellowsec/2;
}
void main()
{
	ini();
	ini_0();
	chushihua();
	time=100;
	NSGreen=0;
	WERed=0;
	while(1)
	{
		if(miltimes==100)
		{
			miltimes=0;
			seccount++;
			display_NS(Greensec-seccount);
			display_WE(Redsec-seccount);
		if(seccount==Greensec)
			{
				NSGreen=1;
				NYellow=0;
				SYellow=0;
				NSBlue=1;
			}
			if((seccount>Greensec)&&(seccount<=Greensec+Yellowsec))
			{
				display_NS(Greensec+Yellowsec-seccount);
			}
			if(seccount==Greensec+Yellowsec)
			{
				NYellow=1;
				SYellow=1;
				NSRed=0;
				WERed=1;
				WEGreen=0;
				WEBlue=0;
			}

			
			if((seccount>Greensec+Yellowsec)&&(seccount<Greensec+Yellowsec+Redsec))
			{
				display_NS(Greensec+Yellowsec+Redsec-seccount);
				if((seccount>Greensec+Redsec)&&(seccount<Redsec+Greensec+Yellowsec))
				{
					WYellow=0;
					EYellow=0;
					WEGreen=1;
					WEBlue=1;
					display_WE(Redsec+Greensec+Yellowsec-seccount);
					
				}
				else
				display_WE(Redsec+Greensec-seccount);
			}	
			if(seccount==Greensec+Yellowsec+Redsec)
			{
				WYellow=1;
				EYellow=1;
				WEGreen=1;
				WEBlue=1;
				WERed=0;
				NSGreen=0;
				NSRed=1;
				NSBlue=0;
				seccount=0;
			}	
		}

	}
}
void t0() interrupt 1
{
	TH0=(65535-10000)/256;
	TL0=(65535-10000)%256;
	miltimes++;
	if(miltimes%10==0)
	{
		flash++;
		if(flash==255){flash=0;}
		if((Greensec+NYellowsec-seccount)>0&&(Greensec+NYellowsec-seccount)<4)
		{
			SYellow=flash%2;
		}
		if((Greensec+Yellowsec-seccount)>0&&(Greensec+Yellowsec-seccount)<4)
		{
			NYellow=flash%2;
		}
		if((Redsec+Greensec+NYellowsec-seccount)>0&&(Redsec+Greensec+NYellowsec-seccount)<4)
		{
			EYellow=flash%2;
		}
		if((Redsec+Greensec+Yellowsec-seccount)>0&&(Redsec+Greensec+Yellowsec-seccount)<4)
		{
			WYellow=flash%2;
		}
		if((Greensec-seccount>0)&&(Greensec-seccount<5))
		{
			NSGreen=flash%2;
		}
		
		if(seccount<Greensec)
		{
			NSBlue=flash%2;
		}
		if((Redsec+Greensec-seccount)>0&&(Redsec+Greensec-seccount)<5)
		{
			WEGreen=flash%2;
		}
		if((seccount>Redsec)&&(seccount<Redsec+Greensec))
		{
			WEBlue=flash%2;
		}
	}
}

void display_NS(uchar k)
{
	uchar i,j;
	if(k>0&&k<100)
	{
		i=k/10;
		j=k%10;
		
		P0=table_dula[i];
		dula=1;
		dula=0;

		P0=0xf7;
		wela=1;
		wela=0;
		delay(time);

		P0=table_dula[j];
		dula=1;
		dula=0;

		P0=0xfb;
		wela=1;
		wela=0;
	}	
}

void display_WE(uchar k)
{
	uchar i,j;
	if(k>0&&k<100)
	{
		i=k/10;
		j=k%10;
		
		P0=table_dula[i];
		dula=1;
		dula=0;

		P0=0x7f;
		wela=1;
		wela=0;
		delay(time);

		P0=table_dula[j];
		dula=1;
		dula=0;

		P0=0xbf;
		wela=1;
		wela=0;
	}	
}




/*uchar keyscan()//循环扫描!!
{
	uchar rcode , lcode;
	P3=0xf0; //先将第四位置为0
	if((P3&0xf0)!=0xf0) //按键后的P0与0xf0相与
 	{
		delay(5);
		if((P3&0xf0)!=0xf0) 
	 	{
			rcode = 0xfe;
			while((rcode&0x10)!=0)//rcode不能变为1110 1111
		 	{
				P3 = rcode;
				if((P3&0xf0)!=0xf0)
			 	{
					lcode = P3&0xf0;
					rcode = rcode&0x0f;
					return(rcode|lcode);
				}
				else
				rcode = (rcode<<1)|0x01;//1111 1110变为1111 1101
			}
		}
	}
	return(0);
}
	

void display(uchar k)
{
	P0=table_dula[k];
	dula=1;
	dula=0;
}

uchar keyshow()
{
	key = keyscan();
	switch(key)
	{
		case 0xee: num=0;break;
		case 0xde: num=1;break;
		case 0xbe: num=2;break;
		case 0x7e: num=3;break;
		case 0xed: num=4;break;
		case 0xdd: num=5;break;
		case 0xbd: num=6;break;
		case 0x7d: num=7;break;
		case 0xeb: num=8;break;
		case 0xdb: num=9;break;
		case 0xbb: num=10;break;
		case 0x7b: num=11;break;
		case 0xe7: num=12;break;
		case 0xd7: num=13;break;
		case 0xb7: num=14;break;
		case 0x77: num=15;break;
		default :break;
	}
	return num;
	delay(5);
}*/

⌨️ 快捷键说明

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