视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
一个基于51单片机控制直流电机的设计
2025-09-25 14:13:57 责编:小OO
文档
今天做的一个基于51单片机控制直流电机的设计

2010-09-12 18:47

可以实现的功能是:

按下左转键则开始向左转动

按下右转键则向右转动

按下停止键则开始逐渐停止转动

按下调速键一次则会加速一档

按下调速键二次则会加速二档

按下调速键三次则会加速三档

按下调速键四次则会加速四档

按下调速键五次则会回到最初速度重新记档位 

设计思路:

     直流电机只要能提供一定的直流就可以转动,改变电压极性可以改变转动方向,可以通过给直流电机提供脉冲信号来驱动它,脉冲信号的占空比可以影响到直流电机的平均速度,因此可以通过调整占空比从而能实现调速的目的。直流电机的驱动电路要有过流保护作用,图中的二极管就直到这个作用,另外电机的驱动电流是比较大的所以需要用三极管来放大电流。程序的关键就是如何实现占空比的调整,这个可以通过对51单片机定时器重装初值进行改变,从而改变时间。用51实现PWM信号的输出,相对麻烦点,要是AVR就可以方便地实现PWM信号,由见51单片机的局限性与AVR单片机的优势。

原理图

详细程序:

#include

#define uchar unsigned char 

#define uint   unsigned int

sbit PW1=P2^0 ;

sbit PW2=P2^1 ;     //控制电机的两个输入

sbit accelerate=P2^2 ;   //调速按键

sbit stop=P2^3 ;    //停止按键

sbit left=P2^4 ;     //左转按键

sbit right=P2^5 ;    //右转按键

            

#define right_turn PW1=0;PW2=1    //顺时针转动

#define left_turn PW1=1;PW2=0    //逆向转动

#define end_turn   PW1=1;PW2=1    //停转

uint t0=25000,t1=25000;   //初始时占空比为50%

uint a=25000;      //   设置定时器装载初值   25ms     设定频率为20Hz

uchar flag=1;      //此标志用于选择不同的装载初值

uchar dflag;      //左右转标志

uchar count;     //用来标志速度档位

void keyscan();     //键盘扫描

void delay(uchar z);

void time_init();    //定时器的初始化

void adjust_speed();   //通过 调整占空比来调整速度

void main()

{

    time_init();     //定时器的初始化

while(1)

{

    

   keyscan();    //不断扫描键盘程序,以便及时作出相应的响应

}

}

void timer0()   interrupt 1 using 0

{

    

if(flag)

    {

       flag=0;

    end_turn;

    a=t0;    //t0的大小决定着低电平延续时间

    TH0=(65536-a)/256;

    TL0=(65536-a)%256;   //重装载初值

    }

    else 

     {

    flag=1;    //这个标志起到交替输出高低电平的作用

    if(dflag==0)

    {

       right_turn;   //右转

    }

     else

       {

      left_turn; //左转

     }

    a=t1;   //t1的大小决定着高电平延续时间

    TH0=(65536-a)/256;

      TL0=(65536-a)%256;   //重装载初值

   }

}

void time_init()

{

TMOD=0x01; //工作方式寄存器    软件起动定时器 定时器功能 方式1 定时器0

TH0=(65536-a)/256;

TL0=(65536-a)%256;   //装载初值

ET0=1;       //开启定时器中断使能

EA=1;         // 开启总中断

TR0=0;

}

void delay(uchar z)    //在12M下延时z毫秒

{

uint x,y;

for(x=z;x>0;x--)

   for(y=110;y>0;y--);

}

void keyscan()

{

  

if(stop==0)

   {

   TR0=0;        //关闭定时器0    即可停止转动

end_turn;

   }

if(left==0)

   {

       TR0=1; 

      dflag=1;     //转向标志置位则左转

   }

   if(right==0)

   {

     TR0=1; 

   dflag=0;    //转向标志复位则右转

   }

if(accelerate==0)

   {

     delay(5) ; //延时消抖

   if(accelerate==0)

   {

     while(accelerate==0) ;   //等待松手

      count++;

    if(count==1)

     {

        t0=20000;

         t1=30000;   //占空比为百分之60

     }

    if(count==2)

     {

        t0=15000;

         t1=35000;    //占空比为百分之70

     }

    if(count==3)

     {

        t0=10000;

         t1=40000;    //占空比为百分之80

     }

     if(count==4)

     {

        t0=5000;

         t1=45000;    //占空比为百分之90

     }

    if(count==5)

     {

       count=0;

     }

   }

     

   }

}

下载本文
显示全文
专题