crazylinux 发表于 2011-10-12 15:11:44

给大家分享个好东西(智能小车驱动程序)



#include< reg52.h >



#define uchar unsigned char

#define uint unsigned int



#define MOTOR_C P0                  //P0口作为电机的控制口。

#define SIGNAL P1                   //P2口的低两位为循迹传感器输入口。

#define SHELVES 25                  //速度总档数。



#define BACK 0xA5                   //后退

#define FORWARD 0xC6                //前进



sbit PWM_R = P0^7;                  //右电机PWM输入口

sbit PWM_L = P0^2;                  //左电机PWM输入口



void timer_init( void );            //定时器初始化函数。

void left( void );                  //右转弯函数。

void left( void );                  //左转弯函数。

void forward( void );               //前进函数。



uchar percent_l = 0;                //左轮占空比

uchar percent_r = 0;                //右轮占空比

uint run_time = 0;                  //车轮运行一步的时间



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


函 数 名:timer_init()

功    能:初始化定时器0

说    明:无

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void timer_init( void )

{

    TMOD = 0x02;                //定时器0工作在方式2,定时值自动重载,启动仅受TR0的控制。

    TH0 = 256 - 200;            //定时周期为 200us * SHELVES

    TL0 = 256 - 200;



    EA = 1;                     //开总中断。

    ET0 = 1;                  //开定时器0中断。

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

}



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


函 数 名:left()

功    能:小车左转

说    明:通过控制左右轮不同的占空比,实现左右转。

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void left( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 0;            //右轮速度慢。

    percent_l = 4;            //左轮速度快。

}



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


函 数 名:right()

功    能:小车右转

说    明:通过控制左右轮不同的占空比,实现左右转。

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void right( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 4;            //右轮速度快。

    percent_l = 2;            //左轮速度慢。

}



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


函 数 名:forward()

功    能:小车前进

说    明:

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void forward( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 3;            //右轮同速度。

    percent_l = 3;            //左轮同速度。

}



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


函 数 名:back()

功    能:小车后退

说    明:

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void back( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = BACK;             //方向向前

    percent_r = 3;            //右轮同速度。

    percent_l = 3;            //左轮同速度。

}



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


函 数 名:stop()

功    能:停车

说    明:

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void stop( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 0;            //右轮零速度。

    percent_l = 0;            //左轮零速度。

}



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


函 数 名:uchar check_sig()

功    能:检测信号,并返回信号代码。

说    明:

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

uchar check_sig( void )

{

    uchar temp = 0;

    temp = SIGNAL & 0x01;       //信号输入口就只有低两位,得到信号码。

    return temp;

}



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


函 数 名:avoid()

功    能:实现避障功能。

说    明:对采集的信号进行分析,转换为对电机的控制。

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void avoid( void )

{

    uchar sig = 0;            //存储采集的信号

    timer_init();               //初始化定时器0

    while( 1 )

    {

      run_time = 0;         //清计时器,重新开始。

      sig = check_sig();      //存储信号码

      switch( sig )

      {

            case 1:             //没有检测到障碍物。

                forward();

                break;

            case 0:             //检测到障碍物,首先小车倒退一段距离,让后左转弯,最后继续前进。



                back();

                while(run_time < 350);//决定后退的时间。

                run_time = 0;



                left();

                while(run_time < 180);//决定左转弯角度。

                run_time = 0;



                forward();

                break;

            default:

                break;

      }
      while(run_time < 3);    //运行一步,时间为 3*5ms

    }

}



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


函 数 名:timer_zero()

功    能:定时器0中断服务函数

说    明:无

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void timer_zero( void ) interrupt 1

{

    static uchar temp = 0;                  //中断次数计数,



    EA = 0;                                 //关总中断,屏蔽其他中断。



    if(temp < SHELVES)                      //高电平保持时间。

    {         
      if(temp < percent_l)

      {

            PWM_L = 1;                      //左电机高电平

      }

      else

      {

            PWM_L = 0;                      //左电机低电平

      }



      if(temp < percent_r)

      {

            PWM_R = 1;                      //右电机高电平

      }

      else

      {         
            PWM_R = 0;                      //右电机低电平

      }



      temp ++;                            //实现计数

    }

    else                                    //一个PWM周期结束,计数清零。

    {

      temp = 0;

      run_time++;

    }      


    EA = 1;                                 //开总中断。

}



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


函 数 名:main()

功    能:

说    明:

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void main( void )

{

    avoid();

}

幕府幽魂 发表于 2011-10-12 15:31:30

VERY GOOD:lol

yipwing 发表于 2011-10-12 16:09:39

能遥控不?

crazylinux 发表于 2011-10-12 16:23:38

yipwing 发表于 2011-10-12 16:09 static/image/common/back.gif
能遥控不?

可以加遥控我现在没加,我现在带有红外避障,有障碍物自己就躲开了,现在我少一个小型的单片机

小甲鱼 发表于 2011-10-12 17:11:06

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


函 数 名:left()

功    能:小车左转

说    明:通过控制左右轮不同的占空比,实现左右转。

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void left( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 0;            //右轮速度慢。

    percent_l = 4;            //左轮速度快。

}



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


函 数 名:right()

功    能:小车右转

说    明:通过控制左右轮不同的占空比,实现左右转。

入口参数:无

返 回 值:无
设    计:tongwei         日    期:2009.09.15

修    改:                  日    期:
***********************************************************************/

void right( void )

{

//timer_init();               //初始化定时器0。

    MOTOR_C = FORWARD;          //方向向前

    percent_r = 4;            //右轮速度快。

    percent_l = 2;            //左轮速度慢。

}反了吧?右轮速度快应该是左转

yk94215 发表于 2011-10-12 18:24:51

{:5_107:}太长了。

嗜血灵异狂 发表于 2011-10-12 20:51:59

汇编都学的半透这个更看不懂了:L:@{:5_99:}
页: [1]
查看完整版本: 给大家分享个好东西(智能小车驱动程序)