51单片机电机控制
时间:10-02
整理:3721RD
点击:
程序介绍:
按键有三个
KEY短按进行模式切换,长按电机加速
KEY1短按进行模式切换,长按电机减速
KEY2长按3S开始工作,再次长按3秒停止工作。
共10种模式进行切换。
这个程序可以用在按摩器材上。
根据我们公司的一个产品写的程序,经过多次调试和优化。算法可能不是太好,但总算实现了功能。
经过输出波形的检测,应该不会有太多BUG了。
给大家参考使用。
#include<reg51.h> //51头文件,
#include<intrins.h>
//---------常用的两个宏定义--------------
#define uint8 unsigned char
#define uint16 unsigned int
//------------函数的声明-----------------
void DelayMS(uint16 dly);
//--定义使用的IO口--//
sbit KEY=P1^0;
sbit KEY1=P1^1;
sbit KEY2=P1^2;
sbit PWM=P0^0;
sbit LED2=P0^2;
//--定义一个全局变量--//
unsigned char timer1,pwm; //定时器返回值
int i;
signed char cycle;
void Timer0Interrupt();
void InitTimer1();
void Keyscan();
void out1();
void out2();
void out3();
void out4();
void out5();
void out6();
void out7();
void out8();
void out9();
void out10();
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void InitTimer1(void)
{
TMOD = 0x10;
TH1 = 0x0FE;
TL1 = 0x0C;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void main(void)
{
signed char k=1,power=0;
InitTimer1();
i=30;
while(1)
{
int j;
while((KEY==0)||(KEY1==0)||(KEY2==0))
{
if(power)
{
if (KEY==0) //检测按键K1是否按下
{
Delay10ms(1); //消除抖动
if (KEY==0) //再次检测按键是否按下
{
Delay10ms(50);
if(KEY==1)
{
k++;
}
else while(KEY==0)
{
j=0;
while (j<10) //检测按键是否松开
{
Delay10ms(1);
j++;
}
i++;
TR1=1;
}
}
}
else if (KEY1==0)
{
Delay10ms(1); //消除抖动
if (KEY1==0) //再次检测按键是否按下
{
Delay10ms(50);
if(KEY1==1)
{
k--;
}
else while(KEY1==0)
{
j=0;
while (j<10) //检测按键是否松开
{
Delay10ms(1);
j++;
}
i--;
TR1=1;
}
}
}
}
if (KEY2==0)
{
Delay10ms(1); //消除抖动
if (KEY2==0) //再次检测按键是否按下
{ if(power)
{TR1=1;}
j=0;
while ((j<300)&&(KEY2==0)) //检测按键是否松开
{
Delay10ms(1);
j++;
}
if((KEY2==0)&&(j>250))
{
if(power==0)
{power=1;
TR1=1;}
else
{power=0;
TR1=0;}
if(TR1==0)
{PWM=0;}
k=1;
while(KEY2==0)
{
}
}
}
}
}
P2=~k;
if(power)
{
if(k>10)
{k=1;}
if(k<1)
{k=10;}
switch (k)
{
case(1) :out1();
break;
case(2) :out2();
break;
case(3) :out3();
break;
case(4) :out4();
break;
case(5) :out5();
break;
case(6) :out6();
break;
case(7) :out7();
break;
case(8) :out8();
break;
case(9) :out9();
break;
case(10) :out10();
break;
default:
break;
}
}
else
{
TR1=0;
PWM=0;
}
}
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x0FE;
TL1 = 0x0C;
pwm++;
if(i>=100)
{i=100;}
if(i<=0)
{i=0;}
if(pwm>100) //PWM周期为100*0.5ms
{
pwm=0;
}
if(pwm <i) //改变30这个值可以改变直流电机的速度
{
PWM=1;
}
else
{
PWM=0;
}
//add your code here!
}
void out1()
{
char a;
TR1=1;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out2()
{
char a=0;
TR1=1;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out3()
{
char a;
TR1=1;
i=i+2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i>90)
{i=10;}
}
void out4()
{
char a;
TR1=1;
i=i-2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i<10)
{i=90;}
}
void out5()
{
char a;
TR1=1;
if(cycle)
{
i=i+2;
if(i>90)
cycle=~cycle;
}
else
{
i=i-2;
if(i<10)
cycle=~cycle;
}
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out6()
{
char a;
TR1=1;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out7()
{ unsigned char a;
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out6();
}
void out8()
{
unsigned char a;
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out3();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out3();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out5();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out9()
{
out4();
out4();
out4();
out2();
out1();
out2();
out2();
out5();
}
void out10()
{
out1();
out2();
out3();
out4();
out5();
out6();
out7();
out8();
out9();
}
按键有三个
KEY短按进行模式切换,长按电机加速
KEY1短按进行模式切换,长按电机减速
KEY2长按3S开始工作,再次长按3秒停止工作。
共10种模式进行切换。
这个程序可以用在按摩器材上。
根据我们公司的一个产品写的程序,经过多次调试和优化。算法可能不是太好,但总算实现了功能。
经过输出波形的检测,应该不会有太多BUG了。
给大家参考使用。
#include<reg51.h> //51头文件,
#include<intrins.h>
//---------常用的两个宏定义--------------
#define uint8 unsigned char
#define uint16 unsigned int
//------------函数的声明-----------------
void DelayMS(uint16 dly);
//--定义使用的IO口--//
sbit KEY=P1^0;
sbit KEY1=P1^1;
sbit KEY2=P1^2;
sbit PWM=P0^0;
sbit LED2=P0^2;
//--定义一个全局变量--//
unsigned char timer1,pwm; //定时器返回值
int i;
signed char cycle;
void Timer0Interrupt();
void InitTimer1();
void Keyscan();
void out1();
void out2();
void out3();
void out4();
void out5();
void out6();
void out7();
void out8();
void out9();
void out10();
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
void InitTimer1(void)
{
TMOD = 0x10;
TH1 = 0x0FE;
TL1 = 0x0C;
EA = 1;
ET1 = 1;
TR1 = 1;
}
void main(void)
{
signed char k=1,power=0;
InitTimer1();
i=30;
while(1)
{
int j;
while((KEY==0)||(KEY1==0)||(KEY2==0))
{
if(power)
{
if (KEY==0) //检测按键K1是否按下
{
Delay10ms(1); //消除抖动
if (KEY==0) //再次检测按键是否按下
{
Delay10ms(50);
if(KEY==1)
{
k++;
}
else while(KEY==0)
{
j=0;
while (j<10) //检测按键是否松开
{
Delay10ms(1);
j++;
}
i++;
TR1=1;
}
}
}
else if (KEY1==0)
{
Delay10ms(1); //消除抖动
if (KEY1==0) //再次检测按键是否按下
{
Delay10ms(50);
if(KEY1==1)
{
k--;
}
else while(KEY1==0)
{
j=0;
while (j<10) //检测按键是否松开
{
Delay10ms(1);
j++;
}
i--;
TR1=1;
}
}
}
}
if (KEY2==0)
{
Delay10ms(1); //消除抖动
if (KEY2==0) //再次检测按键是否按下
{ if(power)
{TR1=1;}
j=0;
while ((j<300)&&(KEY2==0)) //检测按键是否松开
{
Delay10ms(1);
j++;
}
if((KEY2==0)&&(j>250))
{
if(power==0)
{power=1;
TR1=1;}
else
{power=0;
TR1=0;}
if(TR1==0)
{PWM=0;}
k=1;
while(KEY2==0)
{
}
}
}
}
}
P2=~k;
if(power)
{
if(k>10)
{k=1;}
if(k<1)
{k=10;}
switch (k)
{
case(1) :out1();
break;
case(2) :out2();
break;
case(3) :out3();
break;
case(4) :out4();
break;
case(5) :out5();
break;
case(6) :out6();
break;
case(7) :out7();
break;
case(8) :out8();
break;
case(9) :out9();
break;
case(10) :out10();
break;
default:
break;
}
}
else
{
TR1=0;
PWM=0;
}
}
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x0FE;
TL1 = 0x0C;
pwm++;
if(i>=100)
{i=100;}
if(i<=0)
{i=0;}
if(pwm>100) //PWM周期为100*0.5ms
{
pwm=0;
}
if(pwm <i) //改变30这个值可以改变直流电机的速度
{
PWM=1;
}
else
{
PWM=0;
}
//add your code here!
}
void out1()
{
char a;
TR1=1;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out2()
{
char a=0;
TR1=1;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out3()
{
char a;
TR1=1;
i=i+2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i>90)
{i=10;}
}
void out4()
{
char a;
TR1=1;
i=i-2;
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
if(i<10)
{i=90;}
}
void out5()
{
char a;
TR1=1;
if(cycle)
{
i=i+2;
if(i>90)
cycle=~cycle;
}
else
{
i=i-2;
if(i<10)
cycle=~cycle;
}
a=0;
while((a<10)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out6()
{
char a;
TR1=1;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<50)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<100)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
TR1=1;
a=0;
while((a<30)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
PWM=0;
TR1=0;
a=0;
while((a<80)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out7()
{ unsigned char a;
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out6();
}
void out8()
{
unsigned char a;
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out3();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out2();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out3();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out4();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
out5();
a=0;
while((a<200)&&((KEY==1)&&(KEY1==1)&&(KEY2==1)))
{
Delay10ms(1);
a++;
}
}
void out9()
{
out4();
out4();
out4();
out2();
out1();
out2();
out2();
out5();
}
void out10()
{
out1();
out2();
out3();
out4();
out5();
out6();
out7();
out8();
out9();
}
感谢分享。小编去抖时间方面没自己的想法?