找回密码
 注册
关于网站域名变更的通知
查看: 240|回复: 2
打印 上一主题 下一主题

51单片机旋转编码器模块KY-040调试程序+仿真 LCD1602显示

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-9-19 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真
! N2 m4 n$ v- D! y& G6 p+ z+ r' r/ E" y# j7 T6 {' b
程序功能:旋转编码器顺时针旋转,显示数值增加; h+ }( \9 n* w9 v
               旋转编码器逆时针旋转,显示数值减小
( B) J4 N6 N6 |  b  I; F, ]1 L3 W               旋转编码器按下,切换显示ON/OFF; J: T* o* k. |( X% t
' b5 L. t" b2 m* L9 B
根据旋转编码器KY-040模块资料可知:# L5 b$ `- R0 M) g$ L) J

( F0 T$ W6 b6 F; A

9 H$ e% G% a: {- s' D
在下降触发模式下,AB进行电平比较:
* M+ M# @$ X7 c/ J$ }! i( x' UA触发的中断:同加异减
% k6 D; |( x# D( h' I5 U4 _+ RB触发的中断:同减异加: j  N8 h+ {) p% p& T
反之亦然

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

$ C! c4 O6 B0 ]( Q6 M6 u仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)# q0 k5 ~! L& u5 B1 m4 w0 X

& ]+ G  x+ ^! X4 Z* R  M3 U9 i/ `1 e
单片机源程序如下:0 h2 R# k4 c9 F+ i1 [& d
  • #include<reg51.h>
  • #include"lcd.h"
  • #include<intrins.h>
  • //外部中断的IO
  • sbit K1=P3^2;
  • sbit K2=P3^3;
  • sbit K3=P3^4;
  • void IntConfiguration();
  • void Delay(unsigned int n);
  • unsigned char KeyValue=0;
  • unsigned char state=0;
  • /*******************************************************************************
  • * 函 数 名       : main
  • * 函数功能                 : 主函数
  • * 输    入       : 无
  • * 输    出       : 无
  • *******************************************************************************/
  • void main(void)
  • {
  •         LcdInit();
  •         IntConfiguration();
  •         LCDWrite_String(2, 0, 10, "Bian ma qi");
  •         while(1)
  •         {
  •                 if(K3==0)
  •                 {
  •                         Delay(1);         //延时消抖
  •                         if(K3==0)
  •                         {
  •                                 state=!state;
  •                                 while(K3==0);
  •                         }
  •                 }
  •                 if(state==1)
  •                 {
  •                         LcdWriteCom(0xc0+13);
  •                         LcdWriteData('O');
  •                         LcdWriteData('N');
  •                         LcdWriteData(' ');
  •                 }
  •                 else
  •                 {
  •                         LcdWriteCom(0xc0+13);
  •                         LcdWriteData('O');
  •                         LcdWriteData('F');
  •                         LcdWriteData('F');
  •                 }
  •                 LcdWriteCom(0xC0+4);
  •                 LcdWriteData('0'+KeyValue/100%10);
  •                 LcdWriteData('0'+KeyValue/10%10);
  •                 LcdWriteData('0'+KeyValue%10);
  •         }
  • }
  • /*******************************************************************************
  • * 函 数 名         : IntConfiguration()
  • * 函数功能                   : 设置外部中断
  • * 输    入         : 无
  • * 输    出         : 无
  • *******************************************************************************/
  • void IntConfiguration()
  • {
  •         //设置INT0
  •         IT0=1;//跳变沿出发方式(下降沿)
  •         EX0=1;//打开INT0的中断允许。
  •         EA=1;//打开总中断
  • }
  • /*******************************************************************************
  • * 函 数 名         : Delay(unsigned int n)
  • * 函数功能                   : 延时
  • * 输    入         : n
  • * 输    出         : 无
  • *******************************************************************************/
  • void Delay(unsigned int n)   //延时50us误差 0us
  • {
  •     unsigned char a,b;
  •                 for(;n>0;n--)
  •                 {
  •             for(b=1;b>0;b--)
  •         for(a=22;a>0;a--);
  •                 }
  • }
  • /*******************************************************************************
  • * 函 数 名         : Int0()        interrupt 0
  • * 函数功能                   : 外部中断0的中断函数
  • * 输    入         : 无
  • * 输    出         : 无
  • *******************************************************************************/
  • void Int0()        interrupt 0                //外部中断0的中断函数
  • {
  •         if(K2==1)
  •         {
  •                 KeyValue++;
  •         }
  •         if(K2==0)
  •         {
  •                 KeyValue--;
  •         }
  •         if(KeyValue>200)
  •         KeyValue=200;
  •         if(KeyValue<1)
  •         KeyValue=1;
  • }
    7 t' ~# u2 U, C" N5 g- E$ T4 G

; Y: a" p: A& L

旋转编码器.zip

369.52 KB, 下载次数: 0, 下载积分: 威望 -5

该用户从未签到

2#
发表于 2022-9-19 10:44 | 只看该作者
本帖最后由 RGB_lamp 于 2022-9-23 18:00 编辑
, _% ?2 r' i8 \# Y$ p; E& \2 U  j$ c6 i
旋转编码器其实就是机械元件,依靠物理布局,来编码。认真学习技术,维护好良好的学习氛围。

该用户从未签到

3#
发表于 2022-9-19 11:25 | 只看该作者
本帖最后由 Crash 于 2022-9-23 21:45 编辑
2 D/ S: A7 X* ^- T0 s- Z4 D; \* u
# V* C$ k9 j: v1 _9 N) T, i你这C语言编程,挺不错的。我分析了一下。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-3 06:35 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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