找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4290|回复: 3
收起左侧

功能比较强大的智能小车设计 寻迹、避障、发光发声

[复制链接]
ID:585655 发表于 2019-7-17 12:09 | 显示全部楼层 |阅读模式
本次任务设计了一款功能比较强大的智能小车,具有以下几个功能:寻迹、避障、发光发声。小车由拍手启动电机,可以按照给定的黑色轨迹行驶,由前端的LED灯指示方向,并且在寻迹过程中,位于后方的LED灯实现流水灯的功能;在遇到障碍物时,由前端检测到后蜂鸣器报警,小车后退3秒并由数码管显示倒计时,后退3秒后小车向右转向调整角度来避过障碍,避障过程中的LED全灭。本小车以前轮的两个电机来驱动,通过各种传感器件,采集各种信息,送入主控单元AT89S52单片机,处理数据后完成相应动作,实现无人控制即可完成一系列动作。

一、设计目的
利用一个以8位单片机为核心的小型单片机应用系统完成一个简单的项目,从项目的可行性分析、硬件测试、系统的框图构造、到软件的设计调试,综合运用所学课程的相关知识,掌握具有A/D、七段LED显示,RS-485通信、watchdog的接口电路的单片机应用系统的设计思想和方法。培养学生的工程设计思想和科学研究能力,使学生在分析问题、解决问题和动手能力等方面有所提高,初步达到能够设计、调试一个小型单片机应用系统,并了解工程项目设计实施的全过程。
二、设计任务分析
(一)、设计任务内容
  1、小车可按设计行走
2、可避障,避悬崖
3、可按固定路线寻迹行驶

(三)、硬件环境
计算机、伟福系统仿真器、89C51单片机
(四)、设计思路  
要求明确设计任务内容、任务分工、硬件环境、设计思路等;首先对LED灯、七段数码显示管、话筒、光敏电阻、按键以及蜂鸣器进行自检确保硬件的正常使用,根据任务目标要求小车可以实现寻迹、避障等功能。
次任务在分块设计程序完成各种外设以及传感器的检测后,对各个检测模块进行优化,先进行前端红外检测的设计,实现三组红外探测在分别检测到信号后控制小车的前进、后退、左转、右转、停止功能,三部分完成后进行组合,实现左侧检测到黑线、右转、前段右侧LED亮,右侧检测到黑线、左转、前段左侧LED亮,这里的目的是实现寻迹功能;然后,在前端检测到信号(即障碍物)时,蜂鸣器发出警报,小车后退3秒并由数码管显示倒计时,右转,这里的目的是完成避障功能;主要任务完成后,需要尽可能的加入外设,因此我们设计了在寻迹时后排LED的流水灯以及声控启动小车,加入到了主程序中。
框图
、自检程序框图
蜂鸣器自检框图

    说明:蜂鸣器的自检采用给定两种延时不同的声音,循环实现蜂鸣器的响应。经检验小车的蜂鸣器焊接没有问题。
光敏自检框图  
               
说明:光敏电阻在有遮挡时可以认为是黑天,因此有遮挡时(p05=0)小车的所有灯亮,无遮挡时灯灭。经检验,小车光敏电阻、前板指示灯以及LED灯没有问题。
3.话筒自检框图
说明:启动小车后,话筒检测到高声后,小车直走;再次检测到高声后,小车停止。经检验,小车的话筒以及电机焊接没有问题。
4.按键自检框图

说明:启动小车后,按下s2键时小车直走,按下s1键时,小车停止。经检验,此程序可循环执行并且小车的按键焊接没有问题。
5.数码管自检框图

说明:这里直接给编程使七段数码管全部点亮。经检验,小车的数码管焊接没有问题。

6.前板红外探头自检框图
           

说明:当前方的红外探测到障碍物时,前板的两个灯都亮;左边检测到黑线时,左灯亮;右边检测到黑线时,右灯亮,这部分程序可以循环执行。经检验,小车的三个红外探头焊接没有问题。
(二)、主程序框图

说明:声控启动小车,直行,如果当前前方红外探头没有检测到障碍,左右红外也没有检测到黑线,则直行;如果右侧检测到黑线,左转,左灯亮;如果左侧检测到黑线,右转,右灯亮;如果前方检测到障碍物,小车马上后退,然后右转调整角度;执行完避障程序后,继续执行寻迹程序。
  • 程序清单
  • 蜂鸣器自检程序
#include<reg51.h>
typedef unsigned int u16;              //定义变量
sbit p06=P0^6;                         //蜂鸣器
void delay(u16 i)                      //延时程序
  {while(i--);}                        //i=1大约为1us
  void fm()                            //主程序
{                while(1)                          //循环
{     p06=0;                          //蜂鸣器响
       delay(10000);
       p06=1;                         //蜂鸣器停止响声
       delay(5000);}              }
