大神请指教 本程序测得是增量式编码器位置 说白了就是计数A B脉冲 但是烧进去之后示数一直是0 转动编码器不会有反应 前后改了几次实在是改不出来了 求大神支招
#include <REG51.H>
#include <intrins.h>
#define uchar unsigned char
#define GPIO_DIG P0
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
sbit PINA = P1^0; //A相
sbit PINB = P1^1; //B相
sbit PIND = P1^2;
static unsigned int counter = 0; //编码器脉冲计数
int xx[3]={0,0,0};
unsigned char code DIG_CODE[17]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
/************************************
void Timer0Init(void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
PT0 = 0;
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0 = 1; //定时器0开始计时
PT0 = 1; //数码管刷新优先
EA = 1;
}
*****利用STC89系列的外中断模式*******
void Inti_INT0()
{
//set INT1 int type (1:Falling only 0:Low level)
//enable INT1 interrupt
EA = 1;
}
************************************/
void main (void)
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
PT0 = 0;
TF0 = 0; //清除TF0标志
ET0 = 1;
TR0 = 1; //定时器0开始计时
PT0 = 1; //数码管刷新优先
EA = 1;
while(1)
{
}
}
void Timer0() interrupt 1
{
static unsigned char i;
unsigned int j;
unsigned char check[8];
check[0]=counter/100;
check[1]=counter%100/10;
check[2]=counter%100%10;
check[3]=0;
check[4]=0;
check[5]=0;
check[6]=0;
check[7]=0;
TL0 = 0x30; //设置定时初值
TH0 = 0xF8; //设置定时初值
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
GPIO_DIG=DIG_CODE[check[i]];//发送段码
j=5;
i++;
if(i==8)
{
i=0;
} //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
void exint1() interrupt 0 //(location at 0013H)
{
static bit Curr_encoder_b; //定义一个变量来储存当前B信号
static bit Last_encoder_b; //定义一个变量来储存上次B脚信号
static bit updata= 0;
if(PINA && PINB) //编码器无转动退出
{
updata = 0;
return;
}
Last_encoder_b = PINB;
while(!PINA)
{
Curr_encoder_b = PINB;
updata = 1;
}
if(updata)
{
updata = 0;
if(Last_encoder_b==1&&Curr_encoder_b==0)
{
if(counter == 400)
return;
counter++;
}
else if(Last_encoder_b==0&&Curr_encoder_b==1)
{
if(counter == 0)
return;
counter--;
}
}
}
|