• <rp id="wfxtb"><acronym id="wfxtb"></acronym></rp><em id="wfxtb"></em><dd id="wfxtb"><big id="wfxtb"><video id="wfxtb"></video></big></dd>
  • <rp id="wfxtb"></rp>

    <mark id="wfxtb"><center id="wfxtb"></center></mark>

      <rp id="wfxtb"><span id="wfxtb"><u id="wfxtb"></u></span></rp>

      <rp id="wfxtb"><object id="wfxtb"></object></rp>

      注意:訪問本站需要Cookie和JavaScript支持!請設置您的瀏覽器! 打開購物車 查看留言付款方式聯系我們
      初中電子 單片機教材一 單片機教材二
      搜索上次看見的商品或文章:
      商品名、介紹 文章名、內容
      首頁 電子入門 學單片機 免費資源 下載中心 商品列表 象棋在線 在線繪圖 加盟五一 加入收藏 設為首頁
      本站推薦:
      AT89C51制作的簡單計數器
      文章長度[3499] 加入時間[2007/4/13] 更新時間[2025/4/13 2:24:56] 級別[0] [評論] [收藏]

      AT89C51制作的簡單計數器

      作者:大俠 明浩 原載:磁動力電子論壇

        
        網上好友大俠畫了一個計數器的電路圖讓我幫忙寫個軟件,抽空寫了一個。他做好了電路我就把程序給他燒寫實驗,稍微修改后達到他的要求。

        圖中可以看到本制作的主要核心電路是用AT89C51組成的按鍵取值電路,S3S4分別控制計數值的加減。數碼管使用的是共陽極通過3906控制。

        這個計數器主要用于對鍵的按鍵次數計數,用于鼠標中的微按鈕或其它按鈕做QC測試用。所以在軟件中用了取兩次定時中斷的鍵值做比較以達到簡單防抖動和取健值的目的。讀者朋友可以自行修改程序以適合自己的電路。本計數器的計數范圍為0-999999,最大的頻率為50Hz,當然這些參數都可以根據需要調整。程序使用的是匯編延時程序,可以改用C寫,沒有任何關系只是我偷懶從舊的程序中拷過來用。

      點擊看大圖
      原理圖(點擊看大圖)

      實驗板

      #include <AT89X51.H>
      #define Key_UP P3_6 //上調
      #define Key_DOWN P3_7 //下調
      #define LED P0
      #define LED1 P2_2 //LED控制
      #define LED2 P2_3 //LED控制
      #define LED3 P2_4 //LED控制
      #define LED4 P2_5 //LED控制
      #define LED5 P2_6 //LED控制
      #define LED6 P2_7 //LED控制

      unsigned char code LEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
      //共陽0-9的LED筆劃
      static unsigned char bdata Key; //可位尋址的狀態寄存器
      sbit NewKeyUP = Key ^ 0;
      sbit NewKeyDOWN = Key ^ 1;
      sbit OldKeyUP = Key ^ 2;
      sbit OldKeyDOWN = Key ^ 3;
      static unsigned long data Count;
      static unsigned char LEDN[6];

      void main(void)
      {
      void Delay_510(void);

      Count = 0; //初始化變量
      Key = 0;

      EA = 1; //允許CPU中斷
      ET0 = 1; //定時器0中斷打開
      TMOD = 0x1; //設定時器0為模式1,16位模式
      TH0=0xB1;
      TL0=0xDF; //設定時值為20000us(20ms)
      TR0 = 1; //開始定時
      while(1);
      }

      //定時器0中斷外理中鍵掃描和顯示
      void KeyAndDis_Time0(void) interrupt 1 using 2
      {
      TH0=0xB1;
      TL0=0xDF; //設定時值為20000us(20ms)

      NewKeyUP = Key_UP; //取新的鍵值
      NewKeyDOWN = Key_DOWN;

      if (!OldKeyUP && NewKeyUP) //鍵放開時,這里的中斷為20ms左右(定時值非自動裝載所以多于20ms)
      Count++;
      if (!OldKeyDOWN && NewKeyDOWN)
      Count--; //這里Conut為int 沒有做負數等處理,有需要自行加上
      if (Count>999999)
      Count = 999999;
      LEDN[5]=Count/100000;
      LEDN[4] = (Count-100000*(long)LEDN[5])/10000;
      LEDN[3] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4])/1000;
      LEDN[2] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3])/100;
      LEDN[1] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2])/10;
      LEDN[0] = (Count-100000*(long)LEDN[5]-10000*(long)LEDN[4]-1000*(long)LEDN[3]-100*(long)LEDN[2]-10*(long)LEDN[1]);

      LED=LEDDis[LEDN[5]];
      LED6 = 0;
      Delay_510();
      LED6 = 1;

      LED=LEDDis[LEDN[4]];
      LED5 = 0;
      Delay_510();
      LED5 = 1;

      LED=LEDDis[LEDN[3]];
      LED4 = 0;
      Delay_510();
      LED4 = 1;

      LED=LEDDis[LEDN[2]];
      LED3 = 0;
      Delay_510();
      LED3 = 1;

      LED=LEDDis[LEDN[1]];
      LED2 = 0;
      Delay_510();
      LED2 = 1;

      LED=LEDDis[LEDN[0]];
      LED1 = 0;
      Delay_510();
      LED1 = 1;

      OldKeyUP = NewKeyUP;
      OldKeyDOWN = NewKeyDOWN;
      }

      void Delay_510(void) //延時510微秒
      {
      #pragma asm
      MOV R0,#7DH
      MOV R1,#02H
      TSR1:
      DJNZ R0,TSR1
      MOV R0,#7DH
      DJNZ R1,TSR1
      #pragma endasm
      }

      1、 本站不保證以上觀點正確,就算是本站原創作品,本站也不保證內容正確。
      2、如果您擁有本文版權,并且不想在本站轉載,請書面通知本站立即刪除并且向您公開道歉! 以上可能是本站收集或者轉載的文章,本站可能沒有文章中的元件或產品,如果您需要類似的商品請 點這里查看商品列表!
      本站協議。 版權信息。 關于我們。 本站地圖。 營業執照。 發票說明。 付款方式。 聯系方式
      深圳市寶安區西鄉五壹電子商行——粵ICP備16073394號-1;地址:深圳西鄉河西四坊183號;郵編:518102
      E-mail:51dz$163.com($改為@);Tel:(0755)27947428
      工作時間:9:30-12:00和13:30-17:30和18:30-20:30,無人接聽時可以再打手機13537585389
      91嫩草黄片动漫版