附上我的程序,用外部中断1,2计数和定时器T0计时,但是还是走不了直线
#include//单片机头文件
unsigned int motor1=0; //计左电机码盘脉冲值
unsigned int motor2=0; //计右电机码盘脉冲值
unsigned int speed1=0; //计左电机码盘脉冲值
unsigned int speed2=0; //计右电机码盘脉冲值
sbit zuo1=P0^0;//左电机控制端1
sbit zuo2=P0^1;//左电机控制端2
sbit you1=P0^2;//右电机控制端1
sbit you2=P0^3;//右电机控制端2
unsigned int k=0;
void delay(int z)//pwm中使用的延时函数
{
int i,j;
for(i=10;i>0;i--)
for(j=z;j>0;j--);
}
void qian(void)
{
you1=0;
you2=1;
zuo1=0;
zuo2=1;
delay(3);//pwm调速,若PWM1=7表示速度为全速的70%
you1=1;
you2=1;
zuo1=1;
zuo2=1;
delay(7);
}
void zuostop(void)
{
zuo1=1;
zuo2=1;
delay(20);
}
void youstop(void)
{
you1=1;
you2=1;
delay(20);
}
/*********************************************************************************************
主程序
/*********************外部中断INT0、INT1初始化函数***********************************************************************/
void main(void)
{
TMOD=0X01;
TH0=(65536-50000)/256; //50MS定时
TL0=(65536-50000)%256;
TR0= 1;
ET0= 1;
EX0=1; //开启外部中断0
IT0=1; //下降沿有效
IE0=0;
EA = 1;
EX1 = 1;
IT1= 1;
qian();
}
/*********************************************************************************************
外部中断INT0计算电机1的脉冲
/********************************************************************************************/
void intersvr1(void) interrupt 0 using 1
{
motor1++;
}
/*********************************************************************************************
外部中断INT1计算电机2的脉冲
/********************************************************************************************/
void intersvr2(void) interrupt 2 using 3
{
motor2++;
}
/********************************************************************************************
定时器0中断函数
注意:这里的speed为简单书写,逻辑公式过程应该为
speed2=小车轮子周长/码盘格式*1秒的码盘脉冲格数
定时器做出的效果为算出一秒内的距离
/********************************************************************************************/
void timer0(void) interrupt 1 using 2
{ TH0=(65536-50000)/256; //2MS定时
TL0=(65536-50000)%256;
k++;
if(k>=10) //10次即是,0.5S
{
k=0; //重新定义k的值
speed1=motor1;
speed2=motor2;
{
if(speed1>speed2) zuostop();//左边走得快就停顿一下
else if(speed1
else if(speed1=speed2) qian();//左右相同,直走
}
motor1=0; //重新定义motor1的值
motor2=0; //重新定义motor1的值
}
}
请大家指正 |