0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

硬件模塊---數(shù)碼管基本原理與實(shí)現(xiàn)方法

嵌入式開發(fā)星球 ? 2024-05-11 09:20 ? 次閱讀

嵌入式中,數(shù)碼管的使用方法。

第一:數(shù)碼管基本介紹

wKgZomY-NmSAOkMRAAVCZBHXK88205.png

1、單個數(shù)碼管

wKgaomY-NnKAejy5AACMoczR768826.png

一個數(shù)碼管是由a、b、c、d、e、f、g、dp八個二極管組成,八個LED一端接在一起,另一端引腳引出來。二極管如果陽極連在一起,就是共陽極數(shù)碼管,陰極連在一起,就是共陰極數(shù)碼管。

如上圖,是一個共陰極數(shù)碼管,要使數(shù)碼管顯示不同的數(shù)字,只需點(diǎn)亮對應(yīng)LED即可。如:數(shù)碼管顯示“0”,則a、b、c、d、e、f六個LED亮,g、dp這倆個LED滅,即可顯示“0”。

2、多個數(shù)碼管

wKgaomY-No2APN9BAAENwPqHFuI590.png

上圖所示的六個數(shù)碼管,在使用時,需要程序選定使用哪幾個數(shù)碼管,這就是“位選”,選定數(shù)碼管后再對選定的數(shù)碼管進(jìn)行操作,其操作與單個數(shù)碼管的操作一致(接下來還會進(jìn)一步詳解),這就是“段選”。

3、數(shù)碼管與芯片的連接

3.1 為什么要使用鎖存器?

二極管正常工作時需要5mA以上的電流,若數(shù)碼管引腳和芯片引腳直接相連,芯片的I/O口無法輸出這么大的電流,對于共陰極的數(shù)碼管,可以在陽極處接上拉電阻,對于共陽極的數(shù)碼管,可以在陰極處接下拉電阻,但是也使得“位選”需做另外的處理。

引入鎖存器,利用其輸出電流大的特點(diǎn),有效的解決了LED工作電流問題,而且還可以利用鎖存器進(jìn)行“位選”、“段選”。

3.2 鎖存器的電路連接

wKgZomY-Np2ASm66AAG3mPbz1ig948.png

上圖所示,連接倆塊鎖存器,U1控制段選,U2控制位選,鎖存器現(xiàn)再回顧一下

wKgaomY-NquAE-HUAAAmkjT5ico387.png

根據(jù)電路圖,OE始終接地,所以鎖存器工作狀態(tài)只有前三種,當(dāng)LE軟件置1時,鎖存器的輸入端D與輸出端Q同高電平,同低電平,當(dāng)LE軟件置0時,鎖存器輸出為Q0。

由電路圖可得,電路連接為:

單片機(jī)的芯片引腳P00—>P07分別接U1鎖存器的D0——>D7,單片機(jī)的芯片引腳P00—>P07分別接U2鎖存器的D0——>D7,也就是說U1、U2倆鎖存器都與P0相連,所以在數(shù)碼管工作狀態(tài)下,倆個鎖存器不能同時處于打開狀態(tài),即倆個鎖存器的LE不能同時為高電平。鎖存器U1的輸出接數(shù)碼管的LED陽極,鎖存器U2的輸出接數(shù)碼管的WE,控制“數(shù)碼管選擇”。

鎖存器U2控制位選,U2打開時,U1關(guān)閉,此時U2的輸入和輸出同高、同低電平。如下圖,若使用數(shù)碼管1,則只需D0置0,其他引腳置1,即芯片P00輸出為0,P01——>P07輸出為1,即P0寄存器的狀態(tài)值為0xfe(上面低位,從下往上讀)

wKgaomY-NsqAHrLdAAHyJD-IYCo575.png

鎖存器U1控制段選,如剛剛位選了數(shù)碼管1,則接下來段選是對數(shù)碼管1的操作。此時關(guān)閉U2,打開U1,即U2的LE軟件置0,U1的LE軟件置1,而U2的LE與芯片的P27相連,U1的LE與芯片的P26相連(下圖所示),所以只需使芯片的P27輸出低電平來關(guān)閉U2鎖存器,P26輸出高電平來打開U1鎖存器。

wKgZomY-Nt6AFQabAAIDi-A37qE915.png

打開U1鎖存器后,使數(shù)碼管顯示某個數(shù)字,我們在第一節(jié)中總結(jié)過了,比如顯示一個數(shù)字“6”,需要a、c、d、e、f、g六個LED亮,所以鎖存器輸出01111101(共陰極數(shù)碼管。輸出1時點(diǎn)亮),即P0寄存器輸出01111101,P0寄存器的狀態(tài)值為0x7d。

