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在下降触发模式下,A和B进行电平比较: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 |