一、 總體分析 3
二、 材料清單: 4
三、 系統原理圖 5
1. L298n電機驅動: 5
2. 紅外模塊: 6
3. 51單片機: 6
4. 7805穩壓 7
四、 模塊功能 8
1. L298n電機驅動: 8
2. 紅外模塊: 8
3. 51單片機: 8
4. 7805穩壓: 9
五、 軟件編程 10
1. 程序1: 10
2. 程序2: 12
材料清單:
小車底盤(帶輪胎,直流減速馬達,萬向輪);
紅外對管若干;
L9110和L298n電機驅動模塊(推薦L298n);
51最小系統板(含51單片機);
7805穩壓芯片;
杜邦線若干;
銅柱若干;
18650電池(含電池盒);
系統原理圖
L298n電機驅動:
紅外模塊:
51單片機:
7805穩壓
模塊功能
L298n電機驅動:
L298N是ST公司生產的一種高電壓、大電流電機驅動芯片。該芯片采用15腳封裝。主要特點是:工作電壓高,最高工作電壓可達46V;輸出電流大,瞬間峰值電流可達3A,持續工作電流為2A;額定功率25W。內含兩個H橋的高電壓大電流全橋式驅動器,可以用來驅動直流電動機和步進電動機、繼電器線圈等感性負載;采用標準邏輯電平信號控制;具有兩個使能控制端,在不受輸入信號影響的情況下允許或禁止器件工作有一個邏輯電源輸入端,使內部邏輯電路部分在低電壓下工作;可以外接檢測電阻,將變化量反饋給控制電路。使用L298N芯片驅動電機可以控制兩路電機。
紅外模塊:
紅外傳感器黑線的檢測原理是紅外發射管發射光線到路面,紅外光遇到白底則被反射,接收管接收到反射光,經施密特觸發器整形后輸出低電平;當紅外光遇到黑線時則被吸收,接收管沒有接收到反射光
51單片機:
AT89C51單片機是把那些作為控制應用所必需的基本內容都集成在一個尺寸有限的集成電路芯片上。如果按功能劃分,它由如下功能部件組成,即微處理器(CPU)、數據存儲器(RAM)、程序存儲器(ROM)、并行I/O口(4個8位I/O口)、串行口、定時器/計數器、中斷系統及特殊功能寄存器。它們都是通過片內單一總線連接而成,其基本結構依舊是微處理器(CPU)加上外圍芯片的傳統結構模式。但對各種功能部件的控制是采用特殊功能寄存器的集中控制方式,以實現不同的功能
7805穩壓:
7805三端穩壓集成電路,電子產品中,常見的三端穩壓集成電路有正電壓輸出的78 ×× 系列和負電壓輸出的79××系列。顧名思義,三端IC是指這種穩壓用的集成電路,只有三條引腳輸出,分別是輸入端、接地端和輸出端。
軟件編程
程序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++);
}
} //延時函數}
void straight() //走直線函數
{
left1=0;
left2=1;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_left() //左轉彎函數
{
left1=0;
left2=1;
right1=0;
right2=0;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void turn_right() //右轉彎函數
{
left1=0;
left2=0;
right1=0;
right2=1;
delay(3);
left1=0;
left2=0;
right1=0;
right2=0;
delay(14);
}
void tingzhi()//停止函數
{
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; //左右占空比標志
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() //走直線函數
{
pro_you=4;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_left() //左轉彎函數
{
pro_you=0;
pro_zuo=5;
left1=0;
left2=1;
right1=0;
right2=1;
}
void turn_right() //右轉彎函數
{
pro_you=5;
pro_zuo=0;
left1=0;
left2=1;
right1=0;
right2=1;
}
void tingzhi()//停止函數
{
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
{
} |