找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2993|回复: 9
打印 上一主题 下一主题
收起左侧

关于硬件电路按键问题

[复制链接]
跳转到指定楼层
楼主
最近做了一个直流电机闭环调速硬件电路,按键有4个,1.启动/停止
2.正转/反转
3.加一转(按住可以连续加转)
4.减一转(按住可以连续减转)
电路焊接完成后,按键1按一下本应该是启动,再按一下是停止。可是按一下后启动后立刻就停止了。求解答
以下是按键1的程序


                if(!KEY1) //开始停止按键
                {
                        Delay_ms(10);
                        if(!KEY1) //开始停止按键
                        {
                                i++;
                                if(i%2==0)
                                {
                                        Motor_Speed(1);//开始
                                        LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
                                }
                                if(i%2==1)
                                {
                                        Motor_Speed(0);//停止
                                        LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
                                }
                                while(!KEY1);
                        }               
                }

其中Motor_Speed(0);Motor_Speed(1);是电机运行状态子程序
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:79544 发表于 2016-6-25 12:38 | 只看该作者
要加个变量或标志位的。标志位取反。
回复

使用道具 举报

板凳
ID:123289 发表于 2016-6-25 15:45 | 只看该作者
未细看你的程序.
应该是你防弹动失效.
回复

使用道具 举报

地板
ID:128089 发表于 2016-6-25 15:50 | 只看该作者
给你一个项目中用的:       
static u8 st;
if(K1 == 0)
{
        if(st == 0)
        {
                Delay(5000);
                if(K1 == 0)
                {
                        st = 1;
                        按键执行代码。
                }
        }
}
else
        st = 0;
回复

使用道具 举报

5#
ID:128093 发表于 2016-6-25 16:51 | 只看该作者
用标志位,防抖动
回复

使用道具 举报

6#
ID:111634 发表于 2016-6-25 17:12 | 只看该作者
本帖最后由 zl2168 于 2016-6-25 17:15 编辑

直流电机正反转及PWM调速


Proteus仿真一下,确认有效。
实例100 直流电机正反转及调速.rar (44.12 KB, 下载次数: 4)



按下Kp,电机正转(顺时针);按下Kn,电机反转(逆时针)。两位数码管显示PWM脉冲波占空比,初始值为70(脉冲高电平占比70%)。按一次加速键up,占空比加1;按住不放,快速加1;最大值100(显示00)。按一次减速键up,占空比减1;按住不放,快速减1;最小值20



以上摘自张志良编著《单片机实验实训100例》 ISBN 978-7-5124-1603-1,北航社出版


书中电路和程序设计有详细说明,程序语句条条有注解。




回复

使用道具 举报

7#
ID:127022 发表于 2016-6-25 18:12 | 只看该作者
以下是除了1602以外的全部程序,求各位帮忙看看 哪有错误没!
#include<reg52.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint  unsigned int

bit flag;             //¶¨òå±ê־λ
unsigned long x,x1;  
uint T0count;        //′óT0μļÆêyμ¥ÔaÖD¶á衼ÆêyμÄêyÖμ
uint timecount;  
unsigned char Motor_Count,Set_Count=199;

sbit KEY1 = P1^3;//°′¼ü11
sbit KEY2 = P1^4;//°′¼ü2
sbit KEY3 = P1^5;//°′¼ü3
sbit KEY4 = P1^6;//°′¼ü4

sbit IN1 = P2^0;//μç»ú¿ØÖƶË1
sbit IN2 = P2^1;//μç»ú¿ØÖƶË2
sbit EN = P2^2;        //μç»úê1Äü¶Ë

void Timer(void);

