标题: 好用的旋转编码器单片机代码分享 [打印本页]

作者: 客来宝    时间: 2019-3-19 10:51
标题: 好用的旋转编码器单片机代码分享
自己写的旋转编码器C语言代码,对变量num数值进行调整,正转加,逆转减,按下归0。
对于快速、慢速旋转准确率都很高。
通用性好,有的旋转编码器是要转两格才调整一个数值的,这个代码通用。
代码里面的c与c1比较是防止因漏码而卡死,c1选的80000是对1T单片机的,如果用12T的就改为10000。如果要以非常慢的速度旋转,可以在这个基础上再把c1加大。

单片机源程序如下:
  1. /*     K1、K2、K3分别接旋转编码器的CLK、DT、SW,正时针、逆时针调整旋转编码器分别增、减
  2. */

  3. #include <stc15.h>
  4. sbit K1=P3^2;     // K1、K2、K3分别接旋转编码器的CLK、DT、SW
  5. sbit K2=P3^3;
  6. sbit K3=P3^4;

  7.     unsigned  long c,c1;
  8.                 unsigned  int num;         //定义变量类型
  9.           bit d;

  10. void main()
  11. {
  12.    c1=80000;
  13.         num=100;
  14.        
  15.   while (1)
  16.         {
  17.                 if(K1&&K2)
  18.         {               
  19.         c=0;                  //对c和d赋初值
  20.         d=1;
  21.         }

  22.           if(!K1&&K2&&d)          //首先判断是否符合正转第一特征码,如不符合则立即进行反转判断
  23.          {
  24.           while (K2&&d)           //等待第二特征码出现,如超过预设时限则直接退出,进行下一次判断
  25.           {                                   //每循环一次,c值加1,加至c1则超过预设时限,给d赋值0,退出
  26.           c++;
  27.           if(c>c1)
  28.           d=0;
  29.           }
  30.           if (!K1&&!K2&&d)                 //判断是否符合正转第二特征码
  31.           {
  32.            while (!K1&&d)
  33.            {
  34.           c++;
  35.           if(c>c1)
  36.           d=0;
  37.           }
  38.        if (K1&&!K2&&d)                   //判断是否符合正转第三特征码
  39.            {
  40.                           num++;
  41.                                  }
  42.         while (!K2&&d)           //等待正转第三特征码结束
  43.            {
  44.           c++;
  45.           if(c>c1)
  46.           d=0;
  47.           }                 
  48.                 }
  49.     }
  50.        
  51.                  if(K1&&!K2&&d)           //判断是否符合反转第一特征码
  52.          {
  53.           while (K1&&d)
  54.            {
  55.           c++;
  56.           if(c>c1)
  57.           d=0;
  58.           }
  59.           if (!K1&&!K2&&d)
  60.           {
  61.            while (!K2&&d)
  62.             {
  63.           c++;
  64.           if(c>c1)
  65.           d=0;
  66.           }
  67.        if (!K1&&K2&&d)
  68.            {
  69.                 num--;
  70.                           while (!K1&&d)
  71.                   {
  72.           c++;
  73.           if(c>c1)
  74.           d=0;
  75.           }         
  76.                 }
  77.     }
  78.                 }
  79.                        
  80.                 if(!K3)
  81.                  {
  82.                  num=0;
  83.                   }
  84.                                   
  85.                         }
  86.                   }
复制代码

所有资料51hei提供下载:
旋转编码器.rar (30.82 KB, 下载次数: 354)



作者: myd    时间: 2019-7-20 11:05
正需要这个来参考学习。谢谢。
作者: dlwater    时间: 2019-9-24 13:16
谢谢分享,刚好需要这个程序。
作者: liu198601    时间: 2019-10-1 08:01
感谢分享
作者: saixun    时间: 2019-10-8 17:21
正需要这个来参考学习。谢谢。
作者: lixiaofei    时间: 2020-3-6 15:28
谢谢分享
作者: lixiaofei    时间: 2020-3-6 15:29
谢谢分享,看一下
作者: wsh791    时间: 2020-3-7 06:30
谢谢分享
作者: bg4rfb    时间: 2020-3-7 17:03
感谢分享!
作者: jameshhb    时间: 2020-3-11 16:10
用的是51单片机吗?

作者: xiejp03    时间: 2020-4-12 20:51
谢谢奉献分享~
作者: 客来宝    时间: 2021-2-9 23:50
好久没来论坛了
作者: cdiyy    时间: 2021-3-19 08:59
感谢分享,正在学习中
作者: kkk2003    时间: 2021-5-30 20:26
目前还用不到,先看看
作者: myhj    时间: 2024-6-29 09:55
这个程序真的不错,快调慢调都很准确。
作者: piscest_x    时间: 2024-11-4 09:59
myhj 发表于 2024-6-29 09:55
这个程序真的不错,快调慢调都很准确。

我的快调不是每次都识别
作者: w645053932    时间: 2025-1-16 12:24
谢谢分享,刚好需要这个程序。
作者: w645053932    时间: 2025-1-16 12:25
两个以上编码器




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