這個是我自己用的,你參考一下,速度不是很快,但正常使用是可以的,定時器掃描速度提高一點,可以讀取得快一點
/*──────────────────────────────────────────────────────────────────────────────────────────────────
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;
}
}
//──────────────────────────────────────────────────────────────────────────────────────────────────
|