EC11或EC12编码器按键,不占用中断的驱动方法

在8051单片机开发中,当引脚资源紧张且中断已用完时,文章提供了一种不依赖中断的EC11或EC12编码器正反转检测方法。通过分析编码器的波形,设计了一套在主循环中不断扫描编码器状态的方案,避免了上升沿和下降沿检测可能导致的丢失或错误。此外,还提到了使用100Hz定时器中断处理编码器和按键的方法,以减少抖动问题。
摘要由CSDN通过智能技术生成

最近遇见一个问题,在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 =
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值