请教一下如何在程序中添加消抖程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//------8拍-----
uchar code zz1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转
uchar code fz1[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转
uchar code zz2[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //2正转
uchar code fz2[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; //2反转.
/***********************************
时间函数
************************************/
void delay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
/***********************************
定义各变量
************************************/
void motor_zz1(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x9f)
break;
P2=zz1[j];
delay(20);
}
}
}
void motor_zz2(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x5f)
break;
P2=zz2[j];
delay(20);
}
}
}
void motor_fz1(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x6f||P3==0xef||P3==0xaf)
break;
P2=fz1[j];
delay(20);
}
}
}
void motor_fz2(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0xaf)
break;
P2=fz2[j];
delay(20);
}
}
}
/***********************************
主函数
************************************/
void main()
{
uint N=361; //转动圈速
while(1)
{
//****************检测键****************ok
P0=0xff;
if(P0==0xef&&P3==0xaf)//传感器1和3=1的时候,即复位完成时*****检测键(0.4)+传感器1(3.4)和传感器3(3.6)
{
while(P0==0xef);//检测键(0.4)*********+传感器1(3.4)和传感器3(3.6)
delay(200);//延时启动
motor_zz1(N);
if(P3==0x9f);//碰到传感器2(3.5)+此时传感器3仍闭合(3.6)
delay(500);
motor_zz2(N);
if(P3==0x5f);//碰到传感器4(3.7)+此时传感器2仍闭合(3.5)
delay(500);
motor_fz1(N);
if(P3==0x6f)//碰到传感器1(3.4)+此时传感器4仍闭合(3.7)
delay(500);
motor_fz2(N);
if(P3==0xaf)//碰到传感器3(3.6)+此时传感器1仍闭合(3.4)
break;//结束检测
if(P0==0xbf)//p0.6(暂停)
break;
}
//****************复位键****************
if(P0==0xdf)//按下复位键(0.5)
{
while(P0==0xdf);
motor_fz1(N);
if(P3==0xef||P3==0xaf);//(传感器1)或(传感器1+4)
delay(500);
motor_fz2(N);
if(P3==0xaf);//(传感器3+1)
break;
if(P0==0xbf)//(暂停)
break;
}
//****************电动机手动控制****************
if(P0==0xfe)
{
while(P0==0xfe);//p0.0+p0.1(电动机1正转)
motor_zz1(N) ;
if(P0==0xbf)
break;
}
else if(P0==0xfd)//p0.0+p0.2(电动机1反转)
{
while(P0==0xfd);
motor_fz1(N);
if(P0==0xbf)
break;
}
else if(P0==0xfb)//p0.0+p0.3(电动机2正转)
{
while(P0==0xfb);
motor_zz2(N);
if(P0==0xbf)
break;
}
else if(P0==0xf7)//p0.0+p0.4(电动机2反转)
{
while(P0==0xf7);
motor_fz2(N);
if(P0==0xbf)
break;
}
}
}
麻烦大家帮帮忙,谢谢~~~
好吧,百度了大半天才发现延时消抖逻辑出错导致消抖不成功,现在改好了,把程序贴出了给有需要的看看吧,只是很普通的很笨的软件消抖程序,仅供像我这样的小白参考,大神勿喷,如有不合理的地方还请指点一下
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//------8拍-----
uchar code zz1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转
uchar code fz1[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转
uchar code zz2[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90}; //2正转
uchar code fz2[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; //2反转.
/***********************************
时间函数
************************************/
void delay(uint ms)
{
uint t;
while(ms--)
for(t=0;t<120;t++);
}
/***********************************
定义各变量
************************************/
void motor_zz1(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x9f)
break;
P2=zz1[j];
delay(20);
}
}
}
void motor_zz2(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x5f)
break;
P2=zz2[j];
delay(20);
}
}
}
void motor_fz1(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0x6f||P3==0xef||P3==0xaf)
break;
P2=fz1[j];
delay(20);
}
}
}
void motor_fz2(uint n)
{
uint i,j;
for(i=0;i<5*n;i++)
{
for(j=0;j<8;j++)
{
if(P0==0xbf||P3==0xaf)
break;
P2=fz2[j];
delay(20);
}
}
}
/***********************************
主函数
************************************/
void main()
{
uint N=361; //转动圈速
while(1)
{
P0=0xff;
//****************检测键****************
if(P0==0xef) //去抖
{
delay(200);
if(P0==0xef&&P3==0xaf)//传感器1和3=1的时候,即复位完成时*****检测键(0.4)+传感器1(3.4)和传感器3(3.6)
{
while(P0==0xef);//消除抖动
motor_zz1(N);
if(P3==0x9f);//碰到传感器2(3.5)+此时传感器3仍闭合(3.6)
delay(500);
motor_zz2(N);
if(P3==0x5f);//碰到传感器4(3.7)+此时传感器2仍闭合(3.5)
delay(500);
motor_fz1(N);
if(P3==0x6f)//碰到传感器1(3.4)+此时传感器4仍闭合(3.7)
delay(500);
motor_fz2(N);
if(P3==0xaf)//碰到传感器3(3.6)+此时传感器1仍闭合(3.4)
break;//结束检测
if(P0==0xbf)//p0.6(暂停)+消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
//****************复位键****************
if(P0==0xdf) //消除抖动
{
delay(200);
if(P0==0xdf)//按下复位键(0.5)
{
while(P0==0xdf);
motor_fz1(N);
if(P3==0xef||P3==0xaf);//(传感器1)或(传感器1+4)
delay(500);
motor_fz2(N);
if(P3==0xaf);//(传感器3+1)
break;
if(P0==0xbf)//消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
//****************电动机手动控制****************
if(P0==0xfe) //消除抖动
{
delay(200);
if(P0==0xfe)
{
while(P0==0xfe);//p0.0(电动机1正转)
motor_zz1(N) ;
if(P0==0xbf)//消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
else if(P0==0xfd) //消除抖动
{
delay(200);
if(P0==0xfd)//p0.1(电动机1反转)
{
while(P0==0xfd);
motor_fz1(N);
if(P0==0xbf)//消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
else if(P0==0xfb) //消除抖动
{
delay(200);
if(P0==0xfb)//p0.3(电动机2正转)
{
while(P0==0xfb);
motor_zz2(N);
if(P0==0xbf)//消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
else if(P0==0xf7) //消除抖动
{
delay(200);
if(P0==0xf7)//p0.4(电动机2反转)
{
while(P0==0xf7);
motor_fz2(N);
if(P0==0xbf)//消除抖动
{
delay(200);
if(P0==0xbf)//(暂停)
{
break;
}
}
}
}
}
}
同小白,你做过单片机pid控制程序之类的吗?
sorry,这是我第一个单片机设计,其他的还没设计,帮不了你
ME TOO.什么都不会