LED數(shù)碼管的顯示和驅(qū)動原理是電子工程師必需熟練撐握的,對于單個數(shù)碼管來說,點(diǎn)亮不同的LED段,就能形成相對應(yīng)的數(shù)字,比如下圖中,點(diǎn)亮BC兩個段就是顯示的數(shù)字1,點(diǎn)亮abdeg這幾個段就是顯示數(shù)字2,這個很容易理解。
7段數(shù)碼管
而對于兩位一體的數(shù)碼管有共陰和共陽之分,共陽的內(nèi)部電路結(jié)構(gòu)如下圖所示,這種就需要控制器對這兩個數(shù)碼管進(jìn)行不同時(shí)間段的輪流顯示,而輪流顯示的頻率要大于人眼能感覺到的閃爍頻率。
這種兩位一體的數(shù)碼管我在專欄“數(shù)字電子技術(shù)”的第66節(jié)視頻進(jìn)行了詳細(xì)講解,并用proteus軟件進(jìn)行了仿真,之后還在真實(shí)電路上運(yùn)行了程序進(jìn)行測試。
下圖是proteus的電路原理圖
下面是C語言程序源代碼
//用AT89C52實(shí)現(xiàn)的兩位共陽數(shù)碼管顯示程序
#include 《reg52.h》
#include 《type_def.h》
#include 《intrins.h》
extern void Delay10ms(void);
extern void display(UINT8 number);
sbit SW = P1^7;
sbit LED_GREEN = P2^3;
sbit BUZZER = P2^4;
sbit WEI_SHI = P2^5;
sbit WEI_GE = P2^6;
int tcount = 0;//記錄經(jīng)過的10ms區(qū)間段個數(shù)
UINT8 add_cnt = 0;
UINT8 num = 0;
UINT8 code num_table[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void T0_INT() interrupt 1 //timer0中斷, 每10ms觸發(fā)一次
{
TR0 = 0;//關(guān)閉timer0
TH0 = 0xD8;
TL0 = 0xF0;//65536 - 10000 = 55536
if(tcount 》 0)
{
tcount ++;
}
if(tcount 》 11) //10ms * 10 = 100ms
{
tcount = 0;
BUZZER = 1;
LED_GREEN = 1;
}
display(num);
TR0 = 1;//重新開啟timer0
}
void display(UINT8 num)
{
if (!add_cnt)
{
P0 = 0xff; //關(guān)8個段碼
WEI_SHI = 1; //打開十位的數(shù)碼管共陽極公共端
WEI_GE = 0;
P0 = num_table[num/10]; //顯示的十位數(shù)字
add_cnt = 1;
}
else
{
P0 = 0xff; //關(guān)8個段碼
WEI_SHI = 0; //關(guān)十位的數(shù)碼管
WEI_GE = 1; //打開個位的數(shù)碼管共陽極公共端
P0 = num_table[num%10]; //顯示的個位數(shù)字
add_cnt = 0;
}
}
void Delay10ms(void) //@12.000MHz
{
unsigned char i, j;
i = 20;
j = 113;
do
{
while (--j);
} while (--i);
}
main()
{
BUZZER = 1;
LED_GREEN = 1;
TMOD = 0x01;
TH0 = 0xD8;
TL0 = 0xF0; //65536 - 10000 = 55536
IE = 0x82; //EA + ET0 --》 1000 0010
TR0 = 1; //開啟timer0
while(1){
if(0 == SW){
Delay10ms();
if(0 == SW){
while(0 == SW){}
BUZZER = 0;
LED_GREEN = 0;
tcount = 1;
num++;
if (num 》 99)
{
num = 0;
}
}
}
}
return 1;
}
責(zé)任編輯人:CC
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1874瀏覽量
90947 -
共陽數(shù)碼管
+關(guān)注
關(guān)注
0文章
14瀏覽量
11275
發(fā)布評論請先 登錄
相關(guān)推薦
評論