最近遇见一个问题,在8051单片机开发时,引脚不够用了,引脚中断被用光了,于是只能用普通引脚来读取EC12编码器的正反转和按键,(本文不描述按键,只描述正反转的获取方法)
了解思路之后,查看最后一段代码具有实战意义。
由于EC11或EC12分为一定位一脉冲或两定位一脉冲
本文只提供思路和代码,不提供编码器基础知识
关于编码器的基础知识请参考如下
https://www.jianshu.com/p/41fa67ecb248
我测得我的编码器顺时针和逆时针旋转时,波形如下,忽略0和1,下面会解释。
相信,你已经知道了常用的方法是获取上升沿和下降沿的状态来判断正反转。
由于我们没有中断,那么采取上升沿下降沿的方法,就很容易丢失或错误。
但也正是由于没有中断,我们把获取正反转的函数放在main()函数的while(1)里面
void main(void)
{
System_Init();//系统初始化
while (1)
{
if (Rotate == 0)//已释放编码器
{
Rotate = EC12_1Scan(); //获取编码器1的正反转
}
}
}
UINT8 EC12_1Scan(void) //EC12扫描函数,使用时放入主函数while循环里
{
while (EC_A != 1 || EC_B != 1)
{
while (EC_A == 0 && EC_B == 0)
{
do
{
if (EC_A == 1 && EC_B == 0)
return 1;
if (EC_A == 0 && EC_B == 1)
return 2;
} while (EC_A != 1 || EC_B != 1);
}
}
return 0;
}
void EC12_1Handle(void)//此函数可以放入中断里处理
{
if (Rotate =