标题: 51单片机旋转编码器模块KY-040调试程序+仿真 LCD1602显示 [打印本页]

作者: 854100995    时间: 2017-9-7 14:26
标题: 51单片机旋转编码器模块KY-040调试程序+仿真 LCD1602显示
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真

程序功能:旋转编码器顺时针旋转,显示数值增加
               旋转编码器逆时针旋转,显示数值减小
               旋转编码器按下,切换显示ON/OFF

根据旋转编码器KY-040模块资料可知:


在下降触发模式下,AB进行电平比较:
A触发的中断:同加异减
B触发的中断:同减异加
反之亦然

那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真,
                      CLK(A) ---- P3^2
                      DT(B)  ---- P3^3
                      SW(Z)  ---- P3^4
外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器
的旋转方向。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:

  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include<intrins.h>

  4. //外部中断的IO
  5. sbit K1=P3^2;
  6. sbit K2=P3^3;
  7. sbit K3=P3^4;

  8. void IntConfiguration();
  9. void Delay(unsigned int n);
  10. unsigned char KeyValue=0;
  11. unsigned char state=0;
  12. /*******************************************************************************
  13. * 函 数 名       : main
  14. * 函数功能                 : 主函数
  15. * 输    入       : 无
  16. * 输    出       : 无
  17. *******************************************************************************/
  18. void main(void)
  19. {
  20.         LcdInit();
  21.         IntConfiguration();
  22.         LCDWrite_String(2, 0, 10, "Bian ma qi");
  23.         while(1)
  24.         {
  25.                 if(K3==0)
  26.                 {
  27.                         Delay(1);         //延时消抖
  28.                         if(K3==0)
  29.                         {
  30.                                 state=!state;
  31.                                 while(K3==0);
  32.                         }
  33.                 }
  34.                 if(state==1)
  35.                 {
  36.                         LcdWriteCom(0xc0+13);
  37.                         LcdWriteData('O');
  38.                         LcdWriteData('N');
  39.                         LcdWriteData(' ');
  40.                 }
  41.                 else
  42.                 {
  43.                         LcdWriteCom(0xc0+13);
  44.                         LcdWriteData('O');
  45.                         LcdWriteData('F');
  46.                         LcdWriteData('F');
  47.                 }
  48.                 LcdWriteCom(0xC0+4);
  49.                 LcdWriteData('0'+KeyValue/100%10);
  50.                 LcdWriteData('0'+KeyValue/10%10);
  51.                 LcdWriteData('0'+KeyValue%10);
  52.         }        
  53. }

  54. /*******************************************************************************
  55. * 函 数 名         : IntConfiguration()
  56. * 函数功能                   : 设置外部中断
  57. * 输    入         : 无
  58. * 输    出         : 无
  59. *******************************************************************************/
  60. void IntConfiguration()
  61. {
  62.         //设置INT0
  63.         IT0=1;//跳变沿出发方式(下降沿)
  64.         EX0=1;//打开INT0的中断允许。
  65.         
  66.         EA=1;//打开总中断        
  67. }
  68. /*******************************************************************************
  69. * 函 数 名         : Delay(unsigned int n)
  70. * 函数功能                   : 延时
  71. * 输    入         : n
  72. * 输    出         : 无
  73. *******************************************************************************/

  74. void Delay(unsigned int n)   //延时50us误差 0us
  75. {
  76.     unsigned char a,b;
  77.                 for(;n>0;n--)
  78.                 {
  79.             for(b=1;b>0;b--)
  80.         for(a=22;a>0;a--);
  81.                 }
  82. }
  83. /*******************************************************************************
  84. * 函 数 名         : Int0()        interrupt 0
  85. * 函数功能                   : 外部中断0的中断函数
  86. * 输    入         : 无
  87. * 输    出         : 无
  88. *******************************************************************************/

  89. void Int0()        interrupt 0                //外部中断0的中断函数
  90. {
  91.         if(K2==1)
  92.         {
  93.                 KeyValue++;
  94.         }
  95.         if(K2==0)
  96.         {
  97.                 KeyValue--;
  98.         }
  99.         if(KeyValue>200)
  100.         KeyValue=200;
  101.         if(KeyValue<1)
  102.         KeyValue=1;
  103. }


  104. ……………………

  105. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei附件下载,注意仿真是用Proteus7.5画的,高版本可能无法打开,请安装7.5或7.8版本,扩展名为dsn的那个:
