找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2738|回复: 6
收起左侧

自学51单片机 按键能控制pwm调速了,那么如何用按键多个功能呢,求指点,附代码

[复制链接]
ID:730961 发表于 2020-5-9 17:34 | 显示全部楼层 |阅读模式
1589016293.png


这是我的原理图,四个继电器常开,常闭,IO口控制,第一个按键想实现按一下开,按一下关,长按加速,松开保持这个速度不变,在长按减速的功能,第二个按键按下反转,第三个按下停止,我现在开,关,反转,停止写出来了,但是长按加速,减速处理不过来,通过pwm  mos管来控制,就有些搞不清楚了,我也写了代码,各位大神们指点一下


#include <reg51.h>

typedef unsigned char u8;
typedef unsigned int  u16;
unsigned char Count,num;                //全局变量

sbit ke = P1^0;                                   //定义管脚
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit J1 = P0^0;
sbit J2 = P0^1;
sbit J3 = P0^2;
sbit J4 = P0^3;
sbit pwm= P0^4;
bit flay;

void delay(u16 i)                          //延时函数
{
   while(i--);
}

void delayu (u16 x)         //精确延时函数
{
   u16 i,j;
   for(i=x;i>0;i--)
    for(j=120;j>0;j--);
}

void  inversion()
{
   u8 i;
   u8 dat;                                                        //定义一个变量         
   if(ke==0)                                                //判断开关是否按下
   {
         delay(1000);                                        //消抖
         if(ke==0)                                                //再次判断按键是否按下
         {
                i++;
                dat=1;                                                //按键按下 变量就加一次
                if(i>=2)                                   //判断变量是否大于或者等于2
                {
                i=0;
                }                                           //变量等于0
         while(!ke);                                   //按键松
     }
    switch(i)                                          //扫描
        {
         
          case 0:J1=1;J2=1;J3=1;J4=1;break;   //第一此扫描
          case 1:J1=1;J2=0;J3=0;J4=1;break;   //第二次扫描
         }
                if(ke==0)                                                 //判断按键是否按下
                {
                if(num>Count)                  //判断 周期跟占空比开关pwm
          pwm=0;
             else pwm=1;
             Count++;
                 
             if(Count>=100)                                        //占空比清空
               {
                   Count =0;
                   flay=~flay;                                   //标志位
                   }
                   if(flay)
                   {
                          while(!ke)                                //判断按键是否真的按下,
                          {
                                 if(num<100)                    //当大于100,
                                 num ++;
                                 delayu(50);
                          }
                   }
                     else                                           //反之则
                     {
                           while(!ke)
                           {
                                  if(num>0)
                                          num--;
                                          delayu(50);
                           }
                     }
                }
                             
   }
         
   if(k2==0)                                                 //按键是否按下,消抖
   {
      delay(1000);
        if(k2==0)                                                 //开关继电器
        {
          J1 = 0;
          J2 = 1;
          J3 = 1;
          J4 = 0;
        }
        while(!k2);
   }                                                                   //按键是否触碰,
   if(k3==0)
   {
         delay(1000);
         if(k3==0)                                                   //继电器全关
         {
           J1 = 1;
           J2 = 1;
           J3 = 1;
           J4 = 1;
         }
   }
}

void InitIimer0()   //定时函数
{
TMOD =0X02;  //8位重装模式
TH0  =163;   //初始值  加90的溢出值
TL0  =163;
EA =  1;
ET0 = 1;
TR0 = 1;
}
        
void main()
{
    J1 = 1;                                  //继电器初始闭合
        J2 = 1;
        J3 = 1;
        J4 = 1;
    Count=0;
        num=0;
    flay=0;
        InitIimer0();
        while(1)
        {
         inversion();
        }
        
}


void Timer0Interrupt() interrupt 1
{
   TH0 =163;
   TL0 =163;
    num++;  //进入中断,时间加一,占空比加一
        Count++;
        

}

回复

使用道具 举报

ID:94031 发表于 2020-5-9 19:08 | 显示全部楼层
不用那么多继电器,一套驱动电路加多个按键就能实现。
回复

使用道具 举报

ID:730961 发表于 2020-5-10 16:14 | 显示全部楼层
xuyaqi 发表于 2020-5-9 19:08
不用那么多继电器,一套驱动电路加多个按键就能实现。

你的意思是用一套298驱动电路来控制,不需要继电器嘛?
回复

使用道具 举报

ID:94031 发表于 2020-5-10 17:03 | 显示全部楼层
小白学51i 发表于 2020-5-10 16:14
你的意思是用一套298驱动电路来控制,不需要继电器嘛?

如果是小直流电机,是这个意思。
回复

使用道具 举报

ID:748499 发表于 2020-5-10 17:52 来自手机 | 显示全部楼层
这个加速,减速的也比较简单,,我曾经也写过一个,不过不是长按,是按一下加速,,按一下减速。pwm波占空比改变了,你这样整体简单的加减是不对的。我记不清怎么写的了,你好像还要设置一个变量当减(或者减)之后要就和count一样清零,,否则循环几次之后的周期也会改变。
回复

使用道具 举报

ID:730961 发表于 2020-5-10 21:30 | 显示全部楼层
天下归晋 发表于 2020-5-10 17:52
这个加速,减速的也比较简单,,我曾经也写过一个,不过不是长按,是按一下加速,,按一下减速。pwm波占空 ...

那就和我的定义冲突了,我短按就是开关功能,长按是加减,还要保持不变
回复

使用道具 举报

ID:730961 发表于 2020-5-10 21:31 | 显示全部楼层
xuyaqi 发表于 2020-5-10 17:03
如果是小直流电机,是这个意思。

好的,感谢,主要我想学习一些怎么实现长短按键pwm调速,程序的思路
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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