旋转编码开关 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模拟设定后时间
}
} 楼主能仔细讲解下不,没弄明白. 本帖最后由 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]