L298控制直流电机加减速的89c51单片机C程序.docx

上传人:b****3 文档编号:4148354 上传时间:2022-11-28 格式:DOCX 页数:12 大小:18.25KB
下载 相关 举报
L298控制直流电机加减速的89c51单片机C程序.docx_第1页
第1页 / 共12页
L298控制直流电机加减速的89c51单片机C程序.docx_第2页
第2页 / 共12页
L298控制直流电机加减速的89c51单片机C程序.docx_第3页
第3页 / 共12页
L298控制直流电机加减速的89c51单片机C程序.docx_第4页
第4页 / 共12页
L298控制直流电机加减速的89c51单片机C程序.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

L298控制直流电机加减速的89c51单片机C程序.docx

《L298控制直流电机加减速的89c51单片机C程序.docx》由会员分享,可在线阅读,更多相关《L298控制直流电机加减速的89c51单片机C程序.docx(12页珍藏版)》请在冰豆网上搜索。

L298控制直流电机加减速的89c51单片机C程序.docx

L298控制直流电机加减速的89c51单片机C程序

L298控制直流电机加减速的89c51单片机C程序

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

sbiten1=P3^0;/*L298的EnableA*/

sbits1=P3^2;/*L298的Input1*/

sbits2=P3^3;/*L298的Input2*/

uchart=0;/*中断计数器*/

ucharm1=0;/*电机1速度值*/

uchartmp1;/*电机当前速度值*/

/*电机控制函数index-电机号(1,2);speed-电机速度(-100—100)*/

voidmotor(ucharindex,charspeed)

{

if(speed>=-100&&speed<=100)

{

if(index==1)/*电机1的处理*/

{

m1=abs(speed);/*取速度的绝对值*/

if(speed<0)/*速度值为负则反转*/

{

s1=0;

s2=1;

}

else/*不为负数则正转*/

{

s1=1;

s2=0;

}

}

}

}

voiddelay(uintj)/*简易延时函数*/

{

for(j;j>0;j--);

}

voidmain()

{

uchari;

TMOD=0x02;/*设定T0的工作模式为2*/

TH0=0x9B;/*装入定时器的初值*/

TL0=0x9B;

EA=1;/*开中断*/

ET0=1;/*定时器0允许中断*/

TR0=1;/*启动定时器0*/

while

(1)/*电机实际控制演示*/

{

for(i=0;i<=100;i++)/*正转加速*/

{

motor(1,i);

delay(5000);

}

for(i=100;i>0;i--)/*正转减速*/

{

motor(1,i);

delay(5000);

}

for(i=0;i<=100;i++)/*反转加速*/

{

motor(1,-i);

delay(5000);

}

for(i=100;i>0;i--)/*反转减速*/

{

motor(1,-i);

delay(5000);

}

}

}

voidtimer0()interrupt1/*T0中断服务程序*/

