找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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, 下载次数: 1091)

评分

参与人数 5黑币 +104 收起 理由
残...月 + 6 很给力!
euxbjfjfjcn + 30
stkh + 8 赞一个!
zkele + 10 共享资料的黑币奖励!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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