找回密码
 注册
查看: 160|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真
; e; h7 Q. `: s, P# e; }; V# P& |$ q% ^5 B. e- h+ U6 ^
程序功能:旋转编码器顺时针旋转,显示数值增加2 `* E( ^* m/ y7 O5 D
               旋转编码器逆时针旋转,显示数值减小7 |) x7 M- ?5 M1 d& X% q8 x
               旋转编码器按下,切换显示ON/OFF
4 d. y8 F; f+ Y  F5 J
% a5 [* [9 R" Y! \' ]" S根据旋转编码器KY-040模块资料可知:
' C7 X3 f" B! a/ c$ g( d
6 H- a) X* M, Q5 y. \/ M: p

3 x& T& p" r4 Q3 S& P+ s
在下降触发模式下,AB进行电平比较:
* y* u! ?1 d' e0 wA触发的中断:同加异减
( Y& w/ m; A. q9 t2 k0 P/ iB触发的中断:同减异加: _! L/ ?, [, B/ n! ^! i1 E
反之亦然

! h/ ]; m( l8 A$ e* }2 H
那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真,
                      CLK(A) ---- P3^2
                      DT(B)  ---- P3^3
                      SW(Z)  ---- P3^4
外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器
的旋转方向。
  E( d- S9 m1 w' i1 s
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)# \8 F3 t* ^4 c- M
7 l) |! i8 U7 k' [

' |6 R$ Y  I; ~; A- I! w单片机源程序如下:
8 V2 P" _/ u8 k7 W1 O: o
  • #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;
  • }
    2 N3 {5 Y1 ?) c3 i: ?% I0 D6 S
: t' I8 Q; a* H/ G- |5 w9 F3 ^

旋转编码器.zip

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

该用户从未签到

2#
发表于 2022-9-19 10:44 | 只看该作者
本帖最后由 RGB_lamp 于 2022-9-23 18:00 编辑 2 s& |8 z# Q9 k; ]1 Q3 W8 H& e2 S

) b4 B/ f+ ?2 p$ Z; N; u9 t旋转编码器其实就是机械元件,依靠物理布局,来编码。认真学习技术,维护好良好的学习氛围。

该用户从未签到

3#
发表于 2022-9-19 11:25 | 只看该作者
本帖最后由 Crash 于 2022-9-23 21:45 编辑 9 w  S) C2 u4 H5 w6 {/ m. [/ i
+ O. c# I* D6 q0 H0 E; X
你这C语言编程,挺不错的。我分析了一下。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

EDA365公众号

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

GMT+8, 2025-1-16 01:00 , Processed in 0.078125 second(s), 25 queries , Gzip On.

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

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

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