旋转编码器.zip (369.52 KB, 下载次数: 1105)

作者: LXJ50    时间: 2017-9-7 17:34
好资料,一定要分享学习
作者: lekeak47    时间: 2018-1-16 23:20
看看,不知道如何?
作者: xrfxrfxrf008    时间: 2018-2-27 09:09
好东西  正是需要的
作者: Hwinnie    时间: 2018-3-10 14:59
找了一圈没有旋转编码器,原来要这么搞
作者: h1007886499    时间: 2018-3-16 20:42
Hwinnie 发表于 2018-3-10 14:59
找了一圈没有旋转编码器,原来要这么搞

可以分享下 吗  
还没赚够黑币
作者: bleach    时间: 2018-4-30 11:10
谢谢分享,正在用这个编码器,很好的参考资料
作者: 906267461    时间: 2018-5-10 13:45
谢谢分享
作者: shtsw    时间: 2018-5-24 20:45
真好  我正在找,就看到了
作者: landisonss    时间: 2018-7-13 12:15
正需要谢谢楼主
作者: jinanyuanyue    时间: 2018-7-18 15:09
谢谢,楼主好人,我学了很久都看不明白,你这是雪中送炭啊
作者: 7782    时间: 2018-9-3 16:17
好资料,一定要学习学习
作者: 天12    时间: 2018-9-5 15:32
很棒的思路
作者: 15942379927    时间: 2018-10-21 19:02
谢谢。值得学习
作者: stkh    时间: 2018-11-11 19:22
很详细,赞一个
作者: zx49666428    时间: 2018-11-11 19:45

谢谢分享,正在用这个编码器,很好的参考资料
作者: tyrant988    时间: 2019-1-11 15:28
谢谢,很好,很实用
作者: mykt2012    时间: 2019-1-12 01:17
正好需要
作者: wangcongliang    时间: 2019-1-13 16:57
感谢楼主大佬啊,简洁明了!
作者: 201610103061    时间: 2019-3-2 23:18
get!非常棒!

作者: guo1373766226    时间: 2019-4-7 00:08
好东西!!!
作者: ElecC    时间: 2019-6-27 08:59
楼主,我试了你的仿真。点击SW2的时候编码器的值并没有减小,没反应,是程序有BUG吗?还是什么地方没操作对?
作者: boumbo    时间: 2019-7-6 18:11
感谢楼主分享,很受用
作者: 放心去飞    时间: 2019-7-8 17:24
学习一下好东西
作者: 小黑鱼    时间: 2019-7-11 19:33
厉害,必须赞一个
作者: 万万123    时间: 2019-9-2 17:03
点赞。。。。
作者: mobicity    时间: 2019-10-6 21:31
编码器看似很简单的一个器件,其时一点都不简单。学习下,感谢
作者: fancunwu    时间: 2019-10-7 13:51
ElecC 发表于 2019-6-27 08:59
楼主,我试了你的仿真。点击SW2的时候编码器的值并没有减小,没反应,是程序有BUG吗?还是什么地方没操作对 ...

就是 我也试了 值不会减 ,只会增加  不会减少,程序可能有问题。
作者: 51黑电子会员    时间: 2019-12-8 11:00
如何下载

作者: 51黑电子会员    时间: 2019-12-8 11:00
如何下载
作者: xuanmic    时间: 2020-1-16 21:56
谢谢楼主的分享。
作者: 道洲    时间: 2020-2-18 16:11

