lovepig200 发表于 2013-4-29 22:15:27

旋转编码开关 IO口读取 专门用于设置参数用

本帖最后由 lovepig200 于 2013-4-29 22:18 编辑

基本在代码模拟的情况下,在20hz的转动频率下,一般的旋转编码开关是20个脉冲一圈,也就是一圈每秒的情况下,可以采样到13个数,如果用户设定参数所用时间很短,就全都能采集到。
10个脉冲每秒以下都能采集到。
用于作为参数设定用还是可以将就着用的,干其他的就不好说了。
可用于不方便用中断而且想程序简单的参考。

贴上代码
#include <reg52.h>
#include<INTRINS.H>

sbit PINA=P1^1;
sbit PINB=P1^2;
sbit OUTUP=P2^1;
sbit OUTDOWN=P2^2;

void delay_ms (unsigned char mst)
{
unsigned char i, j;
while(mst--)
{
        _nop_();
        _nop_();
        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
        }
}

void Delay200us()                //@11.0592MHz
{
        unsigned char i, j;

        i = 3;
        j = 35;
        do
        {
                while (--j);
        } while (--i);
}


unsigned char fw()
{
   unsigned char pre,now,i;
   unsigned char out =2;
   for(i=0;i<50;i++)                          //重复50次
{ pre=PINA;
// delay_ms (1);
Delay200us();
   now=PINA;

   if(now>pre)
   {
   if(!PINB)
   {
   out = 1;
   }
   else
   {
   out = 3;
   }
   }
   }
   return out;
}

void main (void)
{
   while(1)
   {
   switch(fw())                                               //进入设定
   {
   case 1:
   OUTDOWN = ! OUTDOWN;
    delay_ms (1);                                        //1ms模拟用户设定时间
        OUTDOWN = ! OUTDOWN;
   break;
   
   case 2:
   break;
   
   case 3:
   OUTUP = ! OUTUP;
   delay_ms (1);                                  //1ms模拟用户设定时间
   OUTUP = ! OUTUP;
   break;
   
   }
    delay_ms (2);                                  //2ms模拟设定后时间

   }
}

lmt50211 发表于 2013-4-30 08:54:17

楼主能仔细讲解下不,没弄明白.

lovepig200 发表于 2013-4-30 10:24:41

本帖最后由 lovepig200 于 2013-4-30 10:26 编辑

lmt50211 发表于 2013-4-30 08:54 static/image/common/back.gif
楼主能仔细讲解下不,没弄明白.

fw() 内的内容是 先保存PINA的状态到pre 然后延时200us,然后再检测PINA状态到now,然后判断now是否大于pre 如果大于就是上升沿,然后判断在PINA上升沿的时候PINB的状态,为0就是正转,1就是反转。当PINA不变化那就是没有旋转了。在最后fw()函数返回out值,1为反转,2为不转,3为正转。
重复50次是为了能抓到上升沿。

然后后面就是switch语句了。
页: [1]
查看完整版本: 旋转编码开关 IO口读取 专门用于设置参数用