51單片機入門:數碼管原理介紹及C代碼實現

本文是江協科技up的課堂筆記!大家可以去bilibili配合這位up的51單片機入門教程食用,效果更佳~

我這里進行詳細介紹,希望你忘記數碼管的時候來這里看看!(你猜我為什么寫這個TAT)

一.基本介紹

LED數碼管:數碼管是一種簡單、廉價的顯示器,是由多個發光二極管封裝在一起組成“8”字型的器件

下面介紹引腳連接和段的概念

單個數碼管

這個圖顯示的是數碼管從A-DP這八個段,對應一個字節的八個比特位

這是引腳定義,類似單片機,一號引腳也是在左下角,呈逆時針排列

這個叫做共陰極連接,右邊的叫做共陽極連接,我們觀察引腳分布和各個段的引腳鏈接,我們發現在電路上是就近原則的

3.8引腳是公共的陰極

二.顯示一個數字

比如說我們要顯示數字六:ACDEFG點亮,其他熄滅就可以(以共陰極為例!!!)

步驟:

1.公共端接地(位選端選中)——決定哪個數字“8”亮起

2.把下面棕色的數字輸入進去(段碼)——決定哪根LED亮起

接下來看看更復雜的四位一體數碼管!

上圖是共陰極,下圖是共陽極

相信聰明的你發現規律了:單個數碼管是八個段引腳加上兩個陰極的引腳,而四位一體就是把相同的引腳連在一起控制,然后再支出另外四個引腳作為每個數碼管的陰極(還是以共陰極為例)

自然想到通過控制陰極端口的電平高低來控制哪一個數碼管亮啦(負極接正極,那他就必然不會亮啊),然后控制其余引腳來控制他亮起來的數字是幾

但是就出現了一個問題,我的數碼管無論同時亮起幾個都只能顯示一個數字(比如我讓第一個和第三個亮起,但是如果讓1號亮起數字‘6’,第3號也只能亮起6)畢竟段的選擇是公用的引腳

公用引腳可以減少io口的使用,但是如何讓多位數字同時顯示呢?

U4的用途是雙向數據緩沖器,最下面的四個東西:

VCC:正極,GND:負極;OE:把它理解為下面的那個使能端得了,低電平有效,不用管;

DIR:方向選擇,看是把左邊的數據緩沖到右邊還是把右邊的數據輸送到左邊

(其實是接高電平就把數據輸送到右邊,這個是我買的電路,他是沒有跳線改變輸送方向的,直接連接正極,有些帶有跳線的是可以改變它的方向的)

不用這個芯片的話,左側的信號就是驅動,加入芯片他就是信號源;只需要低強度信號,讓芯片接受,再加上芯片有自己的電源,就可以加強信號啦

那些電阻是排阻,四位一體的電阻元件

原理已知,首先我要在LED1-8這些個引腳里來進行位選,如何進行?

138譯碼器解決這個問題,它使用三個端口就可以解決問題

具體怎么做?

ABC表示輸入端,右側就是輸出端,左下角就是使能端(其實不用管,知道這么接他就會工作就行)CBA是一次高位到低位

因為2^3=8,所以在abc處用二進制表示后,轉換到0-7這八個數,分別對應LED1-8(這里有個很無語的錯位哈。)

下圖標的Y0一杠的橫線表示0有效,就是說比如CBA順序是000,就是Y0有效,即Y0是0,其他都是1

(問題又來了,這樣搞得話,不就只有一個數碼管可以亮了嗎)

代碼實現:

#include <REGX52.H>unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};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];
}void main()
{
//	//CBA的順序讀
//	//6號led對應的是Y5
//	P2_4=1;
//	P2_3=0;
//	P2_2=1;
//	//數據的高位對應端口的高位
//	P0=0x7D;Nixie(1,10);while(1){;}
}

各位要注意,數字是從下往上讀的!!!高位對高位

三.動態數碼管顯示

多個位顯示不同的數字,如何做到

原理就是讓數碼管不斷循環,這一個是1,下一個是2,在下一個是3,這樣的話借著快速移動的數字加上他熄滅的時間以及人眼的視覺暫留就可以達到效果

初次嘗試:

