矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 8136|回复: 22

[原创diy]试验51单片机驱动3脚增量型旋转编码器

[复制链接]
     
发表于 2018-1-22 19:27:24 | 显示全部楼层 |阅读模式
有很多场合都会用到增量型旋转编码器
比如:数字PLL收音机、音响中的电子音量、等等
于是找了一个旧的做试验(型号是EC16-2A)
效果还不错
给有兴趣的坛友做个参考

试验的图里:
A接单片机(AT89S52)的P32(INT0)
B接在P34口

在P0口接8个led做类似流水灯的指示
即可观察到左右旋转时的效果

评分

1

查看全部评分

     
 楼主| 发表于 2018-1-22 19:28:04 | 显示全部楼层
我的旋转编码器.jpg

我的编码器图.jpg
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-22 19:28:54 | 显示全部楼层
本帖最后由 lxa000 于 2018-1-22 19:31 编辑

代码很简单
一试就成
参考原代码:


;这是一个旋转编码器的试验汇编代码2018-1-20
;at89s52,11.0592MHz,
;p32(int0)下降沿做中断判别A,p34(t0)做引脚B判别

ORG 0000H
LJMP mm
ORG 0003H
LJMP pd                ;中断判别A脚
         
;程序入口*********************************************************      
org 0100h
mm:mov 12h,#0feh       ;循环显示p0口的led
mov p0,12h
mov sp,#4fh            ;设堆栈入口50h
mov tcon,#01h          ;int0下降沿中断
setb ea                ;开总中断
setb ex0               ;开int0
mm0:nop
sjmp mm0

;int0中断代码*****************************************************
org 0003h
pd:nop
clr ea
push acc
push pws
push dph
push dpl
mov a,p3
anl a,#00010100b
cjne a,#10h,pd0        ;A=L,B=H时右移           
mov a,12h
rl a
mov 12h,a
mov p0,a
sjmp pd00
pd0:mov a,p3
anl a,#00010100b
cjne a,#00h,pd00       ;A=B=L时左移
mov a,12h
rr a
mov 12h,a
mov p0,a
pd00:setb ea
pop dpl
pop dph
pop pws
pop acc
reti

end

补充内容 (2018-1-24 19:51):
更改一个疏忽:中断代码的入口地址org 0003h有误,应为org 0300h
回复 支持 反对

使用道具 举报

     
发表于 2018-1-23 08:38:11 | 显示全部楼层
现在玩汇编的真是不多了,顶一个。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-23 09:57:53 | 显示全部楼层
又见汇编,高手,我默默拿起C语言大全。。。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-23 11:21:00 | 显示全部楼层
有实物图么?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-23 22:36:18 | 显示全部楼层

实物焊接的比较乱
就不上了

接下来计划试验用这个编码器模拟调谐选台
届时我会上好点的实物图的
谢谢关注!
回复 支持 反对

使用道具 举报

     
发表于 2018-1-24 08:20:52 | 显示全部楼层
lxa000 发表于 2018-1-23 22:36
实物焊接的比较乱
就不上了

A和B的上升沿、下降沿都作判断,使用起来感觉会好些——只是程序略复杂些。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-24 10:46:12 | 显示全部楼层
有汇编玩玩也不错
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-24 19:47:14 | 显示全部楼层
qzlbwang 发表于 2018-1-24 08:20
A和B的上升沿、下降沿都作判断,使用起来感觉会好些——只是程序略复杂些。

这样做双重判断
是为了把误动作几率降到最小
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-1-26 16:13:32 | 显示全部楼层
今天又改进代码加入延时
几乎没有误动作了:

;这是一个旋转编码器的试验汇编代码2018-1-20
;最后试验修改2018-1-26,几乎没有了抖动
;at89s52,11.0592MHz,
;p32(int0)下降沿做中断判别A,p34(t0)做引脚B判别

ORG 0000H
LJMP mm
ORG 0003H
LJMP pd                ;中断判别A脚
         
;程序入口*********************************************************      
org 0100h
mm:nop
mov 17h,#0feh          ;循环显示p0口的led
mov 18h,#00h           ;4个做判别缓冲用
mov 19h,#00h
mov 1ah,#00h
mov 1bh,#05h
mov p0,17h
mov sp,#4fh            ;设堆栈入口50h
mov tcon,#01h          ;int0下降沿中断
setb ea                ;开总中断
setb ex0               ;开int0
mm0:nop
sjmp mm0

;int0中断代码*****************************************************
org 0300h
pd:nop
clr ea
push acc
push psw
push dph
push dpl
mov a,p3
anl a,#00010100b        ;保留p32和p34脚屏蔽其余引脚
mov 18h,a               ;暂存在r7
acall ys100             ;延时约1.5ms
mov a,p3
anl a,#00010100b
cjne a,18h,pd0          ;不是正转则判别是否反转
cjne a,#10h,pd0         ;A=L,B=H时右移           
mov a,17h
rl a
mov 17h,a
mov p0,a
sjmp pd00
pd0:mov a,p3
anl a,#00010100b
mov 19h,a
acall ys100             ;延时约1.5ms
mov a,p3
anl a,#00010100b
cjne a,19h,pd00         ;是干扰则返回
cjne a,#00h,pd00        ;A=B=L时左移
mov a,17h
rr a
mov 17h,a
mov p0,a
pd00:setb ea
pop dpl
pop dph
pop psw
pop acc
reti

ys100:nop               ;延时约1.5mS
ys0:djnz 1ah,$
djnz 1bh,ys0
mov 1ah,#00h
mov 1bh,#05h
ret


end
回复 支持 反对

使用道具 举报

     
发表于 2018-1-26 17:59:02 | 显示全部楼层
lxa000 发表于 2018-1-24 19:47
这样做双重判断
是为了把误动作几率降到最小

不是误动作,是反应灵敏
回复 支持 反对

使用道具 举报

     
发表于 2018-1-26 18:08:06 | 显示全部楼层
其实这东西根本不用搞那么复杂,也不用什么中断,看A电平变了,A=1,B=0和A=0,B=1都是同一个方向,反的就是另一个方向,象按键一样慢慢查询就行,也不用加延时,任意两个IO都可以。
回复 支持 反对

使用道具 举报

     
发表于 2018-1-28 01:19:29 | 显示全部楼层
C语言的,接2个中断很简单*(中断类型为电平跳变)

interrupt [EXT_INT6] void ext_int6_isr(void)
{

if(GSFX6==0){
  if(GSFX7==1) MCNumber--;
  else MCNumber++;
}else{
  if(GSFX7==0) MCNumber--;
  else MCNumber++;
}
}

interrupt [EXT_INT7] void ext_int7_isr(void)
{

if(GSFX7==0){
  if(GSFX6==0) MCNumber--;
  else MCNumber++;
}else{
  if(GSFX6==1) MCNumber--;
  else MCNumber++;
}

}
回复 支持 反对

使用道具 举报

     
发表于 2018-1-28 14:15:44 | 显示全部楼层
lxa000 发表于 2018-1-24 19:47
这样做双重判断
是为了把误动作几率降到最小

bmcl.png
看看明白否?发现有什么区别了吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-30 09:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表