項(xiàng)目分工:
1、領(lǐng)料、焊接、板子的成型。
2、板子的裝接、調(diào)試。
3、程序的編寫(xiě)與仿真
4、資料的收集與整理、實(shí)驗(yàn)報(bào)告總結(jié)。
一、課題具體安排與實(shí)施實(shí)訓(xùn)時(shí)間:第十六周到第十九周;
第十六周收集材料,板子成型;
第十七周寫(xiě)程序;
第十八周調(diào)試、寫(xiě)實(shí)驗(yàn)報(bào)告;
第十九周答辯。
二、課題目標(biāo):1、掌握基于C51單片機(jī)、FPGA模數(shù)混合硬件系統(tǒng)設(shè)計(jì)和程序設(shè)計(jì);
2、學(xué)會(huì)智能電子產(chǎn)品的功能設(shè)計(jì)與任務(wù)分析,能進(jìn)行小型電子產(chǎn)品方案的設(shè)計(jì);
3、通過(guò)智能循跡小車(chē)軟件系統(tǒng)設(shè)計(jì),整機(jī)調(diào)試,設(shè)計(jì)、軟件性能并仿真調(diào)試;
4、培養(yǎng)團(tuán)隊(duì)合作能力、溝通能力、創(chuàng)新能力以及組織能力。
三、課題要求: 1.基本要求
(1)輸入電源:12V;

(2)具有前進(jìn)、左轉(zhuǎn)、右轉(zhuǎn)、自動(dòng)停車(chē)的功能;
(3)能根據(jù)提供的8字循跡路線進(jìn)行尋跡。
2.發(fā)揮部分
(1)按鍵啟動(dòng); (2)轉(zhuǎn)向提示; (3)鳴號(hào)提示; 摘要:本循跡小車(chē)是AT89C51單片機(jī)為控制核心,加以直流電機(jī),電源電路以及其他電路構(gòu)成。系統(tǒng)AT89C51通過(guò)I/O控制小車(chē)前進(jìn)及轉(zhuǎn)向。尋跡由光敏電阻組成光敏探測(cè)器完成。
四、小車(chē)循跡原理: 本智能循跡小車(chē)以AT89C51單片機(jī)為核心控制系統(tǒng),用光敏電阻組成光敏探測(cè)器。光敏電阻的阻值可以跟隨周?chē)h(huán)境光線的變化而變化。當(dāng)光線照射到白線上面時(shí),光線反射強(qiáng)烈,光線照射到黑線上面時(shí),光線反射較弱。因此光敏在白線和黑線上面上方時(shí),阻值會(huì)發(fā)生明顯的變化。將阻值的變化值經(jīng)過(guò)比較器就可以輸出高低電平。經(jīng)單片機(jī)處理后,輸出控制信號(hào)給電機(jī)驅(qū)動(dòng)電路,來(lái)控制電機(jī)的驅(qū)動(dòng)。所以整個(gè)過(guò)程不需要人來(lái)控制,當(dāng)不同的光敏電阻檢測(cè)到黑線時(shí),電機(jī)會(huì)有不同的轉(zhuǎn)動(dòng)方向。從而實(shí)現(xiàn)了簡(jiǎn)單的智能控制。
五、硬件設(shè)計(jì)1、總體設(shè)計(jì)