//Ñóê±oˉêy
void Delay_ms(uint jj) //Ñóê±1oáÃë
{
        uint ii;
        while(jj--)
                for(ii=0;ii<116;ii++);
}
void Motor_Speed(unsigned char Speed) //μç»ú×′ì¬
{
        if(Speed==0)  {IN1=0;IN2=0;}//í£Ö1
        if(Speed==1)  {IN1=0;IN2=1;}//Õy×a
        if(Speed==2)  {IN1=1;IN2=0;}//·′×a
}
void main()           //
{          
        unsigned char  Data[3];
           unsigned int  i,j;
        unsigned char Set_x;
       
        Timer(); //¶¨ê±Æ÷3õê¼»ˉ
    LCD1602_init();//òo¾§3õê¼»ˉ
//////////////////////////0123456789ABCDEF
    LCD1602_Disp_ZF(0x80,"Now Speed:   r/s",16);//ÏÔê¾êμê±Ëù¶è
                                                     //0123456789ABCDEF
    LCD1602_Disp_ZF(0x80+0X40,"Set:   r/s      ",16); //éèÖÃËù¶è
        //LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
        //LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
        LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
        Motor_Speed(0);//??
        Set_Count=1;
        Set_x=30;
        Data[0]='0'+Set_x/100;         //ÏÔê¾éèÖÃËù¶è°ùλ
        Data[1]='0'+(Set_x/10)%10; //ÏÔê¾éèÖÃËù¶èê®Î»
        Data[2]='0'+Set_x%10;      //ÏÔê¾éèÖÃËù¶è¸öλ
        LCD1602_Disp_ZF(0x84+0x40,Data,3);        //ÏÔê¾éèÖÃËù¶è
        while(1)
        {
       
                if(flag==1)                  
                {
                        flag=0;                        //Çå±ê־λ
                        x=T0count*65536+TH0*256+TL0;   //è¡μÃê±¼ä¿í¶è2Îêy  
                        x=x/5;     //¼ÆËãËù¶è
                        timecount=0;
                        T0count=0;
                        TH0=0;
                        TL0=0;
                        TR0=1;         //TR0=1,¿ØÖÆ¿a1رÕoÏ£¬¼¼êõÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
                        Data[0]='0'+x/100;          //ÏÔê¾μ±Ç°Ëù¶è
                        Data[1]='0'+(x/10)%10; //ÏÔê¾μ±Ç°Ëù¶è
                        Data[2]='0'+x%10;      //ÏÔê¾μ±Ç°Ëù¶è
                        LCD1602_Disp_ZF(0x80,"Now Speed:   r/s",16); //ÏÔê¾μ±Ç°Ëù¶è
                        LCD1602_Disp_ZF(0x8a,Data,3); //ÏÔê¾μ±Ç°Ëù¶è

                        if(x>Set_x)//Ëù¶èμ÷½ú
                        {
                                if(Set_Count==0)Set_Count=1;//¼õËù
                                Set_Count--;       
                        }
                        if(x<Set_x)        //Ëù¶èμ÷½ú
                        {
                                Set_Count++;
                                if(Set_Count==200)Set_Count=199;//¼óËù       
                        }
                       
                }

                if(!KEY1) //¿aê¼í£Ö1°′¼ü
                {
                        Delay_ms(50);
                        if(!KEY1) //
                        {
                                i++;
                                if(i%2==0)
                                {
                                        Motor_Speed(1);//¿aê¼
                                        LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
                                }
                                if(i%2==1)
                                {
                                        Motor_Speed(0);//í£Ö1
                                        LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
                                }
                                while(!KEY1);
                        }               
                }
                if(!KEY2)        //Õy×a·′×a°′¼ü
                {
                        Delay_ms(10);
                        if(!KEY2)
                        {
                                j++;
                                if(j%2==0)//Õy×a
                                {       
                                        Motor_Speed(1);
                                        LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
                                }
       
                                if(j%2==1)//·′×a
                                {
                                        Motor_Speed(2);
                                        LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
                                }
                                while(!KEY2);
                        }               
                }
                //////////////////////////////////
                if(!KEY3) //éèÖüóËù
                {
                        Delay_ms(50);
                        if(!KEY3)//
                        {
                                Set_x ++;
                                if(Set_x>30)Set_x=30;
                                Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
                                Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
                                Data[2]='0'+Set_x%10;  //??????  
                                LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
                        }               
                }
                if(!KEY4)//éèÖüõËù
                {
                        Delay_ms(50);
                        if(!KEY4)//????
                        {
                            if(Set_x==0)Set_x=1;
                                Set_x --;
                                Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
                                Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
                                Data[2]='0'+Set_x%10;  //ÏÔê¾éèÖÃËù¶è
                                LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
                        }               
                }
                /////////////////////////////////

                /////////////////////
                ///////////////////////////
   
        }
            
  }


