找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5309|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

功能比較強(qiáng)大的智能小車(chē)設(shè)計(jì) 尋跡、避障、發(fā)光發(fā)聲

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:585655 發(fā)表于 2019-7-17 12:09 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本次任務(wù)設(shè)計(jì)了一款功能比較強(qiáng)大的智能小車(chē),具有以下幾個(gè)功能:尋跡、避障、發(fā)光發(fā)聲。小車(chē)由拍手啟動(dòng)電機(jī),可以按照給定的黑色軌跡行駛,由前端的LED燈指示方向,并且在尋跡過(guò)程中,位于后方的LED燈實(shí)現(xiàn)流水燈的功能;在遇到障礙物時(shí),由前端檢測(cè)到后蜂鳴器報(bào)警,小車(chē)后退3秒并由數(shù)碼管顯示倒計(jì)時(shí),后退3秒后小車(chē)向右轉(zhuǎn)向調(diào)整角度來(lái)避過(guò)障礙,避障過(guò)程中的LED全滅。本小車(chē)以前輪的兩個(gè)電機(jī)來(lái)驅(qū)動(dòng),通過(guò)各種傳感器件,采集各種信息,送入主控單元AT89S52單片機(jī),處理數(shù)據(jù)后完成相應(yīng)動(dòng)作,實(shí)現(xiàn)無(wú)人控制即可完成一系列動(dòng)作。

一、設(shè)計(jì)目的
利用一個(gè)以8位單片機(jī)為核心的小型單片機(jī)應(yīng)用系統(tǒng)完成一個(gè)簡(jiǎn)單的項(xiàng)目,從項(xiàng)目的可行性分析、硬件測(cè)試、系統(tǒng)的框圖構(gòu)造、到軟件的設(shè)計(jì)調(diào)試,綜合運(yùn)用所學(xué)課程的相關(guān)知識(shí),掌握具有A/D、七段LED顯示,RS-485通信、watchdog的接口電路的單片機(jī)應(yīng)用系統(tǒng)的設(shè)計(jì)思想和方法。培養(yǎng)學(xué)生的工程設(shè)計(jì)思想和科學(xué)研究能力,使學(xué)生在分析問(wèn)題、解決問(wèn)題和動(dòng)手能力等方面有所提高,初步達(dá)到能夠設(shè)計(jì)、調(diào)試一個(gè)小型單片機(jī)應(yīng)用系統(tǒng),并了解工程項(xiàng)目設(shè)計(jì)實(shí)施的全過(guò)程。
二、設(shè)計(jì)任務(wù)分析
(一)、設(shè)計(jì)任務(wù)內(nèi)容
  1、小車(chē)可按設(shè)計(jì)行走
2、可避障,避懸崖
3、可按固定路線尋跡行駛

(三)、硬件環(huán)境
計(jì)算機(jī)、偉福系統(tǒng)仿真器、89C51單片機(jī)
(四)、設(shè)計(jì)思路  
要求明確設(shè)計(jì)任務(wù)內(nèi)容、任務(wù)分工、硬件環(huán)境、設(shè)計(jì)思路等;首先對(duì)LED燈、七段數(shù)碼顯示管、話(huà)筒、光敏電阻、按鍵以及蜂鳴器進(jìn)行自檢確保硬件的正常使用,根據(jù)任務(wù)目標(biāo)要求小車(chē)可以實(shí)現(xiàn)尋跡、避障等功能。
次任務(wù)在分塊設(shè)計(jì)程序完成各種外設(shè)以及傳感器的檢測(cè)后,對(duì)各個(gè)檢測(cè)模塊進(jìn)行優(yōu)化,先進(jìn)行前端紅外檢測(cè)的設(shè)計(jì),實(shí)現(xiàn)三組紅外探測(cè)在分別檢測(cè)到信號(hào)后控制小車(chē)的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止功能,三部分完成后進(jìn)行組合,實(shí)現(xiàn)左側(cè)檢測(cè)到黑線、右轉(zhuǎn)、前段右側(cè)LED亮,右側(cè)檢測(cè)到黑線、左轉(zhuǎn)、前段左側(cè)LED亮,這里的目的是實(shí)現(xiàn)尋跡功能;然后,在前端檢測(cè)到信號(hào)(即障礙物)時(shí),蜂鳴器發(fā)出警報(bào),小車(chē)后退3秒并由數(shù)碼管顯示倒計(jì)時(shí),右轉(zhuǎn),這里的目的是完成避障功能;主要任務(wù)完成后,需要盡可能的加入外設(shè),因此我們?cè)O(shè)計(jì)了在尋跡時(shí)后排LED的流水燈以及聲控啟動(dòng)小車(chē),加入到了主程序中。
框圖
、自檢程序框圖
蜂鳴器自檢框圖

    說(shuō)明:蜂鳴器的自檢采用給定兩種延時(shí)不同的聲音,循環(huán)實(shí)現(xiàn)蜂鳴器的響應(yīng)。經(jīng)檢驗(yàn)小車(chē)的蜂鳴器焊接沒(méi)有問(wèn)題。
