请教一下如何在程序中添加消抖程序

2019-07-15 11:25发布

原程序程序如图所示
#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;
                }

          
        }
}

麻烦大家帮帮忙,谢谢~~~

1111111.PNG
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
Simon博
1楼-- · 2019-07-15 13:16
好吧,百度了大半天才发现延时消抖逻辑出错导致消抖不成功,现在改好了,把程序贴出了给有需要的看看吧,只是很普通的很笨的软件消抖程序,仅供像我这样的小白参考,大神勿喷,如有不合理的地方还请指点一下
#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;
              }
                          }
                }
        }
          
         }
}


周不妄
2楼-- · 2019-07-15 16:31
同小白,你做过单片机pid控制程序之类的吗?
Simon博
3楼-- · 2019-07-15 18:52
 精彩回答 2  元偷偷看……
周不妄
4楼-- · 2019-07-15 21:27
Simon博 发表于 2017-4-8 17:30
sorry,这是我第一个单片机设计,其他的还没设计,帮不了你

ME TOO.什么都不会

一周热门 更多>