找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2777|回复: 1
打印 上一主题 下一主题
收起左侧

HT6221智能小车的设计论文 含程序

[复制链接]
跳转到指定楼层
楼主
ID:208223 发表于 2017-6-6 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
打开小车开关和摄像头开关,然后手机连接到wifi信号,通过将wifi接收器接收到的信号传送给STC89C52,最后将信号传送给小车和摄像头进行小车的移动和摄像头视频的录制。摘要随着无线技术的发展及应用,手机蓝牙及wifi技术逐渐被应用于人们生活中。针对现阶段家电智能化的发展趋势,为了实现家电的智能化控制,本文设计了以单片机为控制核心,基于手机平台,利用WiFi技术,无线WiFi模块,单片机模块,将摄像头、小车与手机APP连接在一起,手机APP的操作指令通过WiFi无线传输给摄像头内部的芯片,进而根据指令做出相应改变。这种以无线连接为基础的监视控制系统,不仅能够实现小车的无线控制,而且体现了区域自由的优越性。

第一章 引言当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。 而本次学校组织的智能循迹小车大赛也让同学们能充分的参与到实际电子作品的设计,制作中,同时也让同学们能在实际制作中理解传感器系统,自动控制系统。无容置疑,人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛(ABU ROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于电子,电路,自动控制,传感系统相关知识。学校此次的比赛对于我们来说就是很好的一个平台,让我们能更加的加强自己理论方面的知识,同时,增强理论与实践相结合的发散性,创造性思维的能力。 第二章 系统方案2.1方案与选择方案1:该智能车采用红外传感器对赛道进行道路检测,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。方案2:该智能车采用HT6221芯片控制小车的移动,单片机根据控制器发出的信号做出相应的移动,再加上小车上安装了摄像头对沿途的状况记录并传送到手机上。综合以上方案我们选择方案2的设计。功能:                              由遥控器控制小车进行移动,摄像机进行拍摄。
第三章 硬件3.1最小系统:小车采用atmel公司的AT89S52单片机作为控制芯片,图1是其最小系统电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:1、时钟电路:给单片机提供一个外接的16MHz的石英晶振。2、电源电路:给单片机提供5V电源。3、复位电路:在电压达到正常值时给单片机一个复位信号。 图2  单片机最小系统原理图3.2遥控电路 HT6221/HT6222芯片是通用红外遥控发射集成电路,采用CMOS工艺制造,最多可外接64个按键,并有三组双重按键。封装形式为SOP-24和SOP-20。 特点:1. 低压CMOS工艺制造。2. 工作电压范围宽。3.通过外部接法最多可产生65536种用户码。4. 可通过SEL管脚选择,最多可支持128+6条指令码。5.SOP-24、SOP-20、COB封装形式可选。 图3 控制电路图 第四章 软件设计移动监视车的设计包括两部分,一部分是通过手机APP与wifi连接实现的摄像显示,另一部分是通过HT6221芯片接受控制 信号进行移动。4.1 无线链接

4.2软件流程图
第五章 测试结果
将本电路用硬件做出来,用编程器将KEIL软件对源程序编译生成的.HEX文件烧入AT89S52单片机,将单片机插入到小车中,连好线。
将“控制模式”开关选择在“遥控”,打开电源,小车在遥控器的控制下开始移动,摄像头也正常工作。
测试结果表明,本系统实现了预期功能。我们还想给小车添加自动监控的功能,遇到障碍进行躲避。为了这一目标我们继续努力。












附录
#include <REGX52.H> //包含51单片机相关的头文件
#include <intrins.h>
sbit LeftLed=P2^0;                        //定义前方左侧指示灯端口
sbit RightLed=P0^7;                       //定义前方右侧指示灯端口
sbit FontLled=P1^7;
sbit LeftIR=P3^5;                         //定义前方左侧红外探头端口
sbit RightIR=P3^6;                        //定义前方右侧红外探头端口
sbit FontIR=P3^7;                         //定义前方正前方红外探头端口
sbit M1A=P0^0;                            //定义左侧电机驱动A
sbit M1B=P0^1;                            //定义左侧电机驱动B
sbit M2A=P0^2;                            //定义右侧电机驱动A
sbit M2B=P0^3;                            //定义右侧电机驱动B
sbit B1=P0^4;                             //定义语音识识别传感器端口
sbit SB1=P0^6;                            //定义蜂鸣器端口
sbit IRIN=P3^3;                                       //定义红外接收端口
unsigned char code  LedShowData[]={0x03,0x9F,0x25,0x0D,0x99,  //定义数码管显示数据
                                   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;                         //定义闪动频率计数变量
bit EnableLight=0;                                    //定义指示灯使能位
#define ShowPort P2                                   //定义数码管显示端口
unsigned char temp = 1;
void tingzhi()
{
   M1A=0;                                   //M1电机A端初始化为0
   M1B=0;                                   //M1电机B端初始化为0
   M2A=0;                                   //M2电机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)  //延时:i>=12 ,i的最小延时单12 us
{
  i=i/10;
  while(--i);
}   
void delay_nms(unsigned int n)  //延时n ms
{
  n=n+1;
  while(--n)  
  delay_nus(900);         //延时 1ms,同时进行补偿
  
}  
void delayms(unsigned char x)                         //0.14mS延时程序
{
  unsigned char i;                                    //定义临时变量
  while(x--)                                          //延时时间循环
  {
    for (i = 0; i<13; i++) {}                         //14mS延时
  }
}
void Delay()                                          //定义延时子程序
{
  unsigned int DelayTime=30000;                       //定义延时时间变量
  while(DelayTime--);                                 //开始进行延时循环
  return;                                             //子程序返回
}
void ControlCar(unsigned char ConType)    //定义电机控制子程序
{

  tingzhi();
switch(ConType)                          //判断用户设定电机形式
{
  case 1:  //前进                         //判断用户是否选择形式1
  {
    //tingzhi();                                                      //进入前进之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
         //Delay1ms(50);
         LeftLed = 0 ;
         qianjin();
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  {
   // tingzhi();                                                                //进入后退之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
   // Delay1ms(50);
    LeftLed = 1 ;      
         houtui();                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  {
     //tingzhi();                                                                            //进入左转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
         // Delay1ms(50);
          zuozhuan();                               //M2电机正转
          break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  {
   // tingzhi();                                                                      //进入右转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
//       Delay1ms(50);
         youzhuan();                                //M1电机正转
                                          //M2电机反转
         break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    tingzhi();
         break;                                //退出当前选择
  }
}
}
void ControlCar_yaokong(unsigned char ConType)    //定义电机控制子程序       (红外遥控单独设置一个 switch  case  语句  )
{

  tingzhi();
switch(ConType)                          //判断用户设定电机形式
{
  case 1:  //前进                         //判断用户是否选择形式1
  {
    tingzhi();                                                         //进入前进之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
         Delay1ms(150);
         LeftLed = 0 ;
         qianjin();
    break;
  }
  case 2: //后退                          //判断用户是否选择形式2
  {
    tingzhi();                                                                  //进入后退之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
    Delay1ms(150);
    LeftLed = 1 ;      
         houtui();                                //M2电机反转
    break;
  }
  case 3: //左转                          //判断用户是否选择形式3
  {
     tingzhi();                                                                     //进入左转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
          Delay1ms(150);
          zuozhuan();                               //M2电机正转
          break;
  }
  case 4: //右转                          //判断用户是否选择形式4
  {
     tingzhi();                                                                     //进入右转之前 先停止一段时间  防止电机反向电压冲击主板 导致系统复位
          Delay1ms(150);
     youzhuan();                                //M1电机正转  //M2电机反转
         break;
  }
  case 8: //停止                          //判断用户是否选择形式8
  {
    tingzhi();
         break;                                //退出当前选择
  }
}
}
void Robot_Avoidance()                   //机器人避障子程序
{
   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   FontLled= FontIR;
   SB1=FontIR;
    if(FontIR == 0)                          //如果前面避障传感器检测到障碍物
   {
      ControlCar(8);                       //停止
      delay_nms (300);                                           //停止300MS   防止电机反相电压冲击  导致系统复位
           ControlCar(2);                                               //后退  
           delay_nms (1000);                                                 //后退1500MS  
           ControlCar(3);                                               //
           delay_nms (1800);        
  }
   else
   {
      ControlCar(1);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }
    ControlCar(1);
}
//机器人循迹子程序
void Robot_Traction()                     //机器人循迹子程序
{
   LeftLed=LeftIR;                        //前方左侧指示灯指示出前方左侧红外探头状态
   RightLed=RightIR;                      //前方右侧指示灯指示出前方右侧红外探头状态
   FontLled= FontIR;
   SB1=LeftIR;
   if(LeftIR == 0 && RightIR == 0)    //三个红外检测到黑线,就前进
   {
      ControlCar(1);                      //左侧没有信号时,开始向右转一定的角度
      delay_nms (10);
   }
   
   else if(LeftIR == 0 && RightIR == 1)
   {
      ControlCar(3);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }
   else if(LeftIR == 1 && RightIR == 0)
   {
      ControlCar(4);                      //右侧没有信号时,开始向左转一定的角度
      delay_nms (10);
   }
    ControlCar(8);
}
void main()                               //主程序入口
{
  
  bit RunFlag=0;                          //定义小车运行标志位
  LedFlash=3000;                                       //对闪灯数据进行初始化
  //EX1=1;                                               //同意开启外部中断1
  IT1=1;                                               //设定外部中断1为低边缘触发类型
  EA=1;                                                //总中断开启
  ControlCar(8);                          //初始化小车运行状态
  while(1)                                //程序主循环
  {
        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外部中断函数
{
  unsigned char j,k,N=0;                              //定义临时接收变量
   
  EX1 = 0;                                            //关闭外部中断,防止再有信号到达   
  delayms(15);                                        //延时时间,进行红外消抖
  if (IRIN==1)                                        //判断红外信号是否消失
  {  
     EX1 =1;                                          //外部中断开
          return;                                          //返回
  }
                           
  while (!IRIN)                                       //IR变为高电平,跳过9ms的前导低电平信号。
  {
      delayms(1);                                     //延时等待
  }
  for (j=0;j<4;j++)                                   //采集红外遥控器数据
  {
    for (k=0;k<8;k++)                                 //分次采集8位数据
    {
       while (IRIN)                                   // IR 变为低电平,跳过4.5ms的前导高电平信号。
       {
         delayms(1);                                  //延时等待
       }
      
       while (!IRIN)                                  // IR 变为高电平
       {
         delayms(1);                                  //延时等待
       }
   
       while (IRIN)                                   //计算IR高电平时长
       {
         delayms(1);                                  //延时等待
         N++;                                         //计数器加加
         if (N>=30)                                   //判断计数器累加值
              {
           EX1=1;                                     //打开外部中断功能
                return;                                    //返回
         }                  
       }
                                       
      IRCOM[j]=IRCOM[j] >> 1;                         //进行数据位移操作并自动补零
     
      if (N>=8)                                       //判断数据长度
      {
         IRCOM[j] = IRCOM[j] | 0x80;                  //数据最高位补1
      }
      N=0;                                            //清零位数计录器
    }
  }
   
  if (IRCOM[2]!=~IRCOM[3])                            //判断地址码是否相同
  {
     EX1=1;                                           //打开外部中断
     return;                                          //返回
  }
  for(j=0;j<10;j++)                                   //循环进行键码解析
   {
      if(IRCOM[2]==RecvData[j])                       //进行键位对应
      {
       // ControlCar(j);
                   ControlCar_yaokong(j);                               //数码管显示相应数码
      }
   }
   EX1 = 1;                                           //外部中断开
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:720168 发表于 2021-1-21 16:08 | 只看该作者
请问你HT6221这个16按键遥控器做出来了吗,可以请教一下吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表