找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3387|回復(fù): 1
收起左側(cè)

HT6221智能小車(chē)的設(shè)計(jì)論文 含程序

[復(fù)制鏈接]
ID:208223 發(fā)表于 2017-6-6 16:01 | 顯示全部樓層 |閱讀模式
打開(kāi)小車(chē)開(kāi)關(guān)和攝像頭開(kāi)關(guān),然后手機(jī)連接到wifi信號(hào),通過(guò)將wifi接收器接收到的信號(hào)傳送給STC89C52,最后將信號(hào)傳送給小車(chē)和攝像頭進(jìn)行小車(chē)的移動(dòng)和攝像頭視頻的錄制。摘要隨著無(wú)線技術(shù)的發(fā)展及應(yīng)用,手機(jī)藍(lán)牙及wifi技術(shù)逐漸被應(yīng)用于人們生活中。針對(duì)現(xiàn)階段家電智能化的發(fā)展趨勢(shì),為了實(shí)現(xiàn)家電的智能化控制,本文設(shè)計(jì)了以單片機(jī)為控制核心,基于手機(jī)平臺(tái),利用WiFi技術(shù),無(wú)線WiFi模塊,單片機(jī)模塊,將攝像頭、小車(chē)與手機(jī)APP連接在一起,手機(jī)APP的操作指令通過(guò)WiFi無(wú)線傳輸給攝像頭內(nèi)部的芯片,進(jìn)而根據(jù)指令做出相應(yīng)改變。這種以無(wú)線連接為基礎(chǔ)的監(jiān)視控制系統(tǒng),不僅能夠?qū)崿F(xiàn)小車(chē)的無(wú)線控制,而且體現(xiàn)了區(qū)域自由的優(yōu)越性。

