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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

在使用單片機+EC11編碼器中遇到的問題,請大家幫忙

[復制鏈接]
跳轉到指定樓層
樓主
ID:388477 發表于 2020-7-9 14:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我想使用編碼器控制數碼管值的加減,一直沒有反應,望高手指教,非常感謝!
#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器


typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;


sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit EC11_A=P2^5;
sbit EC11_B=P2^6;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
u8 d=125;
/*******************************************************************************
* 函 數 名         : delay
* 函數功能                   : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);        
}


/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<3;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; P0=smgduan[d%10];delay(100); P0=0x00;  break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; P0=smgduan[d%100/10];delay(100);P0=0x00; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; P0=smgduan[d/100];delay(100);P0=0x00;    break;//顯示第2位


                }
        
        }
}


void xuanzhun()
{
        u8 flag=0,left_flag=0,right_flag=0;
        if((EC11_A)&&(EC11_B))
                {
                                flag=1;
                }
                if(EC11_A!=EC11_B)
                {
                                left_flag = EC11_A; //記錄AB的信號狀態
                                right_flag = EC11_B;
                }
                if(flag==1)
                {
                                if((EC11_A==0)&&(EC11_B==0))
                                {
                                                flag=0;
                                                if(left_flag==0)  //左轉
                                                {
                                                                d--;
                                                }
                                                if(right_flag==0)
                                                {
                                                                d++;
                                                }
                                }        
                }
}




/*******************************************************************************
* 函 數 名       : main
* 函數功能                 : 主函數
* 輸    入       : 無
* 輸    出             : 無
*******************************************************************************/
void main()
{        
        while(1)
        {
                xuanzhun();
                DigDisplay();  //數碼管顯示函數        
        }        
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:401564 發表于 2020-7-9 15:12 | 只看該作者
馬云家的EC11有好幾種的:有20位和30位的
這其中又分為好幾種開關狀態的:1是轉動之后固定在短路狀態的,一種是固定在開路狀態的,還有一個是每次轉動停止之后不固定的
所以,你得看你手頭上這個開關的規格書還寫代碼,完全復制別人的代碼不一定行的
回復

使用道具 舉報

板凳
ID:282850 發表于 2020-7-9 16:26 | 只看該作者
是否對你有用,IO口中斷判定輸入

//旋轉編碼開頭,測試與網上介紹相符:
//按下時4、5導通,4、5不與其它腳內部相關
//                 ______
//P25    A     1--|   /|--4 (Press)
//P24    com   2--|__/ |
//P26    B     3--|____|--5 (Press)      P27
//順時針轉:Aon--ABon--Aoff--Boff
//逆時針轉:Bon--ABon--Boff--Aoff
//時序圖如下(設com接Vcc):
//順時針A-->B轉
//A      ____     ____
//      |  |___|  |_
//B        ____     ____
//        |  |___|  |_


//
//逆時針B-->A轉
//B      ____     ____
//      |  |___|  |_
//A        ____     ____
//        |  |___|  |_
//程序思路:
//為與C51兼容,少點用中斷口線,僅使用A線的中斷進行判斷,B線不考慮
//Aon中斷---if(Boff)----是A2B--- 計數+
//          if(Bon)-----是B2A--- 計數-
//Aon中斷,反轉Aoff---if(Boff)----是A2B--- 計數+
//                    if(Bon)-----是B2A--- 計數-
//有旋轉,注先轉到B但A沒on時(半格不到),丟棄

#pragma vector=PORT2_VECTOR
__interrupt void Port2_IR2(void)
{
      //    PressTime=0;
      if(P2IFG & Aon)  //有右旋轉
      {
            P2IFG=0;   
            if(P2IN & Bon) keyOld=keyN, keyN++;  //
      }
      
      if(P2IFG & Bon)  //有左旋轉
      {
            P2IFG=0;   
            if(P2IN & Aon)  keyOld=keyN, keyN--; //
      }
      if(P2IFG & downKey)  //有按下
      {
            P2IFG=0;
            keyPress();
      }
      P2IFG=0;
      
      HT16_DisplayDecimal(keyN,0);
      HT16_1NumDOT(3,Menu_sel,0);
      //__low_power_mode_off_on_exit();     //退出中斷時喚醒CPU。▲▲▲▲在此退LPM,比在BT中斷中退更省電 ▲▲▲▲可運行60+20秒!!
}
回復

使用道具 舉報

地板
ID:388477 發表于 2020-7-9 16:53 | 只看該作者
Y_G_G 發表于 2020-7-9 15:12
馬云家的EC11有好幾種的:有20位和30位的
這其中又分為好幾種開關狀態的:1是轉動之后固定在短路狀態的,一種 ...

嗯嗯,我剛接觸這個是照一個視頻寫的,我覺得挺好理解,我現在這個是24位的,整了好長時間,希望給點思路或者參考,謝謝
回復

使用道具 舉報

5#
ID:799404 發表于 2020-7-9 17:02 | 只看該作者
顯示部分正常嗎,先排查下改變d的值以后顯示會變化嗎
回復

使用道具 舉報

6#
ID:799404 發表于 2020-7-9 17:10 | 只看該作者
LSA/LSB/LSC是位碼吧,數碼管case0的時候沒有點位碼呢
回復

使用道具 舉報

7#
ID:388477 發表于 2020-7-9 19:06 | 只看該作者
wjianing 發表于 2020-7-9 17:02
顯示部分正常嗎,先排查下改變d的值以后顯示會變化嗎

改變d的之后,會改變,謝謝!
回復

使用道具 舉報

8#
ID:388477 發表于 2020-7-9 19:09 | 只看該作者
wjianing 發表于 2020-7-9 17:10
LSA/LSB/LSC是位碼吧,數碼管case0的時候沒有點位碼呢

是位碼,可以顯示
回復

使用道具 舉報

9#
ID:401564 發表于 2020-7-9 20:14 | 只看該作者
C不會,我用匯編的
但原理是一樣的:就是每次轉動就把兩個端口的電平記錄,讀取到某個數據的時候就判定為左轉還是右轉
你把數據手冊上的時序好好的看一下就知道,它順時針和逆時針的區別在于哪個先出現電平的變化
最好是用定時器,一般2mS掃描一次就可以了
回復

使用道具 舉報

10#
ID:388477 發表于 2020-7-10 11:09 | 只看該作者
f556 發表于 2020-7-9 16:26
是否對你有用,IO口中斷判定輸入

//旋轉編碼開頭,測試與網上介紹相符:

沒有看懂,謝謝你
回復

使用道具 舉報

11#
ID:388477 發表于 2020-7-11 14:45 | 只看該作者
終于搞定了,又換了一個ec11的編碼器,20節點的,程序經測試,普中v2.0的板子,一個節點加一或者減一,謝謝大家的幫忙!

#include "reg52.h"                         //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16;          //對數據類型進行聲明定義
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit BMA=P1^0;
sbit BMB=P1^1;
sbit button=P1^2;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值
u16 d=235;
u8 flag;
u8 b,Last_BMB_status,Current_BMB_status;
///*******************************************************************************
//* 函 數 名         : delay
//* 函數功能                   : 延時函數,i=1時,大約延時10us
//*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}
/*******************************************************************************
* 函 數 名         : DigDisplay
* 函數功能                   : 數碼管動態掃描函數,循環掃描8個數碼管顯示
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<3;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; P0=smgduan[d%10];delay(100); P0=0x00;  break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; P0=smgduan[d%100/10];delay(100);P0=0x00; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; P0=smgduan[d/100];delay(100);P0=0x00;    break;//顯示第2位
                }
        }
}

void DirScan(void)
{
                Last_BMB_status = BMB;
    if(BMA == 0)    //BMA為低電平時
    {
                                while(!BMA);
        Current_BMB_status = BMB;
        flag = 1;    //標志位置為1說明編碼開關被旋轉了
                                if(flag == 1)
                                {  
                                                flag = 0;    //時刻要注意這一點!給標志位清零
                                                if(Current_BMB_status == 1) //BMB上升沿表示正轉
                                                {
                                                                d++;
                                                                if(d>=999)  d=999;       
                                                }
                                                else if((Last_BMB_status == 1)&&(Current_BMB_status == 0)) //BMB下降沿表示反轉
                                                {
                                                                d--;
                                                                if(d==65535) d=0;
                                                }
                                }
    }
                if(button==0)
                {
                                delay(10);
                                if(button==0)
                                        d=0;
                }
}

void main()
{
        while(1)
        {
                        DirScan();
                        DigDisplay();  //數碼管顯示函數               
        }       
}

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

12#
ID:611626 發表于 2021-9-1 10:08 | 只看該作者
case(0):
                                LSA=0;LSB=0;LSC=0; P0=smgduan[d%10];delay(100); P0=0x00;  break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; P0=smgduan[d%100/10];delay(100);P0=0x00; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; P0=smgduan[d/100];delay(100);P0=0x00;    break;//顯示第2位
                }
你用的共陰數碼管,這樣能顯示正常嗎
回復

使用道具 舉報

13#
ID:161164 發表于 2021-9-1 10:51 | 只看該作者
宏達工控 發表于 2021-9-1 10:08
case(0):
                                LSA=0;LSB=0;LSC=0; P0=smgduan[d%10];delay(100); P0=0x00;   ...

可能共陰段接了一個NPN反相壙流
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线a| 免费网站在线 | 麻豆av网站| 国产精品久久久久久久久免费丝袜 | 91夜夜夜| 国产成人影院 | 亚洲欧美精品一区 | 亚洲国产成人精品久久久国产成人一区 | 亚洲免费在线观看 | 亚洲av一级毛片 | 日韩午夜电影在线观看 | 最近中文字幕在线视频1 | 成人在线观看免费视频 | 色视频网站| 欧美日韩国产精品一区 | 中文字幕一区二区三区四区五区 | 精品视频久久久久久 | 亚洲精品日本 | 在线成人www免费观看视频 | 国产伊人久久久 | 日本一区二区三区四区 | 成人av在线播放 | 精品国产乱码久久久久久蜜柚 | 欧美一区二区在线 | 国外激情av | 免费在线播放黄色 | 日操操| 美女黄色在线观看 | 91久久精品一区二区二区 | 久久免费精品视频 | 欧美日韩综合 | 国产欧美久久精品 | 日韩av成人| 久久国产精品免费一区二区三区 | av网站免费 | 99热这里有精品 | 欧美激情一区二区三区 | 日韩中文在线 | 国产精品视频www | 欧美在线一区二区三区四区 | 91亚洲国产精品 |