微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 旋转编码器的工作原理和51编程

旋转编码器的工作原理和51编程

时间:10-02 整理:3721RD 点击:



可以看到当A相跳变成低电平的时候,B相在A相为低电平期间发生了变化。
从低变高(正转),或者从高变低(反转)
有一种编程方法就是比较B相在A为低电平时候的电平变化。
这里介绍另外一种编程方法,在A相跳变成低电平的时候,在这一瞬间记住B相是高电平还是低电平
如果是高电平,则是反转;如果是低电平,则是正转
但是要记住,因为是要记住在A相跳变成低电平的瞬间,B相的电平,所以当我们用while来等待A相的电平变化时
while程序只能运行一次就要跳出,记住这个瞬间B相的电平。不然A相在低电平期间,B相电平是要发生变化的。

uchar Flag1 = 1;
uchar Flag2 = 0;
uchar Sd_Key_Value = 0;
uchar Cnt = 0;
void Data_Key();/*编码器扫描程序*/

void main()
{
    while(1)
    {
        Data_Key();    /*在while中不断执行编码器扫描程序*/
    }
}
void Data_Key()
{
         Cnt = 0;
         while((!A)&&Flag1)                       //A == 0;A相变成低电平,表示开关被旋动
         {
                Cnt ++;                                 /*防抖,只有当A相为稳定低电平的时候,Cnt累加到3,才执行下一步。
                if(3 == Cnt)                           假设因抖动A相跳回高电平,则跳出while((!A)&&Flag1)。在主函数的
                {                                             下一次扫描时,Cnt被清零。*/
                        Cnt = 0;
                        Current_Status = Pin_Portry_B;
                        Flag1 = 0;
                        Flag2 = 1;                                                                                                                                                                                                                                                                                                                             
                }
         }
          /*当A相跳变成0时,!A为真,Flag1已经预置为1,所以满足条件,进入while        Flag1 = 0语句执行后,不再执行while,所以while程序只执行了一次就跳出*/
         if(1 == Flag2)
         {
                Flag2 = 0;
                if(0 == Current_Status)
                {
                    if(Sd_Key_Value < 255)               
                        {
                           Sd_Key_Value ++;  
                        }
                        else
                        {
                           Sd_Key_Value = 0;
                        }
                    
                }                /*Current_Status是记录的B相电平,为低表示正转,下面为高,表示反转*/
                if(1 == Current_Bmb_Status)
                if(1 == Current_Status)
                {
                   if(Sd_Key_Value > 0)
                   {
                      Sd_Key_Value--;
                   }
                   else
                   {
                      Sd_Key_Value = 255;
                   }            
                }                 
         }
         while(A)
         {
                 Flag1 = 1;        
         }
        /*这个while程序相当重要,因为当A相为低电平时,是要持续一段时间的、
           如果不等到A相跳变成高电平,还会执行B相电平判断*/
}

一直在找这方面的资料,学习一下。

下载看看,下载看看

屌爆了,下来学学看看。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top