第一章 引言當(dāng)今世界,傳感器技術(shù)和自動(dòng)控制技術(shù)正在飛速發(fā)展,機(jī)械、電氣和電子信息已經(jīng)不再明顯分家,自動(dòng)控制在工業(yè)領(lǐng)域中的地位已經(jīng)越來(lái)越重要,“智能”這個(gè)詞也已經(jīng)成為了熱門(mén)詞匯。現(xiàn)在國(guó)外的自動(dòng)控制和傳感器技術(shù)已經(jīng)達(dá)到了很高的水平,特別是日本,比如日本本田制作的機(jī)器人,其仿人雙足行走已經(jīng)做得十分逼真,而且具有一定的學(xué)習(xí)能力,還據(jù)說(shuō)其智商已達(dá)到6歲兒童的水平。 而本次學(xué)校組織的智能循跡小車(chē)大賽也讓同學(xué)們能充分的參與到實(shí)際電子作品的設(shè)計(jì),制作中,同時(shí)也讓同學(xué)們能在實(shí)際制作中理解傳感器系統(tǒng),自動(dòng)控制系統(tǒng)。無(wú)容置疑,人才的培養(yǎng)不論是在國(guó)外還是國(guó)內(nèi),都開(kāi)始重視起來(lái),主要表現(xiàn)在大學(xué)生的各種大型的創(chuàng)新比賽,比如:亞洲廣播電視聯(lián)盟亞太地區(qū)機(jī)器人大賽(ABU ROBCON)、全國(guó)大學(xué)生“飛思卡爾”杯智能汽車(chē)競(jìng)賽等眾多重要競(jìng)賽都能很好的培養(yǎng)大學(xué)生對(duì)于電子,電路,自動(dòng)控制,傳感系統(tǒng)相關(guān)知識(shí)。學(xué)校此次的比賽對(duì)于我們來(lái)說(shuō)就是很好的一個(gè)平臺(tái),讓我們能更加的加強(qiáng)自己理論方面的知識(shí),同時(shí),增強(qiáng)理論與實(shí)踐相結(jié)合的發(fā)散性,創(chuàng)造性思維的能力。 第二章 系統(tǒng)方案2.1方案與選擇方案1:該智能車(chē)采用紅外傳感器對(duì)賽道進(jìn)行道路檢測(cè),單片機(jī)根據(jù)采集到的信號(hào)的不同狀態(tài)判斷小車(chē)當(dāng)前狀態(tài),通過(guò)電機(jī)驅(qū)動(dòng)芯片L298N發(fā)出控制命令,控制電機(jī)的工作狀態(tài)以實(shí)現(xiàn)對(duì)小車(chē)姿態(tài)的控制。方案2:該智能車(chē)采用HT6221芯片控制小車(chē)的移動(dòng),單片機(jī)根據(jù)控制器發(fā)出的信號(hào)做出相應(yīng)的移動(dòng),再加上小車(chē)上安裝了攝像頭對(duì)沿途的狀況記錄并傳送到手機(jī)上。綜合以上方案我們選擇方案2的設(shè)計(jì)。功能:                              由遙控器控制小車(chē)進(jìn)行移動(dòng),攝像機(jī)進(jìn)行拍攝。
第三章 硬件3.1最小系統(tǒng):小車(chē)采用atmel公司的AT89S52單片機(jī)作為控制芯片,圖1是其最小系統(tǒng)電路。主要包括:時(shí)鐘電路、電源電路、復(fù)位電路。其中各個(gè)部分的功能如下:1、時(shí)鐘電路:給單片機(jī)提供一個(gè)外接的16MHz的石英晶振。2、電源電路:給單片機(jī)提供5V電源。3、復(fù)位電路:在電壓達(dá)到正常值時(shí)給單片機(jī)一個(gè)復(fù)位信號(hào)。 圖2  單片機(jī)最小系統(tǒng)原理圖3.2遙控電路 HT6221/HT6222芯片是通用紅外遙控發(fā)射集成電路,采用CMOS工藝制造,最多可外接64個(gè)按鍵,并有三組雙重按鍵。封裝形式為SOP-24和SOP-20。 特點(diǎn):1. 低壓CMOS工藝制造。2. 工作電壓范圍寬。3.通過(guò)外部接法最多可產(chǎn)生65536種用戶(hù)碼。4. 可通過(guò)SEL管腳選擇,最多可支持128+6條指令碼。5.SOP-24、SOP-20、COB封裝形式可選。 圖3 控制電路圖 第四章 軟件設(shè)計(jì)移動(dòng)監(jiān)視車(chē)的設(shè)計(jì)包括兩部分,一部分是通過(guò)手機(jī)APP與wifi連接實(shí)現(xiàn)的攝像顯示,另一部分是通過(guò)HT6221芯片接受控制 信號(hào)進(jìn)行移動(dòng)。4.1 無(wú)線鏈接

4.2軟件流程圖
第五章 測(cè)試結(jié)果
將本電路用硬件做出來(lái),用編程器將KEIL軟件對(duì)源程序編譯生成的.HEX文件燒入AT89S52單片機(jī),將單片機(jī)插入到小車(chē)中,連好線。
將“控制模式”開(kāi)關(guān)選擇在“遙控”,打開(kāi)電源,小車(chē)在遙控器的控制下開(kāi)始移動(dòng),攝像頭也正常工作。
測(cè)試結(jié)果表明,本系統(tǒng)實(shí)現(xiàn)了預(yù)期功能。我們還想給小車(chē)添加自動(dòng)監(jiān)控的功能,遇到障礙進(jìn)行躲避。為了這一目標(biāo)我們繼續(xù)努力。












