鱼C论坛

 找回密码
 立即注册
查看: 3779|回复: 6

[争议讨论] 给大家分享个好东西(智能小车驱动程序)

[复制链接]
发表于 2011-10-12 15:11:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


#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();

}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-12 15:31:30 | 显示全部楼层
VERY GOOD:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-12 16:09:39 | 显示全部楼层
能遥控不?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-10-12 16:23:38 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-12 17:11:06 | 显示全部楼层
  1. /********************************************************************


  2. 函 数 名:left()

  3. 功    能:小车左转

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

  5. 入口参数:无

  6. 返 回 值:无  
  7. 设    计:tongwei           日    期:2009.09.15

  8. 修    改:                  日    期:
  9. ***********************************************************************/

  10. void left( void )

  11. {

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

  13.     MOTOR_C = FORWARD;          //方向向前

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

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

  16. }



  17. /********************************************************************


  18. 函 数 名:right()

  19. 功    能:小车右转

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

  21. 入口参数:无

  22. 返 回 值:无  
  23. 设    计:tongwei           日    期:2009.09.15

  24. 修    改:                  日    期:
  25. ***********************************************************************/

  26. void right( void )

  27. {

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

  29.     MOTOR_C = FORWARD;          //方向向前

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

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

  32. }
复制代码
反了吧?右轮速度快应该是左转

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-12 18:24:51 | 显示全部楼层
  太长了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-12 20:51:59 | 显示全部楼层
汇编都学的半透  这个更看不懂了  :L:@
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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