当前位置:首页 > 单片机 > 单片机
[导读]数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极

数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。见下图:

一般来说大部分的逻辑IC的吸收电流要强于输出电流。因此,大家都爱使用共阴极的数码管,因为可选的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资源
/********************************************************************
定义管脚:P2_0-------上横 a P3_0-------个位
P2_1-----右上竖 b P3_1-------十位
P2_2-----右下竖 c P3_2-------百位
P2_3----- 下横 d P3_3-------千位
P2_4-----左下竖 e P3_4-------万位
P2_5-----左上竖 f P3_5-------十万位
P2_6-----中间横 g
P2_7-----小数点 H
*********************************************************************/
# 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了。下面再写个用中断来显示的://这是采用中断方式的,也是带闪烁的。
/********************************************************************
定义管脚:P2_0------小数点 P3_0------个位
P2_1------中横 P3_1------十位
P2_2------左上竖 P3_2------百位
P2_3------左下竖 P3_3------千位
P2_4------下横 P3_4------万位
P2_5------右下竖 P3_5------十万位
P2_6------右上竖
P2_7------上横
*********************************************************************/
# 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);
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在电动汽车(EV)领域,牵引逆变器作为关键组件之一,扮演着至关重要的角色。它不仅影响电动汽车的驱动性能和效率,还直接关联到整车的安全性和耐用性。本文将详细介绍在选择电动汽车牵引逆变器时需要考量的多个方面,包括其保护机制与...

关键字: 逆变器 电动汽车 驱动

7月3日消息,AMD显卡战未来,再添实锤证据!

关键字: 驱动 英伟达

在当今高速发展的电子系统领域,信号完整性已然成为确保系统性能与可靠性的关键要素。从驱动到连接器的信号传输路径宛如一条信息高速公路,而接收端则如同这条公路的终点收费站,其设置的合理性直接关乎信号能否准确无误地抵达目的地。若...

关键字: 信号 连接器 驱动

在复杂的嵌入式系统或高性能计算环境中,以太网驱动的稳定性与可靠性至关重要。然而,有时开发者会遇到一些难以解释的现象,比如拔掉一个网口后,另一个原本工作正常的网口突然无法接收数据。这种看似不合逻辑的问题,往往隐藏着深层次的...

关键字: 以太网 驱动

在嵌入式开发过程中,许多系统通常使用串口驱动来满足通信要求,但在实际应用中,使用SPI通信方式会更加高效和快捷。

关键字: 串口 驱动

变频调速电机简称变频电机,是变频器驱动的电动机的统称,优点是具备有启动功能;采用电磁设计,减少了定子和转子的阻值;适应不同工况条件下的频繁变速;在一定程度上节能。

关键字: 变频 调速电机 驱动

发光二极管驱动芯片按类型可分为:恒压式驱动芯片、恒流式驱动芯片以及脉冲式驱动芯片。其中恒压式驱动芯片一般就是我们常见的DC/DC升压芯片居多。

关键字: 二极管 驱动 芯片

在电子工程领域,图腾柱电路(Totem Pole Circuit)以其独特的结构和广泛的应用场景,成为了数字电路与模拟电路之间不可或缺的桥梁。这种电路结构以其高效的驱动能力和快速的开关速度,在电力电子、开关电源、微控制器...

关键字: 图腾柱电路 驱动 信号转换

在Linux操作系统的广阔世界中,设备驱动扮演着至关重要的角色,它们作为内核与用户空间之间的桥梁,使得用户可以高效地与硬件设备进行交互。其中,字符设备驱动因其简单直接的交互模式,成为众多硬件设备驱动的首选实现方式。本文将...

关键字: 字符设备 Linux内核 驱动

根据具体应用的不同,LED可能会采用不同的电源来供电,如交流线路、太阳能板、12 V汽车电池、直流电源或低压交流系统,甚至是基于碱和镍的电池或锂离子电池等。

关键字: 交流 离线电源 驱动
关闭