光敏自检程序
#include<reg51.h>
sbit p05=P0^5;                       //光敏电阻
sbit p20=P2^0;                       //前端左侧灯
sbit p07=P0^7;                       //前端右侧灯
typedef unsigned int u16;            //定义变量
void delay(u16 i)                    //延时程序
  {while(i--);}                      //i=1大约1us
void gm()                            //主程序
{   while (1)                        //循环
  { if(p05==0)                       //光敏电阻被遮挡
     {   p1=0x00;                    //后排灯全亮
         p07=0;                      //前端右侧灯亮
         p20=0;}                     //前端左侧灯亮
    else
{  p1=0xff;                          //后排灯全熄灭
   p07=1;                            //前端右侧灯熄灭
   p20=1; }}}                        //前端左侧灯熄灭
话筒自检程序
#include<reg51.h>
typedef unsigned int u16;            //定义变量
sbit B1=P0^4;                        //麦克风
void delay(u16 i)                   //延时程序
{ while(i--); }                     //i=1大约1us
void go()                           //前进
{ p00=0;
p01=1;                               //左电机前进
p02=1;
p03=0;}                              //右电机前进
void stop()                          //停止
{p00=0;
p01=0;                               //左电机停止
p02=0;
p03=0;}                              //右电机停止
void main()                          //主程序
  { while(1)                         //循环
    { if(B1==0)                      //麦克风检测到声音信号
              { go();}                        //前进
         if(B1==0)                  //麦克风再次检测到声音信号
   { stop();}}}                     //停止
按键自检程序
#include<reg51.h>
typedef unsigned int u16;           //定义变量
sbit s1=P3^2;                       //左侧开关S1
sbit s1=P3^4;                       //右侧开关S2
sbit p00=P0^0;                      //左侧电机
sbit p01=P0^1;                      //左侧电机
sbit p02=P0^2;                      //右侧电机
sbit p03=P0^3;                      //右侧电机
void delay(u16 i)                   //延时程序
  {while(i--);}                     //i=1大约为1us
void go()                           //前进
{p00=1;
p01=0;
p02=0;
p03=1;}
void stop()                         //停止
{p00=0;
p01=0;
p02=0;
p03=0;}
void za()                           //左开关按键
{ if(s1==0)                         //开关S1按下
              { delay(1000);                  //消抖
                 if(s1==0)                     //S1按下
                 {stop();}                     //执行停止
                 Else                          //S1未按下
                 {go();}}}                     //执行前进
void ya()                           //右开关按键
{if(s2==0)                          //开关S2按下
              {delay(1000);                   //消抖
                 if(s2==0)                     //S2按下
                 {go();}                       //执行前进
                 else                          //S2未按下
                 {stop();}}}                   //执行停止
数码管自检程序
#include<reg51.h>
sbit p21=P2^1;                      //七段数码管g
sbit p22=P2^2;                      //七段数码管f
sbit p23=P2^3;                      //七段数码管e
sbit p24=P2^4;                      //七段数码管d
sbit p25=P2^5;                      //七段数码管c
sbit p26=P2^6;                      //七段数码管b
sbit p27=P2^7;                      //七段数码管a
void go()                           //主程序
{p21=0;                             //七段数码管g亮
p22=0;                              //七段数码管f亮
p23=0;                              //七段数码管e亮
p24=0;                              //七段数码管d亮
p25=0;                              //七段数码管c亮
p26=0;                              //七段数码管b亮
p27=0;}                             //七段数码管a亮
前板红外探头自检程序
#include<reg51.h>
sbit p37=P3^7;                      //前端红外接收
sbit p35=P3^5;                      //前端左侧红外接收
sbit p36=P3^6;                      //前端右侧红外接收
sbit p20=P2^0;                      //前端左侧灯
sbit p07=P0^7;                      //前端右侧灯
sbit p25=P2^5;                      //七段数码管c亮
sbit p26=P2^6;                      //七段数码管b亮
void qian()                         //前板主程序
{while (1)                          //循环
{ if(p37==0)                        //前端红外接收端接收到信号
{p25=0;                             //七段数码管c亮
p26=0;}                            //七段数码管b亮
else
{p25=1;                             //七段数码管c熄灭
p26=1;}                            //七段数码管b熄灭
if(p35==0)                          //前端左侧红外接收端接收到信号
{p20=0; }                          //前端左侧灯亮
  else
{p20=1; }                           //前端左侧灯熄灭
              if(p36==0)                       //前端左侧红外接收端接收到信号
              {p07=0; }                       //前端右侧灯亮
              else
              {p07=1; } }}                    //前端右侧灯熄灭

