电子说
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
全部0条评论
快来发表一下你的评论吧 !