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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 8499|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

數(shù)碼管顯示原理

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

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

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


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

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


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

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

因?yàn)檫@個(gè)程序就一句話,很簡單,所以我們不再進(jìn)行分析。
三、 一個(gè)數(shù)碼管顯示不同字符
下面的程序讓一個(gè)數(shù)碼管輪流顯示不同的字符。
#include
void delay();
void main()
{
P0 = 0x3f; //顯示字符‘0’
delay(); //延時(shí)一會(huì)
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--);
}
這個(gè)程序?qū)崿F(xiàn)字符‘0’,‘1’,‘2’的循環(huán)顯示。但如果要循環(huán)顯示更多的數(shù)字,每次都寫出他們的編碼很麻煩,這里我們可以將所有的編碼都寫到一個(gè)數(shù)組里,以后只需調(diào)用數(shù)組就可以了。程序如下。
#include
unsigned char code table[]={0x3f,0x06,0x5b}; //定義編碼數(shù)組,注意最后的分號(hào)
void delay();
void main()
{
P0 = table[0]; //調(diào)用數(shù)組的第一個(gè)元素
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表明數(shù)組中的元素是無符號(hào)字符型數(shù)據(jù),code表明這是編碼數(shù)組,其編譯后不占內(nèi)存空間而是占程序存儲(chǔ)空間,我們知道單片機(jī)的內(nèi)存空間很小,所以這個(gè)很重要。table是數(shù)組名字,自己可以隨便更換。因?yàn)閿?shù)組中的元素是從0開始排的,所以table[0]就是第一個(gè)元素0x3f。
四、 多個(gè)數(shù)碼管同時(shí)顯示
原理圖如下:

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

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

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

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

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

再次點(diǎn)擊單步按鍵,第一條語句執(zhí)行完畢,會(huì)發(fā)現(xiàn)第一位數(shù)碼管被點(diǎn)亮,因?yàn)檫沒有賦值,所以七段都被點(diǎn)亮了。如下圖。

再點(diǎn)擊單步按鍵,可以看到雖然段選已經(jīng)賦值了,但數(shù)碼管并沒有顯示。如下圖。

再點(diǎn)擊單步,便進(jìn)入了delay()函數(shù)的內(nèi)部,此時(shí)數(shù)碼管也顯示出‘1’了,如下圖。

連續(xù)點(diǎn)擊單步,直到跳出delay()函數(shù),以后我們就點(diǎn)擊另一個(gè)單步按鍵,它不會(huì)進(jìn)入子函數(shù)內(nèi)部。如下圖。

點(diǎn)擊單步后,執(zhí)行完P(guān)2=0xff;語句,數(shù)碼管不再顯示,如下圖。

再點(diǎn)擊單步,執(zhí)行完P(guān)2=0xfd;語句,我們發(fā)現(xiàn)第二個(gè)數(shù)碼管居然顯示的是‘1’,其實(shí)也對(duì),因?yàn)槎芜x的數(shù)據(jù)還沒有改變呢。這正是產(chǎn)生“拖影”的原因。如下圖。

再點(diǎn)擊單步,準(zhǔn)備執(zhí)行延時(shí)函數(shù)。如下圖。

點(diǎn)擊單步,執(zhí)行完延時(shí)函數(shù)后,顯示出了正確的字符,如下圖。

因?yàn)橐呀?jīng)找到了原因,所以我們聯(lián)機(jī)調(diào)試就到這里。可以看到,在進(jìn)行聯(lián)機(jī)調(diào)試單步運(yùn)行時(shí)可以發(fā)現(xiàn)很多程序執(zhí)行的細(xì)節(jié),所以對(duì)一些不好想的問題,我們都可以通過這種方法去尋找答案。
我們已經(jīng)看到程序出錯(cuò)是因?yàn)橄罢Z句“P2 = 0xff;”并沒有起到應(yīng)有的作用。那怎樣才能起到作用呢?剛才在聯(lián)機(jī)調(diào)試時(shí)我們已經(jīng)發(fā)現(xiàn)只要給了數(shù)碼管位選數(shù)據(jù),它就會(huì)被點(diǎn)亮,所以我們可以先給其送入段選數(shù)據(jù),然后給其送入位選數(shù)據(jù),這樣它應(yīng)該會(huì)顯示正確字符了,然后延時(shí)讓它亮一會(huì),再加上消影語句,它就會(huì)被熄滅。再給第二位送入段選數(shù)據(jù),但這時(shí)數(shù)碼管還是滅這的,它不會(huì)產(chǎn)生拖影,此時(shí)給其送入位選數(shù)據(jù),它就能顯示正確的字符了。程序可更改如下:
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;
}
}
這樣編譯后運(yùn)行就能完美的顯示了。如果你還是不太明白,可以再次進(jìn)行聯(lián)機(jī)調(diào)試,看一下程序的運(yùn)行過程。
說明:從上面可以看出,就算是兩條語句的順序錯(cuò)誤,也會(huì)很大地影響整個(gè)程序的運(yùn)行效果。調(diào)試程序是個(gè)很繁雜的工作,為了少出錯(cuò),我們就要在寫源程序時(shí)規(guī)范我們的語句,從最簡單的程序開始,將它研究透了,這樣再寫大程序時(shí),才不會(huì)在這些細(xì)節(jié)問題上浪費(fèi)大量的時(shí)間。這里我們只是做一個(gè)示例,還有更多的細(xì)節(jié)知識(shí)需要自己在寫大量的程序的過程中積累。知識(shí)可以傳授,但經(jīng)驗(yàn)是不能傳授的。

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:67678 發(fā)表于 2015-1-5 00:39 | 只看該作者
很好  學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

地板
ID:32154 發(fā)表于 2015-1-8 16:18 | 只看該作者
初學(xué)者,看著有點(diǎn)困額
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区免费视频 | av中文字幕在线播放 | 97在线观看 | 91久久国产综合久久 | 久久久噜噜噜久久中文字幕色伊伊 | 最新中文字幕在线 | 欧美精品1区 | 久久青| 6080亚洲精品一区二区 | 国产精品久久久久久久久久久久久 | 日本 欧美 三级 高清 视频 | 久久精品99| 99视频在线播放 | 毛片入口| 国产高清视频在线观看 | 欧美久久精品 | 在线视频99| 中文字幕高清 | 成年视频在线观看福利资源 | 欧美激情亚洲天堂 | 国产精品美女 | 青青久久 | 黄色免费在线观看网址 | 国产视频福利在线观看 | 自拍亚洲 | 久久久精品一区 | 久久精品视频网站 | 国产精品永久免费视频 | 91福利电影在线观看 | 欧美综合在线观看 | 亚洲一区二区视频 | 国产精品一区在线播放 | 亚洲视频在线播放 | 97视频网站 | 999免费网站| 欧美性大战久久久久久久蜜臀 | 可以在线观看av的网站 | 中文字字幕一区二区三区四区五区 | 狠狠影院 | 日韩在线国产 | 欧美久久久网站 |