久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6354|回復: 6
打印 上一主題 下一主題
收起左側

求旋轉編碼器c程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:143803 發表于 2017-1-20 17:32 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
功能:順時針轉動數值增大,逆時針轉動數值減小
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:162621 發表于 2017-1-21 11:12 | 只看該作者
在百度云游
回復

使用道具 舉報

板凳
ID:149451 發表于 2017-1-21 14:04 | 只看該作者
編碼器涵蓋很多種類,不知你具體要求的哪種?我也曾折騰過一段時間EC11型的,給你個從網上找來的,參考吧(在我板上能運行)
//通過編碼開關(旋轉編碼器)控制數碼管的加減一
#include<AT89X52.H>
#define uchar unsigned char
#define uint  unsigned int
#define cycle       1           //定義動作周期,編碼器旋轉多少格有效
#define NULL       0          //定義編碼器不動作時的還回值
#define E_RIGHT     0x0e        //定義右旋轉還回值
#define E_LEFT      0x0f        //定義左旋轉還回值
/*=====數碼管位及按鍵定義=====*/
sbit dula=P2^0;  //數碼管段選,鎖存器控制信號
sbit wela=P2^1;  //數碼管位選,鎖存器控制信號
sbit PINA   =   P1^0;  //定義IO
sbit PINB   =   P1^1;
uchar WheelNow,WheelOld,RightCount,LeftCount;
/*=====0-9=====A-G=====*/
uchar a[16]={0x3f,0x06,0x5b,0x4f,0x66,
   0x6d,0x7d,0x07,0x7f,0x6f,0x00};
   //數碼管顯示編碼
unsigned sled_bit_table[]={0x5f,0x6f,0x77,0x7b,0x7d,0x7e,0xff};
       /*定義點亮的數碼管與數組的關系*/
/*=====四個數碼管顯示數據存放處=====*/
uchar one,two,three,four;
uint wc=0;
/*=====函數定義=====*/
void delay(uint x);
void display(void);
//void key();
void led_analyze(uint i);
/*====延時函數=====*/
void delay(uint x)
{
  uint i;
  for(i=0;i<x;i++);
}
/*====顯示函數=====*/
void display(void)
{
//送段碼
dula=0;  
P0 =a[one];
dula=1;
dula=0;
//數碼管位選
wela=0;
P0=sled_bit_table[0]; //開顯示  
wela=1;
wela=0;
delay(200);    //調用鍵盤掃描
wela=0;
P0=sled_bit_table[6];  
wela=1;
wela=0;  //關顯示
dula=0;
P0=a[two];
dula=1;
dula=0;
//數碼管位選
wela=0;
P0=sled_bit_table[1]; //開顯示  
wela=1;
wela=0;
delay(200);    //調用鍵盤掃描
wela=0;
P0=sled_bit_table[6];  
wela=1;
wela=0;  //關顯示
dula=0;
P0=a[three];
dula=1;
dula=0;
//數碼管位選
wela=0;
P0=sled_bit_table[2]; //開顯示  
wela=1;
wela=0;
delay(200);    //調用鍵盤掃描
wela=0;
P0=sled_bit_table[6];  
wela=1;
wela=0;  //關顯示
dula=0;
P0=a[four];
dula=1;
dula=0;
//數碼管位選
wela=0;
P0=sled_bit_table[3]; //開顯示  
wela=1;
wela=0;
delay(200);    //調用鍵盤掃描
wela=0;
P0=sled_bit_table[6];  
wela=1;
wela=0;  //關顯示  
}
/*====分解顯示數據=====*/
void led_analyze(uint i)
{
    i=i%10000;
four=i/1000;  // 千位
    three=(i/100)%10; // 百位
    two=(i%100)/10;  // 十位
    one=(i%100)%10;  // 個位
}
//=================================================
uchar WheelRight()
{
    LeftCount=0;
    RightCount++;
    if (RightCount>=cycle)
{
  RightCount=0;
  return(E_RIGHT);
    }  
else
return(NULL);
}
//=====================================================
uchar WheelLeft()
{
    RightCount=0;
    LeftCount++;
    if (LeftCount>=cycle)
{
        LeftCount=0;
        return(E_LEFT);
    }
else
return(NULL);
}
//=================================================================
uchar EncoderProcess()
{
    uchar keytmp;  
    PINA = 1;
    PINB = 1;
    WheelNow=WheelNow<<1;
    if (PINA==1) WheelNow=WheelNow+1;  // 讀 PINA
    WheelNow=WheelNow<<1;
    if (PINB==1) WheelNow=WheelNow+1;  // 讀 PINB
    WheelNow=WheelNow & 0x03;   // 將 WheelNow 的 2 - 7 位清零,保留 0 - 1 兩個位的狀態.
    if (WheelNow==0x00) return(NULL); //當  PINA 和 PINB 都為低電平時退出,低電平區不做處理
    keytmp=WheelNow;
    keytmp ^=WheelOld; // 判斷新讀的數據同舊數據
    if (keytmp==0) return(NULL); // 新讀的數據同舊數據一樣時退出.   
    if (WheelOld==0x01 && WheelNow==0x02)
{ // 是左旋轉否
        WheelOld=WheelNow;
        return(WheelLeft()); //左旋轉
    }
    else
if (WheelOld==0x02 && WheelNow==0x01)
{ // 是右旋轉否
        WheelOld=WheelNow;
        return(WheelRight()); //右旋轉
    }
    WheelOld=WheelNow; // 保存當前值
    return(NULL); // 當  PINA 和 PINB 都為高電平時表示編碼器沒有動作,退出
}
//==========================================================================
void inc()
{   
   wc++;
   if(wc>9999) wc=0;//如果WG大于9999則將它清零
    led_analyze(wc);
} // 在此處設置斷點看 num 加的變化
//====================================================================
void dec()
{
    wc--;
    if(wc>9999) wc=9999;
     led_analyze(wc);
} // 在此處設置斷點看 num 減的變化
//===========================================================================
void main()
{
    while (1)
{
        switch(EncoderProcess())
  {
            case E_RIGHT:  inc(); break;
            case E_LEFT:   dec(); break;
        }
display();
    }
}