void t0() interrupt 1 using 0      //T0ÖD¶Ï·tÎñ
{  
T0count++;                      //¶ÔP3.4¿úμÄÂö3å½øDD¼Æêy
}

void t1(void) interrupt 3 using 0       //T1ÖD¶Ï·tÎñ
{   
TH1=(65536-368)/256;               //¼Æêy3õÖμÖØ×°ÔØ
    TL1=(65536-368)%256;
    timecount++;
        Motor_Count++;
        if(Motor_Count==Set_Count)        //μ÷½úËù¶è
        {
                EN=0;
        }
        if(Motor_Count==200)  //μ÷½úËù¶è
        {
                EN=1;
                Motor_Count=0;
        }
    if(timecount==249) //1s¼Æêy±êÖ¾
    {  TR0=0;
        timecount=0;
        flag=1;                       // ÖÃλ±ê־λ
    }  
}

void Timer(void)
{
    TMOD=0x15;       //T01¤×÷Îa16λ¼ÆêyÆ÷£¨·½ê½1£©,T11¤×÷·½ê½Îa16붨ê±Æ÷
    TH0=0;                     //¼ÆêyÎa65536
    TL0=0;                     //
    TH1=(65536-4000)/256;     //¶¨ê±Æ÷2éóö¨ê±4ms,3õÖμÎa4000
    TL1=(65536-4000)%256;
    TR1=1;   //TR1=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷,Æô¶ˉ¶¨ê±
    TR0=1;   //TR0=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
    ET0=1;                    //¶¨ê±Æ÷0¿aÖD¶Ï
    ET1=1;                    //¶¨ê±Æ÷1¿aÖD¶Ï
    EA=1;                     //CPU¿aÖD¶Ï

}
回复

使用道具 举报

8#
ID:127022 发表于 2016-6-25 18:15 | 只看该作者
腾飞的龙 发表于 2016-6-25 12:38
要加个变量或标志位的。标志位取反。

以下是全部程序,编译后没有错误和警告,但是烧录到单片机后就出现我之前说的按键问题了,帮忙看看!谢谢!
#include<reg52.h>
#include "LCD1602.h"
#define uchar unsigned char
#define uint  unsigned int

bit flag;             //¶¨òå±ê־λ
unsigned long x,x1;  
uint T0count;        //′óT0μļÆêyμ¥ÔaÖD¶á衼ÆêyμÄêyÖμ
uint timecount;  
unsigned char Motor_Count,Set_Count=199;

sbit KEY1 = P1^3;//°′¼ü11
sbit KEY2 = P1^4;//°′¼ü2
sbit KEY3 = P1^5;//°′¼ü3
sbit KEY4 = P1^6;//°′¼ü4

sbit IN1 = P2^0;//μç»ú¿ØÖƶË1
sbit IN2 = P2^1;//μç»ú¿ØÖƶË2
sbit EN = P2^2;        //μç»úê1Äü¶Ë

void Timer(void);