附錄
#include <REGX52.H> //包含51單片機(jī)相關(guān)的頭文件
#include <intrins.h>
sbit LeftLed=P2^0;                        //定義前方左側(cè)指示燈端口
sbit RightLed=P0^7;                       //定義前方右側(cè)指示燈端口
sbit FontLled=P1^7;
sbit LeftIR=P3^5;                         //定義前方左側(cè)紅外探頭端口
sbit RightIR=P3^6;                        //定義前方右側(cè)紅外探頭端口
sbit FontIR=P3^7;                         //定義前方正前方紅外探頭端口
sbit M1A=P0^0;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)A
sbit M1B=P0^1;                            //定義左側(cè)電機(jī)驅(qū)動(dòng)B
sbit M2A=P0^2;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)A
sbit M2B=P0^3;                            //定義右側(cè)電機(jī)驅(qū)動(dòng)B
sbit B1=P0^4;                             //定義語(yǔ)音識(shí)識(shí)別傳感器端口
sbit SB1=P0^6;                            //定義蜂鳴器端口
sbit IRIN=P3^3;                                       //定義紅外接收端口
unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定義數(shù)碼管顯示數(shù)據(jù)
                                   0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
unsigned char code  RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F};
unsigned char IRCOM[7];
static unsigned int LedFlash;                         //定義閃動(dòng)頻率計(jì)數(shù)變量
bit EnableLight=0;                                    //定義指示燈使能位
#define ShowPort P2                                   //定義數(shù)碼管顯示端口
unsigned char temp = 1;
void tingzhi()
{
   M1A=0;                                   //M1電機(jī)A端初始化為0
   M1B=0;                                   //M1電機(jī)B端初始化為0
   M2A=0;                                   //M2電機(jī)A端初始化為0
   M2B=0;
}
void qianjin()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=1;                                   
   M2B=0;
}
void houtui()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=0;                                   
   M2B=1;
}
void zuozhuan()
{
   M1A=0;                                   
   M1B=1;                                   
   M2A=1;                                   
   M2B=0;
}
void youzhuan()
{
   M1A=1;                                   
   M1B=0;                                   
   M2A=0;                                   
   M2B=1;
}
void Delay1ms(unsigned int i)
{
unsigned char j,k;
do{
  j = 10;
  do{
   k = 50;
   do{
    _nop_();
   }while(--k);     
  }while(--j);
}while(--i);
}
void delay_nus(unsigned int i)  //延時(shí):i>=12 ,i的最小延時(shí)單12 us
{
  i=i/10;
  while(--i);
}   
void delay_nms(unsigned int n)  //延時(shí)n ms
{
  n=n+1;
  while(--n)  
  delay_nus(900);         //延時(shí) 1ms,同時(shí)進(jìn)行補(bǔ)償
  
}  
void delayms(unsigned char x)                         //0.14mS延時(shí)程序
{
  unsigned char i;                                    //定義臨時(shí)變量
  while(x--)                                          //延時(shí)時(shí)間循環(huán)
  {
    for (i = 0; i<13; i++) {}                         //14mS延時(shí)
  }
}
void Delay()                                          //定義延時(shí)子程序
{
  unsigned int DelayTime=30000;                       //定義延時(shí)時(shí)間變量
  while(DelayTime--);                                 //開(kāi)始進(jìn)行延時(shí)循環(huán)
  return;                                             //子程序返回
}
void ControlCar(unsigned char ConType)    //定義電機(jī)控制子程序
{

  tingzhi();
switch(ConType)                          //判斷用戶(hù)設(shè)定電機(jī)形式
{
  case 1:  //前進(jìn)                         //判斷用戶(hù)是否選擇形式1
  {
    //tingzhi();                                                      //進(jìn)入前進(jìn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
         //Delay1ms(50);
         LeftLed = 0 ;
         qianjin();
    break;
  }
  case 2: //后退                          //判斷用戶(hù)是否選擇形式2
  {
   // tingzhi();                                                                //進(jìn)入后退之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
   // Delay1ms(50);
    LeftLed = 1 ;      
         houtui();                                //M2電機(jī)反轉(zhuǎn)
    break;
  }
  case 3: //左轉(zhuǎn)                          //判斷用戶(hù)是否選擇形式3
  {
     //tingzhi();                                                                            //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
         // Delay1ms(50);
          zuozhuan();                               //M2電機(jī)正轉(zhuǎn)
          break;
  }
  case 4: //右轉(zhuǎn)                          //判斷用戶(hù)是否選擇形式4
  {
   // tingzhi();                                                                      //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
//       Delay1ms(50);
         youzhuan();                                //M1電機(jī)正轉(zhuǎn)
                                          //M2電機(jī)反轉(zhuǎn)
         break;
  }
  case 8: //停止                          //判斷用戶(hù)是否選擇形式8
  {
    tingzhi();
         break;                                //退出當(dāng)前選擇
  }
}
}
void ControlCar_yaokong(unsigned char ConType)    //定義電機(jī)控制子程序       (紅外遙控單獨(dú)設(shè)置一個(gè) switch  case  語(yǔ)句  )
{

  tingzhi();
switch(ConType)                          //判斷用戶(hù)設(shè)定電機(jī)形式
{
  case 1:  //前進(jìn)                         //判斷用戶(hù)是否選擇形式1
  {
    tingzhi();                                                         //進(jìn)入前進(jìn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
         Delay1ms(150);
         LeftLed = 0 ;
         qianjin();
    break;
  }
  case 2: //后退                          //判斷用戶(hù)是否選擇形式2
  {
    tingzhi();                                                                  //進(jìn)入后退之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
    Delay1ms(150);
    LeftLed = 1 ;      
         houtui();                                //M2電機(jī)反轉(zhuǎn)
    break;
  }
  case 3: //左轉(zhuǎn)                          //判斷用戶(hù)是否選擇形式3
  {
     tingzhi();                                                                     //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
          Delay1ms(150);
          zuozhuan();                               //M2電機(jī)正轉(zhuǎn)
          break;
  }
  case 4: //右轉(zhuǎn)                          //判斷用戶(hù)是否選擇形式4
  {
     tingzhi();                                                                     //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間  防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位
          Delay1ms(150);
     youzhuan();                                //M1電機(jī)正轉(zhuǎn)  //M2電機(jī)反轉(zhuǎn)
         break;
  }
  case 8: //停止                          //判斷用戶(hù)是否選擇形式8
  {
    tingzhi();
         break;                                //退出當(dāng)前選擇
  }
}
}
void Robot_Avoidance()                   //機(jī)器人避障子程序
{
   LeftLed=LeftIR;                        //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài)
   RightLed=RightIR;                      //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài)
   FontLled= FontIR;
   SB1=FontIR;
    if(FontIR == 0)                          //如果前面避障傳感器檢測(cè)到障礙物
   {
      ControlCar(8);                       //停止
      delay_nms (300);                                           //停止300MS   防止電機(jī)反相電壓沖擊  導(dǎo)致系統(tǒng)復(fù)位
           ControlCar(2);                                               //后退  
           delay_nms (1000);                                                 //后退1500MS  
           ControlCar(3);                                               //
           delay_nms (1800);        
  }
   else
   {
      ControlCar(1);                      //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }
    ControlCar(1);
}
//機(jī)器人循跡子程序
void Robot_Traction()                     //機(jī)器人循跡子程序
{
   LeftLed=LeftIR;                        //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài)
   RightLed=RightIR;                      //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài)
   FontLled= FontIR;
   SB1=LeftIR;
   if(LeftIR == 0 && RightIR == 0)    //三個(gè)紅外檢測(cè)到黑線,就前進(jìn)
   {
      ControlCar(1);                      //左側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向右轉(zhuǎn)一定的角度
      delay_nms (10);
   }
   
   else if(LeftIR == 0 && RightIR == 1)
   {
      ControlCar(3);                      //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }
   else if(LeftIR == 1 && RightIR == 0)
   {
      ControlCar(4);                      //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度
      delay_nms (10);
   }
    ControlCar(8);
}
void main()                               //主程序入口
{
  
  bit RunFlag=0;                          //定義小車(chē)運(yùn)行標(biāo)志位
  LedFlash=3000;                                       //對(duì)閃燈數(shù)據(jù)進(jìn)行初始化
  //EX1=1;                                               //同意開(kāi)啟外部中斷1
  IT1=1;                                               //設(shè)定外部中斷1為低邊緣觸發(fā)類(lèi)型
  EA=1;                                                //總中斷開(kāi)啟
  ControlCar(8);                          //初始化小車(chē)運(yùn)行狀態(tài)
  while(1)                                //程序主循環(huán)
  {
        if(P3_2 == 0)
           {
            delay_nms(10);
            if(P3_2 == 0)
            {
                 temp++;
                     while(!P3_2);
            }
           }
           if(temp > 3)
           {
           temp = 1;
           }
           switch(temp)
           {
               case 1:      ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break;
                   case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break;
                   case 3: ShowPort = LedShowData[3];EX1 = 1;break;
           }
  }
}
//----------紅外遙控-------------------------------------------------------------
void IR_IN() interrupt 2 using 0                      //定義INT2外部中斷函數(shù)
{
  unsigned char j,k,N=0;                              //定義臨時(shí)接收變量
   
  EX1 = 0;                                            //關(guān)閉外部中斷,防止再有信號(hào)到達(dá)   
  delayms(15);                                        //延時(shí)時(shí)間,進(jìn)行紅外消抖
  if (IRIN==1)                                        //判斷紅外信號(hào)是否消失
  {  
     EX1 =1;                                          //外部中斷開(kāi)
          return;                                          //返回
  }
                           
  while (!IRIN)                                       //IR變?yōu)楦唠娖,跳過(guò)9ms的前導(dǎo)低電平信號(hào)。
  {
      delayms(1);                                     //延時(shí)等待
  }
  for (j=0;j<4;j++)                                   //采集紅外遙控器數(shù)據(jù)
  {
    for (k=0;k<8;k++)                                 //分次采集8位數(shù)據(jù)
    {
       while (IRIN)                                   // IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。
       {
         delayms(1);                                  //延時(shí)等待
       }
      
       while (!IRIN)                                  // IR 變?yōu)楦唠娖?/font>
       {
         delayms(1);                                  //延時(shí)等待
       }
   
       while (IRIN)                                   //計(jì)算IR高電平時(shí)長(zhǎng)
       {
         delayms(1);                                  //延時(shí)等待
         N++;                                         //計(jì)數(shù)器加加
         if (N>=30)                                   //判斷計(jì)數(shù)器累加值
              {
           EX1=1;                                     //打開(kāi)外部中斷功能
                return;                                    //返回
         }                  
       }
                                       
      IRCOM[j]=IRCOM[j] >> 1;                         //進(jìn)行數(shù)據(jù)位移操作并自動(dòng)補(bǔ)零
     
      if (N>=8)                                       //判斷數(shù)據(jù)長(zhǎng)度
      {
         IRCOM[j] = IRCOM[j] | 0x80;                  //數(shù)據(jù)最高位補(bǔ)1
      }
      N=0;                                            //清零位數(shù)計(jì)錄器
    }
  }
   
  if (IRCOM[2]!=~IRCOM[3])                            //判斷地址碼是否相同
  {
     EX1=1;                                           //打開(kāi)外部中斷
     return;                                          //返回
  }
  for(j=0;j<10;j++)                                   //循環(huán)進(jìn)行鍵碼解析
   {
      if(IRCOM[2]==RecvData[j])                       //進(jìn)行鍵位對(duì)應(yīng)
      {
       // ControlCar(j);
                   ControlCar_yaokong(j);                               //數(shù)碼管顯示相應(yīng)數(shù)碼
      }
   }
   EX1 = 1;                                           //外部中斷開(kāi)
}
回復(fù)

使用道具 舉報(bào)

ID:720168 發(fā)表于 2021-1-21 16:08 | 顯示全部樓層
請(qǐng)問(wèn)你HT6221這個(gè)16按鍵遙控器做出來(lái)了嗎,可以請(qǐng)教一下嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表