久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8340|回復: 6
打印 上一主題 下一主題
收起左側

數碼管顯示原理

  [復制鏈接]
跳轉到指定樓層
樓主
ID:71259 發表于 2014-12-30 15:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、 數碼管顯示原理
我們最常用的是七段式和八段式LED數碼管,八段比七段多了一個小數點,其他的基本相同。所謂的八段就是指數碼管里有八個小LED發光二極管,通過控制不同的LED的亮滅來顯示出不同的字形。數碼管又分為共陰極和共陽極兩種類型,其實共陰極就是將八個LED的陰極連在一起,讓其接地,這樣給任何一個LED的另一端高電平,它便能點亮。而共陽極就是將八個LED的陽極連在一起。其原理圖如下。

其中引腳圖的兩個COM端連在一起,是公共端,共陰數碼管要將其接地,共陽數碼管將其接正5伏電源。一個八段數碼管稱為一位,多個數碼管并列在一起可構成多位數碼管,它們的段選線(即a,b,c,d,e,f,g,dp)連在一起,而各自的公共端稱為位選線。顯示時,都從段選線送入字符編碼,而選中哪個位選線,那個數碼管便會被點亮。
數碼管的8段,對應一個字節的8位,a對應最低位,dp對應最高位。所以如果想讓數碼管顯示數字0,那么共陰數碼管的字符編碼為00111111,即0x3f;共陽數碼管的字符編碼為11000000,即0xc0。可以看出兩個編碼的各位正好相反。如下圖。

二、 點亮一個數碼管
下面以七段共陰數碼管為例講述如何點亮一個數碼管。
l 51系列單片機的P0口沒有上拉電阻(其他端口有),所以如果直接接數碼管的段選線,那么不能將其點亮。我們需要為其加上220歐姆的上拉電阻,注意,上拉電阻阻值不能過大。實驗原理圖如下。


其中,7SEG-COM-CAT-GRN為七段共陰數碼管,顯示為綠色。RES為電阻。查找電阻時,需要選中下面的Resistors,如下圖。

右擊選中圖中的電阻再左擊,彈出的窗口中可改變它的阻值。如下圖。


那七個電阻看上去很亂,其實他們可以用一個排阻(RESPACK-7)代替。如下圖。

到這里原理圖就畫完了,我們開始寫源程序。讓數碼管顯示字符“0”。
#include
void main()
{
P0 = 0x3f; //P0口送字符‘0’的編碼
}
顯示效果如下。

