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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真
7 D3 _2 ^( d! w* `9 Z$ |) ?- ^$ b0 H; _3 k/ K
程序功能:旋转编码器顺时针旋转,显示数值增加4 X6 l: J0 o8 U8 u! h
               旋转编码器逆时针旋转,显示数值减小+ |6 m; B2 _2 Y, E8 [3 e- [, V
               旋转编码器按下,切换显示ON/OFF4 Y* i2 i4 d, a
' j: b. A6 f& I
根据旋转编码器KY-040模块资料可知:
( E3 M2 J% E$ P) W- j% ~) @  X
1 D0 y- I! z* |* f, o/ ]9 M

% \  {! }0 t$ N% N& ?0 `2 y
在下降触发模式下,AB进行电平比较:6 Y; p8 n3 D% t# [
A触发的中断:同加异减
" X4 W  o( l) _- f& ^B触发的中断:同减异加, x. |& O. a; o6 z( l+ w$ N/ v9 }
反之亦然
# S7 l3 _" D" J+ q( Y8 B* O
那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真,
                      CLK(A) ---- P3^2
                      DT(B)  ---- P3^3
                      SW(Z)  ---- P3^4
外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器
的旋转方向。

) y2 o+ u- h, y( _/ n; b+ v仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1 m+ p# J7 f: p, C+ b/ j/ ^: Y
% B& [$ q6 r; A  v. q$ C2 v/ a8 w& i9 D; o- Z7 g& L3 ~( w
单片机源程序如下:: f6 ~: _- e& B1 r
  • #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;
  • }! m: Y/ C5 R2 a% t4 T$ ~, D

4 s3 W4 A: Y" }; i5 Q

旋转编码器.zip

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

该用户从未签到

2#
发表于 2022-9-19 10:44 | 只看该作者
本帖最后由 RGB_lamp 于 2022-9-23 18:00 编辑 6 W0 A: y4 \  K
/ q) W$ L- A4 o* ?7 W
旋转编码器其实就是机械元件,依靠物理布局,来编码。认真学习技术,维护好良好的学习氛围。

该用户从未签到

3#
发表于 2022-9-19 11:25 | 只看该作者
本帖最后由 Crash 于 2022-9-23 21:45 编辑 ' p' B/ i0 R/ `9 H3 j& E. j7 L

( w9 ~# C2 j6 ~& l8 l9 k! R3 l你这C语言编程,挺不错的。我分析了一下。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-6 20:41 , Processed in 0.093750 second(s), 26 queries , Gzip On.

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

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

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