wKgaomY-NvaAAcYYAACIidtSd2M599.png

wKgaomY-NweATNS7AAHmCLEyeYM486.png

第二:數(shù)碼管具體實(shí)現(xiàn)

第一個數(shù)碼管顯示數(shù)字“6”的程序如下:

#include
sbit dula=P2^6;
sbit wela=P2^7;
void main()
{
  wela=1;
  P0=0xfe;//位選第一個數(shù)碼管
  wela=0;

  dula=1;
  P0=0x7d;
  dula=0;
  while(1);
}

分析上面程序:

首先對連接U1、U2鎖存器LE的芯片引腳P26與P27進(jìn)行位操作,重命名為“dula”與“wela”,表示“段選”和“位選”。主函數(shù)里,先打開位選:wela=1,選擇第一個數(shù)碼管,則U2鎖存器輸入和輸出均為11111110(從下往上),P0的輸出也為11111110,即0xfe,位選結(jié)束后關(guān)閉位選:wela=0。

接下來打開段選:dula=1,對第一個數(shù)碼管操作,顯示數(shù)字“6”,U1鎖存器輸入輸出均為01111101,即P0輸出為01111101,即P0的狀態(tài)值為0x7d。最后關(guān)閉段選。

注:

正因?yàn)殒i存器U1與U2同時接在芯片的P0引腳上,所以倆個鎖存器不能同時打開,否則芯片引腳P0輸出的狀態(tài)值會在U1和U2上同時發(fā)生響應(yīng),造成紊亂。

第三:數(shù)碼管顯示數(shù)字時芯片引腳的狀態(tài)值

wKgaomY-N1yAHtIlAAF3jHwxJ8g660.png

顯示數(shù)字“0”,abcdef亮,狀態(tài)值00111111——>0x3f

顯示數(shù)字“1”,bc亮,狀態(tài)值00000110——>0x06

顯示數(shù)字“2”,abdeg亮,狀態(tài)值01011011——>0x5b

顯示數(shù)字“3”,abcdg亮,狀態(tài)值01001111——>0x4f

顯示數(shù)字“4”,bcfg亮,狀態(tài)值01100110——>0x66

顯示數(shù)字“5”,acdfg亮,狀態(tài)值01101101——>0x6d

顯示數(shù)字“6”,acdefg亮,狀態(tài)值01111101——>0x7d

顯示數(shù)字“7”,abc亮,狀態(tài)值00000111——>0x07

顯示數(shù)字“8”,abcdefg亮,狀態(tài)值01111111——>0x7f

顯示數(shù)字“9”,abcdfg亮,狀態(tài)值01101111——>0x6f

顯示字母“A”,abcefg亮,狀態(tài)值01110111——>0x77

顯示字母“B”,cdefg亮,狀態(tài)值01111100——>0x7c

顯示字母“C”,adef亮,狀態(tài)值00111001——>0x39

顯示字母“D”,bcdeg亮,狀態(tài)值01011110——>0x5e

顯示字母“E”,adefg亮,狀態(tài)值01111001——>0x79

顯示字母“F”,aefg亮,狀態(tài)值01110001——>0x71

在編寫程序時將上述狀態(tài)值放入數(shù)組中,通過數(shù)組來實(shí)現(xiàn)數(shù)碼管的動態(tài)顯示。

放在如下數(shù)組中:

#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
}

在table數(shù)組名前加了code,表示編碼的意思,單片機(jī)程序把不需要更改的東西通過code關(guān)鍵字定義為編碼,單片機(jī)執(zhí)行程序時,table只占用程序存儲空間,可以理解為占用flash,而不占用RAM

第四:數(shù)碼管實(shí)現(xiàn)動態(tài)顯示

一個數(shù)碼管從0到F動態(tài)顯示

#include 
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  wela=1;
  P0=0xfe;
  wela=0;

  while(1)
  {  
    for(num=0;num0;i--)
  for(j=110;j>0;j--);
}

此時第一個數(shù)碼管從0變化到F,之后停止不動。

若使數(shù)碼管從0到F反復(fù)變化,只需在while()語句里添加如下代碼:

  if(num==16)
    num=0; 

完整程序:


#include 
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  wela=1;
  P0=0xfe;
  wela=0;

  while(1)
  {  
    for(num=0;num0;i--)
  for(j=110;j>0;j--);
}

第五:數(shù)碼管經(jīng)典實(shí)例