電路原理方框圖
2、單片機(jī)控制系統(tǒng)模塊設(shè)計(jì)
我們采用AT89C52片機(jī)最小系統(tǒng)電路為整個(gè)系統(tǒng)的控制系統(tǒng),它負(fù)責(zé)控制小車(chē)的運(yùn)動(dòng)狀態(tài)。
(1)啟動(dòng)小車(chē) 小車(chē)在接收到FPGA送過(guò)來(lái)的啟動(dòng)指令后,讀取尋跡信號(hào),根據(jù)尋跡信號(hào)確定小車(chē)的運(yùn)行狀態(tài),將小車(chē)的運(yùn)行狀態(tài)送至FPGA,同時(shí)根據(jù)相應(yīng)算法,驅(qū)動(dòng)小車(chē)的左右電機(jī)前進(jìn)。 (2)正常前進(jìn) 當(dāng)尋跡板中間兩個(gè)傳感器檢測(cè)到黑線(任意一個(gè)檢測(cè)到黑線或兩個(gè)同時(shí)檢測(cè)到黑線),小車(chē)都正常前進(jìn)。 (3) 左拐彎 當(dāng)最左端的傳感器檢測(cè)到黑線,右端3個(gè)傳感器檢測(cè)到白色時(shí),小車(chē)應(yīng)左拐彎。 (4) 右拐彎 當(dāng)最右端的傳感器檢測(cè)到黑線,左端3個(gè)傳感器檢測(cè)到白色時(shí),小車(chē)應(yīng)右拐彎。 (5)后退 當(dāng)4個(gè)傳感器都檢測(cè)到白色,小車(chē)后退。 (6) 停車(chē) 當(dāng)4個(gè)傳感器同時(shí)連續(xù)多次檢測(cè)到黑線(如連續(xù)3次),小車(chē)停車(chē)。小車(chē)停車(chē)后,發(fā)出一個(gè)停車(chē)標(biāo)志信號(hào)送給FPGA。 3、尋跡模塊的設(shè)計(jì)
尋跡板送過(guò)來(lái)的4路檢測(cè)信號(hào)送到FPGA板,F(xiàn)PGA將此4路信號(hào)送出至4個(gè)LED燈顯示狀態(tài)(檢測(cè)至黑線亮,否則滅);同時(shí)將此4路信號(hào)送到單片機(jī)。

4、顯示模塊的設(shè)計(jì)
我們采用的是數(shù)碼管顯示。 (1) 小車(chē)啟動(dòng) 小車(chē)啟動(dòng)時(shí),顯示“1”。 (2)小車(chē)左拐 小車(chē)左拐時(shí),顯示“2”。 (3) 小車(chē)右拐 小車(chē)右拐時(shí),顯示“3”。 (4)小車(chē)前進(jìn) 小車(chē)前進(jìn)時(shí),顯示“4”。 (5) 小車(chē)后退 小車(chē)后退時(shí),顯示“5”。 (6) 停車(chē) 小車(chē)停車(chē)時(shí),顯示“6”。
5、提示音模塊的設(shè)計(jì)
(1) 小車(chē)啟動(dòng) 小車(chē)啟動(dòng)前發(fā)出3聲“嘟、嘟、嘟”的聲音,提示音結(jié)束后,F(xiàn)PGA發(fā)出一個(gè)啟動(dòng)信號(hào)給單片機(jī),從而啟動(dòng)小車(chē)。 (2) 停車(chē) 小車(chē)停車(chē)時(shí),F(xiàn)PGA播放一首音樂(lè),音樂(lè)播放結(jié)束即表示小車(chē)完成了任務(wù)。 6、FPGA模塊的設(shè)計(jì) (1) 尋跡信號(hào)處理 尋跡板過(guò)來(lái)的信號(hào)一方面送到LED燈顯示尋跡狀態(tài),另一方面要將此信號(hào)送到單片機(jī)去處理。 (2) 小車(chē)狀態(tài)顯示 將小車(chē)的運(yùn)行狀態(tài)用數(shù)碼管顯示出來(lái)。 (3) 提示音 小車(chē)啟動(dòng)前,發(fā)出3聲提示音。小車(chē)停車(chē)后播放一首音樂(lè)。 (4) 小車(chē)啟動(dòng) 小車(chē)在發(fā)出3聲提示音后,FPGA發(fā)出一個(gè)開(kāi)始指令給單片機(jī),從而啟動(dòng)小車(chē)前進(jìn)。 (5) 小車(chē)停車(chē) 小車(chē)停車(chē)后,FPGA接收到單片機(jī)的停車(chē)指令,開(kāi)始播放音樂(lè),直到一首音樂(lè)播放完畢。 7、電機(jī)驅(qū)動(dòng)模塊設(shè)計(jì) 我們選用電機(jī)驅(qū)動(dòng)芯片L298N。L298N為單塊集成電路,高電壓,高電流,四通道驅(qū)動(dòng),可直接是對(duì)電機(jī)進(jìn)行控制,無(wú)需隔離電路,通過(guò)單片機(jī)的I/O輸入改變控制端的電平,即可以對(duì)電機(jī)進(jìn)行正反轉(zhuǎn),停止的操作,非常方便,亦能滿足直流減速電機(jī)的大電流要求。調(diào)試時(shí)在依照上表,用程序輸入對(duì)應(yīng)的碼值,能夠?qū)崿F(xiàn)對(duì)應(yīng)的動(dòng)作。下表是其使能、輸入引腳和輸出引腳的邏輯關(guān)系。
六、軟件設(shè)計(jì) 智能小車(chē)的控制使用ATMEL公司的AT89C51單片機(jī)。程序設(shè)計(jì)上,通過(guò)對(duì)檢測(cè)信號(hào)的采集、分析數(shù)據(jù),判斷出小車(chē)的運(yùn)行狀態(tài),進(jìn)而控制小車(chē)沿黑線行駛。
主程序流程圖

