简单实现光电编码器状态的读取
1 引言
在一些医用设备如监护仪中,程序的菜单项很多,如果完全用键盘来实现菜单功能是不现实的,因为仪器本身就很小。较好的方法就是使用光电编码器,以实现菜单功能。
2 光电编码器工作原理
如果是顺时针从位置 # 1 旋转到位置#2,通道 A 会比通道B 相位超前半个周期;反之如果是逆时针从位置 # 1 旋转到位置 # 4 ,通道 B 会比通道 A 相位超前半个周期。通过检测通道 A 和通道 B 的相位就能判断是顺时针还是逆时针转动。
3 电路实现
在电路实现中,主要是使用单片机中的P2 口,通过读取这P2 口的状态就可以知道编码器是顺时针旋转,或是逆时针旋转,或是回车。具体电路实现如图 1 所示。
4 读取程序
以下是读取编码器状态的子程序,当编码器的状态读出之后,再转入菜单操作子程序。菜单操作子程序这里不再给出。
unsigned char feisuo1;
unsigned char oldfeisuo1;
sbit pin20=P2^0;
void readfeisuo(void) / / 读飞梭子程序
{
unsigned char aaa=0x00,
bb=0x00;
aaa=P2 & 0x06;
aaa=aaa>>1;
bb=pin20;
if (aaa!=oldfeisuo1)
{
switch (aaa)
{ case 0x00: {
switch (oldfeisuo1)
{ case 0x01: feisuo1=0x01;
break;
case 0x02: feisuo1=0x10;
break;
default:break; }
break;
}
case 0x02: { switch (oldfeisuo1)
{ case 0x00: feisuo1=0x01;
break;
case 0x03: feisuo1=0x10;
break;
default:break;
}
break;
}
case 0x03:
{switch(oldfeisuo1)
{ c a s e
0 x 0 2 :
feisuo1=0x01;
break;
case 0x01:
feisuo1=0x10;
break;
default:
break;
}
break;
}
c a s e
0x01: { switch
(oldfeisuo1)
{ c a s e
0 x 0 3 :
feisuo1=0x01;
break;
case 0x00: feisuo1=0x10;
break;
default:break;
}
break;
}
default:break;
}
oldfeisuo1=aaa;
}
else
if (bb==0)
{ feisuo1=0x0d;
oldfeisuo1=aaa;
}
}
以上 0x01表示顺时针旋转,0x10表示逆时针旋转,0x0d表示回车。当菜单处理程序读取feisuo1并进行键值处理后,feisuo1要被清除,如清除为0xf f,如果不清除feisu o1的状态可导致下次读取出错。飞梭状态读取的速度要快,否则有些状态会被丢弃。
相关文章
- 2023-06-23车号识别系统在茂名乙烯电子轨道衡中的应用
- 2024-03-01基于CAN现场总线的分布式柴油发动机测试系统
- 2023-08-15基于AM402的电流量输出电容式角度传感器
- 2021-12-173G室内分布系统解决方案
- 2023-04-15微机电系统中薄膜结构在静电力和Casimir力作用下的稳定性
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。