本设计由STC89C52单片机电路+L298N电机驱动电路+按键电路+电位器调速电路+电源电路组成。
1、通过电位器可以实时调节电机1的转速。
2、通过按键可以控制电机2的正转和反转。即按键1按下,电机2正转。再次按下,电机2反转。再次按下,电机2停转。
3、通过按键2可以设置电机3正转的速度:按键2按下一次,电机3低速转动,再按下一次,电机3中速转动,再次按下一次,电机3高速转动。(具体速度可自行调节)
资料下载地址
https://pan.baidu.com/s/1NfslpI_UrfwmS1z0wcCBWw?pwd=8888
部分代码
unsigned char pwmRigh=1; //pwm调整
unsigned char pwmLeft=1;
unsigned char Flag1 = 0;//运行标志
unsigned char Flag2 = 0;//运行标志
unsigned char rekey = 0; //按键按下
void Init_Timer0(void);//
void main (void)
{
Init_Timer0(); //定时器0初始化
DelayMs(100); //延时有助于稳定
IN1 = 1; //控制方向
IN2 = 0;
IN3 = 1; //控制方向
IN4 = 0;
while (1) //主循环
{
if((key1 == 0)||(key2 == 0))
{
if(rekey == 0)
{
DelayMs(10);
if(key1 == 0) //按键1按下
{
rekey =1; //防止重复按下
if(Flag1 == 0)//运行标志
{
Flag1 = 1;
IN1 = 1; //控制方向
IN2 = 0;
pwmRigh= 10;
}
else if(Flag1 == 1)
}
}
}
else
{
rekey = 0;
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
static unsigned char countRigh;
static unsigned char countLeft;
TH0=(65536-1000)/256; //重新赋值 20ms
TL0=(65536-1000)%256;
countRigh++;
countLeft++;
if(countRigh<pwmRigh) //led1 占空比调节
{
ENA=1; //打开
}
else if(countRigh<=20) //关闭时间段
{
ENA=0; //关闭
if(countRigh == 20) countRigh=0; //一个周期结束
}
if(countLeft<pwmLeft) //led1 占空比调节
{
ENB=1; //打开
}
else if(countLeft<=20) //关闭时间段
{
ENB=0; //关闭
if(countLeft == 20) countLeft=0; //一个周期结束
}
}
资料下载地址