六個數(shù)碼管,第一個數(shù)碼管顯示數(shù)字“1”,間隔1秒后再在第二個數(shù)碼管上顯示數(shù)字“2”,間隔1s后在第三個數(shù)碼管上顯示數(shù)字“3”,以此類推…在第六個數(shù)碼管上顯示數(shù)字“6”

分析:

六個數(shù)碼管輪流顯示,所以位選時依次選擇數(shù)碼管1、2…6,每次位選后,再段選輸出需要顯示的數(shù)字。

第一個數(shù)碼管位選:


  wela=1;
  P0=0xfe;//第一個數(shù)碼管
  wela=0;

第一個數(shù)碼管段選輸出數(shù)字“1”:


  dula=1;
  P0=table[1];
  dula=0;
  delay_ms(1000);

位選時P0的輸出之前已經(jīng)總結(jié)過了,再回憶一下,如下圖,從左到右分別為數(shù)碼管1、2、3、4…從下往上讀,得到8位二進(jìn)制碼,變?yōu)?6進(jìn)制即可。

wKgZomY-N-WAa2gNAAE5xJGLqxQ288.png

完整程序:


#include 
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
uchar num;
sbit dula=P2^6;
sbit wela=P2^7;
void delay_ms(uint );
void main()
{
  while(1)
  {
    wela=1;
    P0=0xfe;//第一個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[1];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xfd;//第二個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[2];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xfb;//第三個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[3];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xf7;//第四個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[4];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xef;//第五個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[5];
    dula=0;
    delay_ms(1000);

    wela=1;
    P0=0xdf;//第六個數(shù)碼管
    wela=0;

    dula=1;
    P0=table[6];
    dula=0;
    delay_ms(1000);
  }
}

void delay_ms(uint ms)
{
  uint i,j;
  for(i=ms;i>0;i--)
  for(j=110;j>0;j--);
}

總結(jié):數(shù)碼管是常用器件,掌握其中的控制方法,才能走的更遠(yuǎn)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5052

    文章

    18906

    瀏覽量

    300697
