0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于51单片机四路循迹小车

Q4MP_gh_c472c21 来源:CSDN 作者:CSDN 2021-03-04 15:55 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这学期开设的51单片机课程的课程设计即将验收,今天开始正式着手做循迹小车~

一. 任务要求

二. 系统原理

本系统以设计题目的要求为目的,采用STC89C52单片机为控制核心,利用红外传感器检测轨道,控制电动小汽车的自动循迹,快慢速行驶。

这里的轨道是指汽车沿着白色地板上的黑线行驶。由于黑线与白地板的反射系数不同,可以根据接收到的反射光的强度来判断“道路”。常用的方法是红外检测。

红外检测方法,即在汽车行驶过程中,利用红外光在具有不同颜色的物体表面的不同反射特性,不断向地面发射红外光。当红外光与白纸地板相遇时,会发生漫反射,反射光被安装在车内的接收器接收,如果遇到黑线,就会变成红色。外部光被吸收,车内的接收器不能接收红外线。单片机根据是否接收到反射的红外光来确定黑线的位置和汽车的行驶路线。

三. 整体方案

1. 控制模块

小车的核心控制部件采用STC公司生产的8位单片机STC89C52。它是一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。STC89C52有3个16 位定时器/计数器,2个外部中断,1个串口中断。

最小系统

