您的位置 首页 知识

单片机驱动数码管电路的制做

把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点

把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显现数字。为了削减管脚,把各个发光管的其间同一个极接在一同作为共用点,因而就产生了共阳极和共阴极数码之说。共阳管便是把各个发光管的正极接在一同,而共阴管就刚好相反。见下图:

大部分的逻辑IC的吸收电流要强于输出电流。因而,我们都爱运用共阴极的数码管,由于可选的%&&&&&%多些。很可惜,我的这组数码管是共阳的,因而公共端我方案用三级管来驱动。最常用的S9012,首要我得方案好电路方法,就选用最常用的动态扫描显现。先建立最简电路,调试出需选用元件的参数。


先不接上图的R2和74HC244,将数码管一个段直接接地。调理R1,测得S9012基极电流为0.21mA时集电极也便是数码管上已有40mA,阐明扩大倍数足够了。这时接上R2和74HC244,调理R2使数码管电流控制在15mA,这样当8个段一同点亮时三极管上得经过120mA的电流。而基极上需求0.63mA,为了减小三极管的负荷应使三极管过饱和,,调理R1使基极电流为2mA,此刻测得集电极和漏极之间的电压约0.1V。好!此刻R1为2K。R2为240欧姆。


接下来便是确认电路。电路的接口与AT89S51间有三组接口:段码、位码和电源。为了让AT89S51独立出来这三级接口都选用插针做接口,用排线自在衔接到AT89S51的P1-P3口,电源用短路帽衔接,完成后的板子见下图


然后便是写程序。先写个查询方法的吧!
//六位管码管在以0.3秒的间隔在闪耀,这是选用查询方法的,比较占CUP资源

# include
typedef unsigned char uchar;
uchar code bit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码值表:0,1,2,3,4,5
uchar code meg_val[]={0x03,0x9f,0x25,0x0d,0x99,0x49};//段码值表:0,1,2,3,4,5
uchar code hello[]={0x03,0xe3,0xe3,0x61,0x91,0xff}; //HELLO
uchar code beybey[]={0x89,0x61,0xc1,0x89,0x61,0xc1};//beybey
uchar code ab6789[]={0xc1,0x11,0x09,0x01,0x1f,0x41};//ab6789
void delay(int n);
void main(void)
{
uchar i,m;
P2=0xff; //先将段码封闭
P3=0xff; //将位码封闭
delay(20);//等候一会
while(1)
{
for (m=30;m>0;m–) //显现30次约0.3秒
{
for(i=0;i<=5;i++)
{
P2=0xff;
P3=bit_num[i]; //输出位码到P3口
P2=ab6789[i]; //输出段码到P2口
delay(5);
}
}
P2=0xff; //封闭段码
P3=0xff; //封闭位码
delay(1000); //等候0.3秒
}
}

void delay(int n) //子程序
{
int j;
uchar k;
for(j=0;j
{
for(k=255;k>0;k–);
}
}
======================================
当我插把程序写入片子,插上电运行时,是乱码。你猜怎么回事?
本来那个P2口方向是反的,您留意过没有,在AT89S51管脚摆放上,P0–P1和P3都是上方为PX_0。而唯一P2口管脚摆放是下方为P2_0。方向则好是反的。已然反了,我就把段码表重写一下。再试,一切正常。
在这里我说一下段码的摆放,好多人问数码管段码是怎么摆放的,我也在网上查了,如同没有什么规范的排法,随自己的接法而定,这也是导致为什么在网上下载的一些数码管程序在自己的板子上不能正常显现的原因。就遍及而言我最上面的那张图示的标法最多,在上面程序里原方案也是P2_0对应段码a(也便是上面的横)。一直到P2_7对应段为h(便是小数点)。成果哪知道P2口刚好是反的。这样一来也便是倒过来了,P2_0对应段h(小数点了)。例如我原先界说的数码管显现“2”段码为10100100B的,一接反了就不再是“2”了。而要想再显现“2”那就把段码的高低位倒过来。改为00100101B就OK了。

下面再写个用中止来显现的:
//这是选用中止方法的,也是带闪耀的。

# include
typedef unsigned char uchar;
uchar code bit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码:0,1,2,3,4,5
uchar code meg_val[]={0x49,0x99,0x0d,0x25,0x9f,0x03};//段码:0,1,2,3,4,5
uchar i,aa; //界说全局变量
bit fg; //界说一个亮起和平息标志

void timer0(void) interrupt 1 using 1 //中止程序
{
if (fg) //当fg为1时点亮6位数码管
{ P2=0xff;
if (i>=6)
{
i=0;
}
else
{
P3=bit_num[i]; //输出位码到P3口
P2=meg_val[i]; //输出段码到P2口
i++;
}
}
else //当fg为0时平息数码管
{
if(aa==0)
{
P3=0xff;
P2=0xff;
}
}
aa++;
if (aa>=254) //当aa值累加至254时fg标志翻转。
{
fg=~fg;
aa=0;
}
TH0=0xf8; //重装定时器初值,2ms,值为65536-2000
TL0=0x30;
}
void main(void)
{
P2=0xff; //先将段码封闭
P3=0xff; //将位码封闭
TMOD=0x01;//设置T0为形式1
TH0=0xf8; //装入计数初值高位
TL0=0x30; //装入计数初值低位
EA=1; //总充许
ET0=1; //T0充许
fg=1; //将亮、灭标志设置为亮
TR0=1; //发动中止
while(1);
}
OK!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/261930.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部