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" M4 `! c( w4 Z5 E3 n( B& I/ i/ d
在下降触发模式下,A和B进行电平比较:
- a- [, \+ `, S8 L/ W( s9 S8 T( w对A触发的中断:同加异减$ 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/ S 1 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
|