#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,但頻率還是不斷重復,望告知哪個地方設置有誤
|