找回密码
 立即注册

QQ登录

只需一步,快速开始

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

循迹小车制作资料-51单片机

  [复制链接]
跳转到指定楼层
楼主
分享一下哈。
本寻迹小车主要由2部分组成:1.黑线的检测。2电机控制

1、黑线的检测方法:
    黑线的检测主要利用的是不同颜色对光的反射率不同来实现检测。同种物体,黑色对光的反射最差,这样利用光敏电阻检测反射
回来的光线强度就可以判断反射区域的颜色是否为黑色。这里用的光敏电阻型号是5516,有光的时候光敏电阻的阻值为5-10K,
没有检测到反射光的时候,电阻的阻值为0.8M左右。黑线的检测分左右2组,这里以其中一组来讲解,另外一组的原理也是这样的。
    电路中的R4为光敏电阻,LM393比较器的6脚的电压为[R4/(R4+R2)]*VCC,VCC为电源电压,这里是4.5V。检测到有反射光的时候,也就是白色区域的时候,比较器6脚的电压为:1.5V-2.25V。没有反射光的时候,也就是黑色区域的时候,
比较器6脚的电压为:[800K/(800K+10K)]*4.5V,约为4.4V。通过调节R1电位器,使得比较器5脚的电压再2.3-3.5V范围左右,这样在有反射光和没有反射光的时候,LM393比较器的7脚就可以输出不同的电平。有反射光的时候,6脚的电压小于5脚,芯片7脚输出高电平。无反射光的时候,6脚的电压大于5脚,7脚输出低电平,单片机通过检查7脚的电压,就可以判断所处区域为白色还是黑色。
2、电机控制
    电机有2个,分左右2侧。单片机通过一个PNP三极管来控制电机。当单片机输出的电平为低电平时,电机转动。
    如果单片机输出的电平为高电平,电机停止转动。如果2个电机同时往前进的方向转动,小车就前进。如果左边的电机停止,右边的电机前进,这样小车就左转;
    如果左边的电机前进,右边的电机停止,这样小车就右转。利用这个原理就可以控制小车的左右转和前进。


    寻迹原理:小车前进的时候,如果检测到左边碰到黑线了,左边的电机就稍微停止转动一下,这样小车就会左拐。如果检测到右边碰到黑线了,右边的电机就停止转动一下,让小车右拐。停止运行的时候和车速有关系,这样需要多次调试,来取得一个合适的延时。









元件名称    数量
PCB板    1
100欧电阻    5
4.7K电阻    3
10K电阻    7
1N4007    5
100UF25V    3
10UF25V    1
104瓷片电容    6
8550三极管    3
40P IC座    1
8P IC座    1
5MM LED 红发红    3
8*8自锁开关    1
103蓝白电位器    2
7号3节电位器(贴好双面胶)    1
电机(贴好双面胶)    2
车轮+橡皮圈    2
M2.5*8螺丝    2
M5*30螺丝+普通螺母+带帽螺母    1
5MM LED 白发红    3
5516光敏电阻    2
LM393芯片    1
AT89S52(烧写好程序)    1

