碧波液压网 欢迎你,游客。 登录 注册

简单实现光电编码器状态的读取

版权信息:站内文章仅供学习与参考,如触及到您的版权信息,请与本站联系。

  

  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的状态可导致下次读取出错。飞梭状态读取的速度要快,否则有些状态会被丢弃。

你没有登陆,无法阅读全文内容

您需要 登录 才可以查看,没有帐号? 立即注册

标签:
点赞   收藏

相关文章

发表评论

请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。

用户名: 验证码:

最新评论