項目分工:
1、領料、焊接、板子的成型。
2、板子的裝接、調試。
3、程序的編寫與仿真
4、資料的收集與整理、實驗報告總結。
一、課題具體安排與實施實訓時間:第十六周到第十九周;
第十六周收集材料,板子成型;
第十七周寫程序;
第十八周調試、寫實驗報告;
第十九周答辯。
二、課題目標:1、掌握基于C51單片機、FPGA模數混合硬件系統設計和程序設計;
2、學會智能電子產品的功能設計與任務分析,能進行小型電子產品方案的設計;
3、通過智能循跡小車軟件系統設計,整機調試,設計、軟件性能并仿真調試;
4、培養團隊合作能力、溝通能力、創新能力以及組織能力。
三、課題要求: 1.基本要求
(1)輸入電源:12V;

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

電路原理方框圖
2、單片機控制系統模塊設計
我們采用AT89C52片機最小系統電路為整個系統的控制系統,它負責控制小車的運動狀態。
(1)啟動小車 小車在接收到FPGA送過來的啟動指令后,讀取尋跡信號,根據尋跡信號確定小車的運行狀態,將小車的運行狀態送至FPGA,同時根據相應算法,驅動小車的左右電機前進。 (2)正常前進 當尋跡板中間兩個傳感器檢測到黑線(任意一個檢測到黑線或兩個同時檢測到黑線),小車都正常前進。 (3) 左拐彎 當最左端的傳感器檢測到黑線,右端3個傳感器檢測到白色時,小車應左拐彎。 (4) 右拐彎 當最右端的傳感器檢測到黑線,左端3個傳感器檢測到白色時,小車應右拐彎。 (5)后退 當4個傳感器都檢測到白色,小車后退。 (6) 停車 當4個傳感器同時連續多次檢測到黑線(如連續3次),小車停車。小車停車后,發出一個停車標志信號送給FPGA。 3、尋跡模塊的設計
尋跡板送過來的4路檢測信號送到FPGA板,FPGA將此4路信號送出至4個LED燈顯示狀態(檢測至黑線亮,否則滅);同時將此4路信號送到單片機。

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

七、程序設計:1、單片機C語言程序設計: #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;}//右轉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;}//左轉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、循跡程序設計: #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; } } |