通过输出波形图可知每个运动周期的时序为顺时针运动逆时针运动ABAB1101001011100001静止状态为11或00,A异或B的结果为0(注1)单片机可利用定时器中断来检测A和B的状态,中断时间在5~20ms之间均可。当检测到A^B=0时,表示为静止状态,记下A和B的状态。当检测到A^B=1时,表示有转动,读取AB的状态,如果AB是从11到01或者是从00到10则为正转,反之如果AB是从11到10或者是从00到01则为反转。此方法比较简单可靠,可以检测转动一格又可以检测快速转动。注1:异或运算异或的运算方法是一个二进制运算,C语言中用A^B表示A异或B:1^1=00^0=01^0=10^1=1两者相等为0,不等为1.也许是屎上最简单的旋转编码器程序,占用一个外中断#defineROTATE_APIND.2#defineROTATE_BPIND.3ucharCW=0;ucharCCW=0;//ExternalInterrupt0serviceroutineinterrupt[EXT_INT0]voidext_int0_isr(void){if(ROTATE_A!=ROTATE_B){CW++;}elseCCW++;}voidmain(void){if((CW|CCW)!=0){DATA=DATA+CW-CCW;}CW=0;CCW=0;delay_ms(50);}//////////////////////////////////////////占用一个外中断,电平变化触发,CW是顺时针转过的脉冲,CCW是逆时针每50ms处理一下数值,如果想要出错,起码脉冲时间要比50ms/256短才行,手指是没可能达到这速度实际应用中感觉很爽//******************************************************************************//旋转编码器脉冲计数程序,在8051上通过外部中断0实现//特别说明:适应于旋转编码器脉冲频率较低的场合(对于12MHz晶体,大致可以支持4KHz//以下的旋转编码器脉冲频率),若旋转编码器脉冲频率更高,建议采用计数器//T0和T1分别实现正反向计数,此时一般需要附加少量外部电路的配合//以下代码仅供参考,由此产生的任何后果,本人不承担任何责任//******************************************************************************#include"reg51.h"longcounter=0;//旋转编码器的脉冲计数值,左转为正,右转为负voidmain(){IT0=1;//外部中断0为边沿触发EX0=1;//使能外部中断0EA=1;//使能中断while(1){//在这里写代码实现你想做的事,比如计数值的进一步处理等等等等}}//******************************************************************************//延时函数delay(unsignedchardly)//延时值与晶体频率有关,可以自己调整变量x的值以取得合适的单位延时值//******************************************************************************voiddelay(unsignedchardly){unsignedintx;while(dly--){x=1000;while(x--);}}//******************************************************************************//外部中断0的中断处理函数voidISR0()//注意:旋转编码器的A接P3.2,B接P1.7(跟你图上一样不变)//******************************************************************************voidISR0()interrupt0{if((P1&0x80)==0x80){delay(10);//消抖动,延时一会,确认P1.7仍然为高,如果频率比较高,延时要缩短if((P1&0x80)==0x80)counter++;}else{delay(10);//消抖动,延时一会,确认P1.7仍然为低,如果频率比较高,延时要缩短if((P1&0x80)==0x00)counter--;}}最近用到旋转编码器,在网上找了一大堆资料,发现这篇好文章。收藏到自己的空间待用。[ME850扩展应用]旋转编码器计数程序(飞梭旋钮功能)-数码管显示/**********************************************************************ME850单片机开发实验仪演示程序-旋转编码器计数程序****3位数码管显示****MCU:AT89S52晶振:11.0592MHz****版本:V1.1(2011/07/14)**作者:tangyuan**网站:http://www.linjve.com/****邮箱:893@linjve.com****【版权】东莞市林积为实业投资有限公司**【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!**************************************************************************功能简述:(飞梭旋钮功能)**当旋钮顺时针旋转时,计数值增加。达到最大值255后,不再响应。**当逆钮顺时针旋转时,计数值减小。达到最小值0后,不再响应。**当按下旋钮时,将计数值清零(归位)。*********...