1. 程式人生 > >51微控制器學習筆記(二) 單個數碼管顯示1到9

51微控制器學習筆記(二) 單個數碼管顯示1到9

轉自我的部落格:http://sincos.in/?p=20

數碼管,其實就是8個發光二極體按順序排列而成的,所以讓數碼管顯示特定的數字,只需要將該亮的二極體點亮,不該亮的滅了就好了。為了達到這個目的,就得參考電路圖了,51HEI開發板的電路圖在我的相簿裡有,但是整張貼出來就太大了,所以這裡只顯示部分。電路圖如下:

乍一看這張圖比較明顯的就是最左邊的微控制器和兩個鎖存器U1和U2的引腳資訊了,從D00到D07,兩個鎖存器是共用的,D00對應輸出Y1和X1,D07對應輸出Y8和X8。鎖存器,從它的名字大概就可以知道它的用途了!其作用就是有的引腳輸入改變的時候輸出保持之前的狀態,達到鎖和存的效果(我目前的理解是這樣的,不理解的可以上網搜官方解釋)。查查74HC573是怎麼用的,表格如下:

圖中引腳1代表輸出使能,11引腳代表鎖存使能。鎖存器嘛,開啟鎖存,讓輸出使能引腳處於低電平,鎖存使能引腳輸入高電平,傳入對應的D,然後再使鎖存使能引腳處於低電平,這樣就能讓輸出保持不變。使用的過程就是開啟鎖,傳資料,關鎖保持。

說完了鎖存器,回到第一張電路圖,途中的鎖存器1號引腳都接地,自然是低電平,11號引腳分別對應微控制器的D26和D27,所以控制U1和U2就靠這2個引腳啦!

按道理說,8個數碼管,應該有8*8=64根線才對啊,而第一張圖中只有24個引腳,裡面肯定有複用的引腳,所以不知道內部電路是沒辦法寫滴,還好51HEI給的資料比較全。

2個LED管的內部電路如下:         ABCDEFG  DP總共8個二極體,分別由11、7、4、2、1、10、5、3引腳控制,而1這8個引腳對應第一個圖中的Y1到Y8,12、9、8、6呢則有兩組,一組是共陰極的數碼管,一組是共陽極的數碼管。12、9、8、6呢則對應X1到X8,有2個,一組是X1到X4,一組是X4到X8,X1到X4是共陰極的,X5到X8是共陽極的。本實驗只讓共陰極的DIG1那個數碼管顯示資料,把別的都關掉。那隻要12(X1)引腳輸入低電平,986輸入高電平,其他的都不會亮了,讓DIG1顯示什麼數字,就由Y1到Y7來決定了。

經計算,讓DIG1顯示0到9還有小數點的表格如下:

 uint8  table[11]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};
最終程式碼如下:
#include
typedef unsigned char uint8;
typedef unsigned int  uint16;

 sbit   D24 = P2^4;
 sbit   D25 = P2^5;
 sbit   U1 = P2^6;                 //U1鎖存器的開關
 sbit   U2 = P2^7; 					//U2鎖存器的開關
 sbit 	LINX1  = P0^0;
 sbit   LINY5  = P0^4;
 sbit   LINY6  = P0^5;

 uint8  table[11]={ 0x3f, 0x30, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x80  };

 void main(void)
 {	

   uint8 counter = 0;
   uint8 offset = 0;
   TH0 = 0x3C;
   TL0 = 0xB0;
   TR0 = 1;

   TMOD = 0x01;			   //計時模式選01模式
    U2 = 1;
	P0 = 0xfe;
	U2 = 0;
    P0 = 0xff;

   D24 = 0;                //關閉8X8點陣LED
   D25 = 0;

    while(1)
	{
	 if(TF0==1)			  //每次計時是50ms,達到50ms後計時器0的溢位位位1,進行軟體清零和計時器初始化.
	  {
	     counter++;
		 TF0=0;
		 TH0 = 0x3C;         //12MHZ的晶振算出來是從15536開始計時,十六進位制就是 0x3CB0
		 TL0 = 0xB0;		 //高位取0x3C,低位取0xB0
	  }
	  if(counter==20)		 //20*50ms=1000ms=1s
	  {
	    counter=0;
		U1 = 1;
		P0 = table[offset++];
		U1 = 0;
		if(offset==11)
		{
		  offset = 0;
		}

	  }

	}

 }