因為這個程序就一句話,很簡單,所以我們不再進行分析。
三、 一個數碼管顯示不同字符
下面的程序讓一個數碼管輪流顯示不同的字符。
#include
void delay();
void main()
{
P0 = 0x3f; //顯示字符‘0’
delay(); //延時一會
P0 = 0x06; //顯示字符‘1’
delay();
P0 = 0x5b; //顯示字符‘2’
delay();
}
void delay()
{
int i,j;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
這個程序實現字符‘0’,‘1’,‘2’的循環顯示。但如果要循環顯示更多的數字,每次都寫出他們的編碼很麻煩,這里我們可以將所有的編碼都寫到一個數組里,以后只需調用數組就可以了。程序如下。
#include
unsigned char code table[]={0x3f,0x06,0x5b}; //定義編碼數組,注意最后的分號
void delay();
void main()
{
P0 = table[0]; //調用數組的第一個元素
delay();
P0 = table[1];
delay();
P0 = table[2];
delay();
}
void delay()
{
int i,j;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
這里要說明的是,unsigned char表明數組中的元素是無符號字符型數據,code表明這是編碼數組,其編譯后不占內存空間而是占程序存儲空間,我們知道單片機的內存空間很小,所以這個很重要。table是數組名字,自己可以隨便更換。因為數組中的元素是從0開始排的,所以table[0]就是第一個元素0x3f。
四、 多個數碼管同時顯示
原理圖如下:

其中,7SEG-MPX8-CC-BLUE是8位八段共陰數碼管,顯示為藍色。其段選線接在P0口,位選線接在P2口。
讓所有數碼管顯示同一個字符。源程序如下:
#include
void main()
{
P2 = 0; //P2口各位全為低電平,選中數碼管所有位
P0 = 0x3f; //顯示字符‘0’
}
這個程序只比第一個程序多了一條“P2 = 0;”,這樣來實現位選。最終效果如下:

讓任意位顯示字符。源程序如下:
#include
void main()
{
P2 = 0xaa; //選中從左數的第1,3,5,7位數碼管
P0 = 0x3f;
}
效果如下:

五、 動態顯示
以上的顯示均為靜態顯示,下面講述動態顯示。而到底什么是靜態顯示什么是動態顯示,等看完下面的內容就會很清楚了。
因為上面多個數碼管顯示時只能顯示同一個字符,怎么才能讓不同的數碼管顯示不同的字符呢?我們先完成這樣的一個程序,讓第一位數碼管顯示1,然后第二位數碼管顯示2,然后第三位數碼管顯示3。為了使程序短些,我們只控制前三位,要想讓其他五位也顯示,道理是一樣的。
源程序如下:
#include
unsigned char code table[]={0x3f,0x06,0x5b,0x4f};
void delay();
void main()
{
P2 = 0xfe; //選中第一位數碼管
P0 = table[1]; //讓其顯示字符‘1’
delay(); //延時一會
P2 = 0xfd; //選中第二位數碼管
P0 = table[2]; //讓其顯示字符‘2’
delay();
P2 = 0xfb; //選中第三位數碼管
P0 = table[3]; //讓其顯示字符‘3’
delay();
}
void delay()
{
int i,j;
for(i=1000;i>0;i--)
for(j=100;j>0;j--);
}
這個程序就是分別選中一位數碼管,讓它顯示一個字符,同單位數碼管顯示的原理是一樣的。這里你會發現每顯示完一個字符之后都有一個延時,這個延時有什么作用呢?我們可以先試著改變這個延時,看會有什么效果。我們先將delay()函數中的第一個for循環中的i的初值由1000,改為100,再運行一下程序,有什么效果?然后再將其改為10呢?這時是不是我們想要的不同數碼管同時顯示不同的字符的效果已經出來了。效果如下:

這就是上面所說的動態顯示效果。那靜態顯示與動態顯示到底有什么不同呢?很明顯,通俗的說,我們把向數碼管各位輪流送入字符編碼和位選信號,利用人眼的視覺暫留,讓人感覺好像幾位數碼管被同時點亮,這樣便可以在不同的數碼管上同時顯示不同的字符的效果稱為動態顯示。打個比方,你晚上拿根點著的煙,在空中快速劃過,你就會看到一條亮線,但其實它只是一個亮點劃過而已。如果你對它還不了解,可以到別的資料上查看一下視覺暫留的相關知識。而靜態顯示就是真實的同時選中幾位。這就是它們的根本區別。
六、 消影
到這里我們必須先說明一個問題了。前面我們寫程序都是全部直接寫到main()函數里的。那么你有沒有想過,main()函數里的語句從頭執行到尾,那么語句全部執行完了會怎么樣呢?你會想到它會從頭再開始執行,對吧!因為由前面的程序可以看出,指令是在無限循環執行的。但依靠這種默認的循環并不可靠,一般地,我們都是在程序中用一個死循環語句來實現無限循環的。上面的源程序的主函數可改為:
void main()
{
while(1) //死循環
{
P2 = 0xfe;
P0 = table[1];
delay();
P2 = 0xfd;
P0 = table[2];
delay();
P2 = 0xfb;
P0 = table[3];
delay();
}
}
可以看到,我們是把所有要循環的語句都放到了一個while(1){}循環中執行的。在以后的程序中,程序的主體部分都會放到這個語句中。
程序寫成這樣以后,你再將延時函數的延時縮減,比如:
void delay()
{
int i,j;
for(i=5;i>0;i--)
for(j=1;j>0;j--);
}
這時運行程序,是不是發現很亂了!效果可能如下:

這就是我們所說的“拖影”。
其實在真實的板子上,就算延時很長,也可以看見“拖影”現象。出現這樣的現象的原因是CPU的執行速度很快,當送入位選和段選數據后,接著又送入位選數據,但該位的段選數據還沒有送入,所以該位還保持著上次的段選數據,接著該位的段選數據送入,由于視覺殘留,兩個段選數據的顯示效果重合,形成了混亂。簡單的說,就是一位數碼管顯示了它前一位要顯示的字符和它本身要顯示的字符的重疊效果。要想避免“拖影”就必須在每位數碼管顯示完后將其關閉,我們可以加入“P2 = 0xff;”,這樣各位數碼管都不會選中,然后下一位再顯示時就不會有影響了,這就是所謂的“消影”。我們把程序改為如下:
void main()
{
while(1)
{
P2 = 0xfe;
P0 = table[1];
delay();
P2 = 0xff; //消影
P2 = 0xfd;
P0 = table[2];
delay();
P2 = 0xff;
P2 = 0xfb;
P0 = table[3];
delay();
P2 = 0xff;
}
}
但是當運行后,你會發現效果并沒有變化。為什么呢?為了研究原因,我們進行聯機調試,然后單步運行程序,看看程序到底是怎么執行的。關于怎么聯機調試,我們以前已經專門講過,這里不再敘述。
如下圖,先在keil中按下調試按鍵,會發現Proteus仿真圖已經開始運行。然后在keil中選擇源程序one顯示界面,并按下單步調試按鍵,它表示進入子函數內部,例如下面的調試過程中會進入delay()函數的內部。按下該按鍵后,會在第一條語句前出現黃色箭頭,表明這條語句還沒有執行,下一次將會執行該語句。

再次點擊單步按鍵,第一條語句執行完畢,會發現第一位數碼管被點亮,因為還沒有賦值,所以七段都被點亮了。如下圖。

再點擊單步按鍵,可以看到雖然段選已經賦值了,但數碼管并沒有顯示。如下圖。

再點擊單步,便進入了delay()函數的內部,此時數碼管也顯示出‘1’了,如下圖。

連續點擊單步,直到跳出delay()函數,以后我們就點擊另一個單步按鍵,它不會進入子函數內部。如下圖。

點擊單步后,執行完P2=0xff;語句,數碼管不再顯示,如下圖。

再點擊單步,執行完P2=0xfd;語句,我們發現第二個數碼管居然顯示的是‘1’,其實也對,因為段選的數據還沒有改變呢。這正是產生“拖影”的原因。如下圖。

再點擊單步,準備執行延時函數。如下圖。

點擊單步,執行完延時函數后,顯示出了正確的字符,如下圖。

因為已經找到了原因,所以我們聯機調試就到這里。可以看到,在進行聯機調試單步運行時可以發現很多程序執行的細節,所以對一些不好想的問題,我們都可以通過這種方法去尋找答案。
我們已經看到程序出錯是因為消影語句“P2 = 0xff;”并沒有起到應有的作用。那怎樣才能起到作用呢?剛才在聯機調試時我們已經發現只要給了數碼管位選數據,它就會被點亮,所以我們可以先給其送入段選數據,然后給其送入位選數據,這樣它應該會顯示正確字符了,然后延時讓它亮一會,再加上消影語句,它就會被熄滅。再給第二位送入段選數據,但這時數碼管還是滅這的,它不會產生拖影,此時給其送入位選數據,它就能顯示正確的字符了。程序可更改如下:
void main()
{
while(1)
{
P0 = table[1];
P2 = 0xfe;
delay();
P2 = 0xff;
P0 = table[2];
P2 = 0xfd;
delay();
P2 = 0xff;
P0 = table[3];
P2 = 0xfb;
delay();
P2 = 0xff;
}
}
這樣編譯后運行就能完美的顯示了。如果你還是不太明白,可以再次進行聯機調試,看一下程序的運行過程。
說明:從上面可以看出,就算是兩條語句的順序錯誤,也會很大地影響整個程序的運行效果。調試程序是個很繁雜的工作,為了少出錯,我們就要在寫源程序時規范我們的語句,從最簡單的程序開始,將它研究透了,這樣再寫大程序時,才不會在這些細節問題上浪費大量的時間。這里我們只是做一個示例,還有更多的細節知識需要自己在寫大量的程序的過程中積累。知識可以傳授,但經驗是不能傳授的。

評分

參與人數 2黑幣 +15 收起 理由
周鑫鑫鑫666 + 10 絕世好帖!
埃及噶和u哎 + 5 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:70847 發表于 2014-12-30 15:56 | 只看該作者
看不到圖片啊
回復

使用道具 舉報

板凳
ID:67678 發表于 2015-1-5 00:39 | 只看該作者
很好  學習了
回復

使用道具 舉報

地板
ID:32154 發表于 2015-1-8 16:18 | 只看該作者
初學者,看著有點困額
回復

使用道具 舉報

5#
ID:78273 發表于 2015-5-28 00:01 | 只看該作者

0
主題       
6
帖子       
10
黑幣
助理工程師
Rank: 3Rank: 3
收聽TA 發消息       
地板
青山0依舊 發表于 2015-1-8 16:18:28 | 只看該作者
初學者,看著有點困額
回復

使用道具 舉報

6#
ID:214745 發表于 2017-6-30 09:10 | 只看該作者
這種方法好
回復

使用道具 舉報

7#
ID:256080 發表于 2017-12-4 10:28 | 只看該作者
很好的東西
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99国产精品 | 能看的av网站 | 中文字幕在线视频网站 | 色播av| av网站在线看 | 日韩在线观看一区二区三区 | 亚洲精品第一 | 麻豆hd| 日韩在线视频一区 | 中文字幕日韩欧美一区二区三区 | 日韩视频91 | 久久久久久高潮国产精品视 | 亚洲精品视频一区 | 亚洲网站在线观看 | 99国产精品视频免费观看一公开 | www.久久久久久久久久久 | 国产精品亚洲精品久久 | 999re5这里只有精品 | 久久视频免费看 | 欧美日韩专区 | 97caoporn国产免费人人 | 国产大毛片 | 欧美精品久久久久久 | 全免费a级毛片免费看视频免 | 91国内精品久久 | 精品在线观看入口 | 亚洲成人99| 亚洲国产精品激情在线观看 | 久久久久国产一区二区三区四区 | 精品一区国产 | 成人精品一区二区三区 | 偷拍自拍网站 | 欧美一区二区三 | 亚洲福利在线观看 | 亚洲激情综合 | 亚洲激情综合网 | 国产电影一区二区在线观看 | 一级免费毛片 | 亚洲欧美日韩精品久久亚洲区 | 亚洲精品电影网在线观看 | 日韩资源|