//Ñóê±oˉêy
void Delay_ms(uint jj) //Ñóê±1oáÃë
{
        uint ii;
        while(jj--)
                for(ii=0;ii<116;ii++);
}
void Motor_Speed(unsigned char Speed) //μç»ú×′ì¬
{
        if(Speed==0)  {IN1=0;IN2=0;}//í£Ö1
        if(Speed==1)  {IN1=0;IN2=1;}//Õy×a
        if(Speed==2)  {IN1=1;IN2=0;}//·′×a
}
void main()           //
{          
        unsigned char  Data[3];
           unsigned int  i,j;
        unsigned char Set_x;
       
        Timer(); //¶¨ê±Æ÷3õê¼»ˉ
    LCD1602_init();//òo¾§3õê¼»ˉ
//////////////////////////0123456789ABCDEF
    LCD1602_Disp_ZF(0x80,"Now Speed:   r/s",16);//ÏÔê¾êμê±Ëù¶è
                                                     //0123456789ABCDEF
    LCD1602_Disp_ZF(0x80+0X40,"Set:   r/s      ",16); //éèÖÃËù¶è
        //LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
        //LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
        LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
        Motor_Speed(0);//??
        Set_Count=1;
        Set_x=30;
        Data[0]='0'+Set_x/100;         //ÏÔê¾éèÖÃËù¶è°ùλ
        Data[1]='0'+(Set_x/10)%10; //ÏÔê¾éèÖÃËù¶èê®Î»
        Data[2]='0'+Set_x%10;      //ÏÔê¾éèÖÃËù¶è¸öλ
        LCD1602_Disp_ZF(0x84+0x40,Data,3);        //ÏÔê¾éèÖÃËù¶è
        while(1)
        {
       
                if(flag==1)                  
                {
                        flag=0;                        //Çå±ê־λ
                        x=T0count*65536+TH0*256+TL0;   //è¡μÃê±¼ä¿í¶è2Îêy  
                        x=x/5;     //¼ÆËãËù¶è
                        timecount=0;
                        T0count=0;
                        TH0=0;
                        TL0=0;
                        TR0=1;         //TR0=1,¿ØÖÆ¿a1رÕoÏ£¬¼¼êõÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
                        Data[0]='0'+x/100;          //ÏÔê¾μ±Ç°Ëù¶è
                        Data[1]='0'+(x/10)%10; //ÏÔê¾μ±Ç°Ëù¶è
                        Data[2]='0'+x%10;      //ÏÔê¾μ±Ç°Ëù¶è
                        LCD1602_Disp_ZF(0x80,"Now Speed:   r/s",16); //ÏÔê¾μ±Ç°Ëù¶è
                        LCD1602_Disp_ZF(0x8a,Data,3); //ÏÔê¾μ±Ç°Ëù¶è

                        if(x>Set_x)//Ëù¶èμ÷½ú
                        {
                                if(Set_Count==0)Set_Count=1;//¼õËù
                                Set_Count--;       
                        }
                        if(x<Set_x)        //Ëù¶èμ÷½ú
                        {
                                Set_Count++;
                                if(Set_Count==200)Set_Count=199;//¼óËù       
                        }
                       
                }

                if(!KEY1) //¿aê¼í£Ö1°′¼ü
                {
                        Delay_ms(50);
                        if(!KEY1) //
                        {
                                i++;
                                if(i%2==0)
                                {
                                        Motor_Speed(1);//¿aê¼
                                        LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
                                }
                                if(i%2==1)
                                {
                                        Motor_Speed(0);//í£Ö1
                                        LCD1602_Disp_ZF(0x8b+0X40,"Stop ",5);
                                }
                                while(!KEY1);
                        }               
                }
                if(!KEY2)        //Õy×a·′×a°′¼ü
                {
                        Delay_ms(10);
                        if(!KEY2)
                        {
                                j++;
                                if(j%2==0)//Õy×a
                                {       
                                        Motor_Speed(1);
                                        LCD1602_Disp_ZF(0x8b+0X40,"Right",5);
                                }
       
                                if(j%2==1)//·′×a
                                {
                                        Motor_Speed(2);
                                        LCD1602_Disp_ZF(0x8b+0X40,"Left ",5);
                                }
                                while(!KEY2);
                        }               
                }
                //////////////////////////////////
                if(!KEY3) //éèÖüóËù
                {
                        Delay_ms(50);
                        if(!KEY3)//
                        {
                                Set_x ++;
                                if(Set_x>30)Set_x=30;
                                Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
                                Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
                                Data[2]='0'+Set_x%10;  //??????  
                                LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
                        }               
                }
                if(!KEY4)//éèÖüõËù
                {
                        Delay_ms(50);
                        if(!KEY4)//????
                        {
                            if(Set_x==0)Set_x=1;
                                Set_x --;
                                Data[0]='0'+Set_x/100;//ÏÔê¾éèÖÃËù¶è
                                Data[1]='0'+(Set_x/10)%10;//ÏÔê¾éèÖÃËù¶è
                                Data[2]='0'+Set_x%10;  //ÏÔê¾éèÖÃËù¶è
                                LCD1602_Disp_ZF(0x84+0x40,Data,3);//ÏÔê¾éèÖÃËù¶è
                        }               
                }
                /////////////////////////////////

                /////////////////////
                ///////////////////////////
   
        }
            
  }


