#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar time,time1,count,value,flag=1,a=0,b=0,c=0; //低电平的占空开比
sbit PWM=P2^1; //pwm通道脉冲
sbit ADD=P1^0; //加速
sbit DEC=P1^1; //减速
sbit TURN=P1^2; //电机换向
//函数声明
void delayxms(uint z);
void motor_turn();
void motor_add();
void motor_dec();
void timer0_init();
//主函数
void main()
{
timer0_init();
PWM=0;
while(1)
{
motor_turn();
motor_add();
motor_dec();
}
}
//延时处理
void delayxms(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<180;y++);
}
//电机正反向控制
void motor_turn()
{
if(TURN==0)
{
delayxms(10); //此处时间不能太长,否则会和中断产生冲突
if(TURN==0)
{
flag=~flag;
}
while(!TURN);
}
}
//电机加速
void motor_add()
{
if(ADD==0)
{
delayxms(10);
if(ADD==0)
{
a=1;
b=0;
// time++;
// value++;
/* if(value>100)
{
value=0;
count++;
}
if(count>=90)
{
count=90;
}
if(time<count)
{
PWM=1;
}
else
{
PWM=0;
}
if(time>=1000)
{
time=0;
} */
}
// while(!ADD);
}
/* else
{
a=0;
} */
}
//电机减速
void motor_dec()
{
if(DEC==0)
{
delayxms(10);
if(DEC==0)
{
b=1;
a=0;
// time++;
// value++;
/* if(value>100)
{
value=0;
count--;
}
if(time<count)
{
PWM=1;
}
else
{
PWM=0;
}
if(time>=1000)
{
time=0;
} */
}
// while(!DEC);
}
/* else
{
b=0;
} */
}
//定时器0初始化
void timer0_init()
{
TMOD=0x01; //定时器0工作于方式1
TH0=0xff;
TL0=0xff;
TR0=1;
ET0=1;
EA=1;
}
//定时0中断处理
void timer0_int() interrupt 1
{
// TR0=0; //设置定时器初始值期间,关闭定时器
TH0=0xff;
TL0=0xff;
// TR0=1;
time++;
count++;
if(count>250)
{
count=0;
if(a==1)
{
value++;
// delayxms(100);
}
if(b==1)
{
value--;
// delayxms(100);
}
}
/* if(value>=500)
{
value=500;
}
if(value<=0)
{
value=0;
} */
if(time>1500)
{
time=0;
// time1++;
}
/* if(time1>=1000)
{
time1=1000;
} */
if(time<value)
{
PWM=1;
}
else
{
PWM=0;
}
}
这个程序试过时间恒定time1=1000,但频率还是不断重复,望告知哪个地方设置有误
|