光敏自檢框圖  
               
說(shuō)明:光敏電阻在有遮擋時(shí)可以認(rèn)為是黑天,因此有遮擋時(shí)(p05=0)小車(chē)的所有燈亮,無(wú)遮擋時(shí)燈滅。經(jīng)檢驗(yàn),小車(chē)光敏電阻、前板指示燈以及LED燈沒(méi)有問(wèn)題。
3.話(huà)筒自檢框圖
說(shuō)明:?jiǎn)?dòng)小車(chē)后,話(huà)筒檢測(cè)到高聲后,小車(chē)直走;再次檢測(cè)到高聲后,小車(chē)停止。經(jīng)檢驗(yàn),小車(chē)的話(huà)筒以及電機(jī)焊接沒(méi)有問(wèn)題。
4.按鍵自檢框圖

說(shuō)明:?jiǎn)?dòng)小車(chē)后,按下s2鍵時(shí)小車(chē)直走,按下s1鍵時(shí),小車(chē)停止。經(jīng)檢驗(yàn),此程序可循環(huán)執(zhí)行并且小車(chē)的按鍵焊接沒(méi)有問(wèn)題。
5.數(shù)碼管自檢框圖

說(shuō)明:這里直接給編程使七段數(shù)碼管全部點(diǎn)亮。經(jīng)檢驗(yàn),小車(chē)的數(shù)碼管焊接沒(méi)有問(wèn)題。

6.前板紅外探頭自檢框圖
           

說(shuō)明:當(dāng)前方的紅外探測(cè)到障礙物時(shí),前板的兩個(gè)燈都亮;左邊檢測(cè)到黑線時(shí),左燈亮;右邊檢測(cè)到黑線時(shí),右燈亮,這部分程序可以循環(huán)執(zhí)行。經(jīng)檢驗(yàn),小車(chē)的三個(gè)紅外探頭焊接沒(méi)有問(wèn)題。
(二)、主程序框圖

說(shuō)明:聲控啟動(dòng)小車(chē),直行,如果當(dāng)前前方紅外探頭沒(méi)有檢測(cè)到障礙,左右紅外也沒(méi)有檢測(cè)到黑線,則直行;如果右側(cè)檢測(cè)到黑線,左轉(zhuǎn),左燈亮;如果左側(cè)檢測(cè)到黑線,右轉(zhuǎn),右燈亮;如果前方檢測(cè)到障礙物,小車(chē)馬上后退,然后右轉(zhuǎn)調(diào)整角度;執(zhí)行完避障程序后,繼續(xù)執(zhí)行尋跡程序。
  • 程序清單
  • 蜂鳴器自檢程序
#include<reg51.h>
typedef unsigned int u16;              //定義變量
sbit p06=P0^6;                         //蜂鳴器
void delay(u16 i)                      //延時(shí)程序
  {while(i--);}                        //i=1大約為1us
  void fm()                            //主程序
{                while(1)                          //循環(huán)
{     p06=0;                          //蜂鳴器響
       delay(10000);
       p06=1;                         //蜂鳴器停止響聲
       delay(5000);}              }
光敏自檢程序
#include<reg51.h>
sbit p05=P0^5;                       //光敏電阻
sbit p20=P2^0;                       //前端左側(cè)燈
sbit p07=P0^7;                       //前端右側(cè)燈
typedef unsigned int u16;            //定義變量
void delay(u16 i)                    //延時(shí)程序
  {while(i--);}                      //i=1大約1us
