《智能循跡小車設(shè)計(jì).docx》由會(huì)員分享,可在線閱讀,更多相關(guān)《智能循跡小車設(shè)計(jì).docx(9頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、智能循跡/避障小車研究
工作報(bào)告
一、 智能循跡小車程序結(jié)構(gòu)框圖
二、 Proteus仿真圖
三、 軟件程序設(shè)計(jì)
一、 智能循跡小車程序結(jié)構(gòu)框圖
經(jīng)過幾天在網(wǎng)上的查找,對智能循跡/避障小車有了大致的了解,
一般有三個(gè)模塊:
1、最基本的小車驅(qū)動(dòng)模塊,使用兩個(gè)二相四線步進(jìn)電機(jī)對小車的兩個(gè)后輪分別進(jìn)行驅(qū)動(dòng),前輪最好用萬向輪,能使小車更好地轉(zhuǎn)彎;
2、小車循跡模塊,在小車底部有三個(gè)并排安裝的紅外對管,對黑色與白色的反射信號不同,經(jīng)單片機(jī)處理后對小車進(jìn)行相應(yīng)處理;
3、避障模塊,我寫的程序中對于避障模塊是用中斷來處理的(即安裝在小車車頭的紅外對
2、管檢測到有障礙物后,就會(huì)向單片機(jī)的P3_2口輸出一個(gè)高電平或是低電平,這時(shí)中斷程序?qū)π≤囘M(jìn)行預(yù)先設(shè)定好的避障處理),但是在程序結(jié)構(gòu)框圖中,我不太會(huì)表示中斷處理方式,所以就用查詢的方式畫了。
啟動(dòng)小車
開始
避障?
N
Y
避障模
3、塊
循跡模塊
停止?
N
Y
停止
二、Proteus仿真圖
我用Proteus大概地仿真了小車的運(yùn)行狀態(tài)。圖中的兩個(gè)二相四線步進(jìn)電機(jī)就代表小
4、車的左右輪(假定步進(jìn)電機(jī)順時(shí)針轉(zhuǎn)動(dòng)方向?yàn)樾≤嚽斑M(jìn)方向),網(wǎng)上有很多種驅(qū)動(dòng)芯片,在仿真時(shí)我只使用L298N芯片來驅(qū)動(dòng)步進(jìn)電機(jī)。用三個(gè)單刀雙制開關(guān)模擬用于小車循跡的三個(gè)紅外對管的輸出信號,經(jīng)一個(gè)與門與三極管開關(guān)連接到P3_3口,中斷程序?qū)1_0, P1_1, P1_2三個(gè)口進(jìn)行檢測,并做出相應(yīng)處理。同時(shí)因?yàn)楸苷夏K的優(yōu)先級高于循跡模塊,所以將外部中斷0用于避障,外部中斷1用于循跡。P1_3口則用于檢測小車是否到達(dá)終點(diǎn)。
1、小車驅(qū)動(dòng)模塊:
使用一片298芯片驅(qū)動(dòng)一個(gè)二相四線步進(jìn)電機(jī),電機(jī)的電壓為12V。
2、小車循跡模塊:
左邊為三個(gè)單刀雙制開關(guān)模擬小車循跡使用的紅外對管的輸
5、出信號,經(jīng)一個(gè)與門和三極管開關(guān)送至P3_3口,有P1_4口定時(shí)響應(yīng)中斷程序。又經(jīng)或門送至P1_3口(圖因找不到或門,所以用7411和7404代替),檢測小車是否到達(dá)終點(diǎn).
3、避障模塊: (用一個(gè)開關(guān)代替車頭紅外對管的輸出信號)
4、仿真結(jié)果:
根據(jù)兩個(gè)步進(jìn)電機(jī)的轉(zhuǎn)動(dòng)情況,小車可以按照預(yù)先設(shè)計(jì)好的程序進(jìn)行循跡(轉(zhuǎn)彎,直走),避障處理,最后停止前進(jìn)。
三、軟件程序設(shè)計(jì)
#include
#define uchar unsigned char
sbit P1_2=P1^2; //P1口的低三位作為小車循跡的三個(gè)紅外對管與單片機(jī)的信號接口
sbit
6、 P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_3=P1^3; //三個(gè)循跡的紅外對管輸出口經(jīng)或門后的結(jié)果與P1_3接,用于實(shí)時(shí)檢測
sbit P1_7=P1^7; //控制兩個(gè)二相四線步進(jìn)電機(jī)的啟動(dòng)與停止
sbit P1_6=P1^6;
sbit P1_4=P1^4; //為循跡中斷所用的定時(shí)/計(jì)數(shù)器0輸出口
uchar i,j,ms;
uchar dianji[]={0x11,0x22,0x44,0x88}; //電機(jī)的轉(zhuǎn)動(dòng)使小車前進(jìn)
uchar back[]={0x88,0x44,0x22,0x11}; //電機(jī)的轉(zhuǎn)動(dòng)使小車后退
7、
void delay(int z) //延時(shí)程序
{
int x,y;
for(x=0;x
8、 兩個(gè)車輪的轉(zhuǎn)動(dòng)。小車左轉(zhuǎn)時(shí),左邊的電機(jī)停止轉(zhuǎn)動(dòng),右邊的電機(jī)
P1_6=0; 仍然轉(zhuǎn)動(dòng),即實(shí)現(xiàn)小車的左轉(zhuǎn)動(dòng)作;反之則是小車的右轉(zhuǎn)動(dòng)作
P1_7=1;
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
void turnright() //小車右轉(zhuǎn)程序
{
P1_6=1;
P1_7=0;
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
void qianj
9、in() //小車前進(jìn)程序,此程序是為小車遇到障礙時(shí)進(jìn)行躲避處理時(shí)小車前
{ 進(jìn)程序,一個(gè)循環(huán)小車的車輪轉(zhuǎn)動(dòng)三周
P1_6=1;
P1_7=1;
for(j=0;j<3;j++)
{
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
}
void goback() //小車后退程序,此程序也是小車避障環(huán)節(jié)中的為小車后退的程序,
{ 一個(gè)循環(huán),小車的車輪向后轉(zhuǎn)動(dòng)三周
P1_6=1;
10、
P1_7=1;
for(j=0;j<3;j++)
{
for(i=0;i<4;i++)
{
P2=back[i];
delay(50);
}
}
}
void main(void) //主程序
{
TMOD=0x01; //為循跡中斷時(shí),設(shè)置了一個(gè)定時(shí)/計(jì)數(shù)器0,使得循跡中斷會(huì)定時(shí)被響應(yīng)
TH0=(65536-50000)/256; //設(shè)置定時(shí)/計(jì)數(shù)器的初值
TL0=(65536-50000)%256;
TR0=1; //開啟定時(shí)/計(jì)數(shù)器0
IE=0x
11、87; //打開T0,INT0,INT1的中斷
IT0=1; //兩個(gè)外部中斷的中斷觸發(fā)方式
IT1=1;
P1_4=0; //設(shè)定初值
ms=0;
while(P1_3) //場地為白紙黑線,紅外對管發(fā)射接收后,若為黑色則向單片機(jī)輸出低電
{ 平,若為白色則輸出高電平。三個(gè)紅外對管接一個(gè)或門后到P1_3口,只
goahead(); 要有一個(gè)對管檢測到白線,小車就一直向前走。場地的終點(diǎn)為一條與循
}
12、 跡線路相垂直的黑線,若三個(gè)對管都檢測到黑線,即輸出都為低電平,
P1_6=0; 此時(shí)跳出循環(huán),關(guān)閉兩個(gè)步進(jìn)電機(jī),小車停止運(yùn)行。
P1_7=0;
}
void time0() interrupt 0 //避障中斷處理程序。在小車車頭安裝一個(gè)或是兩個(gè)紅外對
{ 管,用于檢測循跡軌道上的障礙物。若有障礙物出現(xiàn)則紅外
P1_6=0; 對管向單片機(jī)的P3_2口輸出低電平,做出相應(yīng)處理。
P1_7=0; //先關(guān)閉兩個(gè)步進(jìn)電機(jī),使其正
13、轉(zhuǎn)與反轉(zhuǎn)之間有一個(gè)緩沖時(shí)間
goback(); //后退,左轉(zhuǎn),前進(jìn),右轉(zhuǎn),前進(jìn),右轉(zhuǎn),直走
turnleft();
qianjin();
turnright();
qianjin();
turnright();
goahead();
}
void tt_0() interrupt 2 //循跡中斷程序。由于安裝在小車下面的三個(gè)紅外對管會(huì)長時(shí)間地保持一個(gè)電平不變,若直接將此信號經(jīng)與門連接到P3_3口時(shí),中斷程序只執(zhí)行一次便不再繼續(xù)響應(yīng),所以我加了一個(gè)三極管開關(guān)。這樣隔一段時(shí)間三極管導(dǎo)通,將信號傳送到P3_3口。由定時(shí)器設(shè)定每
14、100ms導(dǎo)通三極管一次,將三個(gè)用于循跡的對管的輸出經(jīng)或門后送到P3_3口。
{
if(P1_0==0&&P1_2==1) //若左邊紅外管輸出為低電平,右邊的為高電平,則左轉(zhuǎn)
turnleft();
if(P1_0==1&&P1_2==0) //若左邊紅外管輸出為高電平,右邊的為低電平,則右轉(zhuǎn)
turnright();
if(P1_0==0&&P1_1==0&&P1_2==0) //若三個(gè)都為低電平,則關(guān)閉步進(jìn)電機(jī),小車停止
{
P1_6=0;
P1_7=0;
}
}
void time_0() interrupt 1 //定時(shí)100ms,P1_4口反相
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ms++;
if(ms>=2)
{
P1_4=!P1_4;
ms=0;
}
}