如何驱动两位一体的共阳数码管?

电子说

1.3w人已加入

描述

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分