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在下降触发模式下,A和B进行电平比较:
* M+ M# @$ X7 c/ J$ }! i( x' U对A触发的中断:同加异减
% k6 D; |( x# D( h' I5 U4 _+ R对B触发的中断:同减异加: 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 |