旋转编码器的工作原理和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相电平判断*/
}
一直在找这方面的资料,学习一下。
下载看看,下载看看
屌爆了,下来学学看看。