LED數碼管的顯示和驅動原理是電子工程師必需熟練撐握的,對于單個數碼管來說,點亮不同的LED段,就能形成相對應的數字,比如下圖中,點亮BC兩個段就是顯示的數字1,點亮abdeg這幾個段就是顯示數字2,這個很容易理解。
7段數碼管
而對于兩位一體的數碼管有共陰和共陽之分,共陽的內部電路結構如下圖所示,這種就需要控制器對這兩個數碼管進行不同時間段的輪流顯示,而輪流顯示的頻率要大于人眼能感覺到的閃爍頻率。
這種兩位一體的數碼管我在專欄“數字電子技術”的第66節視頻進行了詳細講解,并用proteus軟件進行了仿真,之后還在真實電路上運行了程序進行測試。
下圖是proteus的電路原理圖
下面是C語言程序源代碼
//用AT89C52實現的兩位共陽數碼管顯示程序
#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;//記錄經過的10ms區間段個數
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觸發一次
{
TR0 = 0;//關閉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; //關8個段碼
WEI_SHI = 1; //打開十位的數碼管共陽極公共端
WEI_GE = 0;
P0 = num_table[num/10]; //顯示的十位數字
add_cnt = 1;
}
else
{
P0 = 0xff; //關8個段碼
WEI_SHI = 0; //關十位的數碼管
WEI_GE = 1; //打開個位的數碼管共陽極公共端
P0 = num_table[num%10]; //顯示的個位數字
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;
}
責任編輯人:CC
-
數碼管
+關注
關注
32文章
1883瀏覽量
91338 -
共陽數碼管
+關注
關注
0文章
14瀏覽量
11310
發布評論請先 登錄
相關推薦
評論