产品选型

单片机旋钮 如何使用数字旋转编码开关

小编 2025-07-29 产品选型 23 0

如何使用数字旋转编码开关

数字旋转编码器在现在的工控领域运用广泛,跑步机的旋钮,控制器的旋钮,音响的音量控制旋钮,都是数字旋转编码器的典型应用。

看一个数字旋转编码器的视频,加深一下理解。

5脚的数字旋转编码器:

图 1 旋转编码器的实物图

具有左转,右转,按下三个功能。4、5脚是中间按下去的开关接线 1 2 3脚 一般是中间2脚接地,1、3脚上拉电阻后,当左转、右转旋纽时,在1、3脚就有脉冲信号输出了。

着这是标准资料:

图2 旋转编码器的结构图

在单片机编程时,左转和右转的判别是难点,用示波器观察这种开关左转和右转时两个输出脚的信号有个相位差,见下图:

图3 旋转编码器在旋转的时候的输出波形

由此可见,如果输出1为高电平时,输出2出现一个高电平,这时开关就是向顺时针旋转; 当输出1 为高电平,输出2出现一个低电平,这时就一定是逆时针方向旋转。

所以,在单片机编程时只需要判断当输出1为高电平时,输出2当时的状态就可以判断出是左旋转或是右旋转了。

还有另外一种3脚的,除了不带按钮开关外,和上面是一样的使用。

图4 三个脚的旋转编码器

参考程序:#include "reg51.h"#define uint unsigned int#define uchar unsigned charsbit Rotation_Key_A = P1_1; //定义旋转编码器的方向判断A口sbit Rotation_Key_B = P1_2; //定义旋转编码器的方向判断B口uint CodingsWitchPolling()//{ static uchar A_Last_State,B_Last_State; //定义了两个变量用来储蓄上一次调用此方法是编码开关两引脚的电平 static uchar High_Last_State;//定义了一个变量用来储蓄以前是否出现了两个引脚都为高电平的状态 uint tmp = 0; if(Rotation_Key_A&&Rotation_Key_B) High_Last_State = 1; // if(High_Last_State) //如果High_Last_State为1执行下面的步骤 { if(Rotation_Key_A==0&&Rotation_Key_B==0) //如果当前编码开关的两个引脚都为底电平执行下面的步骤 { if(B_Last_State) //为高说明编码开关在向加大的方向转 { High_Last_State = 0; tmp++; // } if(A_Last_State) //为高说明编码开关在向减小的方向转 { High_Last_State = 0; tmp--; //设返回值 } } } A_Last_State = Rotation_Key_A; //储存A口的当前状态 B_Last_State = Rotation_Key_B; //储存B口的当前状态 return tmp; //}//编码器计数程序void encoder_cnt(void){ uchar Reade_Io_Data; Reade_Io_Data = PIND; //取端口D管脚信号 Reade_Clr_Signal = (Reade_Io_Data & 0x08); //读取编码器清零信号 if(Reade_Clr_Signal != false) //有编码器清零信号 { couch_num = 0; //水平床码清零 } else { if(encoder_cnt_en == false) //编码器计数模块没有启动 { pr_couch_ba = Reade_Io_Data & 0x03; //取编码器A、B相电平信号 } else { couch_ba = Reade_Io_Data & 0x03; //取编码器A、B相电平信号 if(pr_couch_ba == 0x00) { if(couch_ba == 0x01) { couch_num++; //水平床码加1 } else if(couch_ba == 0x10) { couch_num--; //水平床码减1 } } else if(pr_couch_ba == 0x01) { if(couch_ba == 0x11) { couch_num++; //水平床码加1 } else if(couch_ba == 0x00) { couch_num--; //水平床码减1 } } else if(pr_couch_ba == 0x10) { if(couch_ba == 0x00) { couch_num++; //水平床码加1 } else if(couch_ba == 0x11) { couch_num--; //水平床码减1 } } else if(pr_couch_ba == 0x11) { if(couch_ba == 0x10) { couch_num++; //水平床码加1 } else if(couch_ba == 0x01) { couch_num--; //水平床码减1 } } } pr_couch_ba = couch_ba; }}编码器及其计数模块原理旋转编码器的检测程序(基于51单片机)//旋转编码器检测程序,A/B信号分别接在了INT0和INT1上//2005年3月27用KEIL编译、硬件测试通过//注意:编码器的信号,程序未做消抖处理。测试中,A/B信号上各//接了一只104的瓷片电容,工作很正常。如果不接电容,请自行编//写信号消抖程序。#include <at89x51.h>sbit led=0xB1;//有一只LED接在了RXD引脚上,用来指示正反转;main(){ EA=1; //总中断允许 EX0=1; //外部中断0允许 IT0=1; //外部中断0为边沿触发方式 while(1);;}/*********************编码器中断函数入口:无出口:无*********************/void encoder(void) interrupt 0 { //外部中断0 if (INT1) { led=1; } else { led=0; }}whimsy 的AVR程序//外部中断0,用于编码开关解码,解码图: A接中断脚(AVR的PD2),以此为基准,B用来判断方向(连到AVR的PA1), C接地//A -|// | -----|__________|----------|____________//C -|////B -|// | ----------|__________|----------|____________//C -| // CW ===>>> ROTATION//外部中断设置(ISC01=0,ISC00=1): INT0 引脚上任意的逻辑电平变化都将引发中断#pragma interrupt_handler int0_isr:2void int0_isr(void){ //external interupt on INT0 GICR=0; //禁止外部中断 if ((PIND & 0x04)==0) //先判断是高电平产生的中断还是低点平的中断 { if ((PINA & 0x02)==0) //再判断B线上的电平 { keycounter--; keydirection=0; } else { keycounter++; keydirection=1; } else if ((PINA & 0x02)==0) { keycounter++; keydirection=1; } else { keycounter--; keydirection=0; } GICR=0x40; }}

