找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6155|回复: 4
打印 上一主题 下一主题
收起左侧

基于51单片机控制的轮式循迹小车设计资料

[复制链接]
跳转到指定楼层
楼主
ID:470939 发表于 2019-1-21 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 一寸灰 于 2019-1-30 12:38 编辑

●这里的循迹是指小车在白色地面上 沿着黑线走;
●传感器利用不同颜色的物体表面有不同反射性的特点:白色地面发生漫反射,黑色则被吸收。
小车的组成结构
• 硬件部分
红外传感器
驱动*2
杜邦线*若干
51最小系统*1
螺丝卡簧固定片亚克力板底盘
• 软件部分:
keil软件所写的c语言程序,控制51单片机


传感器:
在小车行驶过程中传感器不断地向地面发射红外光,红外光遇到白色地板发生漫反射,反射光被传感器的接收管接受;遇到黑色红外光会被吸收 单片机以此确定黑线的位置来控制小车的行走路线。循迹51最小系统原理图:



因为所用的L298N驱动模块上有5V稳压端,所以最小系统上面可以不需要稳压电路,直接用驱动供电即可。

下面是可以简单循迹的源代码:
#include <reg52.h>
#include "include.h"

unsigned char pwm_val =0;//变量定义
unsigned char val_left =15;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大  
bit PWM_ON=1;//电机PWM开关

/***************PWM电机转速***************/         

void pwm_moto(void)
{  
     if(PWM_ON)
     {
          if(pwm_val <= val_left)
              {                          
                               
                                 if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==1)
                             {  LOUT1 = 0  ;LOUT2 =  1 ;ROUT1 = 1 ;ROUT2 =  0        ;}                                                       
                                else if(LIN1==0&&LIN2==1&&RIN1==1&&RIN2==1)
                              {  LOUT1 = 1  ;LOUT2 = 0  ;ROUT1 = 1 ;ROUT2 =  0        ;}//快左拐
                          else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
                                        {  LOUT1 = 1  ;LOUT2 = 0  ;ROUT1 = 1 ;ROUT2 =  0        ;}//快左拐
                                else if(LIN1==1&&LIN2==0&&RIN1==1&&RIN2==1)
                                        {  LOUT1 = 0 ;LOUT2 = 0  ;ROUT1 = 1 ;ROUT2 =  0        ;}//慢左拐
                                else if(LIN1==1&&LIN2==1&&RIN1==0&&RIN2==1)
                                        CarTurnRight_Low();//慢右拐
                                else if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==0)
                                        {  LOUT1 = 0  ;LOUT2 = 1  ;ROUT1 = 0 ;ROUT2 =  1        ;}//快右拐
                                                else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
                                        {  LOUT1 = 0  ;LOUT2 = 1  ;ROUT1 = 0 ;ROUT2 =  1        ;}//快右拐
                                else if((LIN1==0&&LIN2==0&&RIN1==1&&RIN2==0)||(LIN1==0&&LIN2==1&&RIN1==0&&RIN2==1)||(LIN1==1&&LIN2==0&&RIN1==0&&RIN2==1))
                                {  LOUT1 = 0  ;LOUT2 =  1 ;ROUT1 = 1 ;ROUT2 =  0        ;}
              }
              else
              {
                   LOUT1 = 0  ;LOUT2 = 0  ;ROUT1 = 0 ;ROUT2 =  0        ;
          }
          if(pwm_val>=20)
                      pwm_val=0;
     }
     else   
     {
         LOUT1 = 0  ;LOUT2 = 0  ;ROUT1 = 0 ;ROUT2 =  0        ;
     }
}

void main()
{
        P2=0X00;    //关电机       
//        delay(1000);

        TMOD=0X01;
    TH0= 0XFC;//0xFF;//0.25ms 定时//0XFC;  //1ms定时
    TL0= 0X66;//0x1A;//0X66;
    TR0= 1;
    ET0= 1;
        EA = 1;            //开总中断
        while(1)        //无限循环  无黑线为零全亮0 有黑线灯灭为一
        {  //作用当为直道时 无调速即全速前进   弯道时有调速
                if(LIN1==0&&LIN2==0&&RIN1==0&&RIN2==0)
                        {PWM_ON = 0; CarGoAhead();}                                                               
                else
                        {PWM_ON = 1;}
        }
}