收藏 人收藏

    評論

    相關(guān)推薦

    數(shù)碼管驅(qū)動芯片的使用方法

    數(shù)碼管驅(qū)動芯片(也稱為LED驅(qū)動芯片)是一種用于控制數(shù)碼管顯示的集成電路。它可以將微控制器產(chǎn)生的數(shù)字信號轉(zhuǎn)換為適合數(shù)碼管顯示的電流和電壓。本文將詳細(xì)介紹數(shù)碼管驅(qū)動芯片的使用
    的頭像 發(fā)表于 12-08 16:24 ?9193次閱讀

    怎樣通過并行接口芯片去控制多個數(shù)碼管顯示呢

    實(shí)驗(yàn)八、數(shù)碼管顯示實(shí)驗(yàn)1、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)“七段共陰極數(shù)碼管”顯示的基本原理;掌握通過并行接口芯片控制多個數(shù)碼管顯示的方法。2、實(shí)驗(yàn)內(nèi)容用一片8
    發(fā)表于 12-10 08:24

    數(shù)碼管動態(tài)顯示的基本原理實(shí)現(xiàn)思路

    一、模塊題目二、原理簡述動態(tài)顯示的基本原理實(shí)現(xiàn)思路(轉(zhuǎn)載)動態(tài)顯示實(shí)質(zhì)上就是輪流點(diǎn)亮單個數(shù)碼管實(shí)現(xiàn)多位
    發(fā)表于 01-11 06:32

    動態(tài)數(shù)碼管的使用方法

    歷年的藍(lán)橋杯單片機(jī)組比賽都會考到數(shù)碼管模塊;對于省賽以及國賽來說,動態(tài)數(shù)碼管都是必考模塊!現(xiàn)在來給大家介紹動態(tài)數(shù)碼管的使用
    發(fā)表于 01-12 06:19

    掌握通過并行接口芯片對鍵盤進(jìn)行掃描并在多位數(shù)碼管顯示數(shù)字的方法

    實(shí)驗(yàn)九、鍵盤掃描及數(shù)碼管顯示實(shí)驗(yàn)1、實(shí)驗(yàn)?zāi)康膶W(xué)習(xí)了解鍵盤掃描的基本原理。掌握通過并行接口芯片對鍵盤進(jìn)行掃描并在多位數(shù)碼管顯示數(shù)字的方法。2、實(shí)驗(yàn)內(nèi)容編寫程序,
    發(fā)表于 01-13 08:22

    數(shù)碼管靜態(tài)顯示和動態(tài)顯示的實(shí)現(xiàn)方法

    數(shù)碼管靜態(tài)顯示和動態(tài)顯示數(shù)碼管共陽和共陰段選和位選數(shù)碼管靜態(tài)顯示原理代碼實(shí)現(xiàn)數(shù)碼管動態(tài)顯示方法
    發(fā)表于 03-01 07:34

    數(shù)碼管的型號命名方法

    數(shù)碼管的型號命名方法
    發(fā)表于 12-11 10:53 ?108次下載

    學(xué)51單片機(jī)之數(shù)碼管部分

    帶您從零學(xué)51單片機(jī)之數(shù)碼管部分 目錄1 數(shù)碼管應(yīng)用2 數(shù)碼管內(nèi)部結(jié)構(gòu)及硬件原理圖3 數(shù)碼管硬件
    發(fā)表于 02-10 14:36 ?155次下載

    數(shù)碼管型號命名方法

    數(shù)碼管型號命名方法
    發(fā)表于 12-11 10:51 ?1.4w次閱讀
    <b class='flag-5'>數(shù)碼管</b>型號命名<b class='flag-5'>方法</b>

    led數(shù)碼管的結(jié)構(gòu)及檢測方法

    led數(shù)碼管的結(jié)構(gòu)及檢測方法 LED數(shù)碼管是由發(fā)光二極構(gòu)成的,亦稱半導(dǎo)體數(shù)碼管. 將條狀發(fā)光二極
    發(fā)表于 01-03 11:51 ?4906次閱讀
    led<b class='flag-5'>數(shù)碼管</b>的結(jié)構(gòu)及檢測<b class='flag-5'>方法</b>

    數(shù)碼管的分類及基于AVR單片機(jī)595驅(qū)動8位數(shù)碼管顯示電路的實(shí)現(xiàn)

    發(fā)光二極單元(多一個小數(shù)點(diǎn)顯示),其基本原理是:將所有LED的一端(正極、負(fù)極均可)連在一起作為一個公共端,然后通過分別控制這組LED的另一個端口來使部分LED點(diǎn)亮,從而達(dá)到顯示一定字形的目的。 數(shù)碼管的分類:按能顯示多少
    發(fā)表于 11-30 11:03 ?17次下載
    <b class='flag-5'>數(shù)碼管</b>的分類及基于AVR單片機(jī)595驅(qū)動8位<b class='flag-5'>數(shù)碼管</b>顯示電路的<b class='flag-5'>實(shí)現(xiàn)</b>

    led數(shù)碼管怎么接線_LED數(shù)碼管的測試

    本文主要介紹了LED數(shù)碼管的安裝接線方式及LED數(shù)碼管的測試方法
    發(fā)表于 10-09 10:44 ?2.7w次閱讀

    數(shù)碼管的工作原理和使用方法解析

    數(shù)碼管是嵌入式開發(fā)中比較常用的一個模塊,本篇文章根據(jù)查閱的資料以及學(xué)習(xí)筆記整理成文,盡可能詳盡的講解常用數(shù)碼管原理和使用方法。
    發(fā)表于 02-29 13:10 ?10.2w次閱讀

    51單片機(jī)按鍵控制數(shù)碼管0~9_項(xiàng)目五 數(shù)碼管應(yīng)用實(shí)例

    (一)項(xiàng)目任務(wù)任務(wù)1:顯示數(shù)字子任務(wù)1.1 數(shù)碼管硬件電路認(rèn)識子任務(wù)1.2 了解段選和位選概念子任務(wù)1.3 掌握數(shù)碼管的靜態(tài)顯示方法任務(wù)2:數(shù)
    發(fā)表于 11-23 10:06 ?6次下載
    51單片機(jī)按鍵控制<b class='flag-5'>數(shù)碼管</b>0~9_項(xiàng)目五 <b class='flag-5'>數(shù)碼管</b>應(yīng)用實(shí)例

    基于單片機(jī)的數(shù)碼管實(shí)驗(yàn) 八段數(shù)碼管簡介

    在我們生活中隨處可見數(shù)碼管的應(yīng)用,數(shù)碼管的應(yīng)用形式多種多樣,拋開事物表象,深入到它的本質(zhì),正所謂萬變不離其中,數(shù)碼管應(yīng)用的原理都是基本相通的。本章我們將詳細(xì)介紹數(shù)碼管
    的頭像 發(fā)表于 07-26 16:37 ?3406次閱讀
    基于單片機(jī)的<b class='flag-5'>數(shù)碼管</b>實(shí)驗(yàn) 八段<b class='flag-5'>數(shù)碼管</b>簡介