<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 數(shù)碼管電路的制做與驅(qū)動(dòng)

          數(shù)碼管電路的制做與驅(qū)動(dòng)

          作者: 時(shí)間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
          數(shù)碼管的使用方法與發(fā)光二極管沒什么區(qū)別,只是把七或八只發(fā)光二極管組合在一個(gè)模件上組成了個(gè)8字和小數(shù)點(diǎn),用以顯示數(shù)字。為了減少管腳,把各個(gè)發(fā)光管的其中同一個(gè)極接在一起作為共用點(diǎn),因此就產(chǎn)生了共陽極和共陰極數(shù)碼之說。共陽管就是把各個(gè)發(fā)光管的正極接在一起,而共陰管就剛好相反。見下圖:
          一般來說大部分的邏輯IC的吸收電流要強(qiáng)于輸出電流。因此,大家都愛使用共陰極的數(shù)碼管,因?yàn)榭蛇x的IC多些。很可惜,我的這組數(shù)碼管是共陽的,因此公共端我打算用三級(jí)管來驅(qū)動(dòng)。
          我的最小系統(tǒng)板:
          我用最常用的S9012,首先我得計(jì)劃好電路方式,就采用最常用的動(dòng)態(tài)掃描顯示。先搭建最簡電路,調(diào)試出需采用元件的參數(shù)。
          先不接上圖的R2和74HC244,將數(shù)碼管一個(gè)段直接接地。調(diào)節(jié)R1,測(cè)得S9012基極電流為0.21mA時(shí)集電極也就是數(shù)碼管上已有40mA,說明放大倍數(shù)足夠了。這時(shí)接上R2和74HC244,調(diào)節(jié)R2使數(shù)碼管電流控制在15mA,這樣當(dāng)8個(gè)段一起點(diǎn)亮?xí)r三極管上得通過120mA的電流。而基極上需要0.63mA,為了減小三極管的負(fù)荷應(yīng)使三極管過飽和,,調(diào)節(jié)R1使基極電流為2mA,此時(shí)測(cè)得集電極和漏極之間的電壓約0.1V。好!此時(shí)R1為2K。R2為240歐姆。確定。
          接下來就是確定電路。電路的接口與AT89S51間有三組接口:段碼、位碼和電源。為了讓AT89S51獨(dú)立出來這三級(jí)接口都采用插針做接口,用排線自由連接到AT89S51的P1-P3口,電源用短路帽連接,完成后的板子見下圖
          反面:
          說明:
          然后就是寫程序。先寫個(gè)查詢方式的吧!
          //六位管碼管在以0.3秒的間隔在閃爍,這是采用查詢方式的,比較占CUP資源
          /********************************************************************
          定義管腳:P2_0-------上橫 a P3_0-------個(gè)位
          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-----小數(shù)點(diǎn) 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; //先將段碼關(guān)閉
          P3=0xff; //將位碼關(guān)閉
          delay(20);//等待一會(huì)
          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; //關(guān)閉段碼
          P3=0xff; //關(guān)閉位碼
          delay(1000); //等待0.3秒
          }
          }
          void delay(int n) //子程序
          {
          int j;
          uchar k;
          for(j=0;j {
          for(k=255;k>0;k--);
          }
          }
          ======================================
          當(dāng)我插把程序?qū)懭肫樱迳想娺\(yùn)行時(shí),是亂碼。你猜怎么回事?
          原來那個(gè)P2口方向是反的,您注意過沒有,在AT89S51管腳排列上,P0--P1和P3都是上方為PX_0。而唯獨(dú)P2口管腳排列是下方為P2_0。方向則好是反的。既然反了,我就把段碼表重寫一下。再試,一切正常。
          在這里我說一下段碼的排列,好多人問數(shù)碼管段碼是如何排列的,我也在網(wǎng)上查了,好像沒有什么標(biāo)準(zhǔn)的排法,隨自己的接法而定,這也是導(dǎo)致為什么在網(wǎng)上下載的一些數(shù)碼管程序在自己的板子上不能正常顯示的原因。就普遍而言我最上面的那張圖示的標(biāo)法最多,在上面程序里原打算也是P2_0對(duì)應(yīng)段碼a(也就是上面的橫)。一直到P2_7對(duì)應(yīng)段為h(就是小數(shù)點(diǎn))。結(jié)果哪知道P2口剛好是反的。這樣一來也就是倒過來了,P2_0對(duì)應(yīng)段h(小數(shù)點(diǎn)了)。例如我原先定義的數(shù)碼管顯示“2”段碼為10100100B的,一接反了就不再是“2”了。而要想再顯示“2”那就把段碼的高低位倒過來。改為00100101B就OK了。
          下面再寫個(gè)用中斷來顯示的:
          //這是采用中斷方式的,也是帶閃爍的。
          /********************************************************************
          定義管腳:P2_0------小數(shù)點(diǎn) P3_0------個(gè)位
          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; //定義一個(gè)亮起和熄滅標(biāo)志
          void timer0(void) interrupt 1 using 1 //中斷程序
          {
          if (fg) //當(dāng)fg為1時(shí)點(diǎn)亮6位數(shù)碼管
          { P2=0xff;
          if (i>=6)
          {
          i=0;
          }
          else
          {
          P3=bit_num[i]; //輸出位碼到P3口
          P2=meg_val[i]; //輸出段碼到P2口
          i++;
          }
          }
          else //當(dāng)fg為0時(shí)熄滅數(shù)碼管
          {
          if(aa==0)
          {
          P3=0xff;
          P2=0xff;
          }
          }
          aa++;
          if (aa>=254) //當(dāng)aa值累加至254時(shí)fg標(biāo)志翻轉(zhuǎn)。
          {
          fg=~fg;
          aa=0;
          }
          TH0=0xf8; //重裝定時(shí)器初值,2ms,值為65536-2000
          TL0=0x30;
          }

          void main(void)
          {
          P2=0xff; //先將段碼關(guān)閉
          P3=0xff; //將位碼關(guān)閉
          TMOD=0x01;//設(shè)置T0為模式1
          TH0=0xf8; //裝入計(jì)數(shù)初值高位
          TL0=0x30; //裝入計(jì)數(shù)初值低位
          EA=1; //總充許
          ET0=1; //T0充許
          fg=1; //將亮、滅標(biāo)志設(shè)置為亮
          TR0=1; //啟動(dòng)中斷
          while(1);
          }
          OK!



          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();