EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
给大家分享一个51单片机+1602液晶屏显示 KY-040旋转编码器模块的程序和仿真2 m* o5 m9 p) V# Q$ I' d/ @ 
 
  C  E% j- Q! P) @0 y, `8 i2 `! s程序功能:旋转编码器顺时针旋转,显示数值增加- c  d, a' b. I7 d  A4 T, n 
               旋转编码器逆时针旋转,显示数值减小6 f" |+ ~' Q9 ^* h' _1 S: p, O$ B 
               旋转编码器按下,切换显示ON/OFF' J% }/ c: f  \! K: K 
 
4 n) K. q  P( {. m7 @$ K根据旋转编码器KY-040模块资料可知:9 b& e( k2 B6 ?' M 
 
1 B% w5 l( i# K 
# E* j4 w; p, L2 E在下降触发模式下,A和B进行电平比较: 
' N* F) l% |9 h2 P& v对A触发的中断:同加异减 
, h0 m, C- v4 b9 f对B触发的中断:同减异加- V: J$ @( C8 h- [4 R6 L1 d 
反之亦然  
- ]# h, l/ i9 ^6 q) d& e那么可以通过手动模拟外部中断触发瞬间的电平状态来进行仿真,                       CLK(A) ---- P3^2                       DT(B)  ---- P3^3                       SW(Z)  ---- P3^4 外部中断0下降沿触发后,对B的电平进行判断即可知道旋转编码器 的旋转方向。 ![]() ![]() ![]()  
( t9 [3 R0 ]! c' {4 }" Z( x# _仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 
$ Z' r. H5 v- y6 O& g( P![]()  
8 B, N# O* C0 v/ G* M, d& k. q% F4 @& K) c0 }* B0 r 
单片机源程序如下:# D& ?& n9 d, T7 V" ?. L 
- #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;
 - }
 
8 r) F8 z' F! @1 |0 z 
  
9 _/ M6 r' m; h" g( u- ]  F |