1. 程式人生 > >Arduino實驗之兩位數碼管實驗報告

Arduino實驗之兩位數碼管實驗報告

第一種方案 從1-12引腳分別如圖所示這樣接

下面五個腳從左到右分別是1 2 3 4 5,上面六個腳從右到左分別是7 8 9 10 11 12,13是LED燈

實現方案一:將數碼管從1變成99 兩位數字相同時會使得LED燈亮

#define open(num) digitalWrite(num,LOW)
#define close(num) digitalWrite(num,HIGH)
int e=1;
int d=2;
int dp=3;
int c=4;
int g=5;
int b=7;
int BT3=8;
int BT2=9;
int f=10;
int a=11;
int BT1=12;
int LED=13;///LED變成高電平時會亮
void digital_1()
{
	open(b);
	open(c);
	delay(10);
}
void digital_2()
{
	open(a);
	open(b);
	open(g);
	open(e);
	open(d);
	delay(10);
}
void digital_3()
{
	open(a);
	open(b);
	open(g);
	open(c);
	open(d);
	delay(10);
}
void digital_4()
{
	open(b);
	open(f);
	open(g);
	open(c);
	delay(10);
}
void digital_5()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	delay(10);
}
void digital_6()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	delay(10);
}
void digital_7()
{
	open(a);
	open(b);
	open(c);
	delay(10);
}
void digital_8()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void digital_9()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void digital_0()
{
	open(a);
	open(f);
	open(e);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void setup()
{
	unsigned char i;
	for(i=1;i<=13;i++)
	{
		pinMode(i,OUTPUT);
		digitalWrite(i,HIGH);
	}
	digitalWrite(13,LOW);
	open(8);
	open(9);
	open(12);
}
void resetup()
{
	int i;
	for(i=1;i<=12;i++)
	{
		digitalWrite(i,HIGH);
	}
	open(8);
	open(9);
	open(12);
}
void digital_up(int num)
{
	int num1=num/10;
	int num2=num%10;
	int i=20;
	while(i--)
	{
		switch(num1)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT2);
                delay(1);
		resetup();
		open(BT2);
		switch(num2)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT3);
                delay(1);
		resetup();
		open(BT3);
	}
	open(BT2);
	open(BT3);
	return;
}
void flash()//使LED閃爍
{
	digitalWrite(13,HIGH);
	delay(200);
	digitalWrite(13,LOW);
	delay(200);
	digitalWrite(13,HIGH);
	delay(200);
	digitalWrite(13,LOW);
	delay(200);
}
v
void loop()
{
	unsigned char i,j;
	for(i=0;i<=9;i++)
	{
		for(j=0;j<=9;j++)
		{
                        digitalWrite(13, i == j);
			digital_up(10*i+j);
		}
	}
}

思路:將數碼管從1-99 兩位數碼管亮起時使用交錯亮燈的方式實現,因為數碼管內部電路的原因使其在短時間內執行,發生的延時效果人眼無法觀察到,因此形成了兩位數碼管所顯示的數字不同。當兩位數碼管亮起相同數字時會使得LED亮起,LED在兩位數碼管亮出不同數字時結束。

注意點:1.數碼管數字在逐次遞增過程中一定要注意BT和初始化的順序,因為不注意順序的話換位之後就會使得另一位亮出上一位的數字操作快的話基本上就會閃一下,不會平穩度過。2.在LED亮起的時候使用分時操作,這樣就相當於在同一時間同時進行兩個操作,如果僅僅用簡單的過程堆積來做的話就會卡克(等到LED亮起函式執行時會消耗時間)。數碼管執行時同樣消耗時間,兩個操作是不可能同時執行的,但是延時是可以同時執行的,因此消耗公共的時間會使得程式執行更加流暢,程式碼中有分時操作。

實驗二:將數碼管從1到99 兩位數字相同時使LED燈執行閃爍兩次

#define open(num) digitalWrite(num,LOW)
#define close(num) digitalWrite(num,HIGH)
int e=1;
int d=2;
int dp=3;
int c=4;
int g=5;
int b=7;
int BT3=8;
int BT2=9;
int f=10;
int a=11;
int BT1=12;
int LED=13;///LED變成高電平時會亮
void digital_1()
{
	open(b);
	open(c);
	delay(10);
}
void digital_2()
{
	open(a);
	open(b);
	open(g);
	open(e);
	open(d);
	delay(10);
}
void digital_3()
{
	open(a);
	open(b);
	open(g);
	open(c);
	open(d);
	delay(10);
}
void digital_4()
{
	open(b);
	open(f);
	open(g);
	open(c);
	delay(10);
}
void digital_5()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	delay(10);
}
void digital_6()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	delay(10);
}
void digital_7()
{
	open(a);
	open(b);
	open(c);
	delay(10);
}
void digital_8()
{
	open(a);
	open(f);
	open(g);
	open(e);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void digital_9()
{
	open(a);
	open(f);
	open(g);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void digital_0()
{
	open(a);
	open(f);
	open(e);
	open(c);
	open(d);
	open(b);
	delay(10);
}
void setup()
{
	unsigned char i;
	for(i=1;i<=13;i++)
	{
		pinMode(i,OUTPUT);
		digitalWrite(i,HIGH);
	}
	digitalWrite(13,LOW);
	open(8);
	open(9);
	open(12);
}
void resetup()
{
	int i;
	for(i=1;i<=12;i++)
	{
		digitalWrite(i,HIGH);
	}
	open(8);
	open(9);
	open(12);
}
void digital_up(int num)
{
	int num1=num/10;
	int num2=num%10;
	int i=20;
	while(i--)
	{
		switch(num1)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT2);
                delay(1);
		resetup();
		open(BT2);
		switch(num2)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT3);
                delay(1);
		resetup();
		open(BT3);
	}
	open(BT2);
	open(BT3);
	return;
}
int FlashTimes = 0;
void flash()//使LED閃爍
{
  if(FlashTimes % 2 == 0)
  {
    digitalWrite(13,HIGH);
  }
  else
  {
    digitalWrite(13,LOW);
  }
  if(FlashTimes < 3)
  {
    FlashTimes ++;
  }
}
void digitalShow(int num1, int num2)
{
  switch(num1)
{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT2);
                delay(1);
		resetup();
		open(BT2);
		switch(num2)
		{
			case 0:digital_0();break;
			case 1:digital_1();break;
			case 2:digital_2();break;
			case 3:digital_3();break;
			case 4:digital_4();break;
			case 5:digital_5();break;
			case 6:digital_6();break;
			case 7:digital_7();break;
			case 8:digital_8();break;
			case 9:digital_9();
		}
		close(BT3);
                delay(1);
		resetup();
		open(BT3);
}
void loop()
{
	unsigned char i,j;
	for(i=0;i<=9;i++)
	{
		for(j=0;j<=9;j++)
		{
                   if(i == j)
                   {
                     FlashTimes = 0;
                   }
                    flash();
                    for(int a = 0; a < 7; a++)
                    {
			digitalShow(i,j);
                    }
		}
	}
}

思路:和第一個一樣,只不過LED亮燈方法發生了改變

注意點:LED亮燈方法改變不只是簡單地函式操作改變,與上一個一樣,要使得該功能能夠正常進行並且不會影響數碼管的節奏,因此還要用到分時結構

總結:1.解決數碼管閃爍:注意執行順序以及延時跳過電壓不穩定期

2.解決LED亮滅影響數碼管節奏:延時是可以同時進行的,將延時同時進行不拖慢數碼管節奏

3.其他問題:將程式寫成分時結構更加利於進行其他操作