这个是我自己用的,你参考一下,速度不是很快,但正常使用是可以的,定时器扫描速度提高一点,可以读取得快一点
/*──────────────────────────────────────────────────────────────────────────────────────────────────
EC11_T0.c
编写:YGG
完成日期:20211118
功能:通过T0定时器来完成EC11编码开关的检测
适用于STC8051单片机T0定时器编码开关函数
完成状态:已经完成
──────────────────────────────────────────────────────────────────────────────────────────────────*/
#include "Stc8a.h"
#include "EC11_T0.h"
sbit sa=P2^2; //编码开关的两个端口
sbit sb=P2^1; //编码开关的两个端口
sbit over=P3^2; //过流检测IO
sbit buzz=P4^0; //用于蜂鸣器控制
bit fa; //用于标记编码开关两个端口状态
bit fb; // 0 为没有记录,1 为已经记录
unsigned char turn_f=0x00,turn_r=0x00; //用于存放旋转变量的,一个是正反两个方向
//──────────────────────────────────────────────────────────────────────────────────────────────────
void Timer0Init(void) //T0定时器初始化,1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x66; //设置定时初始值
TH0 = 0xEA; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1; //T0定时器中断开启
TR0 = 1; //定时器0开始计时
P_SW2=0x80; //
P2PU|=0x06; //P2.1,P2.2上拉电阻启用
P_SW2=0x00; //
}
//──────────────────────────────────────────────────────────────────────────────────────────────────
//──────────────────────────────────────────────────────────────────────────────────────────────────
void timer0() interrupt 1 //T0定时器中断
{
static unsigned char bm_data; //用于保存两个端口读取到的数据
TL0 = 0x66; //设置定时初始值
TH0 = 0xEA; //设置定时初始值
if(!over)buzz=!buzz; //检测到低电平,蜂鸣器响
else buzz=0;
//──────────────────────────────────────────────────────────────────────────────────────────────
if(sa&&sb) //如果两个端口都是1,就表示编码开关位于"静止"
{
if(bm_data==0x12)
{
turn_f++;
}
else if(bm_data==0x21)
{
turn_r++;
}
bm_data=0; //长期静止状态,端口数据要清除
fa=1;
fb=1;
}
//──────────────────────────────────────────────────────────────────────────────────────────────────
else if((fa!=sa)||(fb!=sb)) //如果标志位的上次的一样,就不记录端口数据
{
bm_data=(bm_data<<1)|sa;
bm_data=(bm_data<<1)|sb;
fa=sa;
fb=sb;
}
}
//──────────────────────────────────────────────────────────────────────────────────────────────────
|