本次任務設計了一款功能比較強大的智能小車,具有以下幾個功能:尋跡、避障、發光發聲。小車由拍手啟動電機,可以按照給定的黑色軌跡行駛,由前端的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)
2019-7-17 18:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|