天天看點

51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

  • 數位管

    多位數位管,即是兩個或兩個以上單個數位管并列集中在一起形成一體的數位管。當多位一體時,它們内部的公共端是獨立的,而負責顯示什麼數字的段線全部是連接配接在一起的,獨立的公共端可以控制多位一體中的哪一位數位管點亮,而連接配接在一起的段線可以控制這個能點亮數位管亮什麼數字,通常我們把公共端叫做“位選線”,連接配接在一起的段線叫做“段選線”有了這兩個線後,通過單片機及外部驅動電路就可以控制任意的數位管顯示。一般一位數位管有10個引腳,二位數位管也是10個引腳,四位數位管是12個引腳。

    為了更友善區分段選和位選,請看下原理圖:

51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

如圖為兩個4位一體的數位管,可以看到與8個com相連的是兩個數位管的位選,位選與引腳相連,是以位選控制那個燈亮。段選可以看到a,b,,,,,g并聯到一起。因為是并聯,是以點亮的數位管顯示的數字相同。

  • 共陰極數位管和共陽極數位管
51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

圖a數位管管腳圖,圖b是共陽極數位管,圖c是共陰極數位管。

由圖b可知共陽極數位管陽極連接配接在一起,接高電平,陰極對應的各段分别控制。比如要想顯示1,則陰極對應的bc段低電平,其它接高電平,即可顯示。

由圖C可知,共陰極數位管将各個二極管的陰極連接配接在一起(陰極為低電平),而陽極控制各段,比如要顯示1,則bc為高電平,其它各段低電平即可顯示。

共陽極和共陰極數位管對照表:

共陽極數位管對照表(位選位高電平,各段選低電平控制數字顯示)

