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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真( c; Q% |& A% f% `3 b9 ~

7 H; S; I6 u3 Y程序功能:旋转编码器顺时针旋转,显示数值增加1 \) }; E; y/ Y9 y
               旋转编码器逆时针旋转,显示数值减小
5 ?! ~2 O/ t. v9 e/ Q; y, ?0 B. g               旋转编码器按下,切换显示ON/OFF
3 K% Y  H% D, m7 a5 z
+ V( D2 G; W' L根据旋转编码器KY-040模块资料可知:' h1 W: \/ w3 |. ^6 D

; T) q% b0 Y" M
4 `! c( w4 Z5 E3 n( B& I/ i/ d
在下降触发模式下,AB进行电平比较:
- a- [, \+ `, S8 L/ W( s9 S8 T( wA触发的中断:同加异减$ j* `, P  @9 @! Q" j+ m
B触发的中断:同减异加
) s# E" V% c! |) M" C0 h反之亦然
; A4 B2 v' M  W* D8 [0 y8 p4 A, T
那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真,
                      CLK(A) ---- P3^2
                      DT(B)  ---- P3^3
                      SW(Z)  ---- P3^4
外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器
的旋转方向。
9 o! p1 ]4 u/ M, w" x
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0 j4 D, ~+ U$ g/ S1 v. {; s( h; @& L! v1 z
7 @$ O" W/ U& S* f
单片机源程序如下:0 w( ^/ u. q* z
  • #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;
  • }
    , D' G8 w2 k' U( M
# _2 r9 }; W/ E) \+ J

旋转编码器.zip

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

该用户从未签到

2#
发表于 2022-9-19 10:44 | 只看该作者
本帖最后由 RGB_lamp 于 2022-9-23 18:00 编辑
  t  x! F7 \+ N# q
* O" V, N6 `7 V; F# f5 E7 Q# P旋转编码器其实就是机械元件,依靠物理布局,来编码。认真学习技术,维护好良好的学习氛围。

该用户从未签到

3#
发表于 2022-9-19 11:25 | 只看该作者
本帖最后由 Crash 于 2022-9-23 21:45 编辑 , b  x$ E6 ^2 j
5 u$ d" ~- e# V1 O1 e
你这C语言编程,挺不错的。我分析了一下。哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-24 07:23 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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