复制代码

以上图文内容均转载自订阅号:电子工程世界(微信搜索 eeworldbbs 关注)

欢迎微博@EEWORLD

如果您也写过此类原创干货欢迎将您的原创发至:bbs_service@eeworld.com.cn,一经入选,我们将帮你登上头条!

与更多行业内网友进行交流请登陆EEWorld论坛。

51单片机实例讲解,由按钮控制流水灯程序

由按钮控制流水灯控制要求:在单片机的PP3.0口和P3.1口线上分别接上一个按钮SB1和SB2,P0口上接8只发光二极管LED1~LED8。当按下SB1时,8只发光二极管按方式一从LED1~LED8间隔1s交替正向流水点亮一次,即LED1亮→LED2亮→LED3亮→LED4亮→LED5亮→LED6亮→LED7亮→LED8亮。

当按下SB2时,8只发光二极管按方式二从LED1~LED8间隔1s依次点亮一次,即LED1亮→LED1+LED2亮→LED1+LED2+LED3亮→LED1+LED2+LED3+LED4亮→LED1+ LED2+LED3+LED4+LED5亮→LED1 +LED2 +LED3 +LED4 +LED5 +LED6亮→LED1 +LED2 + LED3 +LED4 +LED5 +LED6+LED7亮→LED1+LED2+LED3+LED4+LED5+LED6+LED7+ LED8亮。

(1)由按钮控制流水灯硬件电路(见图36)。

图36 由按钮控制流水灯接线原理图

(2)由按钮控制流水灯硬件电路元器件(见表14)。

表14 由按钮控制流水灯硬件电路元器件表

(3)由按钮控制流水灯程序流程图(见图37)。

图37 由按钮控制流水灯程序流程图 (a)主程序;(b)显示子程序

(4)由按钮控制流水灯程序。

相关问答

单片机 的按钮叫什么?

单片机的端口一般为准双向IO端口,当你想读端口时需要先写1,这时端口为弱上拉,外部信号可以准确的反应在端口上,如果,端口原来为低电平,这时候你如果想读端...

一个按钮开关控制接触器正反转?

如果是一个带自锁的按钮,加两个接触器就行了如果就是一个常开触点的按钮,最简单的方法就是用PLC,要不就是用NE555组成双稳态电路即可转换。用单片机,一个按...

仿真电路优先编码器实验原理?

有些单片机控制系统和数字电路中,无法对几个按钮的同时响应做出反映,如电梯控制系统在这种情况下就出出现错误,这是绝对不允许的于是就出现了74ls148优先编码...

C51 单片机 按钮程序 变量先归零再自增-ZOL问答

5条回答:【推荐答案】while(1){if(!KEY){delay(1000);if(!KEY){timer++;}}elsetimer=0;}其中voiddelay(uintz){uintx,y;...

stm32 单片机 用两个按钮控制led, 按钮1 控制从灭到亮,按钮2控...

4条回答:【推荐答案】我觉得肯定是程序编写有误,把代码贴出来看看吧,一定能解决掉的。

单片机 按键复位电容有什么作用? - 187****8555 的回答 - 懂得

.与扶摇05商榷:扶摇05答得好棒,51单片机复位的过程描述得非常细致,本人还是第一次看见,足见其深厚的功底,辛苦了!不过,本人觉得其中有两处错误,...

单片机 按键复位电容有什么作用? - 懂得

复位电路的工作原理在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上...

51 单片机 ,2个按钮2个数码管,实现外部清零与计数,一个按钮按一下加1?

假设第一个文本框变量名为text1,第二个文本框变量名为text2按钮A的AS为:on(release){_root.text1++}按钮B的AS为:on(release){_r...

单片机 下载按钮坏了怎么办?

如果单片机下载按钮坏了,可以考虑其他替代的下载方式,例如使用串口下载或者JTAG下载。同时,也可以检查下载器和电路板之间的连接是否正确,以及是否有其他损坏...

单片机 用汇编语言编写一个。用十个按钮分别控制十个灯。比如:按下按钮K1 LED1灯亮。按下"?

检测是否有按键按下,相应的指示灯点亮,并熄灭其它的指示灯。至于10S锁住其他按钮,如果程序不做其它的事情,最简单的方法就是点亮指示灯后延时10S,再回到主函...

猜你喜欢