//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1
{
     TH0=0XFC;          //1Ms定时
         TL0=0X66;
         pwm_val++;
         pwm_moto();
}


//定义小车光电模块输入IO口
sbit LIN1 = P1^0;         //左循迹红外传感器
sbit LIN2 = P1^1;
sbit RIN1 = P1^2;         //右循迹红外传感器
sbit RIN2 = P1^3;

//定义小车电机驱动模块输出IO口
sbit LOUT1 = P2^0;//LIN1 LIN3  IN1 IN2 电机1的转速和方向
sbit LOUT2 = P2^1;//LIN2 LIN4  IN3 IN4 电机2的转速和方向
sbit ROUT1 = P2^2;//RIN1 RIN3
sbit ROUT2 = P2^3;//RIN2 RIN4

//#define Left_moto_go      {LOUT1 = 0,LOUT2 = 1;}   //左边电机正转
//#define Left_moto_back    {LOUT1 = 1,LOUT2 = 0;}   //左边电机反转
//#define Left_moto_Stop    {LOUT1 = 0,LOUT2 = 0;}   //左边电机停转

//#define Right_moto_go     {ROUT1 = 1,ROUT2 = 0;}   //右边电机正转
//#define Right_moto_back   {ROUT1 = 0,ROUT2 = 1;}   //右边电机反转
//#define Right_moto_Stop   {ROUT1 = 0,ROUT2 = 0;}   //右边电机停转

//void delay(unsigned int xms)                               
//{
//    unsigned int i,j;
//        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒
//    for(j=112;j>0;j--);
//}

void CarGoAhead(void)//快进(P1=0000 1010  P1=0x0A)
{
//        Left_moto_go;  
//        Right_moto_go;
LOUT1 = 0  ;
LOUT2 = 1  ;
ROUT1 = 1 ;
ROUT2 =  0        ;
}

//void CarBack(void)//快退(P1=0000 0101  P1=0x05)
//{
//        Left_moto_back;
//        Right_moto_back;
//}

void CarTurnLeft_Low(void)//慢左拐(P1=0000 1000  P1=0x08)
{
//        Left_moto_Stop;
//        Right_moto_go;
LOUT1 = 0  ;
LOUT2 = 0  ;
ROUT1 = 1 ;
ROUT2 =  0        ;
}

void CarTurnLeft_High(void)//快左拐(P1=0000 1001  P1=0x09)
{
//        Left_moto_back;
//        Right_moto_go;
LOUT1 = 1  ;
LOUT2 = 0  ;
ROUT1 = 1 ;
ROUT2 =  0        ;
}

void CarTurnRight_Low(void)//慢右拐(P1=0000 0010  P1=0x02)
{
//        Left_moto_go;
//        Right_moto_Stop;
LOUT1 = 0  ;
LOUT2 = 1  ;
ROUT1 = 0 ;
ROUT2 =  0        ;
}

void CarTurnRight_High(void)//快右拐(P1=0000 0110  P1=0x06)
{
//        Left_moto_go;
//        Right_moto_back;
        LOUT1 = 0  ;
LOUT2 = 1  ;
ROUT1 = 0 ;
ROUT2 =  1        ;
}



0.png (87.85 KB, 下载次数: 157)

0.png

0.png (57.93 KB, 下载次数: 135)

0.png

51循迹.pdf

1.72 MB, 下载次数: 46, 下载积分: 黑币 -5

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-1-25 03:23 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:436177 发表于 2019-3-24 09:13 | 只看该作者
店家,能不能打个包?
回复

使用道具 举报

地板
ID:541789 发表于 2019-5-19 00:06 来自手机 | 只看该作者
师父。。。^O^
回复

使用道具 举报

5#
ID:614922 发表于 2019-9-27 19:13 | 只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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