用51單片機實現愛心跑馬燈程序

用51單片機實現愛心跑馬燈程序


本人閒來無事做,見實驗室的小夥伴用LED等做了一個跑馬燈,頓時引來了一大羣妹子,當時就不服了,哼,不就是一個流水燈,說的跟誰不會一樣


製作的是32個LED燈的愛心流水燈,至於燈怎麼安放,我就不多說了,關鍵是怎麼連接佈線。


由於條件有限,沒有製作PCB的工具,所以就用的洞洞板,32個LED共陰極,連接在51單片機的GND上,每個LED的正極分別連接單片的一個引腳,


我的所有線路全是用電烙鐵焊接的,線路醜爆了,在此就不上圖了,爲了後續程序好寫一點,LED的正極和單片機的引腳的連線最好多考慮一下


好了,廢話不多說了,直接上代碼,只做了幾個動畫,可以按照自己的想法再添加


#include <reg52.h>
#include <intrins.h>
#include <string.h>

void liushui();
void rjl();	   //漸亮
void rja();	   //漸暗
void huaxin();
void huaxin2();
void huaxin3();
void zkb(unsigned char d);
void ys1ms(unsigned int s);	 //延時聲明,修改s的數值,就可以改變時間

unsigned char code table[11]={0xff,0xff ,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
unsigned char code table6[11]={0xff,0xff ,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff};
unsigned char code table2[8]={0x7f,0x3f ,0x1f,0x0f,0x07,0x03,0x01,0x00};
unsigned char code table3[8]={0xfe,0xfc ,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
unsigned char code table4[9]={0x00,0x01 ,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
unsigned char code table5[9]={0x00,0x80 ,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};

unsigned char i; 
unsigned char j; 
unsigned char k;
unsigned char m;

int main()
{
	EA=1;//打開中斷,使用中斷方便調試查看模式
	EX0=1; //允許外部中斷0中斷
	EX1=1; //允許外部中斷1中斷
	PX0=1; // 外部中斷0位高優先級
	while(1)  //無限循環
	{	
		liushui();   ////////////////////
		ys1ms(50);	
		huaxin2();   
		ys1ms(50);
		rja();
		ys1ms(100);

		huaxin();	 ////////////////////
		rjl();
		rja();
		ys1ms(100);

		huaxin3();   ////////////////////
		rja();
		ys1ms(100);

	}
	 return 0;
}

void liushui()
{
	
		for(i = 9; i > 0; i--)
		{
			P1 = table[i];
			ys1ms(50);
		}
		for(i = 2; i <= 10; i++)
		{
			P0 = table[i];
			 ys1ms(50);
		}
		for(i = 9; i > 0; i--)
		{
			P2 = table[i];
			 ys1ms(50);
		}
		for(i = 9; i > 0; i--)
		{
			P3 = table[i];
			 ys1ms(50);
		}
		
}

 void ys1ms(unsigned int s)	   //定時器精確延時1毫秒函數,改變S數值即改變時間
 {
 	TR0=1;
	while(s!=0)
	{
		TH0=-(7629/256);
		TL0=-(7629%256);
		while(TF0!=1);
		TF0=0;
		s--;
	}
	TR0=0;
 }

 /****************************************************************************/
void rjl()  //漸亮函數 
{   
    unsigned char a, b;//a控制延時長度 b控制循環週期      
	P0 = 0xff;
	P1 = 0xff;
	P2 = 0xff;
	P3 = 0xff;
    a = 0;   
   		for (b=250; b>0; b--)   //循環週期設置
    	{   
            a++;   
            zkb (a);      //延時長度隨a而改變    
            P0 = 0xff;
			P1 = 0xff;
			P2 = 0xff;
			P3 = 0xff;
            a = ~a;         //a值取反,決定燈滅時的佔空比    
            zkb (a);   
            P0 = 0x00;
			P1 = 0x00;
			P2 = 0x00;
			P3 = 0x00;
	        a = ~a;         //a值取反 使a回到原值繼續循環 
         }
 }
/****************************************************************************/
void rja()  //漸暗函數
{
	unsigned char a, b;//a控制延時長度 b控制循環週期    
    P0 = 0x00;
	P1 = 0x00;
	P2 = 0x00;
	P3 = 0x00;            //亮起LED 
	a = 0;   
        for (b=250; b>0; b--)   
        {   
            a++;   
            zkb (a);   
            P0 = 0x00;
			P1 = 0x00;
			P2 = 0x00;
			P3 = 0x00;
	        a = ~a;   
            zkb (a);   
            P0 = 0xff;
			P1 = 0xff;
			P2 = 0xff;
			P3 = 0xff;  
	        a = ~a;   
        }
}
void huaxin()
{
	for(j = 0; j < 2; j++)
	{
	  	for(i = 0; i < 8; i++)
		{
			P1 = table2[i];
			P3 = table3[i];
			ys1ms(50);
		}
		for(i = 0; i < 8; i++)
		{
			P0 = table3[i];
			P2 = table3[i];
			 ys1ms(50);
		}
		for(i = 0; i < 9; i++)  
		{
			P2 = table5[i];
			P0 = table5[i];
			ys1ms(50);
		}
		for(i = 0; i < 9; i++)
		{
			P3 = table5[i];
			P1 = table4[i];
			 ys1ms(50);
		}
		ys1ms(100);
	}
}
void huaxin2()
{
	 	for(i = 0; i < 8; i++)
		{
			P1 = table2[i];
			ys1ms(50);
		}
		for(i = 0; i < 8; i++)
		{
			P0 = table3[i];
			 ys1ms(50);
		}
		 for(i = 0; i < 8; i++)
		{
			P2 = table2[i];
			
			ys1ms(50);
		}
		for(i = 0; i < 8; i++)
		{
			P3 = table2[i];
			
			 ys1ms(50);
		}
}
void huaxin3()
{
	k = 0;
	for(m = 0; m < 2; m++)
	{
		for(j = 0; j < 4; j++)
		{
	 		for(i = 9; i > 0; i--)
			{
				P1 = table[i];
				P0 = table6[i];
				P2 = table[i];
				P3 = table[i];
				ys1ms(50);
			}
		}

			for(i = 0; i < 8; i++)
			{
				P1 = table2[i];
				P0 = table3[i];
				P2 = table2[i];
				P3 = table2[i];
				ys1ms(50);
			}
		if(k == 0)
		{
			for(i = 0; i < 8; i++)
			{
			    P1 = table5[i];
				P0 = table4[i];
				P2 = table5[i];
				P3 = table5[i];
				ys1ms(50);
			}
		}
			ys1ms(100);	
			k++;
	}
}
/****************************************************************************/
void zkb(unsigned char d)   //佔空比函數,由d決定延時長度    
{      
    unsigned char i;   
    while( --d != 0)   
    {   
        for(i = 0; i < 1; i++);   //佔空比時間設置
    }                         
} 
/****************************************************************************/  

	 		 	
到此,把妹神器就完成了,快去送給妹子吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章