您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 三极管焊接数码管的方法
数码管电路的制做与驱动2007-08-2121:17数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个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秒的间隔在闪烁,这是采用查询方式的,比较占CPU资源/********************************************************************定义管脚:P2_0-------上横aP3_0-------个位P2_1-----右上竖bP3_1-------十位P2_2-----右下竖cP3_2-------百位P2_3-----下横dP3_3-------千位P2_4-----左下竖eP3_4-------万位P2_5-----左上竖fP3_5-------十万位P2_6-----中间横gP2_7-----小数点H*********************************************************************/#includeAT89X51.htypedefunsignedcharuchar;ucharcodebit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码值表:0,1,2,3,4,5ucharcodemeg_val[]={0x03,0x9f,0x25,0x0d,0x99,0x49};//段码值表:0,1,2,3,4,5ucharcodehello[]={0x03,0xe3,0xe3,0x61,0x91,0xff};//HELLOucharcodebeybey[]={0x89,0x61,0xc1,0x89,0x61,0xc1};//beybeyucharcodeab6789[]={0xc1,0x11,0x09,0x01,0x1f,0x41};//ab6789voiddelay(intn);voidmain(void){uchari,m;P2=0xff;//先将段码关闭P3=0xff;//将位码关闭delay(20);//等待一会while(1){for(m=30;m0;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秒}}voiddelay(intn)//子程序{intj;uchark;for(j=0;jn;j++){for(k=255;k0;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------上横*********************************************************************/#includeAT89X51.htypedefunsignedcharuchar;ucharcodebit_num[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位码:0,1,2,3,4,5ucharcodemeg_val[]={0x49,0x99,0x0d,0x25,0x9f,0x03};//段码:0,1,2,3,4,5uchari,aa;//定义全局变量bitfg;//定义一个亮起和熄灭标志voidtimer0(void)interrupt1using1//中断程序{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-2000TL0=0x30;}voidmain(void){P2=0xff;//先将段码关闭P3=0xff;//将位码关闭TMOD=0x01;//设置T0为模式1TH0=0xf8;//装入计数初值高位TL0=0x30;//装入计数初值低位EA=1;//总充许ET0=1;//T0充许fg=1;//将亮、灭标志设置为亮TR0=1;//启动中断while(1);}
本文标题:三极管焊接数码管的方法
链接地址:https://www.777doc.com/doc-2807508 .html