51单片机的具体引脚功能不细说,不了解的可自行百度。直接上最小系统电路图(自己画的,凑合着看)。顺便说一句,在我看来一个没有指示灯的电路是最烦的电路<(`^´)> 我的复位一定要有灯才行!

c51b534c-7b3a-11eb-8b86-12bb97331649.png

三部分:
电源电路:给单片机提供5V的电源
时钟电路:外接11.0592M石英晶振。
③复位电路:确保单片机是从一个确定的初始状态开始。

焊接时注意P0口要接上拉电阻,否则不能用,一般都用排阻做上拉电阻(当然如果能自己画板子就更好了)。

去除AD网格线

记一下怎么去除AD网格线,如图步骤,最后去掉Visible前面的对勾即可,别忘记最后点OK:

2. 电机驱动模块

我使用的是最经典的LM298N电机驱动:

我太喜欢用298了。不仅可以接至12v(即拥有更强的驱动能力),而且有过电流保护功能,当出现电机卡死时,可以保护电路和电机等。且自带7805降压模块可直接给单片机供电~~
实物图:

驱动与各部分的连接简介:
输出A、B:分别接到左右马达上,通过使能A、使能B来控制电机正常工作(接高电平为正常工作);
单片机IO控制输入(即IN1-IN4):用来控制马达正反转。接单片机引脚,通过在程序中给引脚高低电平实现正转或反转(详见下边输入输出关系表);
12V输入:接电池盒正极;
5V输入:接单片机VCC,给单片机供电;
电源地(即GND):把电池盒负极和单片机的GND一起接入。

c5ce68a6-7b3a-11eb-8b86-12bb97331649.png

输入输出关系(使能ENA、ENB均为1的状态下):

3. 电源模块

我自己使用的是两节18500锂电池供电。如果觉得两节电池不够,三节12V又太大,也可以在中间加一个7809稳压管把电压降到9V再接入驱动:

4. 循迹模块

光电循迹是由四对红外收发管组成,通过检测接收到的反射光强,判断黑白线。

当模块探测灯检测到黑线时指示灯熄灭,同时 OUT端口持续输出高电平信号,反之未检测到黑线的探测灯应常亮,OUT端口输出低电平。该模块检测距离 2~60cm,检测角度 35 ° ,检测距离可以通过电位器进行调节,顺时针调电位器,灵敏度增加;逆时针调电位器,灵敏度减少。

原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。

主控板的电路图:

c97bd0ba-7b3a-11eb-8b86-12bb97331649.png

小板电路图:

c9c22df8-7b3a-11eb-8b86-12bb97331649.png

注意连接的时候:VCC-VCC、GND-GND、IN-OUT。

比较器LM339

c9ef8ed8-7b3a-11eb-8b86-12bb97331649.png

5. 超声波测距模块

实物图:

电路图:

caa17d46-7b3a-11eb-8b86-12bb97331649.png


工作原理
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
测试距离=(高电平时间*声速(340M/S))/2;

四. 车体实物图

五. 软件实现

#includetypedef unsigned int u16;typedef unsigned char u8; sbit ENA = P2^0; //右点机使能sbit IN1 = P2^1; //为0右轮反转sbit IN2 = P2^2; //为0右轮正转sbit IN3 = P2^3; //为0左轮正转sbit IN4 = P2^4; //为0左轮反转sbit ENB = P2^5; //左电机使能 sbit left1 = P1^3;sbit left2 = P1^2;sbit right1 = P1^1;sbit right2 = P1^0; u8 PWMCnt1 = 0;u8 PWMCnt2 = 0;u8 cntPWM1 = 0;u8 cntPWM2 = 0; void Timer0Init();void XunJi(); void main(){ Timer0Init(); while(1) { XunJi(); } }// i = 1时, 大概延时10us//void delay(u16 i)//{// while (i--);//} void Timer0Init(){ TH0 = 0xFF; TL0 = 0xA3; TMOD &= 0xF0; TMOD |= 0x01; EA = 1; ET0 = 1; TR0 = 1;} void TurnRight1() //右转{ IN1 = 0; //右轮反转 IN2 = 1; IN3 = 0; //左轮正转 IN4 = 1; cntPWM1 = 70; cntPWM2 = 55;} void TurnRight2() //右转{ IN1 = 0; //右轮反转 IN2 = 1; IN3 = 0; //左轮正转 IN4 = 1; cntPWM1 = 50; cntPWM2 = 40;} void TurnLeft1() //左转{ IN1 = 1; IN2 = 0; //右轮正转 IN3 = 1; IN4 = 0; //左轮反转 cntPWM1 = 55; cntPWM2 = 70;} void TurnLeft2() //左转{ IN1 = 1; IN2 = 0; //右轮正转 IN3 = 1; IN4 = 0; //左轮反转 cntPWM1 = 40; cntPWM2 = 50;} void Forward() //前进{ IN1 = 1; IN2 = 0; //右轮正转 IN3 = 0; //左轮正转 IN4 = 1; cntPWM1 = 40; cntPWM2 = 40;} //void Backward() //后退//{// IN1 = 0; //右轮反转// IN2 = 1;//// IN3 = 1;// IN4 = 0; //左轮反转// cntPWM1 = 30;// cntPWM2 = 30;//} void Stop() //停止{ IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 0;}void XunJi(){ unsigned char flag = 0; if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0)) //0 0 0 0 flag = 0; if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1)) //0 0 0 1 flag = 1; if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0)) //0 0 1 0 flag = 0; if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1)) //0 0 1 1 flag = 1; if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0)) //0 1 0 0 flag = 0; if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1)) //0 1 0 1 flag = 4; if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0)) //0 1 1 0 flag = 0; if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1)) //0 1 1 1 flag = 1; if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0)) //1 0 0 0 flag = 3; if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1)) //1 0 0 1 flag = 0; if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0)) //1 0 1 0 flag = 2; // ? if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1)) //1 0 1 1 flag = 0; if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0)) //1 1 0 0 flag = 3; //? if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1)) //1 1 0 1 flag = 0; if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0)) //1 1 1 0 flag = 3; if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1)) //1 1 1 1 flag = 5; switch(flag) { case 0:Forward();break; case 1:TurnRight1();break; case 2:TurnRight2();break; case 3:TurnLeft1();break; case 4:TurnLeft2();break; default:Stop();break; }} void InterruptTime0() interrupt 1{ PWMCnt1++; PWMCnt2++; if(PWMCnt1 >= 200) { PWMCnt1 = 0; } if(PWMCnt1 <= cntPWM1) { ENA = 1; } else { ENA = 0; } if(PWMCnt2 >= 200) { PWMCnt2 = 0; } if(PWMCnt2 <= cntPWM2) { ENB = 1; } else { ENB = 0; } TH0 = (65536 - 50)/256; TL0 = (65536 - 50)%256;} 

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 51单片机
    +关注

    关注

    277

    文章

    5714

    浏览量

    132098
  • 控制模块
    +关注

    关注

    2

    文章

    144

    浏览量

    19653
  • 红外传感器
    +关注

    关注

    9

    文章

    560

    浏览量

    49121

原文标题:基于51单片机四路循迹小车

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    51单片机RS485编程实例资料

    详细介绍51单片机RS485通信接线和编程代码
    发表于 10-20 14:57 2次下载

    怎么测单片机系统频率

    单片机系统频率是指单片机工作时的时钟频率,它直接影响单片机的运行速度和处理能力,准确测量系统频率对单片机应用开发、程序调试和性能优化具有重要意义。测量
    的头像 发表于 07-25 11:39 474次阅读

    大一暑假适合学51单片机吗?

    大一暑假学 51 单片机,简直是老天爷赏饭吃的黄金窗口。我当时就是靠着这两个月,把从课本上看来的 C 语言指针、循环语句,变成了能让 LED 按节奏跳舞的真本事。
    的头像 发表于 07-16 11:42 388次阅读
    大一暑假适合学<b class='flag-5'>51</b><b class='flag-5'>单片机</b>吗?

    AT89C51 单片机中文资料

    电子发烧友网站提供《AT89C51 单片机中文资料.pdf》资料免费下载
    发表于 06-24 15:29 1次下载

    2.4寸TFT彩屏配套测试程序-51单片机

    如题,2.4寸TFT彩屏配套测试程序-51单片机
    发表于 06-04 16:26 0次下载

    基于51单片机的温湿度检测与调节系统电路图

    电子发烧友网站提供《基于51单片机的温湿度检测与调节系统电路图》资料免费下载
    发表于 05-12 17:23 1次下载

    新概念51单片机C语言教程入门、提高、开发、拓展全攻略

    资料介绍 从实际应用入手,以实验过程和实验现象为主导,循序渐进地讲述51单片机C语言编程方法以及51单片机的硬件结构和功能应用。全书共分5篇,分别为入门篇、内外部资源操作篇、提高篇、实
    发表于 04-15 13:57

    基于51/32单片机按键控制步进电机正反转,A4988驱动

    基于51/32单片机按键控制步进电机正反转,A4988驱动
    发表于 04-14 15:05 6次下载

    基于瑞萨RA8单片机的智能小车项目方案 附源代码

    基于瑞萨RA8单片机,e2studio开发环境,给大家讲述一下智能小车项目的方案,并附上主要的源代码。
    的头像 发表于 03-07 14:36 2082次阅读
    基于瑞萨RA8<b class='flag-5'>单片机</b>的智能<b class='flag-5'>小车</b>项目方案 附源代码

    51单片机模块化编程设计与实例要点分析

    51单片机模块化开发教程
    发表于 02-24 16:40 4次下载

    单片机学习—C51源代码和Proteus仿真文件

    单片机学习—C51源代码和Proteus仿真文件.zip, 有各种例子
    发表于 02-10 13:46 2次下载

    51单片机pwm和spwm

    51单片机pwm
    发表于 01-08 15:54 3次下载

    51单片机温度报警器

    电子发烧友网站提供《51单片机温度报警器.zip》资料免费下载
    发表于 12-30 14:16 4次下载

    基于51单片机的1U服务器电源的电源管理接口设计

    电子发烧友网站提供《基于51单片机的1U服务器电源的电源管理接口设计.pdf》资料免费下载
    发表于 12-16 14:50 0次下载

    51单片机核心板原理图

    51单片机核心板原理图
    发表于 12-16 11:30 4次下载