#include <REGX52.H>
#include <intrins.h>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();_nop_();_nop_();i = 11;j = 190;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];}void main()
{Nixie(1,10);while(1){Nixie(1,1);
//		Delay(20);Nixie(2,2);
//		Delay(20);Nixie(3,3);
//		Delay(20);}
}

這個會出現數字串位的情況,因為數碼管的消影過程中
//位選 段選 位選 段選
?//在這個過程中,位變了,但是還沒來得及變化段,所以上一個數字會串到下一位
//所以我們可以對段選清零

從而我們對函數進行了優化

#include <REGX52.H>
#include <intrins.h>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};void Delay(unsigned int xms)		//@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();_nop_();_nop_();i = 11;j = 190;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;//讓他熄滅
}void main()
{Nixie(1,10);while(1){Nixie(1,1);
//		Delay(20);Nixie(2,2);
//		Delay(20);Nixie(3,3);
//		Delay(20);//數碼管的消影//位選 段選 位選 段選//     【       】//在這個過程中,位變了,但是還沒來得及變化段,所以上一個數字會串到下一位//所以我們可以對段選清零}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91990.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Camel 簡介

相關文檔地址 https://camel.apache.org/components/next/index.htmlhttps://camel.apache.org/components/4.10.x/languages/simple-language.htmlhttps://camel.apache.org/manual/exception-clause.htmlhttps://camel.apache.org/manual/index.htmlhttps://camel.apache.org…

IP離線庫 輸入IP地址立即返回IP所在地址信息(支持Java、Python)

描述 本文實現&#xff1a; 1、離線查詢IP地址 2、IP地址精確到區域 3、IP地址支持國外IP 此時需要一個創建&#xff0c;比如我輸入一個8.8.8.8的IP立馬就需要返回給我一個中文地址信息&#xff0c; 類似于百度的IP搜索&#xff1a; 113.111.186.123如果現在離線環境或者在…

解決MySQL刪除/var/lib/mysql下的所有文件后無法啟動的問題

刪除 MySQL 數據目錄 /var/lib/mysql 下的所有文件后&#xff0c;MySQL 將無法啟動&#xff0c;因為該目錄包含了數據庫的所有數據文件、配置文件和系統表。當這些文件被刪除時&#xff0c;MySQL 無法找到必要的數據和配置&#xff0c;從而無法正常啟動。本文將詳細介紹解決這個…

蒼穹外賣項目學習——day1(項目概述、環境搭建)

文章目錄一、軟件開發整體介紹1.1 軟件開發流程1.2 角色分工1.3 軟件環境分類二、蒼穹外賣項目介紹2.1 定位2.2 功能架構2.3 技術選型三、開發環境搭建3.1 前端環境3.2 后端環境3.3 前后端聯調3.4 登錄功能優化四、接口文檔管理4.1 YApi4.2 Swagger (Knife4j)一、軟件開發整體介…

【QT】Qt信號與槽機制詳解信號和槽的本質自定義信號和槽帶參數的信號和槽

文章目錄前言一、信號的本質二、槽的本質三、 信號和槽的使?3.1 連接信號和槽四、使用步驟4.1 通過QtCreator?成信號槽代碼五、 ?定義信號和槽5.1 ?例1&#xff1a;信號和槽函數初步使用5.2 ?例2 兩個類使用5.3 示例3 按鈕使用觸發信號六、 帶參數的信號和槽6.1 ?例1&…

【OD機試題解法筆記】文件緩存系統

題目描述 請設計一個文件緩存系統&#xff0c;該文件緩存系統可以指定緩存的最大值&#xff08;單位為字節&#xff09;。 文件緩存系統有兩種操作&#xff1a; 存儲文件&#xff08;put&#xff09;讀取文件&#xff08;get&#xff09; 操作命令為&#xff1a; put fileName …

Python中的sys.path與PYTHONPATH全解析:模塊導入路徑的底層機制與最佳實踐

在Python項目開發中&#xff0c;很多人遇到過類似“模塊導入失敗”、“路徑找不到”、“相對導入與絕對導入混亂”等問題。而這些問題的根源&#xff0c;幾乎都繞不開一個核心概念——Python模塊搜索路徑。 今天&#xff0c;我們圍繞sys.path 和 PYTHONPATH環境變量&#xff0…

python:如何調節機器學習算法的魯棒性,以支持向量機SVM為例,讓伙伴們看的更明白

魯棒性&#xff08;Robustness&#xff09;指模型在噪聲數據或異常值干擾下保持性能穩定的能力。想詳細了解的可參考本人之前的博文 python機器學習&#xff1a;評價智能學習算法性能與效果的常見術語&#xff1a;不收斂、過擬合、欠擬合、泛化能力、魯棒性一句話、一張圖給您…

號源加鎖升級思路(解決高并發問題)

原先邏輯鏈接&#xff1a;號源預約加鎖思路_java 預約 接口加鎖-CSDN博客 一、進行治療項目和號源數據緩存 1.新建一個定時任務&#xff0c;主要在凌晨時緩存治療項目和號源數據 1.1.類中使用redission獲取鎖&#xff08;用于分布式系統獲取數據&#xff0c;保證原子性&…

MCP革命:AI世界的“USB-C”接口如何重塑智能體與外部工具的連接

> 一條標準化的數據通道,讓AI從“對話專家”蛻變為“行動專家”,背后是一場由協議驅動的工具連接革命。 2024年11月,Anthropic公司開源了**Model Context Protocol(MCP)**。在短短9個月內,這項技術徹底改變了AI與外部世界的交互方式。截至2025年8月,MCP服務數量**從…

啟用“安全登錄”組合鍵(Ctrl+Alt+Delete)解鎖

文章目錄背景目標功能操作步驟效果背景 在日常工作中&#xff0c;我們有時需要讓電腦長期開機運行&#xff08;如處理長任務、作為服務器等&#xff09;。然而&#xff0c;這其中存在一個潛在風險&#xff1a;當電腦處于鎖屏或登錄界面時&#xff0c;如果有人無意中觸碰鍵盤比…

【08】C++實戰篇——C++ 生成動態庫.dll 及 C++調用DLL,及實際項目中的使用技巧

文章目錄一、創建動態庫dll (方法一)1 生成C 動態庫dll1.1 創建項目MyDLL1.2 編寫.h 和 .cpp文件1.3 設置 及 生成 DLL2 調用 C 動態庫dll2.1 創建C 空項目DLLtest2.2 動態庫配置 及代碼調用測試3 實際項目中的使用技巧3.1 設置dll輸出路徑3.2 設置頭文件引入路徑3.3 改進后 測…

kettle插件-kettle http client plus插件,輕松解決https接口無法調用文件流下載問題

場景&#xff1a;小伙伴在使用kettle調用https接口過程中無法正常調用&#xff0c;程序出錯問題&#xff0c;今天演示下用自研插件輕松解決這個問題。1、使用openssl 生成自簽名證書openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3652、使用…

C#中的除法

在C#中&#xff0c;除法操作可以通過使用 / 運算符執行。這個運算符可以進行整數除法或浮點除法&#xff0c;這取決于操作數的類型。整數除法當兩個整數相除時&#xff0c;結果將自動向下取整到最接近的整數。這意味著結果是一個整數&#xff0c;而不是小數。int a 10; int b …

PPT文件密碼解密工具推薦:Tenorshare PassFab for PPT綠色免安裝一鍵解除密碼限制,附詳細教程和下載地址

前段時間&#xff0c;我幫朋友做一個商業演示的 PPT&#xff0c;為了防止文件被誤操作或者內容泄露&#xff0c;我給 PPT 設置了密碼。結果等朋友來拿文件的時候&#xff0c;我居然把密碼忘得干干凈凈&#xff0c;這下可把我倆都急壞了。朋友那邊馬上就要用這個 PPT 去參加重要…

【數據結構】二叉樹接口實現指南:遞歸方法的高效運用 (附經典算法OJ)

文章目錄 1、前置說明 1、定義二叉樹結點結構 2、創建新節點 3、手動創建二叉樹 2、二叉樹的遍歷 1、前序&#xff0c;中序和后序遍歷 1.1、二叉樹前序遍歷 1.2、二叉樹中序遍歷 1.3、二叉樹后序遍歷 2、二叉樹層序遍歷 3、二叉樹的基礎操作 1、二叉樹節點總數 2、…

自動駕駛控制算法——LQR控制算法

自動駕駛控制算法——LQR控制算法 文章目錄自動駕駛控制算法——LQR控制算法**一、LQR 是什么&#xff1f;**二、LQR 原理2.1 線性狀態空間模型 (State–Space Model)2.2 二次型性能指標 JJJ2.3 代數黎卡提方程 (ARE)2.4 特點總結2.5 一句話總結 LQR 原理&#xff1a;2.5.1 場景…

Jotai:React輕量級原子化狀態管理,告別重渲染困擾

簡介 Jotai 是一個為 React 提供的原子化狀態管理庫&#xff0c;采用自下而上的方法來進行狀態管理。Jotai 受 Recoil 啟發&#xff0c;通過組合原子來構建狀態&#xff0c;并且渲染基于原子依賴性進行優化。這解決了 React 上下文的額外重新渲染問題&#xff0c;并消除了對 m…

C語言數據結構(7)貪吃蛇項目2.貪吃蛇項目實現

8. 核心邏輯實現分析 8.1 游戲主邏輯 程序開始就設置程序支持本地模式&#xff0c;然后進入程序的主邏輯。 主邏輯分為3個過程&#xff1a; ? 游戲開始&#xff08;GameStart&#xff09;完成游戲的初始化。 ? 游戲運行&#xff08;GameRun&#xff09;完成游戲運行邏輯的…

知識蒸餾 - 最小化KL散度與最小化交叉熵是完全等價的

知識蒸餾 - 最小化KL散度與最小化交叉熵是完全等價的 flyfish KL散度與交叉熵的數學關系 對于兩個概率分布 PPP&#xff08;真實分布&#xff09;和 QQQ&#xff08;模型預測分布&#xff09;&#xff0c;KL散度的定義是&#xff1a; DKL(P∥Q)∑xP(x)log?(P(x)Q(x)) D_{KL}(P…