51单片机直流电机间歇转动

您好,我想咨询下您51单片机控制直流电机再使用PWM调速的情况下怎么控制电机的停歇时间,比如我想让电机转动两秒,停止两秒,我该如何编写代码,感谢您的回复。

要实现电机在旋转一定时间后停止的功能,可以在程序中设置一个计时器来控制电机的运行时间和停留时间。具体编写代码的过程如下:

  • 设置一个定时器来计算电机运行的时间和停留的时间,可以使用定时器中断来实现。比如,设定定时器中断时间为1秒,那么两秒的运行时间可以通过两次定时器中断来实现。
  • 在主程序中编写PWM调速的代码,控制电机的转速。可以使用51单片机自带的PWM模块或者通过软件实现。
  • 在定时器中断服务函数中,设置一个计时器来记录电机的运行时间和停留时间。当电机运行时间达到两秒时,关闭PWM输出,让电机停止运转;当电机停留时间达到两秒时,重新开启PWM输出,让电机重新开始运转。

以下是代码示例:

#include <reg51.h>

unsigned char count; // 定时器计数器
unsigned char running_time; // 电机运行时间计数器
unsigned char stop_time; // 电机停留时间计数器

void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
    TH0 = 0x4C; // 重新赋初值
    TL0 = 0x00;
    count++; // 计时器加1
    if(count == 50) // 1秒钟
    {
        count = 0;
        running_time++; // 运行时间计时器加1
        stop_time++; // 停留时间计时器加1
        if(running_time == 2) // 运行时间达到2秒
        {
            running_time = 0;
            stop_time = 0;
            P1 &= 0xFE; // 关闭PWM输出,电机停止运转
        }
        else if(stop_time == 2) // 停留时间达到2秒
        {
            stop_time = 0;
            P1 |= 0x01; // 开启PWM输出,电机重新开始运转
        }
    }
}

void main()
{
    TMOD |= 0x01; // 定时器0工作在模式1
    TH0 = 0x4C; // 初值
    TL0 = 0x00;
    TR0 = 1; // 启动定时器0
    ET0 = 1; // 允许定时器0中断
    EA = 1; // 允许中断
    P1 |= 0x01; // 初始化为PWM输出,电机开始运转
    while(1)
    {
        // 在主程序中编写PWM调速的代码
        // 比如使用定时器2和PCA模块来实现PWM输出
    }
}

以上代码中的定时器计时器使用了一个计数器count,当计数器达到50时(1秒钟),中断服务函数会将计数器count清零,然后对运行时间计数器和停

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7730104
  • 你也可以参考下这篇文章:用51单片机测电容容值的方法原理及一些问题的解决方案
  • 除此之外, 这篇博客: 51单片机控制42步进电机——程序实现(中断PWM/延时函数)中的 程序部分 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    程序的实现用的是keil软件编写的c语言程序,用了两种思路写的,都可以实现,下面都贴了出来。
    第一种,用的是延时函数实现的脉冲。

    #include <reg51.h>
    #define uint unsigned int

    void delayms(uint);

    sbit ENA=P1^0;
    sbit DIR=P1^1;
    sbit PWM=P1^2;

    void main()
    {
    ENA = 0;
    DIR = 0;
    PWM = 0;
    while(1)
    {
    PWM = ~PWM;
    delayms(1);
    }
    }

    void delayms(uint xms)
    {
    uint i,j;
    for(i=xms;i>0;i–)
    for(j=110;j>0;j–);
    }


    第二种,用的51单片机的T1定时器实现的脉冲。
    #include <reg51.h>
    #define uint unsigned int

    unsigned char timer1;

    sbit DIR=P1^0;
    sbit ENA=P1^1;
    sbit PWM=P1^2;

    void system_Ini()
    {
    TMOD = 0x00; //13λ
    TH1 = 0xfd; //253
    TL1 = 0x06; //6
    EA = 1;
    ET1 = 1;
    TR1 = 1;
    }

    /*********************************************************
    2^13=8192
    25332=8096
    8096+6=8102
    8192-8102=90
    12
    (1/11059200)= 1.09us
    *********************************************************/

    main()

    {
    system_Ini();
    DIR = 0;
    ENA = 0;
    while(1)
    {
    if(timer1==40)
    {
    timer1=0;
    }
    if(timer1<20)
    {
    PWM=0;
    }
    else
    {
    PWM=1;
    }
    }
    }

    void Ti1(void) interrupt 3

    {
    TH1 = 0xfd;
    TL1 = 0x06;
    timer1++;
    }


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^