左電機(jī)轉(zhuǎn) 小車(chē)右轉(zhuǎn)
|
左電機(jī)轉(zhuǎn) 小車(chē)右轉(zhuǎn)
|
七、程序設(shè)計(jì):1、單片機(jī)C語(yǔ)言程序設(shè)計(jì): #include<reg51.h> #define uchar unsigned char #define uint unsigned int unsigned char w0=0; unsigned char w1=0; unsigned char t=0; sbit RT1=P1^0; sbit RT2=P1^1; sbit LT1=P1^2; sbit LT2=P1^3; sbit IN1=P0^0; sbit IN2=P0^1; sbit IN3=P0^2; sbit IN4=P0^3; sbit ENA=P0^4; sbit ENB=P0^5; void delay(int z) { while(z--); } void init() { TMOD=0x01; TH0=(65536-100)/256; TL0=(65536-100)%256; EA=1; ET0=1; TR0=1; } void time0()interrupt 1 { if(t<w0) ENA=1; else ENA=0; if(t<w1) ENB=1; else ENB=0; t++; if(t>=100) {t=0;} } void qianjin() { w0=30; w1=30; } void turn_left1() {w0=0; w1=50; } void turn_left2() {w0=0; w1=60; } void turn_right1() {w0=50; w1=0; } void turn_right2() {w0=60; w1=0; } void xunji() { uchar flag; if((RT1==1)&&(RT2==1)&&(LT1==1)&&(LT2==1)) {flag=0;}//直行 else if((RT1==0)&&(RT2==1)&&(LT1==1)&&(LT2==1)) {flag=1;}//右轉(zhuǎn)1 else if((RT1==0)&&(RT2==0)&&(LT1==1)&&(LT2==1)) {flag=2;}//2 else if((RT1==1)&&(RT2==1)&&(LT1==0)&&(LT2==1)) {flag=3;}//左轉(zhuǎn)1 else if((RT1==1)&&(RT2==1)&&(LT1==0)&&(LT2==0)) {flag=4;}//2 switch(flag) { case0:qianjin(); break; case1:turn_righ1t(); break; case2:turn_right2(); break; case3:turn_left1(); break; case4:turn_left2(); break; } } void main() {init(); w0=30; w1=30; while(1) { IN1=1; IN2=0; IN3=1; IN4=0; ENA=1; ENB=1; while(1) {xunji(); } } } 2、循跡程序設(shè)計(jì): #include<reg52.h> #define uchar unsigned char #define uint unsigned int uint tt=0,flag=0,flag1=0,flag2=0,num=0; sbit in1=P2^0; sbit in2=P2^1; sbit in3=P2^2; sbit in4=P2^3; sbit a=P0^0; sbit b=P0^1; sbit c=P0^2; sbit d=P0^3; sbit ENA=P2^4; sbit ENB=P2^5; sbit control=P1^0; sbit FPGA1=P1^1; sbit FPGA2=P1^2; sbit FPGA3=P1^3; sbit FPGA4=P1^4; sbit buzzer=P1^5; void init_time(); void delay(unsigned int z); void Turn_left() { in1=0; in2=0; in3=1; in4=0; } void Turn_right() { in1=1; in2=0; in3=0; in4=0; } void Go() { in1=1; in2=0; in3=1; in4=0; } void Back() { in1=0; in2=1; in3=0; in4=1; } void Stop() { in1=1; in2=1; in3=1; in4=1; } void Go_left_right() { in1=1; in2=0; in3=0; in4=1; } /*void Go_right() { in1=0; in2=1; in3=0; in4=0; }*/ void FPGA_display() { FPGA1=a; FPGA2=b; FPGA3=c; FPGA4=d; } void FPGA_display1() { FPGA1=a&0; FPGA2=b|1; FPGA3=c|1; FPGA4=d&0; } void main() { uint i=10; init_time(); delay(2); control=0; buzzer=1; //P0=0xff; //P1=0xff; //delay(2000); //delay(2000); //Go(); //delay(100); while(!control) { delay(2); FPGA_display1(); //delay(200); //delay(200); } if(control==1) { delay(300); Go(); delay(100); Go(); delay(100); while(2) { if((a==0&&b==0&&c==1&&d==1)||(a==0&&b==0&&c==0&&d==1)||(a==0&&b==0&&c==1&&d==0)) Turn_right();FPGA_display(); delay(30); if((a==1&&b==1&&c==0&&d==0)||(a==1&&b==0&&c==0&&d==0)||(a==0&&b==1&&c==0&&d==0)) Turn_left();FPGA_display(); delay(30); if(a==0&&b==1&&c==1&&d==0) Go();FPGA_display(); delay(9); if(a==0&&b==0&&c==0&&d==0) { Back();FPGA_display(); delay(10); Back(); delay(10); Back(); flag1++; flag2++; if(flag2==13) flag2=0; if(flag1==8) flag1=0; } if(flag1==7) { flag1=0; Go(); delay(60); Go(); delay(60); Go(); delay(60); Go(); delay(60); } delay(5); if(a==1&&b==1&&c==1&&d==1) { flag++; if(flag==12) flag=4; } if(flag==1||flag==2||flag==3) { Stop(); //Turn_right(); delay(100); Stop(); delay(100); Back(); delay(100); Back(); delay(100); Back(); delay(300); Back(); delay(300); Turn_right(); delay(500); Turn_right(); delay(500); Turn_right(); delay(500); //Back(); //delay(200); //Turn_left(); Turn_right(); delay(500); //Turn_left(); Turn_right(); delay(400); //Turn_left(); Turn_right(); delay(300); //Turn_left(); Turn_right(); delay(200); flag=4; Go(); delay(10); } //if(flag>=2) //{ // Go(); // delay(50); //} //Go(); //Back(); } } } void delay(unsigned int z) { unsigned int i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } void init_time() { TMOD=0x01; TH0=(65536-25000)/256; TL0=(65536-25000)%256; EA=1; TR0=1; ET0=1; } void time_0(void) interrupt 1 { TH0=(65536-20000)/256; TL0=(65536-20000)%256; tt++; num++; if(num==500) { num=0; buzzer=0; } //delay(1); if(tt>=9) tt=0; if(tt<=4) { ENA=1; ENB=1; } else { ENA=0; ENB=0; } } |