void t0() interrupt 1 using 0      //T0ÖD¶Ï·tÎñ
{  
T0count++;                      //¶ÔP3.4¿úμÄÂö3å½øDD¼Æêy
}

void t1(void) interrupt 3 using 0       //T1ÖD¶Ï·tÎñ
{   
TH1=(65536-368)/256;               //¼Æêy3õÖμÖØ×°ÔØ
    TL1=(65536-368)%256;
    timecount++;
        Motor_Count++;
        if(Motor_Count==Set_Count)        //μ÷½úËù¶è
        {
                EN=0;
        }
        if(Motor_Count==200)  //μ÷½úËù¶è
        {
                EN=1;
                Motor_Count=0;
        }
    if(timecount==249) //1s¼Æêy±êÖ¾
    {  TR0=0;
        timecount=0;
        flag=1;                       // ÖÃλ±ê־λ
    }  
}

void Timer(void)
{
    TMOD=0x15;       //T01¤×÷Îa16λ¼ÆêyÆ÷£¨·½ê½1£©,T11¤×÷·½ê½Îa16붨ê±Æ÷
    TH0=0;                     //¼ÆêyÎa65536
    TL0=0;                     //
    TH1=(65536-4000)/256;     //¶¨ê±Æ÷2éóö¨ê±4ms,3õÖμÎa4000
    TL1=(65536-4000)%256;
    TR1=1;   //TR1=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷,Æô¶ˉ¶¨ê±
    TR0=1;   //TR0=1,¿ØÖÆ¿a1رÕoÏ,¼ÆêyÂö3å½øèëT1¼ÆêyÆ÷£¬Æô¶ˉ¼Æêy
    ET0=1;                    //¶¨ê±Æ÷0¿aÖD¶Ï
    ET1=1;                    //¶¨ê±Æ÷1¿aÖD¶Ï
    EA=1;                     //CPU¿aÖD¶Ï

}
回复

使用道具 举报

9#
ID:111634 发表于 2016-6-26 21:44 | 只看该作者
本帖最后由 zl2168 于 2016-6-27 19:47 编辑

你这个不是“闭环调速”,闭环是具有负反馈自动调节功能,是用输出信号反馈到输入端,形成一个闭合环形电路。
回复

使用道具 举报

10#
ID:127022 发表于 2016-6-28 13:33 | 只看该作者
zl2168 发表于 2016-6-26 21:44
你这个不是“闭环调速”,闭环是具有负反馈自动调节功能,是用输出信号反馈到输入端,形成一个闭合环形电路 ...

我这个是首先通过按键设置马达的速度,然后通过光耦开关检测马达的速度,然后经过程序比较,最后才实现的闭环调速。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表