|
一、 總體分析 3
二、 材料清單: 4
三、 系統(tǒng)原理圖 5
1. L298n電機(jī)驅(qū)動(dòng): 5
2. 紅外模塊: 6
3. 51單片機(jī): 6
4. 7805穩(wěn)壓 7
四、 模塊功能 8
1. L298n電機(jī)驅(qū)動(dòng): 8
2. 紅外模塊: 8
3. 51單片機(jī): 8
4. 7805穩(wěn)壓: 9
五、 軟件編程 10
1. 程序1: 10
2. 程序2: 12
材料清單:
小車(chē)底盤(pán)(帶輪胎,直流減速馬達(dá),萬(wàn)向輪);
紅外對(duì)管若干;
L9110和L298n電機(jī)驅(qū)動(dòng)模塊(推薦L298n);
51最小系統(tǒng)板(含51單片機(jī));
7805穩(wěn)壓芯片;
杜邦線若干;
銅柱若干;
18650電池(含電池盒);
系統(tǒng)原理圖
L298n電機(jī)驅(qū)動(dòng):
紅外模塊:
51單片機(jī):
7805穩(wěn)壓
模塊功能
L298n電機(jī)驅(qū)動(dòng):
L298N是ST公司生產(chǎn)的一種高電壓、大電流電機(jī)驅(qū)動(dòng)芯片。該芯片采用15腳封裝。主要特點(diǎn)是:工作電壓高,最高工作電壓可達(dá)46V;輸出電流大,瞬間峰值電流可達(dá)3A,持續(xù)工作電流為2A;額定功率25W。內(nèi)含兩個(gè)H橋的高電壓大電流全橋式驅(qū)動(dòng)器,可以用來(lái)驅(qū)動(dòng)直流電動(dòng)機(jī)和步進(jìn)電動(dòng)機(jī)、繼電器線圈等感性負(fù)載;采用標(biāo)準(zhǔn)邏輯電平信號(hào)控制;具有兩個(gè)使能控制端,在不受輸入信號(hào)影響的情況下允許或禁止器件工作有一個(gè)邏輯電源輸入端,使內(nèi)部邏輯電路部分在低電壓下工作;可以外接檢測(cè)電阻,將變化量反饋給控制電路。使用L298N芯片驅(qū)動(dòng)電機(jī)可以控制兩路電機(jī)。
紅外模塊:
紅外傳感器黑線的檢測(cè)原理是紅外發(fā)射管發(fā)射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經(jīng)施密特觸發(fā)器整形后輸出低電平;當(dāng)紅外光遇到黑線時(shí)則被吸收,接收管沒(méi)有接收到反射光
51單片機(jī):
AT89C51單片機(jī)是把那些作為控制應(yīng)用所必需的基本內(nèi)容都集成在一個(gè)尺寸有限的集成電路芯片上。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數(shù)據(jù)存儲(chǔ)器(RAM)、程序存儲(chǔ)器(ROM)、并行I/O口(4個(gè)8位I/O口)、串行口、定時(shí)器/計(jì)數(shù)器、中斷系統(tǒng)及特殊功能寄存器。它們都是通過(guò)片內(nèi)單一總線連接而成,其基本結(jié)構(gòu)依舊是微處理器(CPU)加上外圍芯片的傳統(tǒng)結(jié)構(gòu)模式。但對(duì)各種功能部件的控制是采用特殊功能寄存器的集中控制方式,以實(shí)現(xiàn)不同的功能
7805穩(wěn)壓:
7805三端穩(wěn)壓集成電路,電子產(chǎn)品中,常見(jiàn)的三端穩(wěn)壓集成電路有正電壓輸出的78 ×× 系列和負(fù)電壓輸出的79××系列。顧名思義,三端IC是指這種穩(wěn)壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。
軟件編程
程序1:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit left1=P1^0;
sbit left2=P1^1;
sbit right1=P1^2;
sbit right2=P1^3; //
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
sbit led5=P2^4;//紅外傳感
void delay(uint z)
{
uchar i;
while(z--)
{
for(i=0;i<121;i++);
}
} //延時(shí)函數(shù)}
void straight() //走直線函數(shù)
{
left1=0;
left2=1;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_left() //左轉(zhuǎn)彎函數(shù)
{
left1=0;
left2=1;
right1=0;
right2=0;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_right() //右轉(zhuǎn)彎函數(shù)
{
left1=0;
left2=0;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void tingzhi()//停止函數(shù)
{
left1=0;
left2=0;
right1=0;
right2=0;
left1=0;
left2=0;
right1=0;
right2=0;
}
void infrared() //循跡
{
uchar flag;
{flag=3;}
else
if(led5==0&&(led3==1)&&(led2==1))
{flag=4;}
else
if(led5==0&&(led1==1)&&(led4==1))
{flag=4;}
else
if((led1==1)||(led2==1))
{flag=2;}
else
if((led3==1)||(led4==1))
{flag=1;}
else
flag=0;
switch (flag)
{
case 0: straight();
break;
case 2: turn_left();
break;
case 1: turn_right();
break;
case 3: straight();
break;
case 4: tingzhi();
break;
default: tingzhi();
break;
}
}
void main(void)
{
while(1)
{
infrared();
}
}
程序2:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar pro_zuo,pro_you,i,j; //左右占空比標(biāo)志
sbit left1=P1^0;
sbit left2=P1^1;
sbit right1=P1^2;
sbit right2=P1^3; //
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3; //紅外傳感
sbit led5=P2^4;
sbit en1=P0^1;
sbit en2=P0^2;
void delay(uint z)
{
uchar i;
while(z--)
{for(i=0;i<121;i++);}
}
void init()
{
/*led1=0; //白線位置
led2=0; //白線位置
led5=1; //黑線位置
led3=0; //白線位置
led4=0; //白線位置 */
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
en1=1;
en2=1;
}
void time0(void)interrupt 1
{
i++;
j++;
if(i<=pro_you) {en1=1;}
else en1=0;
if(i==40) {en1=~en1;i=0;}
if(j<=pro_zuo) {en2=1;}
else en2=0;
if(j==40) {en2=~en2;j=0;}
TH0=(65536-100)/256;
TL0=(65536-100)%256;
}
void straight() //走直線函數(shù)
{
pro_you=4;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_left() //左轉(zhuǎn)彎函數(shù)
{
pro_you=0;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_right() //右轉(zhuǎn)彎函數(shù)
{
pro_you=5;
pro_zuo=0;
left1=0;
left2=1;
right1=0;
right2=1;
}
void tingzhi()//停止函數(shù)
{
left1=0;
left2=0;
right1=0;
right2=0;
left1=0;
left2=0;
right1=0;
right2=0;
}
void infrared() //循跡
{
uchar flag;
if(led5==1&&(led3==1)&&(led2==1))
{flag=3;}
else
if(led5==0&&(led3==1)&&(led2==1))
{flag=4;}
else
if(led5==0&&(led1==1)&&(led4==1))
{flag=4;}
else
if((led1==1)||(led2==1))
{flag=2;}
else
if((led3==1)||(led4==1))
{flag=1;}
else
flag=0;
switch (flag)
{
case 0: straight();
break;
case 1: turn_left();
break;
case 2: turn_right();
break;
case 3: straight();
break;
case 4: tingzhi();
break;
default: tingzhi();
break;
}
}
void main(void)
{
init();
delay(1);
while(1)
{
infrared();
}
}
void int0(void)interrupt 0
{
} |
|