普中A2开发板红绿灯实验


```#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k3=P3^2;
sbit k4=P3^3;

sbit LSA=P2^2//定义位选;
sbit LSB=P2^3;
sbit LSC=P2^4;

sbit red1=P2^0;//东西红
sbit green1=P2^1;//东西绿
sbit red2=P2^5;//南北红
sbit green2=P2^6;//南北绿
sbit yellow=P2^7;//黄灯

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//数码管显示

u8 ssec=0,sec=0;
u8 DisplayData[2];
u8 ssec007=0,sec007=0;


void delay(u16 i)//延时函数
{
	while(i--);
}
void delay1s()//延时1s函数
{
	unsigned char a,b,c;
	for(c=167;c>0;c--)
	for(b=171;b>0;b--)
	for(a=70;a>0;a--);
}

void DigDisplay()//数码管动态显示
{
	u8 i;
	for(i=0;i<2;i++)
	{
	switch(i)
		{
			case(0):LSA=0;LSB=0;LSC=0;break;//第八位
			case(1):LSA=1;LSB=0;LSC=0;break;//第七位
		}
	P0=DisplayData[i];//显示
	delay(100);//延时
	P0=0x00;//消隐
	}
}

void Timer0Init()//初始化  
{
	TMOD|=0x01;//定时器
	TH0=0xd8;//赋初值
	TL0=0xf0; //d8f0是55536
	ET0=1;//打开定时器
	TR0=1;//允许工作
	EA=1;//总中断
}


void Timer()interrupt 1//定时器
{
	TH0=0xd8;
 	TL0=0xf0;//55536
 	ssec++;
	if(ssec>=100)//一秒
	{
		ssec=0;
		sec++;
		if(sec>=0&&sec<=20)  
 			{
				red1=0;
				green1=1;
				red2=1;
				green2=0;
				yellow=1;//状态1
			}
 		if(sec>=21&&sec<=24)
 			{
			  	red1=0;
				green1=1;
				red2=1;
				green2=1;
				yellow=0;//状态2
			}
 		if(sec>=25&&sec<=45) 
 			{
	 		 	red1=1;green1=0;
				red2=0;green2=1;
				yellow=1;//状态3

 			}
 		if(sec>=46&&sec<=49) 
 			{
				red1=1;
				green1=1;
				red2=0;
				green2=1;
				yellow=0;//状态4
 			}
 		if(sec>49)
 			{
	 
 					sec=0;//大于49重新开始
 			}
	}

}
void datapros()//数码管显示
{
	if(sec>=0&&sec<=20)//状态1数码管显示
		{
			DisplayData[0]=smgduan[(20-sec)%10];        
			DisplayData[1]=smgduan[(20-sec)/10];
 		}
 	if(sec>=21&&sec<=24)//状态2数码管显示
 		{
  			DisplayData[0]=smgduan[(24-sec)%10];
 			DisplayData[1]=smgduan[(24-sec)/10];
 		}
 	if(sec>=25&&sec<=45)//状态3 数码管显示
 		{
  			DisplayData[0]=smgduan[(45-sec)%10];  
 			DisplayData[1]=smgduan[(45-sec)/10];
 		}
  	if(sec>=46&&sec<=49)//状态4数码管显示
 		{
  			DisplayData[0]=smgduan[(49-sec)%10];
 			DisplayData[1]=smgduan[(49-sec)/10];
 		}

}



void Int0Init()
{
	IT0=1;//中断触发方式下降沿
	EX0=1;//打开中断
	EA=1;	//打开总中断

}



void main()
{
	Timer0Init();//调用初始化函数
while(1)
	{

		datapros();	//数码管显示
 		DigDisplay();//显示为
 		Int0Init(); //打开中断  
	}
}

void Int0()	interrupt 0	//中断函数	
{
	u16 da,h=0,xiao;
	u16 sec007=0;
	Int0Init();
	delay(100);
	for (da=0;da<60;da++)//通过延时的循环和语句的循环达到接近60秒的时间
		{
			red1=0;
			red2=1;
			yellow=1;
			green1=1;
			green2=0;
			delay(800);
			if(sec007>=0&&sec007<=60)//数码管显示
				{
					DisplayData[0]=smgduan[(60-sec007)%10];        
					DisplayData[1]=smgduan[(60-sec007)/10];
		 		}
				sec007++;	
				ssec007++;
				delay(750);
				for(h=0;h<250;h++)
				 {
					for(xiao=0;xiao<2;xiao++)
						{
							switch(xiao)
								{
									case(0):LSA=0;LSB=0;LSC=0;break;
									case(1):LSA=1;LSB=0;LSC=0;break;
								}
							P0=DisplayData[xiao];
							delay(250);
							P0=0x00;
						} 
				}	
		}					
	IT0=0;//关闭中断
	EX0=0;//关闭总中断	

}

普中A2开发版:最开始出现好多错误,最先自己发现数码管和LED灯不能同时使用,经过多方求证和探索,确实LED灯和数码管显示的位选不能同时使用,虽然单片机具有分时复用的特性,但是数码管显示和LED灯是同时工作,因为你红绿灯的工作的同时数码管还需要计时,黄灯是一个
发布了5 篇原创文章 · 获赞 3 · 访问量 291

猜你喜欢

转载自blog.csdn.net/weixin_45367509/article/details/103481113