? 寫在前面
- 💖 作者簡介:大家好,我是澤奀,
- 🏆 嵌入式領域新星創作者 ? 作者周榜: 45 ? 總排名: 5135 👑
- 📝 個人主頁:澤奀的博客_CSDN博客
- 🎉 歡迎 點贊 ? 評論 ? 收藏 == 養成習慣😜
- 📣 系列專欄:【51單片機】系列_澤奀的博客-CSDN博客
- 💬 總結:希望你看完之后,能對你有所幫助,不足請指正!共同學習交流 🖊
- ?? 我們并非登上我們所選擇的舞臺,演出并非我們所選擇的劇本 ?
目錄
? 寫在前面
🎁 數碼管介紹
🎁 數碼管的分類
🎁 數碼管的引腳定義
🎆 一位一體
🎇 四位一體
🎁 數碼管原理圖
🎆 74HC595
🎇 總結:某一位顯示一個資料呢?
🔎 C語言陣列
🎆 陣列定義
🔍 C語言子函式
🎇 函式定義
🎁 點亮第③位數碼管顯示⑥
🎁 靜態數碼管顯示
🎁 動態數碼管顯示
🎁 數碼管的驅動方式
🎁 數碼管介紹
數碼管相比較之前的按鍵和LED燈的內容稍微復雜一些,操作更加難一點?
數碼管位置:在單片機的最↖角的地方、八個型號的顯示幕件?還有138譯碼器和右邊的74C595存盤器都是屬于數碼管操作這些的東西?
數碼管英文:Nixie tube?
LED數碼管:數碼管是一種簡單、廉價的顯示幕,是由多個發光二極管封裝在一起組成"8"字器件?
應用:數碼管的價格由于相對便宜,在電器特別是家電領域應用極為廣泛,空調、熱水器、冰箱等等,絕大多數熱水器用的都是數碼管,其他家電也用液晶屏與熒光屏?
?
🎁 數碼管的分類
- 數碼管分 共陽數碼管 和 共陰數碼管?
- 數碼管其實就是8個段的發光二極管,只點亮其中的幾個段即可顯示出數字或字母用來表達資訊?
- 共陽數碼管:把8段LED的正極并在一起作為公共端連接在5V上(共陽極),然后8個LED通過單片機的8個IO埠輸出高低電平使其決定點亮哪幾個段?
- 八段LED數碼管
- 分為共陽極及共陰極,共陽極的七段數碼管的正極(或陽極)為八個發光二極管的共有正極,其他節點為獨立發光二極管的負極(或陰極)?
- 使用者只需把正極接電,不同的負極接地就能控制七段數碼管顯示不同的數字,共陰極的七段數碼管與共陽極的只是接駁方法相反而已,同樣根據上面所說的LED數碼管分類方法,我們可以知道還有下面幾種較常見的型別?
- 九段LED數碼管
- 相較七段LED數碼管,該類更多用在數碼手表和傳呼機上?
- 按顯示位數分類
- 按能顯示多少個“8”可分為1位、2位、3位、4位和多位led數碼管
- 按發光二極管單元連接方式分類
- 按發光二極管單元連接方式分為共陽極數碼管和共陰極數碼管,共陽極數碼管是指將所有發光二極管(LED)的陽極接到一起形成公共陽極(COM)的數碼管,共陽極數碼管在應用時,將公共陽極COM接到+5V
🎁 數碼管的引腳定義
🎆 一位一體
?
- 這種①位的數碼管,它就是由⑧個LED燈組成的?
那么這⑧個LED燈是怎么去連接的呢?在上述圖片的右邊當中可以看到,右邊其實就是LED燈的連接方式,總共有兩種連接方式!在上述圖片當中它們的⑧個LED燈陰極都連接到了一個埠上,這種方式就叫做共陰極連接!下面圖中它們⑧個LED燈陽極都連接到了一個埠上,這種方式就叫做共陽極連接!
那我們在看到這圖上的左下角還定義了這個段的一個名稱,首先它嘴上面的LED數字都起好了名字了分別是:A、B、C、D、E、F、G、DP💨這個斷碼加起來就是⑧個,正好和我們的①位元組 = ⑧位 剛好相互對應的?
- 還有一個圖是引腳的定義!在③號引腳上連接的是正極,在⑧號引腳上連接的是負極, 引腳的定義圖是按照"就近原則"來的?
那我們要在數碼管上顯示數字"⑥"那怎么辦呢?很簡單我們把段碼:A、C、D、E、F、G、都點亮即可,然后讓其它的全部熄滅!那么它顯示的就會是"⑥",首先我們點亮,我們肯定要先把這個共陰極的公共端需要接地,接地那么就是給我們這個資料"零"或者是低電平,那么它的這個公共端陰極接到了這個的負極上,那么首先就達到了第一個條件了,它在共陰極上負極接上負極當我們負極接好之后,這個就叫做位選端,我們要把它選中它才能夠亮,如果有多個點亮的話那么就控制它多個位選端,那么如果是共陽極的話那么我們是公共端是VCC,斷碼就是低電平"0"才會點亮(這個資料就是操作我們共陽極的數碼管顯示)?
🎇 四位一體
?
這種就是④位的數碼管,它就是由④*⑧個LED燈組成的,在開發板上也是④位一體的,在單片機上總共有兩個剛好是⑧個數碼管?
那么這個④位一體的數碼管是如何連接的?首先它也是具有一個引腳的序號,如上圖所示在↖角,總共有12個引腳,右邊也是有②種的連接方式,在上面是共陰極連接,下面是共陽極連接?
那我們對比下①位的數碼管,就是多分出③個,它們的公共端是單獨分出來的,然后,它們的斷碼就是全部的連接在了一起(A段、B段、.....DP段)?
💥那么我們想到第三位數碼管顯示數字①的話,那么我們這么樣才可以實作呢?首先,我們在位選(公共端)當中給第三位數碼管給上"0"低電平,再給①、②、④上的位選給上"1"高電平,因為是共陰極,所以給低電平就可以讓 位選 點亮,那么這就是只有第三個才會點亮,亮的前提是什么呢?位選端接上相應的資料,在'B'、'C'中給上資料'1',其余的全部給上'0'?
🎁 數碼管原理圖
?
- 數碼管和138譯碼器都是用來控制數碼管顯示的?
COM就是公共端,這個數碼管的就是共陰極的數碼管,首先我們要點亮的話我們就要把它的公共端給選中,如果點亮第三個數碼管的話,那么就把這第三個數碼管選中"0",其它的公共端都選中"1", 那么如果想要給數碼管資料的話,那么就給數碼管下面的段碼給"1",如果想讓第三位數字①的話,就把 B、C給上①,其它的都給上"0"?
那么這里接上的網路編號(LED1~LED8)都是接到138譯碼器上的輸出端 ,那么138譯碼器是什么作業原理呢?在這里解釋一下:我們現在的目的是使得它的輸出端輸出為"0",剩下的全部輸出"1",那么這個138譯碼器正好可以實作這一個功能,并且還可以把③(P22、P23、P24)個埠變成⑧個埠來控制的!左邊的 A、B、C、是輸入端(正極),右邊這個Y0~Y7是輸出端(負極) 💨 然后這個芯片需要接電源VCC上面的就是,下面就是它的電源負極GND,↙腳的③個引腳叫做它的使能端:相當于一種開關,如果使能電平有效的話,它就是可以進行作業的,如果無效的話它就不會進行作業?
138譯碼器左上角的③個引腳上(P22、P23、P24),C是高位、B在中間、A是低位,按照順序也就是 — C B A,從而我們這個138譯碼器從而也被稱作是"③⑧線",好接下來就是怎么樣去使用:其實這里的作用是讓數碼管的哪一位可以進行顯示????如果假設(P24、P23、P22) C B A ,把高低位進行排序之后,二進制轉換為十進制數,對應著輸出端(Y0~Y7),那么假設C B A:0 0 0 = Y0,從而:LED1是可以被允許顯示的,因為這里"0"是輸出端(低電平)(共陰極)才能讓公共端LED1數碼管允許顯示,其它的7個都是不被允許的!如果是:0 0 1,那么轉換成十進制數字就是:Y1 對應著 LED2,那么這里就是Y1是有效的值,Y1輸出給上"0"(低電平)?
總結:下來就是我們只要給上CBA的資料,然后用二進制轉換成十進制的資料,對應著Y的引腳,然后再對應LED的引腳上,對應到了哪個LED給上輸出端"0",那么這個LED就是有效位的數碼管了?
🎆 74HC595
74HC245這個芯片有什么作用呢?解:這個芯片被稱之為雙向資料緩沖器這個芯片的作用,用來進行資料緩沖(提高驅動能力)的,那么緩沖這個是什么意思?
假設我們給上二進制,就從A0到達B0這是連接的關系,DIR如果接的是高電平(1)那么就能把左邊的資料接到我們右邊的資料上,電容(100nf)在這里的作用是:芯片的供電更加穩定叫做電原始碼波,然后電阻的哪些東西是④位一體的排阻,電阻的阻值是100R(Ω)作用:同樣跟LED燈是一樣的起到限流的作用,防止電流過大,好那么這些數碼管的電路也都是總結完畢了!
🎇 總結:某一位顯示一個資料呢?
- 在138譯碼器上控制③個口(P24、P23、P22)
- 看你(LED1~LED8)哪一位輸出"0"低電平選中
- 比如說 C B A = 0 1 1 = 3,也就是=Y3 = LED4,LED4 就是有效的,允許顯示數碼管的,那么其它的數碼管是不能被允許顯示的、不是有效的,—— 位選
- 那么選中之后,就是給P0口段碼的資料:假設給上資料,經過緩沖送到公共端的段碼端,那么,送到段碼端就會顯示數碼管相對應的數字!注意:P0口給上資料是從高位到低位給上段碼端的,—— 段選
- 就相當于兩步驟:1、選中P2 2、給段碼資料P0
🔎 C語言陣列
?
C 語言支持陣列資料結構,它可以存盤一個固定大小的相同型別元素的順序集合,陣列是用來存盤一系列資料,但它往往被認為是一系列相同型別的變數?
陣列的宣告并不是宣告一個個的變數而是一個集合?
🎆 陣列定義
- 型別說明符 陣列識別符號【常量運算式】
- 型別說明符:表示陣列中所有元素的型別?
- 陣列識別符號:表示該陣列型別變數的名稱,命名規則與變數名一致?
- 常量運算式:定義了陣列中存放的資料元素的個數,即陣列長度,例如:arr[10] ,10 表示數 組當中有10個元素,索引(下標)從 0 開始,到 4 結束?
例如:定義一個陣列:
int arr[10] = {0,1,2,3,4,5,6,7,8,9};在陣列 arr[10] 中只能使用 [0~9],不能訪問 arr[10],若使用就會出現下標越界錯誤!
注意:當陣列不完全初始化也就是當陣列元素比小標的值小的話,默認為 0 ?
🔍 C語言子函式
?
C語言的庫函式在撰寫的時候是可以直接呼叫的,比如 printf 輸出函式,而用戶自定義函式則必須由用戶對其進行定義,在其函式的定義中完成函式所特定的內容功能,這樣才能被其他函式呼叫?
🎇 函式定義
- 回傳型別 函式名稱(引數串列)
- {
- 函式體(函式實作特定功能的程序)
- }
回傳型別:一個函式可以回傳一個值,回傳型別 是函式回傳的值的資料型別,有些函式執行所需的操作而不回傳值,在這種情況下,回傳型別 是關鍵字 void
函式名稱:這是函式的實際名稱,函式名和引數串列一起構成了函式簽名
引數:引數就像是占位符,當函式被呼叫時,您向引數傳遞一個值,這個值被稱為實際引數,引數串列包括函式引數的型別、順序、數量,引數是可選的,也就是說,函式可能不包含引數
函式主體:函式主體包含一組定義函式執行任務的陳述句
🎁 點亮第③位數碼管顯示⑥
#include <REGX52.H>
int main(void)
{
//顯示數碼管的位置
P2_4=1;
P2_3=0;
P2_2=1;
while(1)
{
//顯示數碼管的數字
P0=0x7D;
}
}
那么如果我們要第④位顯示數字⑥的話該怎么辦?很簡單把P2_4=1;P2_3=0;P2_2=0;
LED會亮的原因是因為引腳沖突這個不需要去管它,
🎁 靜態數碼管顯示
#include <REGX52.H>
// 0 1 2 3 4 5 6 7 8 9
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//Location:數碼管的位置; Number:顯示數碼管的數字【高電平點亮段碼】
void Nixie(unsigned char Location,Number)
{
switch(Location) //位碼端輸出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0 = NixieTable[Number]; //P0接收數碼管中的數字
}
int main(void)
{
Nixie(2,2);
while(1)
{
}
}
這段代碼比上面的代碼更加的復雜,因為這段運用到了陣列和子函式的功能!大家仔細的去思考一下這陣列和組函式的用法!
🎁 動態數碼管顯示
#include <REGX52.H>
//數碼管段碼表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//延時子函式
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
//數碼管顯示子函式
void Nixie(unsigned char Location,Number)
{
switch(Location) //位碼輸出
{
case 1:P2_4=1;P2_3=1;P2_2=1;break;
case 2:P2_4=1;P2_3=1;P2_2=0;break;
case 3:P2_4=1;P2_3=0;P2_2=1;break;
case 4:P2_4=1;P2_3=0;P2_2=0;break;
case 5:P2_4=0;P2_3=1;P2_2=1;break;
case 6:P2_4=0;P2_3=1;P2_2=0;break;
case 7:P2_4=0;P2_3=0;P2_2=1;break;
case 8:P2_4=0;P2_3=0;P2_2=0;break;
}
P0=NixieTable[Number]; //段碼輸出
Delay(1); //顯示一段時間
P0=0x00; //段碼清0,消影
}
int main(void)
{
while(1)
{
Nixie(1,1); //在數碼管的第1位置顯示1
// Delay(20);
Nixie(2,2); //在數碼管的第2位置顯示2
// Delay(20);
Nixie(3,3); //在數碼管的第3位置顯示3
// Delay(20);
}
}
那么在這里解釋下數碼管的消影就是比方說:
當我們要顯示數碼管的時候首先要:位選 段選、還要顯示的話就還要 位選、段選,回圈,
那么這樣就會出現問題:首先是選擇"位選端"給上低電平,然后是段選給上資料,然后給上下一位位選的資料,但是:由于我們單片機的速度是很快的,在段選到下一個位選之間就會出現問題,我們選中下一位這個時刻很短的時間內,上一個資料就會串到下一個資料,因為它們是挨著一起的,我在選中下一位之后 上一位的資料自然是會直接過來的,這樣就會顯示出資料的串位的問題了!
那么我們應該怎么避免這個問題?那我們就需要在上一個段選端給清零這樣即使到下一位它也不會對上一位產生影響!因為以及清零了,所以在子函式上需要優化下,顯示玩之后我們首先要延遲1ms這個是為了能讓程式更加穩定顯示 并且 進行清零!
🎁 數碼管的驅動方式
?
靜態驅動也稱直流驅動,靜態驅動是指每個數碼管的每一個段碼都由一個的單片機I/O口進行驅動,或者使用如BCD碼二-十進制譯碼器譯碼進行驅動,
- 靜態驅動的優點是編程簡單,顯示亮度高,缺點是占用I/O埠多,
數碼管動態顯示介面是單片機中應用最為廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,所有數碼管都接收到相同的字形碼,但究竟是哪個數碼管會顯示出字形,取決于單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮,通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動,在輪流顯示程序中,每位數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示資料,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,
- ??????動態驅動的優點是能夠節省大量的I/O埠,而且功耗更低,缺點是花費cpu占用時間,編程較為復雜,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394073.html
標籤:其他
上一篇:Ansible資料操作-串列轉換

?
?