void gm()                            //主程序
{   while (1)                        //循環(huán)
  { if(p05==0)                       //光敏電阻被遮擋
     {   p1=0x00;                    //后排燈全亮
         p07=0;                      //前端右側(cè)燈亮
         p20=0;}                     //前端左側(cè)燈亮
    else
{  p1=0xff;                          //后排燈全熄滅
   p07=1;                            //前端右側(cè)燈熄滅
   p20=1; }}}                        //前端左側(cè)燈熄滅
話(huà)筒自檢程序
#include<reg51.h>
typedef unsigned int u16;            //定義變量
sbit B1=P0^4;                        //麥克風(fēng)
void delay(u16 i)                   //延時(shí)程序
{ while(i--); }                     //i=1大約1us
void go()                           //前進(jìn)
{ p00=0;
p01=1;                               //左電機(jī)前進(jìn)
p02=1;
p03=0;}                              //右電機(jī)前進(jìn)
void stop()                          //停止
{p00=0;
p01=0;                               //左電機(jī)停止
p02=0;
p03=0;}                              //右電機(jī)停止
void main()                          //主程序
  { while(1)                         //循環(huán)
    { if(B1==0)                      //麥克風(fēng)檢測(cè)到聲音信號(hào)
              { go();}                        //前進(jìn)
         if(B1==0)                  //麥克風(fēng)再次檢測(cè)到聲音信號(hào)
   { stop();}}}                     //停止
按鍵自檢程序
#include<reg51.h>
typedef unsigned int u16;           //定義變量
sbit s1=P3^2;                       //左側(cè)開(kāi)關(guān)S1
sbit s1=P3^4;                       //右側(cè)開(kāi)關(guān)S2
sbit p00=P0^0;                      //左側(cè)電機(jī)
sbit p01=P0^1;                      //左側(cè)電機(jī)
sbit p02=P0^2;                      //右側(cè)電機(jī)
sbit p03=P0^3;                      //右側(cè)電機(jī)
void delay(u16 i)                   //延時(shí)程序
  {while(i--);}                     //i=1大約為1us
void go()                           //前進(jìn)
{p00=1;
p01=0;
p02=0;
p03=1;}
void stop()                         //停止
{p00=0;
p01=0;
p02=0;
p03=0;}
void za()                           //左開(kāi)關(guān)按鍵
{ if(s1==0)                         //開(kāi)關(guān)S1按下
              { delay(1000);                  //消抖
                 if(s1==0)                     //S1按下
                 {stop();}                     //執(zhí)行停止
                 Else                          //S1未按下
                 {go();}}}                     //執(zhí)行前進(jìn)
void ya()                           //右開(kāi)關(guān)按鍵
{if(s2==0)                          //開(kāi)關(guān)S2按下
              {delay(1000);                   //消抖
                 if(s2==0)                     //S2按下
                 {go();}                       //執(zhí)行前進(jìn)
                 else                          //S2未按下
                 {stop();}}}                   //執(zhí)行停止
數(shù)碼管自檢程序
#include<reg51.h>
sbit p21=P2^1;                      //七段數(shù)碼管g
sbit p22=P2^2;                      //七段數(shù)碼管f
sbit p23=P2^3;                      //七段數(shù)碼管e
sbit p24=P2^4;                      //七段數(shù)碼管d
sbit p25=P2^5;                      //七段數(shù)碼管c
sbit p26=P2^6;                      //七段數(shù)碼管b
sbit p27=P2^7;                      //七段數(shù)碼管a
void go()                           //主程序
{p21=0;                             //七段數(shù)碼管g亮
p22=0;                              //七段數(shù)碼管f亮
p23=0;                              //七段數(shù)碼管e亮
p24=0;                              //七段數(shù)碼管d亮
p25=0;                              //七段數(shù)碼管c亮
p26=0;                              //七段數(shù)碼管b亮
p27=0;}                             //七段數(shù)碼管a亮
前板紅外探頭自檢程序
#include<reg51.h>
sbit p37=P3^7;                      //前端紅外接收
sbit p35=P3^5;                      //前端左側(cè)紅外接收
sbit p36=P3^6;                      //前端右側(cè)紅外接收
sbit p20=P2^0;                      //前端左側(cè)燈
sbit p07=P0^7;                      //前端右側(cè)燈
sbit p25=P2^5;                      //七段數(shù)碼管c亮
sbit p26=P2^6;                      //七段數(shù)碼管b亮
void qian()                         //前板主程序
{while (1)                          //循環(huán)
{ if(p37==0)                        //前端紅外接收端接收到信號(hào)
{p25=0;                             //七段數(shù)碼管c亮
p26=0;}                            //七段數(shù)碼管b亮
else
{p25=1;                             //七段數(shù)碼管c熄滅
p26=1;}                            //七段數(shù)碼管b熄滅
if(p35==0)                          //前端左側(cè)紅外接收端接收到信號(hào)
{p20=0; }                          //前端左側(cè)燈亮
  else
{p20=1; }                           //前端左側(cè)燈熄滅
              if(p36==0)                       //前端左側(cè)紅外接收端接收到信號(hào)
              {p07=0; }                       //前端右側(cè)燈亮
              else
              {p07=1; } }}                    //前端右側(cè)燈熄滅

