51單片機之動態數碼管顯示

首先來看一下開發板上的電路原理圖:

 

本開發板上使用的是,通過P22、P23、P24控制3-8譯碼器來對數碼管進行位選,通過P0口經過573的驅動控制數碼管的段選,通過P13控制573的使能端,爲低電平時573纔會有輸出。

138譯碼器的真值表如下圖G1,G2A,G2B都是選通腳,當G1,G2A,G2B爲100的時候138譯碼器開始工作,A爲最低位,B爲中間位,C爲最高位。CBA=000B時,Y0爲1,其他口爲0,CBA=001B時,Y1爲1,其他口爲0,CBA=010B時,Y2爲1,其他口爲0,CBA=011B時,Y3爲1,其他口爲0,CBA=100B時,Y4爲1,其他口爲0,CBA=101B時,Y5爲1,其他口爲0,CBA=110B時,Y6爲1,其他口爲0,CBA=111B時,Y7爲1,其他口爲0。

由於8個數碼管是共陰的,所以當Y0~Y7中的一個爲1,其反值爲0,相應的數碼管陰極置低,再將數碼管的段選位置高,就可以顯示相應的值。

 

 

     使用38譯碼器只能在同一個時刻讓一個數碼管顯示,想要讓8個數碼管同時顯示。這個時候就要用到動態顯示技術。

      動態顯示是多個數碼管,交替顯示,利用人的視覺暫停作用使人看到多個數碼管同時顯示的效果。就像我們看的電影是有一幀一幀的畫面顯示的,當速度夠快的時候我們看到它就是動態的。當我們顯示數碼管的速度夠快的時候,也就可以看到它們是同時顯示了。

  程序示例如下:

#include "reg52.h"

   typedef unsigned char u8;
   typedef unsigned int u16;

   sbit LSA = P2^2;
   sbit LSB = P2^3;
   sbit LSC = P2^4;


   u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
                    0x66, 0x6d, 0x7d, 0x07,
					0x7f, 0x6f, 0x77, 0x7c,
					0x39, 0x5e, 0x79, 0x71}; //0~F數碼

 

   void delay(u16 i) //延時函數
   {
    while(i--);
   }
	
	void DigDisplay() //數碼管顯示函數
	{
	u8 i;
	for(i=0;i<8;i++)
	{ 
	  switch(i)
	  {
		case 0:
	  		LSC = 0;LSB = 0;LSA = 0;break; //顯示第1個數碼管
		case 1:
	  		LSC = 0;LSB = 0;LSA = 1;break; //顯示第2個數碼管
		case 2:
	 		LSC = 0;LSB = 1;LSA = 0;break; //顯示第3個數碼管
		case 3:
			LSC = 0;LSB = 1;LSA = 1;break; //顯示第4個數碼管
		case 4:
			LSC = 1;LSB = 0;LSA = 0;break; //顯示第5個數碼管
		case 5:
	  		LSC = 1;LSB = 0;LSA = 1;break; //顯示第6個數碼管
		case 6:
	  		LSC = 1;LSB = 1;LSA = 0;break; //顯示第7個數碼管
		case 7:
	 		LSC = 1;LSB = 1;LSA = 1;break; //顯示第8個數碼管
	  }
	  P0 = smgduan[i+1];//顯示1~8的數值
	  delay(100); //延時,造成視覺暫留現象
	  P0 = 0x00; //數碼管消隱
	}
	}	

   void main()
   {
   while(1)
   {
   DigDisplay();
   }
   }

 

    在上例代碼中使用了C51中的code關鍵字。

u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,

                    0x66, 0x6d, 0x7d, 0x07,

                           0x7f, 0x6f, 0x77, 0x7c,

                        0x39, 0x5e, 0x79, 0x71};

       這稱之爲編碼定義,編碼定義方法與C語言中的數組定義方法非常相似,不同的地方就是在數組類型後面多了一個code關鍵字,code即表示編碼的意思。需要注意的是,單片機C語言中定義數組時是佔用內存空間的,而定義編碼時是直接分配到程序空間(ROM)中,編譯後編碼佔用的是程序存儲空間,而非內存空間(RAM)。

     本次實驗使用的是共陰極數碼管,在靜態數碼管試驗中使用的是共陽極數碼管,那在試驗過程中如果不清楚數碼管是共陰極或者共陽極,可以使用萬用表來確定數碼管是共陰極還是共陽極的。

    

     對數字萬用表來說,紅色表筆連接表內部電池正極,黑色表筆連接表內部電池負極,當把數字萬用表置於二極管檔時,其兩表筆間開路電壓約爲1.5V,把兩表筆正確加在發光二極管兩端時,可以點亮發光二極管。

     如下圖所示,將數字萬用表置於二極管擋,紅表筆接在①腳,然後用黑表筆去接觸其他各引腳,假設只有當接觸到⑨腳時,數碼管的a段發光,而接觸其餘引腳時則不發光。由此可知,被測數碼管爲共陰極結構類型,⑨腳是公共陰極,①腳則是數碼管的a段.接下來再檢測各段引腳,仍使用數字萬用表二極管檔,將黑表筆固定接在⑨腳,用紅表筆依次接觸②、③、④、⑤、⑥、⑦、⑧、⑩引腳時,數碼管的其他段先後分別發光,據此便可繪出該數碼管的內部結構和引腳排列圖。

           

      檢測中,若被測數碼管爲共陽極類型,則需將紅、黑表筆對調才能測出上述結果,在判別結構類型時,操作時要靈活掌握,反覆試驗,直到找出公共端爲止,大家只要懂得了原理,檢測出各個引腳便不在是問題了。

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