評分

參與人數 1黑幣 +5 收起 理由
1281431189a + 5 很給力!

查看全部評分

回復

使用道具 舉報

地板
ID:137676 發表于 2017-2-2 19:19 | 只看該作者

void main(void)
{
        EA=1;
        IT0 = 1;        // 外部中斷0下降沿中斷
        EX0 = 1;        // 外部中斷0允許
        PX0=1;
        while(1)
        {
                ;//加入你要顯示的函數,調用
        }
}
void INT0_int (void) interrupt 0
{
        if(x_flag)//x_flag 編碼器A,INT0 編碼器B
        {
                if(INT1==0)        x_step++,x_fx=0;//x_fx 方向標志
                else                x_step--,x_fx=1;
                if(x_step<0)        x_step=4294967296-x_step,x_fx=0;//x_step定義為long x_step;
                else                x_step=x_step,x_fx=1;
        }
}
回復

使用道具 舉報

5#
ID:231343 發表于 2017-9-7 10:18 | 只看該作者
w1179benp 發表于 2017-1-21 14:04
編碼器涵蓋很多種類,不知你具體要求的哪種?我也曾折騰過一段時間EC11型的,給你個從網上找來的,參考吧( ...

這個里面WheelOld好像是一直為0吧,沒有哪個地方可以改變它的值,是嗎?
回復

使用道具 舉報

6#
ID:105269 發表于 2017-9-7 12:07 | 只看該作者
給你提供個思路吧。一般的編碼器輸出,會有兩個。一個是順時針的脈沖,一個是逆時針的脈沖。可以分別檢測這兩種脈沖來判斷。
回復

使用道具 舉報

7#
ID:1064915 發表于 2023-6-26 11:47 | 只看該作者
在順時針和逆時針方向不同點是:兩個波形的滯后或超前不同。
   編程原理:
   1、可以將A輸出到單片機的電平變化檢測口,B口為普通I/O口,2個口都設置為輸入口。
   2、設置A為上升沿或下降沿觸發。開啟電平變化檢測中斷。
   3、在中斷程序中,產生中斷后,根據B口的電平高低不同,判斷是順時針,還是逆時針。
   4、順時針和逆時針的B口電平是不同的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av大片| 精品国产一级 | 黄色毛片在线看 | 精品国产欧美一区二区 | 国产成人精品一区二区三区在线 | 欧美日韩亚洲在线 | 国产精品96久久久久久 | 热99精品视频 | 欧美5区| av在线一区二区三区 | av网站在线看 | 国产三区av| 欧美日韩精品影院 | 色爱综合网 | 在线视频一区二区 | 亚洲精品中文在线 | 精品亚洲一区二区三区 | 久久久久中文字幕 | 91久久精| 亚洲精品在线看 | 免费午夜电影 | 99热激情| 久久综合亚洲 | 日韩av最新网址 | 欧美福利| 精品少妇一区二区三区日产乱码 | 国产日韩欧美中文 | 欧美久久一级 | www.一区二区三区.com | 久久国产精品一区二区三区 | 午夜爽爽男女免费观看hd | 国产1区2区3区 | 一级毛片视频 | 五月天婷婷激情 | 国产精品a久久久久 | 美女久久久 | 亚洲国产精品网站 | 欧美日韩成人在线 | 日韩在线观看网站 | 国产日韩欧美在线 | 国产中文字幕在线观看 |