系列文章目录
硬件电路学习系列(一)-----电源滤波整流电路设计
硬件电路学习系列(二)-----常用电子元件
硬件电路学习系列(三)-----数码管驱动电路设计
前言
这一章节我们来学习一下数码管显示电路,数码管驱动的硬件电路比较简单,上手很容易。
一、LED驱动
我们学习数码管驱动电路前,我们要知道,数码管内部就是由LED灯珠构成,所以我们要先来了解一下Led是怎么驱动的。
Led灯,即发光二极管,当阳极电压超过阴极电压0.7V(硅管,锗管为0.3V)时,二极管导通,发光二极管会点亮,我们可以通过二极管两个电压差就可以点亮该二极管,但是发光二极管的亮度是由流经该二极管的电流决定的,电压决定了是否导通,电流决定了其亮度。
所以我们在驱动LED的时候我们要考虑好输入电流的大小,像使用单片机时,为保证其正常工作,一般IO口的电流不超过1mA,而LED正常工作时的电流一般为10-20mA,故需要外部驱动电路。
LED驱动电路
驱动LED的方法有很多,可以直接用三极管驱动,也可以用达林顿管或者驱动芯片来驱动,这里我直接用三极管来进行驱动。
电路中各个元件的作用:
电阻R1:主要起限流作用。
电阻R2:下拉电阻,保证上电后为电路状态为低电平状态。
电阻R3:主要起限流作用,限制流经LED的电流。
电容C15:主要起滤波作用。
二极管D1:该二极管为TVS瞬态二极管,当电压超过所需电压时起保护作用。
二、数码管驱动
1.数码管显示原理
简单来说,数码管其实就是由几个二极管构成,从照片可以看出来数码管由8个发光二极管组成,其实就相当于一次性驱动八个发光二极管。
根据公共端的接法,我们可以将数码管分为共阴极数码管和共阳极数码管
共阴极主要是八个发光二极管阴极同时接地,共阳极是八个二极管阳极全都接在电源上,我们在使用发光二极管时要注意好该二极管是共阴极还是共阳极。
对于多位一体的数码管,他们的数字段都是连接在一起的,但是他们的公共端是独立的,我们通过控制公共端来控制显示的数码管,我们称该公共端为位选线。
数码管中,每个LED灯对应一个横段,我们可以通过同时点亮几个LED灯来组成我们想要的数值,比如同时亮bc段显示数字1,同时亮abdeg显示数字2,以此类推,我们就可以得到数字0到9了
2.数码管驱动
上面介绍了一下数码管的工作原理,其实涉及到的东西很简单,利用多段二极管同时点亮来显示我们想要的数值,数码管的驱动其实和LED驱动差不多,不过由于数码管内部涉及到的发光二极管比较多,如果单纯用三极管和电阻来搭建驱动电路的话使用到的元件比较多,我们这里直接使用达林顿管来驱动数码管。
我们这里使用89c52通过达林顿管驱动四位一体数码管,原理图(随手画的)如下
3.数码管动态显示
数码管的动态显示又叫做数码管的动态扫描显示,静态显示其实就是几个数码管都是一样的,太简单了,直接按照上面给的数值表就可以了,我们这里主要讲动态显示。
动态扫描显示,即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示,而实际上多位数码管是一位一位轮流显示的,只是轮流的速度非常快,人眼已经无法分辨出来。
程序代码如下:
#include <reg52.h> //52系列单片机头文件
unsigned char table[]={
0x3f, //00111111->0x3f 0
0x06, //00000110->0x03 1
0x5b, //01011011->0x5b 2
0x4f, //01001111->0x4f 3
0x66, //01100110->0x66 4
0x6d, //01101101->0x6d 5
0x7d, //01111101->0x7d 6
0x07, //00000111->0x07 7
0x7f, //01111111->0x7f 8
0x6f, //01101111->0x6f 9
};
void delay_ms(unigned int x)
{
unsigned char i, j;
while(x--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
void display(unsigned char Choose,unsigned char ShowNumber)
{
switch(Choose)
{
case 1:P2_0=1;P2_1=1;P2_2=1;P2_3=1; break;
case 2:P2_0=0;P2_1=1;P2_2=1;P2_3=1; break;
case 3:P2_0=0;P2_1=0;P2_2=1;P2_3=1; break;
case 4:P2_0=0;P2_1=0;P2_2=0;P2_3=1; break;
case 5:P2_0=0;P2_1=0;P2_2=1;P2_3=0; break;
case 6:P2_0=0;P2_1=1;P2_2=0;P2_3=0; break;
case 7:P2_0=1;P2_1=0;P2_2=0;P2_3=0; break;
case 8:P2_0=0;P2_1=0;P2_2=0;P2_3=0; break;
}
P0=table[ShowNumer];
delay_ms(2);
P0=0x00;
}
void main(){
while(1)
{
display(1,4);
display(2,3);
display(3,2);
display(4,1);
}
}
总结
这一章主要学了一下数码管驱动的知识,比较简单