{

if(t==0)/*1个PWM周期完成后才会接受新数值*/

{

tmp1=m1;

}

if(t

t++;

if(t>=100)t=0;/*1个PWM信号由100次中断产生*/

}

本程序实现串口对

 直流电机的控制

******************************************************************/

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

//****************************************************************

//defineastatusworldwhichsendedbacktocomputer

#defineCOMMAND_STATUS 0

#defineSTATUS_LEFT    1

#defineSTATUS_RIGHT   2

#defineSTATUS_SAFETYL 4   

#defineSTATUS_SAFETYR 8 

#defineCOMMAND_LEFT   1 //Turnleft

#defineCOMMAND_RIGHT  2 //Turnright

#defineCOMMAND_STOP   3

#defineCOMMAND_SPEED  4

#defineSTOP            0

#defineLEFT         1

#defineRIGHT         2

#defineA_OUTPUT_ENABLE P3_4 //输出使能

#defineB_OUTPUT_ENABLEP3_5

#defineMotorA          1

#defineMotorB          2

#definemotorA_r       P1_7

#definemotorA_l       P1_6

#definemotorB_r       P1_5

#definemotorB_l       P1_4

/*******************************************************************************

                                全局变量定义

*******************************************************************************/

ucharmotor,command,cmddata;/*Usedtoreceivecommandswithrs232*/

ucharbytenr=0;      /*Usedtorecordhowmanybytewewillreceive*/

ucharCycle=100;

uchardirectionA=0;           /*currentrotatingdirection*/

uchardirectionB=0;

ucharPWidthA=50;

ucharPWidthB=50;

uint speedA=0;         /*Defaultspeed*/

uint speedB=0;

ucharticks=0;      /*counterusedforspeedcalculation*/

ucharserialtimeout=0;    /*usedwhenwindowscrashes;-)*/

/*******************************************************************************

//funtionname:

voidTimer0_Int(void)

//

//

*******************************************************************************/

voidTimer0_Int(void)interrupt1using1

{

 serialtimeout++;                //Ignoreallreceivedbytesafterabout2seconds

 if(!

serialtimeout) 

  bytenr=0;  

    P3_7=~P3_7;             //invertP3.7,nicefordebugging

    ticks++;

    if(ticks>=Cycle)

      ticks=0;

  if(ticks<=PWidthA)

    A_OUTPUT_ENABLE=0;

  else

    A_OUTPUT_ENABLE=1;

  switch(directionA)

   {

     caseSTOP:

       {

        motorA_r=0;

        motorA_l=0;

        A_OUTPUT_ENABLE=0; //NPN三极管为省电

          }

    break;

   caseLEFT:

 

       {

        motorA_r=0;

        motorA_l=1;

       }

    break;

   caseRIGHT:

       {

     motorA_r=1;

        motorA_l=0;

       }

    break;

   }

  switch(directionB)

   {

     caseSTOP:

       {

        motorB_r=0;

        motorB_l=0;

        B_OUTPUT_ENABLE=0;

          }

    break;

   caseLEFT:

 

       {

        motorB_r=0;

        motorB_l=1;

       }

    break;

   caseRIGHT:

       {

        motorB_r=1;

        motorB_r=0;

    }

    break;

   }

  

 TH0=0xFF;     //Timing10ms

 TH0=0xF0; //reloadbasiccountnumber

 TR0=1;     //Enabletimer0

 return;

 }

 

//**************************************************************************

//

//

//                     

//***************************************************************************/

voidSendChar(ucharch)

{

 SBUF=ch;

 while(TI==0); //等待发送完

 TI=0;   //中断标志复位

 }

//**************************************************************************

//函数名:

voidSerial_INT_SVR

//

//                     

//***************************************************************************

voidSerial_INT_SVR(void)interrupt4using3

{

                     

 if(RI)                       //Didwereceivedata?

   {

  serialtimeout=0;                //resetTimeoutCounter

  RI=0;                   //resettheinterruptflag

  switch(bytenr)

  {

   case0:

{

           motor=SBUF;  //receivethefirstbyte

     SendChar(motor);

        break;

           }

   case1:

{

           command=SBUF;

     SendChar(command);

        break;

             }

   case2:

{

           cmddata=SBUF;

     SendChar(cmddata);

        break;

     }

  }

  bytenr++;

  if(bytenr>2)

   {

   bytenr=0;                    //resetbytecounter

                                  //motorshouldalwaysbezero*/

     if(motor==MotorA)                    

    {        

         switch(command)           /*commandhandler*/

            {

         caseCOMMAND_STOP:

                 {

               directionA=0;

            break;

                  }

            caseCOMMAND_LEFT:

          

                {                   //turnleft  

              directionA=1;

              break;

                 }

            caseCOMMAND_RIGHT:

                 {                   //turnright

               directionA=2;

           break;

        }

            

            caseCOMMAND_SPEED:

                 {                  //改变速度

              speedA=cmddata;

        if((speedA<=Cycle)&&(speedA>1)) //保证脉宽不会太窄

                {

            PWidthA=speedA;

           }

              break;

                 }

                }

   

                }

    elseif(motor==MotorB)

          {        

         switch(command)           /*commandhandler*/

            {

         caseCOMMAND_STOP:

                 {

               directionB=0;

            break;

                  }

            caseCOMMAND_LEFT:

          

                {                   //turnleft  

              directionB=1;

              break;

                 }

            caseCOMMAND_RIGHT:

                 {                   //turnright

               directionB=2;

          break;

        }

            

            caseCOMMAND_SPEED:

                 {                  //改变速度

              speedB=cmddata;

        if((speedB<=Cycle)&&(speedB>1)) //保证脉宽不会太窄

                {

            PWidthA=speedB;

           }

              break;

                 }

                }

   

                }

        

             }

 

 }

}

/********************************************************************************

                             serialinitil

******************************************************************************/

voidInit_serialCOM(void)

{

 SCON=0x50; //SCON:

serailmode1,8-bitUART,enableREN

 TMOD|=0x20;//TMOD:

timer1,mode2,8-bitreload

 PCON|=0x80;//SMOD=1;Baud*2

 TH1=0xF4;  //Baud:

4800fosc=11.0592MHz

 TL1=0xF4;

 EA=1;        //EnableSerialInterrupt

 ES=1;

 TR1=1;     //timer1run

       

 

/*******************************************************************************

   setingtimer0

*******************************************************************************/

voidSet_Timer0(void)

{  

   TMOD&=0xf0; /*Settimer0*/

 TMOD|=0x01; /*settimer0asGate=0Timer,mode1*/

 TH0=0xff;    /*Timint10ms*/

 TL0=0x00;

 TR0=1;    /*Enabletimer0*/

 ET0=1;    /*Enabletimer0interrupt*/

 EA=1;     /*Enableallenabledinterrupts*/

 }

 

/*******************************************************************************

                             Mainloop

*******************************************************************************/

voidmain(void)

 Init_serialCOM();  //serialinition

 

 Set_Timer0();     //intmode

 SendChar(PWidthA);

 SendChar(PWidthB);  //

 A_OUTPUT_ENABLE=1;

 B_OUTPUT_ENABLE=1;   //forbidoutput

                                                                

 

 while

(1)

 {

     ;                  //herecanaddsomeusercode

 } 

}

 

大家来讨论下L298是怎么驱动直流电机的

为什么我用单片机的I/O控制L298的IN1,IN2,ENA直流减速电机不转动呢?

  而直接在上面加H/L电平却能控制呢?

是不是L298又什么要求,我还不知道.......,不过我用仿真软件跑的很好~

        请高手帮忙诊断下,谢谢~

程序如下:

#include

sbitP1_1=P1^1;//ENA  左使能

sbitP1_2=P1^2;//IN1

sbitP1_3=P1^3;//IN2

sbitP1_4=P1^4;//ENB  右使能

sbitP1_5=P1^5;//IN3

sbitP1_6=P1^6;//IN4

sbitP2_0=P2^0;  //前进

sbitP2_1=P2^1;  //后退

sbitP2_2=P2^2;  //左转

sbitP2_3=P2^3;  //右转

#define  ENA  P1_1

#define  IN1  P1_2

#define  IN2  P1_3

#define  ENB  P1_4

#define  IN3  P1_5

#define  IN4  P1_6

unsignedinti,k=0;

voidint_tmer0();

voidforwoard();

voidbackwoard();

voidleft();

voidright();

voidstop();

voidinit();

voidint_tmer0()interrupt  1

{i++;

TH0=0x3C;

TL0=0xB0;

if(i==100)

{i=0;

switch(k++)

    {case0:

P2_0=1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1