普中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燈是同時工作,因爲你紅綠燈的工作的同時數碼管還需要計時,黃燈是一個
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章