| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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(); 
  
} 
 
 |   
 
 
 
 |