好资料,一定要分享学习
作者: xmfjfhcel    时间: 2020-2-18 17:24
想不到这儿有这个资料, 之前看了这个东东,不知道原理,也没敢下手买。 先标记下,空了好好学习学习。
作者: lindeijun1    时间: 2020-2-19 15:44
谢谢楼主分享!!!!
作者: xiejp03    时间: 2020-4-12 21:51
好资料,一定要分享学习
作者: 一只小月白    时间: 2020-5-9 16:35
谢谢!!正好需要
作者: foi    时间: 2020-6-20 16:33
这个是测角度的吗

作者: Eip_Nit    时间: 2020-6-20 22:21
很好用,很详细
作者: yyzf998    时间: 2020-7-2 07:05
好东西,好好学习,天天向上!感谢楼主的无私奉献!
作者: thanksbaby    时间: 2020-7-2 08:56
编码器,io口捕捉脉冲,很好的资料,谢谢
作者: marsyu1991    时间: 2020-8-2 23:39
原理是看懂了,但是按照目前的程序来看,因为51单片机的边沿触发只能设定下降沿触发,并不能设定任意沿触发,因此该程序的效果还是存在点问题
作者: 652018634    时间: 2020-10-23 05:29
谢谢分享,正在用这个编码器,很好的参考资料
作者: xyllovezuu    时间: 2020-11-3 18:11
很好的学习资料,谢谢分享!
作者: catlu    时间: 2021-3-5 18:19
感谢楼主的例程,正在研究怎么永这个编码器当开关用
作者: yangyouyoulin    时间: 2021-6-7 08:38
刚好想用这个编码器,很好的参考资料,谢谢!
作者: bomb1999    时间: 2021-6-8 19:58
下载运行了一下模拟,显示数可增可减,目前问题是如何将此类编码器与接收译码端的连接与适当的控制输出。感谢楼主解惑
作者: bomb1999    时间: 2021-6-8 20:20
手里有两种编码器 一直木有用上呢
作者: chenmanan    时间: 2021-8-9 00:06
谢谢分享,正在用这个编码器,很好的参考资料
作者: CIKAR    时间: 2021-10-1 07:39
正是需要的 非常不错
作者: xiexugang    时间: 2021-10-1 23:31
旋转编码器程序,没有那么复杂的,一个8位变量,大概4条if语句就可以实现的
作者: Simpron1    时间: 2021-10-2 08:40
写的很好 加油楼主 感谢楼主分享
作者: 628    时间: 2021-10-5 12:56
附件里没有proteus仿真文件啊
作者: heicad    时间: 2021-10-5 14:56
628 发表于 2021-10-5 12:56
附件里没有proteus仿真文件啊

仿真文件是用Proteus7.5画的,dsn文件那个,你装个7.5就能打开了
作者: guojizhou    时间: 2021-10-13 12:01
fancunwu 发表于 2019-10-7 13:51
就是 我也试了 值不会减 ,只会增加  不会减少,程序可能有问题。

我也是
作者: 21cnsound    时间: 2022-1-20 15:25
谢谢分享,不过还是没看懂怎么模拟左转还是右转?
作者: 21cnsound    时间: 2022-1-20 15:27
谢谢LZ分享,不过还是没看懂怎么操作旋转的
作者: 21cnsound    时间: 2022-1-21 11:10
请问,仿真时怎么操作SW1和SW2来模拟出左转和右转呢?
按顺序按这两个开关好像不行吧
作者: haokanma77    时间: 2022-3-6 08:27
留个记号,争取试试
作者: Kongman    时间: 2022-3-15 15:47
Mark一下
作者: houwei0303    时间: 2022-3-20 14:56
感觉不是特别灵敏
作者: 374866830    时间: 2022-4-2 18:39
Hwinnie 发表于 2018-3-10 14:59
找了一圈没有旋转编码器,原来要这么搞

兄弟,能分享下吗?
作者: jinanyuanyue    时间: 2022-5-18 15:34
对这个感兴趣,谢谢分享
作者: innere    时间: 2022-9-15 08:11
guojizhou 发表于 2021-10-13 12:01
我也是

最后解决了吗,折腾了两天,我快崩溃了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1