技術(shù)文章您的位置:網(wǎng)站首頁 >技術(shù)文章>旋轉(zhuǎn)編碼器程序簡介
      旋轉(zhuǎn)編碼器程序簡介
      更新時間:2013-05-08   點擊次數(shù):4296次
      zui近用到旋轉(zhuǎn)編碼器,在網(wǎng)上找了一大堆資料,發(fā)現(xiàn)這篇好文章。供大家參考!
      [ME850擴展應(yīng)用]旋轉(zhuǎn)編碼器計數(shù)程序(飛梭旋鈕功能)-數(shù)碼管顯示
      /*******************************************************************
      * *
      * ME850單片機開發(fā)實驗儀演示程序 - 旋轉(zhuǎn)編碼器計數(shù)程序 *
      * *
      * 3位數(shù)碼管顯示 *
      * *
      * MCU: AT89S52 晶振:11.0592MHz *
      * *
      * 版本:V1.1 (2009/04/29) *
      * 作者:gguoqing (: gguoqing@) *
      * : (碩飛科技) *
      * (偉納單片機世界) *
      * :sofitech@ *
      * *
      *【版權(quán)】Copyright(C) 深圳碩飛科技有限公司 All Rights Reserved *
      *【聲明】此程序僅用于學(xué)習(xí)與參考,引用請注明版權(quán)和作者信息! *
      * *
      ********************************************************************
      * *
      * 功能簡述: (飛梭旋鈕功能) *
      * 當(dāng)旋鈕順時針旋轉(zhuǎn)時,計數(shù)值增加。達(dá)到zui大值255后,不再響應(yīng)。 *
      * 當(dāng)逆鈕順時針旋轉(zhuǎn)時,計數(shù)值減小。達(dá)到zui小值0后,不再響應(yīng)。 *
      * 當(dāng)按下旋鈕時,將計數(shù)值清零(歸位)。 *
      * *
      *******************************************************************/
      #Include <reg52.h>
      sbit PINA = P1^0;
      sbit PINB = P1^1;
      sbit PIND = P1^2;
      unsigned char display[3];
      unsigned char code LEDData[ ] =
      {
      0xC0,0xF9,0xA4,0xB0,0x99,0x92,
      0x82,0xF8,0x80,0x90,0xff
      };
      char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節(jié)
      unsigned char counter = 0; //編碼器脈沖計數(shù)
      unsigned char n,shift;
      /**********************************************************
      ms延時子函數(shù)
      **********************************************************/
      void delayms(unsigned int ms)
      {
      unsigned char k;
      while (ms--)
      {
      for (k = 0; k < 114; k++)
      ;
      }
      }
      /**********************************************************
      掃描編碼器子函數(shù)
      在編碼器引腳A為低電平期間:
      編碼器引腳B從0到1為正轉(zhuǎn),編碼器引腳B從1到0為反轉(zhuǎn)。
      **********************************************************/
      void scan_encoder(void)
      {
      static bit Curr_encoder_b; //定義一個變量來儲存當(dāng)前B信號
      static bit Last_encoder_b; //定義一個變量來儲存上次B腳信號
      static bit updata= 0;
      if( PINA && PINB) //編碼器無轉(zhuǎn)動退出
      {
      updata = 0;
      return;
      }
      Last_encoder_b = PINB; //記錄B信號
      while(!PINA) //等待A由低變高
      {
      Curr_encoder_b = PINB; //記錄等待期間的B信號(指當(dāng)前B信號)
      updata = 1;
      }
      if(updata)
      {
      updata = 0 ;
      if( (Last_encoder_b == 0)&&(Curr_encoder_b== 1) ) //B從0到1為正轉(zhuǎn)
      {
      if(counter == 255)
      return;
      counter++; //正轉(zhuǎn)計數(shù)加
      }
      else if( (Last_encoder_b == 1)&&(Curr_encoder_b == 0) ) //B從1到0為反轉(zhuǎn)
      {
      if(counter == 0)
      return;
      counter--; //反轉(zhuǎn)計數(shù)減
      }
      }
      }
      /**********************************************************
      主函數(shù)
      **********************************************************/
      void main(void)
      {
      P0 = 0xff;
      P1 = 0xff;
      P2 = 0xff;
      T2CON = 0x00; //設(shè)置T2CON寄存器
      TH2 = 0xfc; //1ms定時
      TL2 = 0x66;
      ET2 = 1; //啟用Timer2中斷
      EA = 1; //總中斷允許
      TR2 = 1; //啟動定時器2
      counter = 0; //計數(shù)單元清零
      while(1)
      {
      scan_encoder();
      if(! PIND) //當(dāng)按下旋鈕時
      {
      counter = 0; //計數(shù)單元清零(歸位)
      delayms(10);
      }
      }
      }
      /*********************************************************
      Timer2中斷函數(shù)
      **********************************************************/
      void timer2() interrupt 5
      {
      TR2 = 0;
      TF2 = 0; //手工清中斷標(biāo)志
      TH2 = 0xfc; //1ms定時常數(shù)
      TL2 = 0x66;
      if(n >= 3) //3位數(shù)碼管顯示
      {
      n = 0;
      shift = 0xfe; //送位碼初值
      P2 = 0xff; //關(guān)閉顯示
      }
      else
      {
      display[0] = counter%10; //個位數(shù)據(jù)
      display[1] = (counter%100)/10; //十位數(shù)據(jù)
      display[2] = counter/100; //百位數(shù)據(jù)

      if(display[2] == 0)
      {
      display[2] = 0x0a; //百位為0,不顯示
      if(display[1] == 0)
      display[1] =0x0a; //十位為0,不顯示
      }
      P0 = LEDData[display[n++]]; //送段碼
      P2 = shift; //送位碼
      shift = (shift<<1)|0x01; //調(diào)整位碼
      }
      TR2 = 1;
      }
      網(wǎng)站首頁 關(guān)于我們 新聞中心 產(chǎn)品中心 聯(lián)系我們
      備案號:滬ICP備09051314號-3   GoogleSitemap   技術(shù)支持:智能制造網(wǎng) 管理登陸
      © 2018 上海德晶光電科技有限公司DECHING(www.njxh518.com) 版權(quán)所有 總訪問量:492775
      亚洲国产高清在线| 亚洲av福利无码无一区二区| 亚洲国产精品无码久久九九大片| 一本色道久久88综合亚洲精品高清| 久久精品国产精品亚洲下载 | 亚洲视频精品在线观看| 亚洲午夜在线播放| 亚洲一级片内射网站在线观看| 亚洲黄网在线观看| 亚洲国产精品久久久久久| 亚洲精品无码鲁网中文电影| 久久国产亚洲精品| 亚洲日本久久久午夜精品| 亚洲伊人久久大香线蕉影院| 久久亚洲国产成人影院网站| 亚洲视频在线免费| 亚洲国产主播精品极品网红| 色偷偷女男人的天堂亚洲网| 国产成A人亚洲精V品无码| 理论亚洲区美一区二区三区| 亚洲剧情在线观看| 亚洲三级中文字幕| 亚洲成人午夜在线| 亚洲日本在线观看| 亚洲一级二级三级不卡| 国产亚洲精品精品国产亚洲综合| 亚洲熟女综合一区二区三区| 亚洲国产老鸭窝一区二区三区| 亚洲AV成人一区二区三区AV| 亚洲国产高清在线| 亚洲毛片无码专区亚洲乱| 国产亚洲精品岁国产微拍精品| 国产亚洲精久久久久久无码| 亚洲av无码不卡| 久久久久亚洲精品无码网址| 亚洲一区二区三区香蕉| 亚洲成av人片不卡无码久久| 亚洲精品亚洲人成在线| 久久亚洲精品无码网站| 亚洲成A人片在线观看中文| 中文字幕亚洲不卡在线亚瑟|