单片机源程序如下:
  1. /*功能:寻迹小车
  2. 使用芯片:AT89S52 或者 STC89C52 或AT89S51 STC89C51
  3. 晶振:12MHZ
  4. 编译环境:Keil
  5. 作者:zhengzhongxign39*/

  6. #include <reg52.h>            // 引用标准库的头文件
  7. #include <intrins.h>

  8. #define uchar unsigned char
  9. #define uint  unsigned int
  10. //=================电机驱动=====================
  11. sbit  dianji_r = P3^0;  //右边电机控制口,低电平转?
  12. sbit  dianji_l = P3^7;  //左边电机控制口,低电平转
  13. //=============循迹感应接口======================
  14. sbit  xjmk_r   = P3^2;  // 右边寻迹模块检测口 INT0
  15. sbit  xjmk_l   = P3^3;  // 左边寻迹模块检测口 INT1


  16. void  check_righet();   //右边检测到黑线时候测试程序
  17. void  check_left();     //左边检测到黑线时候测试程序

  18. void delay_50us(uint t);
  19. void delayms(uint Ms);


  20. uchar r_count;          //右边传感器检测到的次数计数单元
  21. uchar l_count;
  22. uint time;
  23. //***********************主程序******************************
  24. main()   
  25. {   
  26.    time=50;

  27.    dianji_r=0;//上电时右侧电机运行
  28.    dianji_l=0;//上电时左侧电机运行

  29.    EA=1;
  30.    EX1=1;
  31.    EX0=1;
  32.    IT1=0;
  33.    IT0=0;
  34.    xjmk_r=1;//置IO为1,准备读取数据
  35.    xjmk_l=1;
  36.    _nop_();
  37.    r_count=0;
  38.    l_count=0;
  39.     while(1)
  40.     {
  41.           _nop_();
  42.       //  check_righet();//调用右边寻迹检测传感器
  43.       //   check_left();//
  44.        if(r_count>=1)
  45.         {
  46.               delayms(time);
  47.               dianji_r=0;
  48.               dianji_l=0;
  49.               r_count=0;
  50.             _nop_();   
  51.         }
  52.         if(l_count>=1)
  53.         {
  54.             
  55.               delayms(time);
  56.               dianji_r=0;
  57.               dianji_l=0;
  58.               l_count=0;
  59.               _nop_();
  60.          }
  61.     }
  62.    
  63. }
  64. void init0int() interrupt 2
  65. {
  66.     l_count=5;
  67.     dianji_l=1;
  68.     dianji_r=0;
  69.     if(r_count>0)
  70.     {   EX0=0;
  71.         delayms(20);
  72.         if(time>=20)
  73.                         time-=19;
  74.         EX0=0;
  75.     }
  76.     return;
  77. }

  78. void init1int() interrupt 0
  79. {
  80.     r_count=5;
  81.     dianji_r=1;
  82.     dianji_l=0;
  83.     if(l_count>0)
  84.     {
  85.                 EX1=0;
  86.                 delayms(20);
  87.                 if(time>=20)
  88.                         time-=19;
  89.                 EX1=1;
  90.         }
  91.     return;
  92. }

  93. //*******************************************************************************
  94. //函数名称:
  95. //功能:左边检测到黑线时候测试程序
  96. void  check_left()
  97. {
  98.     if(xjmk_l==0)//检测右边的传感器是否感应到黑线
  99.         {
  100.                 delay_50us(1);//延时,去除机械振动
  101.                _nop_();
  102.                if(xjmk_l==0)//再次检测
  103.                {
  104.                  delay_50us(1);//延时,去除机械振动
  105.                  if(xjmk_l==0)
  106.                  {  
  107.                     l_count++;
  108.                     xjmk_l=1;
  109.                  }
  110.               }
  111.          }
  112. }
  113. //*******************************************************************************
  114. //函数名称:
  115. //功能:右边检测到黑线时候测试程序
  116. void   check_righet()
  117. {
  118.     if(xjmk_r==0)//检测右边的传感器是否感应到黑线
  119.     {
  120.           delay_50us(1);//延时,去除机械振动
  121.           if(xjmk_r==0)//再次检测
  122.           {
  123.              delay_50us(1);//延时,去除机械振动
  124.              if(xjmk_r==0)
  125.              {  
  126.                 r_count++;
  127.                 xjmk_r=1;

  128.              }
  129.           }
  130.      }
  131. }

  132. //*******************************************************************************
  133. //函数名称:void delay_50US(unsigned int t)
  134. //功能: 延时50*t(us)
  135. void delay_50us(uint t)
  136. {
  137.   uchar j;
  138.   for(;t>0;t--)
  139.   {

  140.     for(j=19;j>0;j--);
  141.   }
  142. }

  143. /*====================================================================
  144.   设定延时时间:x*1ms
  145. ====================================================================*/
  146. void delayms(uint Ms)
  147. {
  148.   uint i,TempCyc;
  149.   for(i=0;i<Ms;i++)
  150.   {
  151.     TempCyc =70;
  152.     while(TempCyc--);
  153.   }
  154. }
复制代码

Keil代码与制作说明元件清单3文件下载:
51单片机循迹小车资料.zip (863.5 KB, 下载次数: 105)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:648017 发表于 2019-11-25 16:35 | 只看该作者
很棒,很详细
回复

使用道具 举报

板凳
ID:1075026 发表于 2023-5-2 22:30 | 只看该作者
能继续分享下原理图和PCB源文件吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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