单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5855|回复: 18
打印 上一主题 下一主题
收起左侧

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提供下载:
旋转编码器.zip (369.52 KB, 下载次数: 199)




评分

参与人数 3黑币 +68 收起 理由
stkh + 8 赞一个!
zkele + 10 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏9 转播转播 分享分享 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
LXJ50 发表于 2017-9-7 17:34 | 只看该作者
好资料,一定要分享学习
回复

使用道具 举报

板凳
lekeak47 发表于 2018-1-16 23:20 | 只看该作者
看看,不知道如何?
回复

使用道具 举报

地板
xrfxrfxrf008 发表于 2018-2-27 09:09 | 只看该作者
好东西  正是需要的
回复

使用道具 举报

5#
Hwinnie 发表于 2018-3-10 14:59 | 只看该作者
找了一圈没有旋转编码器,原来要这么搞
回复

使用道具 举报

6#
h1007886499 发表于 2018-3-16 20:42 | 只看该作者
Hwinnie 发表于 2018-3-10 14:59
找了一圈没有旋转编码器,原来要这么搞

可以分享下 吗  
没有黑币
回复

使用道具 举报

7#
bleach 发表于 2018-4-30 11:10 | 只看该作者
谢谢分享,正在用这个编码器,很好的参考资料
回复

使用道具 举报

8#
906267461 发表于 2018-5-10 13:45 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
shtsw 发表于 2018-5-24 20:45 | 只看该作者
真好  我正在找,就看到了
回复

使用道具 举报

10#
landisonss 发表于 2018-7-13 12:15 | 只看该作者
正需要谢谢楼主
回复

使用道具 举报

11#
jinanyuanyue 发表于 2018-7-18 15:09 | 只看该作者
谢谢,楼主好人,我学了很久都看不明白,你这是雪中送炭啊
回复

使用道具 举报

12#
7782 发表于 2018-9-3 16:17 | 只看该作者
好资料,一定要学习学习
回复

使用道具 举报

13#
天12 发表于 2018-9-5 15:32 | 只看该作者
很棒的思路,可惜现在没有黑币
回复

使用道具 举报

14#
15942379927 发表于 2018-10-21 19:02 来自手机 | 只看该作者
谢谢。值得学习
回复

使用道具 举报

15#
stkh 发表于 2018-11-11 19:22 | 只看该作者
很详细,赞一个
回复

使用道具 举报

16#
zx49666428 发表于 2018-11-11 19:45 | 只看该作者

谢谢分享,正在用这个编码器,很好的参考资料
回复

使用道具 举报

17#
tyrant988 发表于 2019-1-11 15:28 | 只看该作者
谢谢,很好,很实用
回复

使用道具 举报

18#
mykt2012 发表于 2019-1-12 01:17 来自手机 | 只看该作者
正好需要
回复

使用道具 举报

19#
wangcongliang 发表于 2019-1-13 16:57 | 只看该作者
感谢楼主大佬啊,简洁明了!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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