(七)主程序

#include<reg51.h>
typedef unsigned int u16;            //定义延时变量
sbit p00=P0^0;                       //左电机
sbit p01=P0^1;                       //左电机
sbit p02=P0^2;                       //右电机
sbit p03=P0^3;                       //右电机
sbit p37=P3^7;                       //前端红外
sbit p36=P3^6;                       //右端红外
sbit p35=P3^5;                       //左端红外
sbit p20=P2^0;                       //左端指示灯
sbit p07=P0^7;                       //右端指示灯
sbit p06=P0^6;                       //蜂鸣器
sbit p10=P1^0;                       //LED
sbit p11=P1^1;                       //LED
sbit p12=P1^2;                       //LED
sbit p13=P1^3;                       //LED
sbit p14=P1^4;                       //LED
sbit p15=P1^5;                       //LED
sbit p16=P1^6;                       //LED
sbit p17=P1^7;                       //LED
sbit p04=P0^4;                       //话筒
sbit p21=P2^1;                       //数码管
sbit p22=P2^2;                       //数码管
sbit p23=P2^3;                       //数码管
sbit p24=P2^4;                       //数码管
sbit p25=P2^5;                       //数码管
sbit p26=P2^6;                       //数码管
sbit p27=P2^7;                       //数码管
void delay(u16 i)                    //延时程序
{while(i--);}                        //i=1大约延时1us
void go()                            //前进
{p00=1;
p01=0;
p02=0;
p03=1;}
void right()                         //左拐
{p00=0;
p01=0;
p02=0;
p03=1;}
void left()                          //右拐
{p00=1;
p01=0;
p02=0;
p03=0;}
void back()                           //后退
{p00=0;
p01=1;

p02=1;
p03=0;}
void stop()                           //停止
{p00=0;
p01=0;
p02=0;
p03=0;}
void deng()                         //流水灯
{p10=0;
p11=0;
delay(5000);
p12=0;
p13=0;
delay(5000);
p14=0;
p15=0;
delay(5000);
p16=0;
p17=0;
delay(5000);
p17=1;
p16=1;
delay(5000);
p15=1;
p14=1;
delay(5000);
p13=1;
p12=1;
delay(5000);
p11=1;
p10=1;
delay(5000);}
void smgl()                          //数码管显示
{p27=0;
p26=0;
p25=0;
p24=0;
p21=0;
delay(50000);
delay(50000);
p27=1;
p26=1;
p25=1;
p24=1;
p21=1;                              //数码管显示‘3’
p27=0;
p26=0;
p24=0;
p23=0;
p21=0;
delay(50000);
delay(50000);
p27=1;
p26=1;
p24=1;
p23=1;
p21=1;                              //数码管显示‘2’
p25=0;
p26=0;
delay(50000);
delay(50000);
p25=1;
p26=1;}                            //数码管显示‘1’
void main()                         //主程序
{                 bit s;                         //声控变量
    if(p04==0)
              {s=1;}
              else{stop();}                    //声控启动
              while(s)
              {  deng();
              if(p36==1&&p35==0)               //左端检测到黑线,右拐,右端灯亮
              {  left();
                 p20=1;
                 p07=0;}
              if(p36==0&&p35==1)               //右端检测到黑线,左拐,左端灯亮              
    {  right();
                 p07=1;
                 p20=0; }
              if(p35==0&&p36==0)               //左右同时检测到黑线,直走
              { go(); }
                if(p35==1&&p36==1)                //左右同时未检测到黑线,直走
              { go(); }
              if(p37==0)                        //前端检测到障碍物
              {p06=0;                           //蜂鸣器响
                            p07=1;
                            p20=1;                            //前板灯灭
                            delay(5000);
                            p06=1;                            //蜂鸣器不响
                            back();                           //后退
                            smgl();                           //数码管计时'3' '2' '1'
                            left();                           //右拐                        
                            delay(50000);
                            delay(50000);            
                            go();} }}                         //直行            
说明:避障时,小车后退,蜂鸣器报警,数码管3秒倒计时同时进行,然后短时间右拐调整车头。下面是避障时实际的照片。

完整的Word格式文档51黑下载地址:
设计文档.7z (5.27 MB, 下载次数: 37)

评分

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

查看全部评分

回复

使用道具 举报

ID:580104 发表于 2019-7-18 13:43 | 显示全部楼层
学习了,非常不错的资料。
回复

使用道具 举报

ID:242298 发表于 2019-11-22 22:36 | 显示全部楼层
学习了,非常不错的资料。嘻谢谢
回复

使用道具 举报

ID:546381 发表于 2019-11-24 19:05 | 显示全部楼层
学习了,非常不错的资料。基于51的吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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