(七)主程序

#include<reg51.h>
typedef unsigned int u16;            //定義延時(shí)變量
sbit p00=P0^0;                       //左電機(jī)
sbit p01=P0^1;                       //左電機(jī)
sbit p02=P0^2;                       //右電機(jī)
sbit p03=P0^3;                       //右電機(jī)
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;                       //話(huà)筒
sbit p21=P2^1;                       //數(shù)碼管
sbit p22=P2^2;                       //數(shù)碼管
sbit p23=P2^3;                       //數(shù)碼管
sbit p24=P2^4;                       //數(shù)碼管
sbit p25=P2^5;                       //數(shù)碼管
sbit p26=P2^6;                       //數(shù)碼管
sbit p27=P2^7;                       //數(shù)碼管
void delay(u16 i)                    //延時(shí)程序
{while(i--);}                        //i=1大約延時(shí)1us
void go()                            //前進(jìn)
{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()                          //數(shù)碼管顯示
{p27=0;
p26=0;
p25=0;
p24=0;
p21=0;
delay(50000);
delay(50000);
p27=1;
p26=1;
p25=1;
p24=1;
p21=1;                              //數(shù)碼管顯示‘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;                              //數(shù)碼管顯示‘2’
p25=0;
p26=0;
delay(50000);
delay(50000);
p25=1;
p26=1;}                            //數(shù)碼管顯示‘1’
void main()                         //主程序
{                 bit s;                         //聲控變量
    if(p04==0)
              {s=1;}
              else{stop();}                    //聲控啟動(dòng)
              while(s)
              {  deng();
              if(p36==1&&p35==0)               //左端檢測(cè)到黑線,右拐,右端燈亮
              {  left();
                 p20=1;
                 p07=0;}
              if(p36==0&&p35==1)               //右端檢測(cè)到黑線,左拐,左端燈亮              
    {  right();
                 p07=1;
                 p20=0; }
              if(p35==0&&p36==0)               //左右同時(shí)檢測(cè)到黑線,直走
              { go(); }
                if(p35==1&&p36==1)                //左右同時(shí)未檢測(cè)到黑線,直走
              { go(); }
              if(p37==0)                        //前端檢測(cè)到障礙物
              {p06=0;                           //蜂鳴器響
                            p07=1;
                            p20=1;                            //前板燈滅
                            delay(5000);
                            p06=1;                            //蜂鳴器不響
                            back();                           //后退
                            smgl();                           //數(shù)碼管計(jì)時(shí)'3' '2' '1'
                            left();                           //右拐                        
                            delay(50000);
                            delay(50000);            
                            go();} }}                         //直行            
說(shuō)明:避障時(shí),小車(chē)后退,蜂鳴器報(bào)警,數(shù)碼管3秒倒計(jì)時(shí)同時(shí)進(jìn)行,然后短時(shí)間右拐調(diào)整車(chē)頭。下面是避障時(shí)實(shí)際的照片。

完整的Word格式文檔51黑下載地址:
設(shè)計(jì)文檔.7z (5.27 MB, 下載次數(shù): 37)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:580104 發(fā)表于 2019-7-18 13:43 | 只看該作者
學(xué)習(xí)了,非常不錯(cuò)的資料。
回復(fù)

使用道具 舉報(bào)

板凳
ID:242298 發(fā)表于 2019-11-22 22:36 | 只看該作者
學(xué)習(xí)了,非常不錯(cuò)的資料。嘻謝謝
回復(fù)

使用道具 舉報(bào)

地板
ID:546381 發(fā)表于 2019-11-24 19:05 | 只看該作者
學(xué)習(xí)了,非常不錯(cuò)的資料;51的嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表