uchar code table[]={
	0xc0,//0
	0xf9,//1
	0xa4,//2
	0xb0,//3
	0x99,//4
	0x92,//5
	0x82,//6
	0xf8,//7
	0x80,//8
	0x90,//9
	0x88,//A
	0x83,//B
	0xc6,//C
	0xa1,//D
	0x86,//E
	0x8e, //F
	0x8c, //P
	0xc1,//U
	0x91,//Y
	0x7c,//L
	0x00,//全亮
	0xff  //熄滅
           

共陰極數位管對照表(位選為低電平,段選為高電平)

uchar code leddata[]={
	0x3F,  //"0"
    0x06,  //"1"
    0x5B,  //"2"
    0x4F,  //"3"
    0x66,  //"4"
    0x6D,  //"5"
    0x7D,  //"6"
    0x07,  //"7"
    0x7F,  //"8"
    0x6F,  //"9"
    0x77,  //"A"
    0x7C,  //"B"
    0x39,  //"C"
    0x5E,  //"D"
    0x79,  //"E"
    0x71,  //"F"
    0x76,  //"H"
    0x38,  //"L"
    0x37,  //"n"
    0x3E,  //"u"
    0x73,  //"P"
    0x5C,  //"o"
    0x40,  //"-"
    0x00  //熄滅
	};

           
  • 數位管顯示原理

    1.靜态顯示

    多位數位管依然可以靜态顯示,但是顯示時要麼隻顯示一位數位管,否則一體的多位同時顯示必須時顯示相同内容。當多位數位管應用于某一系統時,它們的“位選”是可獨立控制的,而“段選”是連接配接在一起的,我們可以通過位選信号控制哪幾個數位管亮,而在同一時刻,位選選通的所有數位管上顯示的數字始終都是一樣的,因為它們的段選是連接配接在一起的,是以送入所有數位管的段選的信号都是相同的,那麼他們顯示的數字必定一樣。(換言之,你可以通過位選控制那個數位管亮,但是亮的同時顯示的數字必定相同)

    2.動态顯示

    位選控制亮不亮,而段選控制顯示數字,那怎樣顯示不同的數字呢?這就利用了人體肉眼觀察的能力。

    舉個例子,假設段選1控制第一位數位管數字顯示1,那麼在顯示第二個數位管是段選控制數位管顯示2,而位選控制燈第二位數位管亮,第一位數位管滅。但是給人的感受是第一位數位管并沒有滅(實際已經滅了),因為時間太短人體肉眼無法識别。這樣就會發現數位管動态顯示是向左或向右一位一位點亮。

  • 靜态數位管工作原理

    靜态數位管原理圖:

51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

因為共陽極數位管,是以位選接的是高電平,要想正常顯示通過控制低電平來控制段選即可。

  • 靜态數位管代碼實作:
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定義全局字元型變量
typedef unsigned int u16; //重定義全局整型變量
u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用數組引用數位表(注次數位表為陰極數位表,因為是共陽極數位管,本應使用剛陽極數位管,
為了友善直接将共陰極數位表取反來使用)。code是将數組從ram調到ROM節省空間*/

/*延時函數*/
void dealy(u16 i)
{
while(i--);
}

void main()
{ int i=0;
  for(i=0;i<9;i++){
  P0=~table[i];//取反是因為使用的是陰極數位表,而取反得陽極數位表
  dealy(50000);
  }	
  //p0=~table[0];  該寫法是固定顯示數字不變的寫法,~table[0]顯示的就為0
	 
}
           
  • 動态數位管工作原理
51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗
51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

如圖,位選的控制通過連接配接J16的管腳連接配接138譯碼器,利用138譯碼器控制位選。段選不是有單片機IO直接驅動,而是通過連接配接74HC25晶片連接配接管腳,利用晶片來實作段選。

因為是共陰極數位管,是以位選應接低電平,段選接高電平時,數位管正常顯示。

譯碼器工作原理

51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗
51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗
51單片機怎麼顯示目前時間_51單片機數位管靜态顯示和動态顯示原理及實驗

可以有真值表觀察,當使能控制都為低電平的情況下,A0A1A2輸入不同電平控制輸出。

例,A0A1A2為000(二進制為0,A為低位,C為高位)對應Y0就輸出低電平,為001(二進制為1)輸出Y1就位高電平。是以就相當于二進制十進制,十進制對應輸出。

74HC25看自己的原理圖即可,不再闡述。

  • 動态數位管代碼實作
#include <reg52.h>
#include <intrins.h>
typedef unsigned char u8; //重定義全局字元型變量
typedef unsigned int u16; //重定義全局整型變量

u8 code table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/*利用數組引用數位表(該數位管是共陰極數位管,是以使用共陰極數位表)。code是将數組從ram調到ROM節省空間*/

sbit LSA=P2^2;    //ABC分别連接配接單片機的P2^2,P2^3,P2^4管腳
sbit LSB=P2^3;
sbit LSC=P2^4;

/*延時函數*/
void dealy(u16 i)
{
while(i--);
}

/*動态顯示函數
*參數說明
*ABC分别為138譯碼器的輸入端,通過控制輸入端來控制輸出端的高低電平,進而實作對位選的控制
且A為二進制中的低位,C為高位*/
void Display()
{  u16 i=0;
for(i=0;i<8;i++)
{
 switch(i)
 {
 case 0:LSA=0;LSB=0;LSC=0;break; //利用138譯碼器來控制位選,當ABC都等于0時,y0為低電平,其餘為高電平
 case 1:LSA=1;LSB=0;LSC=0;break; //Y1輸出低電平
 case 2:LSA=0;LSB=1;LSC=0;break; //Y2輸出低電平
 case 3:LSA=1;LSB=1;LSC=0;break; //Y3輸出低電平
 case 4:LSA=0;LSB=0;LSC=1;break; //Y4輸出低電平
 case 5:LSA=1;LSB=0;LSC=1;break; //Y5輸出低電平
 case 6:LSA=0;LSB=1;LSC=1;break; //Y6輸出低電平
 case 7:LSA=1;LSB=1;LSC=1;break; //Y7輸出低電平
 }
 P0=table[i];  //第i個為低電平決定位選則跳出switch循環,P0提供段選(原理圖可以看出)
 dealy(100);  // 短暫的延時,達到肉眼看不到的速度,以達到同時顯示效果
 P0=0x00;     //清零,作用為了下一個顯示不會産生重影
}
}

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

繼續閱讀