C51单片机使用3-数码管显示
目錄
一、硬件介紹
1、原理
2、多位數碼管驅動
二、數碼管顯示控制
1、靜態顯示
(1)單個數碼管
(2)多個數碼管顯示
(3)顯示數字使用編碼方式
2、動態顯示
(1)原理
(2)代碼實現
(3)測試
工程下載鏈接
一、硬件介紹
1、原理
數碼管有單位數碼管、雙位數碼管和其它多位數碼管。如下圖所示
單個的數碼管共10個引腳,顯示不同的數字需要7個引腳,小數點占用1個引腳,公共端占用1個,廠家為了生產方便同意10個引腳,3和8引腳都是公共端。根據公共端接線不同分共陰和共陽。單個的數碼管的原理如下
比如:
顯示數字“8”,則需要點亮a、b、c、d、e、f、g引腳
顯示數字“5”,則需要點亮a、c、d、f、g引腳
2、多位數碼管驅動
當多位數碼管應用于某一系統時,他們的“位選”是可獨立控制的,而“段選“是連接在一起的,通過”位選“信號控制哪幾個數碼管亮。而在同一時刻,位選選通的所有數碼管上顯示的數字都是一樣的(因為他們8段數碼都連在一起的),這種顯示方式叫靜態顯示。
位和段分別用兩個74HC573驅動和控制,P0同時使用上拉電阻。單片機可以控制鎖存器的鎖存端,進而控制鎖存器的數據輸出。當鎖存使能低電平時11引腳)為高電平時,鎖存器輸出數據隨輸入數據變化而變化。當鎖存器使能端(11引腳)為高電平時,輸出數據為之前狀態數據,輸出數據不隨輸入變化。
?六位的數碼管顯示電氣原理圖
二、數碼管顯示控制
數碼管采用共陰極方式,即程序中給數碼管3和8公共引腳低電平,再給其它段碼高電平則段碼點亮。
1、靜態顯示
(1)單個數碼管
任務:在左邊第二個數碼管上顯示數字8
位選:
對于要啟用的對應數碼管,該位為低電平即0。不用的即1。從左往右依次為數碼管1-數碼管6。沒有數碼管7和數碼管8,則這兩個位都寫1。
如,對于只啟用第二個數碼管,則六個數碼管的值分別如下:
數碼管1:1
數碼管2:0
數碼管3:1
數碼管4:1
數碼管5:1
數碼管6:1
預留位7:1
預留位8:1
1111 1101即0xFD
段選:
需要點亮的段為1,不點亮的則是0
如,顯示數字8,即
a=1
b=1
c=1
d=1
e=1
f=1
g=1
dp=0(小數點)
二進制表示就是0111 1111,16進制表示為0x7F
代碼
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charunsigned char m,n; sbit dula=P2^6; //段選鎖存器-使能控制 sbit wela=P2^7; //位選鎖存器-使能控制void Delay_ms(uint xms) {uint i,j; for(i=xms;i>0;i--)for(j=110;j>0;j--); }void main() {wela=1; //位選鎖存器使能//P0=0xFE; //1111 1110 :啟用第一個數碼管-左邊第一個P0=0xFD; //1111 1101 :啟用第二個數碼管-左邊第二個wela=0;dula=1; //段選鎖存器使能P0=0X7F; //0111 1111 :顯示數字8 dula=0;while(1){} }實驗結果
(2)多個數碼管顯示
顯示6個數碼管的話,即將位選的6個數碼管都置為0,即1100 0000、16進制為0xC0。即可將六個全部都顯示。
顯示其它個數數碼管同樣原理即可。
(3)顯示數字使用編碼方式
任務:從0到F間隔0.5秒依次顯示
數碼管編碼
根據該原理圖,將0-F字符如下表格進行編碼。
?共陰極數碼管編碼
注意:
①本原理圖數碼管為共陰極顯示,共陽極數碼管編碼就不一樣了
②如果需要點亮小數點,則需要對表格重新編碼。
定義數組
uchar code table[]= {//0-9 A-F,共陰極數碼管顯示編碼0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };代碼
#include <reg52.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit dula=P2^6; //段選鎖存器-使能控制 sbit wela=P2^7; //位選鎖存器-使能控制 uchar num;uchar code table[]= {//0-9 A-F,共陰極數碼管顯示編碼0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };void Delay_ms(uint xms) {uint i,j; for(i=xms;i>0;i--)for(j=110;j>0;j--); }void main() {wela=1; //位選鎖存器使能//P0=0xFE; //1111 1110 :啟用第一個數碼管-左邊第一個//P0=0xFD; //1111 1101 :啟用第二個數碼管-左邊第二個P0=0xC0; //1100 0000wela=0;P0=0X7F; //0111 1111 :顯示數字8 while(1){for(num=0;num<16;num++){dula=1; //段選鎖存器使能P0=table[num];dula=0; //段選鎖存器去使能Delay_ms(500); //500毫秒延時}} }2、動態顯示
(1)原理
數碼管動態顯示又叫數碼管的動態掃描顯示。通俗的說就是先在第一個數碼管顯示一個數字然后關閉再在在很短的時間延遲后在第二個數碼管上顯示數字再關閉,再延遲一段時間再在第三個數碼管上顯示數字,依次類推。
這個延遲時間要設置的非常小,測試的時候從500毫秒到10毫秒內,現象為輪流點亮6個數碼管數碼管到數碼管一起變得閃爍顯示數字。最后設置1毫秒延時,因為視覺暫留效應,人的眼睛是看不出來的,所以看起來像是靜態顯示的一樣。
(2)代碼實現
#include <reg51.h> #include <intrins.h>#define uint unsigned int #define uchar unsigned charsbit dula=P2^6; //段選鎖存器-使能控制 sbit wela=P2^7; //位選鎖存器-使能控制 uchar num; uchar index;uchar code table[]= {//0-9 A-F,共陰極數碼管顯示編碼0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };void Delay_ms(uint xms) {uint i,j; for(i=xms;i>0;i--)for(j=110;j>0;j--); }void main() {uint delayTime=1; //延時時間-毫秒while(1){//第一個數碼管顯示num=1;dula=1;P0=table[num];dula=0;P0=0xFF; //消影功能-將所有數碼管段都置高電平,都熄滅,就不會有亮點帶到下一位數碼管上了wela=1;P0=0xfe;wela=0;Delay_ms(delayTime); //第二個數碼管顯示num=2;dula=1;P0=table[num];dula=0;P0=0xFF;wela=1;P0=0xfd; //1111 1101wela=0;Delay_ms(delayTime);//第三個數碼管顯示num=3;dula=1;P0=table[num];dula=0;P0=0xFF;wela=1;P0=0xfb; //1111 1011wela=0;Delay_ms(delayTime);//第四個數碼管顯示num=4;dula=1;P0=table[num];dula=0;P0=0xFF;wela=1;P0=0xf7; //1111 0111wela=0;Delay_ms(delayTime);//第五個數碼管顯示num=5;dula=1;P0=table[num];dula=0;P0=0xFF;wela=1;P0=0xef; //1110 1111wela=0;Delay_ms(delayTime);//第六個數碼管顯示num=6;dula=1;P0=table[num];dula=0;P0=0xFF;wela=1;P0=0xdf; //1101 1111wela=0;Delay_ms(delayTime);}}(3)測試
分別設置delayTime不同的值,依次編譯生成HEX文件下載。
500毫秒運行效果:
uint delayTime=500;
100毫秒運行效果:
uint delayTime=100;
20毫秒運行效果:
uint delayTime=20;
5毫秒運行效果:
uint delayTime=5;
1毫秒運行效果:
uint delayTime=1;
工程下載鏈接
https://download.csdn.net/download/panjinliang066333/86504920
總結
以上是生活随笔為你收集整理的C51单片机使用3-数码管显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 敏捷项目管理实战之进度管理
- 下一篇: Android-网络编程:快乐词典