欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7996|回復: 1
收起左側

51紅外循跡小車

[復制鏈接]
ID:344502 發表于 2018-6-4 11:05 | 顯示全部樓層 |閱讀模式
項目分工:
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播放一首音樂,音樂播放結束即表示小車完成了任務。
6FPGA模塊的設計
1 尋跡信號處理
      尋跡板過來的信號一方面送到LED燈顯示尋跡狀態,另一方面要將此信號送到單片機去處理。
2 小車狀態顯示
      將小車的運行狀態用數碼管顯示出來。
3 提示音
      小車啟動前,發出3聲提示音。小車停車后播放一首音樂。
4 小車啟動
      小車在發出3聲提示音后,FPGA發出一個開始指令給單片機,從而啟動小車前進。
5 小車停車
      小車停車后,FPGA接收到單片機的停車指令,開始播放音樂,直到一首音樂播放完畢。
7、電機驅動模塊設計
  我們選用電機驅動芯片L298NL298N為單塊集成電路,高電壓,高電流,四通道驅動,可直接是對電機進行控制,無需隔離電路,通過單片機的I/O輸入改變控制端的電平,即可以對電機進行正反轉,停止的操作,非常方便,亦能滿足直流減速電機的大電流要求。調試時在依照上表,用程序輸入對應的碼值,能夠實現對應的動作。下表是其使能、輸入引腳和輸出引腳的邏輯關系。
EN A(B)
IN1 (IN3)
IN2 (IN4)
電機運行情況
H
H
L
正轉
H
L
H
反轉
H
IN2 (IN4)
IN1 (IN3)
快速停止
L
X
X
停止

六、軟件設計 智能小車的控制使用ATMEL公司的AT89C51單片機。程序設計上,通過對檢測信號的采集、分析數據,判斷出小車的運行狀態,進而控制小車沿黑線行駛。
   主程序流程圖



開始

開機指示

按鍵選擇

是否在直道?

檢測右轉?

檢測左轉?

是否檢測到全為白線?

停止按鈕

啟動按鈕

Y

直行

N

Y

左電機轉
小車右轉

N

N

N

Y

停止

左電機轉
小車右轉

Y



七、程序設計:
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;
       }
      
}

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:427288 發表于 2018-12-16 21:07 | 顯示全部樓層
如果配上備注的話那就是錦上添花了,謝謝樓主提供程序
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表