首先,从百度百科里面借点资料吧!数码管是一种半导体发光器件,其基本单元是发光二极管。
静态显示驱动
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
动态显示驱动
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
平时我们点亮数码管时最主要是要考虑到电压和电流。静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。电压嘛,可以查引脚排布图,看一下每段的芯片数量是多少?当红色与黄绿色时,使用1.9V乘以每段的芯片串联的个数;当绿色/蓝色时,使用3.1V乘以每段的芯片串联的个数。
这次我用的是四位七段数码管,就先介绍它们了,首先根据网上查的资料确定了,公共极(位选)以及段选。具体的是:从正面看,数码管有引脚的一面向下,按逆时针为:1、2、3、、、12:下面一排是1到6,上面一排是7到12,具体如下;
1af23b(上排)
edpcg4(下排)
其中1234为位选,p为点。
重要:共阴、共阳都是这样的。
下面说说与单片机使用时需要注意的事项:
1、 共阳数码管与单片相连时,需要接三极管放大电流来点亮数码管,具体接法要看使用什么三极管了,这个网上应该有很多资料,所以我就不说了。
2、 共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.
18 个解决方案
#1
路过,支持原创!
#2
共阳极必须接三极管放大电路吗?
还有锁存器没有放大作用吧,只是输入输出的控制锁存呀
还有锁存器没有放大作用吧,只是输入输出的控制锁存呀
#3
1、 共阳数码管与单片相连时,需要接三极管放大电流来点亮数码管,具体接法要看使用什么三极管了,这个网上应该有很多资料,所以我就不说了。
2、 共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.
楼主 我用Proteus仿真时频率要调整一下吗
2、 共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.
楼主 我用Proteus仿真时频率要调整一下吗
#4
什么频率啊?proteus仿真的时候不用接三极管····
#5
感谢三楼,我就是这个地方不是很懂啊!!
#6
锁存器能将单片机的io口电流放大来驱动数码管,比如你直接用io口高电平是无法点亮供阴的数码管
#7
这个是真的,但是我们发现共阳数码管可以直接用单片机驱动只是亮度不够,而且有一个同学竟然自己去编码,四位七段的数码管最后变成自己的玩物了,他不按照传统的接法,按最方便的接法,主要在程序方面下功夫··我仰视···
#8
很好 谢谢
#9
写的太好了 我现在在做DS18B20的仿真 但是数码管老是乱码。。不知道为什么。。
#10
是不是用AD转换啊?你可能AD和单片机IO口的引脚接反了。
#11
这个顶你一下。
#12
我用过,通过中断动态显示,5ms中断没问题,采用74HC595移位锁存器驱动,串行方式输出数据,IO口驱动共阴端用三极管点亮数码管。显示子程序如下:
//本子程序在5ms定时中断中调用,每次显示一个数码管,g_disp_location变量确定显示哪一位
#define PIN_SDIN P0_0
#define PIN_ST P0_1
#define PIN_SH P0_2
#define LOC_D1 0x08
void Display(void)
{
unsigned char i,ch,loc;
if(g_disp_location>3) g_disp_location=0; // display one digit every time, total 4 digits.
if(gb_left_right) //left or right
{
ch=G_Disp_Buf1[g_disp_location]; //left
PIN_LED_RUN=1;
}
else
{
ch=G_Disp_Buf2[g_disp_location]; //right
PIN_LED_RUN=0;
}
loc=LOC_D1; // D1 position,P0_3-P0_6 located D1-D4
for(i=0;i<g_disp_location;i++) loc <<=1;
P0 &=0x87; // P0_3-6 clear, disable display
PIN_ST=0;
for(i=0;i<=7;i++) // output one character
{
PIN_SH=0;
if((ch&0x80)==0) PIN_SDIN=0;
else PIN_SDIN=1;
ch <<=1;
PIN_SH =1;
}
PIN_ST=1; // character ready
P0 |=loc; // set D1,D2,D3 or D4 ,enable display
g_disp_location++;
}
//本子程序在5ms定时中断中调用,每次显示一个数码管,g_disp_location变量确定显示哪一位
#define PIN_SDIN P0_0
#define PIN_ST P0_1
#define PIN_SH P0_2
#define LOC_D1 0x08
void Display(void)
{
unsigned char i,ch,loc;
if(g_disp_location>3) g_disp_location=0; // display one digit every time, total 4 digits.
if(gb_left_right) //left or right
{
ch=G_Disp_Buf1[g_disp_location]; //left
PIN_LED_RUN=1;
}
else
{
ch=G_Disp_Buf2[g_disp_location]; //right
PIN_LED_RUN=0;
}
loc=LOC_D1; // D1 position,P0_3-P0_6 located D1-D4
for(i=0;i<g_disp_location;i++) loc <<=1;
P0 &=0x87; // P0_3-6 clear, disable display
PIN_ST=0;
for(i=0;i<=7;i++) // output one character
{
PIN_SH=0;
if((ch&0x80)==0) PIN_SDIN=0;
else PIN_SDIN=1;
ch <<=1;
PIN_SH =1;
}
PIN_ST=1; // character ready
P0 |=loc; // set D1,D2,D3 or D4 ,enable display
g_disp_location++;
}
#13
正在学习单片机,正需要呢,支持!!!!!
#14
看来大家还是挺关注的!谢谢了!!
#15
这个是真的,但是我们发现共阳数码管可以直接用单片机驱动只是亮度不够,而且有一个同学竟然自己去编码,四位七段的数码……
[/Quote]共阳极的数码管直接用io口驱动亮是利用单片机的灌电流,共阴极的是利用拉点电流,io口的灌电流比拉电流大得多了,所以有可能点亮,但是如果是共阴的,普通51的io口是无法点亮的,就像你给出一个高电平不一定能点亮一个负极接在地的LED
#16
学习了,楼上的兄弟讲解的有道理!!
#17
正在学单片机,这个不错!
#18
有帮助最好了!!
#1
路过,支持原创!
#2
共阳极必须接三极管放大电路吗?
还有锁存器没有放大作用吧,只是输入输出的控制锁存呀
还有锁存器没有放大作用吧,只是输入输出的控制锁存呀
#3
1、 共阳数码管与单片相连时,需要接三极管放大电流来点亮数码管,具体接法要看使用什么三极管了,这个网上应该有很多资料,所以我就不说了。
2、 共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.
楼主 我用Proteus仿真时频率要调整一下吗
2、 共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.
楼主 我用Proteus仿真时频率要调整一下吗
#4
什么频率啊?proteus仿真的时候不用接三极管····
#5
感谢三楼,我就是这个地方不是很懂啊!!
#6
锁存器能将单片机的io口电流放大来驱动数码管,比如你直接用io口高电平是无法点亮供阴的数码管
#7
这个是真的,但是我们发现共阳数码管可以直接用单片机驱动只是亮度不够,而且有一个同学竟然自己去编码,四位七段的数码管最后变成自己的玩物了,他不按照传统的接法,按最方便的接法,主要在程序方面下功夫··我仰视···
#8
很好 谢谢
#9
写的太好了 我现在在做DS18B20的仿真 但是数码管老是乱码。。不知道为什么。。
#10
是不是用AD转换啊?你可能AD和单片机IO口的引脚接反了。
#11
这个顶你一下。
#12
我用过,通过中断动态显示,5ms中断没问题,采用74HC595移位锁存器驱动,串行方式输出数据,IO口驱动共阴端用三极管点亮数码管。显示子程序如下:
//本子程序在5ms定时中断中调用,每次显示一个数码管,g_disp_location变量确定显示哪一位
#define PIN_SDIN P0_0
#define PIN_ST P0_1
#define PIN_SH P0_2
#define LOC_D1 0x08
void Display(void)
{
unsigned char i,ch,loc;
if(g_disp_location>3) g_disp_location=0; // display one digit every time, total 4 digits.
if(gb_left_right) //left or right
{
ch=G_Disp_Buf1[g_disp_location]; //left
PIN_LED_RUN=1;
}
else
{
ch=G_Disp_Buf2[g_disp_location]; //right
PIN_LED_RUN=0;
}
loc=LOC_D1; // D1 position,P0_3-P0_6 located D1-D4
for(i=0;i<g_disp_location;i++) loc <<=1;
P0 &=0x87; // P0_3-6 clear, disable display
PIN_ST=0;
for(i=0;i<=7;i++) // output one character
{
PIN_SH=0;
if((ch&0x80)==0) PIN_SDIN=0;
else PIN_SDIN=1;
ch <<=1;
PIN_SH =1;
}
PIN_ST=1; // character ready
P0 |=loc; // set D1,D2,D3 or D4 ,enable display
g_disp_location++;
}
//本子程序在5ms定时中断中调用,每次显示一个数码管,g_disp_location变量确定显示哪一位
#define PIN_SDIN P0_0
#define PIN_ST P0_1
#define PIN_SH P0_2
#define LOC_D1 0x08
void Display(void)
{
unsigned char i,ch,loc;
if(g_disp_location>3) g_disp_location=0; // display one digit every time, total 4 digits.
if(gb_left_right) //left or right
{
ch=G_Disp_Buf1[g_disp_location]; //left
PIN_LED_RUN=1;
}
else
{
ch=G_Disp_Buf2[g_disp_location]; //right
PIN_LED_RUN=0;
}
loc=LOC_D1; // D1 position,P0_3-P0_6 located D1-D4
for(i=0;i<g_disp_location;i++) loc <<=1;
P0 &=0x87; // P0_3-6 clear, disable display
PIN_ST=0;
for(i=0;i<=7;i++) // output one character
{
PIN_SH=0;
if((ch&0x80)==0) PIN_SDIN=0;
else PIN_SDIN=1;
ch <<=1;
PIN_SH =1;
}
PIN_ST=1; // character ready
P0 |=loc; // set D1,D2,D3 or D4 ,enable display
g_disp_location++;
}
#13
正在学习单片机,正需要呢,支持!!!!!
#14
看来大家还是挺关注的!谢谢了!!
#15
这个是真的,但是我们发现共阳数码管可以直接用单片机驱动只是亮度不够,而且有一个同学竟然自己去编码,四位七段的数码……
[/Quote]共阳极的数码管直接用io口驱动亮是利用单片机的灌电流,共阴极的是利用拉点电流,io口的灌电流比拉电流大得多了,所以有可能点亮,但是如果是共阴的,普通51的io口是无法点亮的,就像你给出一个高电平不一定能点亮一个负极接在地的LED
#16
学习了,楼上的兄弟讲解的有道理!!
#17
正在学单片机,这个不错!
#18
有帮助最好了!!