红外遥控及智能小车程序

发布者:知音学友最新更新时间:2012-08-18 来源: 51hei关键字:红外遥控  智能小车  传感器  电机 手机看文章 扫描二维码
随时随地手机看文章
#include
#define uchar unsigned char
#define uint  unsigned int
sbit inl1=P2^0;   //左电机输出1
sbit inl2=P2^1;   //左电机输出2
sbit inr1=P2^2;   //右电机输出1
sbit inr2=P2^3;   //右电机输出2
sbit s_left=P2^4; //左传感器
sbit s_right=P2^5; //右传感器
sbit s_mid=P2^6;  // 中间传感器
sbit barrier=P2^7;//障碍物扫描传感器
sbit beep=P1^0;//探到铁报警接蜂鸣器
uint b_count=0;// 障碍物扫描位置基数
uchar alter_time=0;//报警计数值
uchar go_go=1;//小车前进中断标志
sbit  left_light=P1^2;
sbit  right_light=P1^1;
uchar second=0;
sbit P32=P3^2;
uchar b_left,b_right;
/****红外遥控程勋数据****/
        uchar irtime;
uchar startflag;
uchar irdata[33];
uchar irreceok;
uchar irproseok;
uchar dis[8];
uchar bitnum;
uchar cd,flag,yaokong;
uchar ircode[4];
uchar right=0,left=0,stop_stop=0,model=0;
uchar kuai;
   void stop(void);
   void delay(uint a);
void ir_key()   //遥控键盘识别
{

  if(ircode[2]==0x51&&ircode[3]==0xAE&&flag==1)
  {
    yaokong=~yaokong;    //打开遥控模式
   flag=0;
  }
 
   if(ircode[2]==0x55&&ircode[3]==0xAA&&flag==1) //前进后退模式选择
    {
        model=~model;
     right=0;
            left=0;
         flag=0;
    }

    if(ircode[2]==0x56&&ircode[3]==0xA9&&flag==1)
    {           //遥控前进标志位
      stop_stop=~stop_stop;
   left=0;
            right=0;
      flag=0;
    }

   if(ircode[2]==0x17&&ircode[3]==0xE8&&flag==1)  //遥控左拐标志位
    {
        left=1;
   
           right=0;
           stop_stop=0;
        flag=0;
    }
if(ircode[2]==0x16&&ircode[3]==0xE9&&flag==1)   //遥控右转标志位
    {
  
     right=1;
  
            stop_stop=0;
   left=0;
   flag=0;
    }
if(ircode[2]==0x11&&ircode[3]==0xEE&&flag==1)   //遥控右转标志位
    {
  
     kuai=~kuai;
   flag=0;
    }
}
void timer1init()  //定时器1初始化
{
  TMOD=0x21;
TH1=0x00;
TL1=0x00;
ET1=1;
        TR1=1;
}

void int1init()    //外部中断1初始化
{
  IT1=1;
EX1=1;
EA=1;
}
void irpros(void)  //红外处理函数
{

uchar k,j,i;
uchar value;
k=1;
   for(j=0;j<4;j++)
   {
  for(i=0;i<8;i++)
  {
  value=value>>1;
  if(irdata[k]>6)
  {
    value=value|0x80;
  }
  k++;
  }
  ircode[j]=value;

  }
irproseok=1;

}
void irwork()  //红外解码函数
{
uchar i;
    dis[0]=ircode[0]/16;
   dis[1]=ircode[0]%16;
   dis[2]=ircode[1]/16;
   dis[3]=ircode[1]%16;
   dis[4]=ircode[2]/16;
   dis[5]=ircode[2]%16;
   dis[6]=ircode[3]/16;
   dis[7]=ircode[3]%16;
for(i=0;i<8;i++)
{
   if(dis[i]>9)
  {
    cd=dis[i]-9;
   dis[i]=0x10+cd;
  }
}
  flag=1;

}
void  inti() //初始化定时器0,中断0
{ P2=0xff;
        P0=0xff;
P1=0xff;
P3=0xff;
EX0=1;
IT0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
        TR0=0;
}
void delay(uint a)    ////延时 1ms
{
int i;
for (; a>0; a--)
  for(i=0; i<110; i++);
}
void  go_along(void)    //直走
{
inl1=1;
inl2=0;

inr1=1;
inr2=0;
}
void  go_left(void)    // 向左转
{  left_light=0;
inl1=0;
inl2=0;


inr1=1;
inr2=0;
}
void  go_right(void) //向右转
{ right_light=0;
inl1=1;
inl2=0;


inr1=0;
inr2=0;
}
void go_back(void) //后退
{
inl1=0;
inl2=1;

inr1=0;
inr2=1;
}

void left_back(void)  //左转弯后退
{ left_light=0;
inl1=0;
inl2=0;

inr1=0;
inr2=1; 
}

void right_back(void) //右转弯后退
{ right_light=0;
inl1=0;
inl2=1;

inr1=0;
inr2=0; 
}

void stop(void)    //停止
{
inl1=0;
inl2=0;

inr1=0;
inr2=0;
}

void kill_stop(void)   //杀停
{
inl1=1;
inl2=1;

inr1=1;
inr2=1;
}
/***************先扫描中间传感器如不再黑线上刹停,扫描
左右两个传感器,如果左边在黑线上,向右转,如果右边在黑
向上向左转知道都在黑向上前进*******************/
void scan_sensor(void)   //扫描前面传感器 并前行
{
      if(s_mid==1)
{
          kill_stop();
       delay(3);
    stop();
    delay(3);
  if (s_right==0)
{
  go_right();
  delay(7);
 
}
else
if (s_left==0)
{
  go_left();
  delay(7);
}
else {
       stop();
       delay(4);
       go_along();
       delay(5);
   }
      }
   else{
      kill_stop();
    delay(3);
    stop();
    delay(3);
   if(s_right==0)
   {
     go_right();
  delay(6);
   }
   else
   if(s_left==0)
    {
      go_left();
   delay(6);
     }
  else {
     go_along();
     delay(6);
  }
  }

}
/**********如果遇见障碍物先向左转到180度还有障碍物,
之后向右转到没有障碍物为止之后前进***************/
void bizhang() //避开障碍物函数
{  
if(barrier==0)
{ if(b_count<=100)
   {
     go_left();
     delay(5);
     b_count++; 
   }
   else{
            left_back();
         delay(10);
       }
}
else{  if(b_left==1)
        {
       go_left();
    delay(50);
   b_left=0;
       }
    if(b_right==1)
        {
       left_back();
    delay(50);
    b_right=0;
       }
    go_along();
    delay(5);
         b_count=0;
   }
}
/****发现铁片则停止三秒钟****/
void fironalter()    //发现铁报警清楚函数
{     
if(second==3)
  {
            second=0;
     beep=1;
     go_along();
      delay(300);
     EX0=1;
            go_go=1;
   }
}
main()
{  
     int1init();
     timer1init();
     inti();
   while(1)
   {   
     if(irreceok)
    {
      irpros();
   irreceok=0;
    }
    if(irproseok)
    {
      irwork();
   irproseok=0;
    }
    ir_key();
      if(yaokong==0xff)    //遥控模式
        { if(kuai==0)
     { stop();
   delay(5);
      }
   if(model==0)   //前行模式
   { if(go_go==1)
    {
     if(left==0xff)
     {   stop();
         delay(2);
        go_left();
     delay(5);
      }
      else
      if(right==0xff)
      {  stop();
         delay(2);
         go_right();
      delay(5);
      }
      else
      if(stop_stop==0xff)
      {     stop();
         delay(5);
      
      }
      else
      {
        go_along();
     delay(5);
      }
     }
      else
          {
           stop();
           delay(5);
     }
   }
  
   else    //后退模式
   {  if(go_go==1)
   {
    if(left==0xff)
     {  stop();
         delay(2);
        left_back();
     delay(5);
      }
      else
      if(right==0xff)
      {  stop();
         delay(2);
         right_back();
      delay(5);
      }
      else
      if(stop_stop==0xff)
      {  stop();
     delay(5);
      
      }
      else
      {
        go_back();
     delay(5);
      }
    }
   else
   {
     stop();
     delay(5);
    }
   }
   left=0;
   right=0;

  }
  else   //循迹模式
  {
       if(go_go==1)
          {     stop();
            delay(5);
         if(s_right==0&&s_left==0&&s_mid==0)
                 bizhang();
      else
         scan_sensor();
        }
      else
       {
          stop();
       }
  }
   fironalter();
   left_light=1;
   right_light=1;
}
}



void int0()  interrupt 0
{
   beep=0;
   kill_stop();
   delay(10);
   alter_time=0;
   TR0=1;
   go_go=0;
   EX0=0;
}
void  timer0()   interrupt 1
{

  TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
alter_time++;
        if(alter_time==20)
  {
     alter_time=0;
                   second++;
    }
}
void timer1() interrupt 3
{
  irtime++;
}
void int1() interrupt 2
{
   if(startflag)
{
  if(irtime>32)
  {
    bitnum=0;
  }
  irdata[bitnum]=irtime;
  irtime=0;
  bitnum++;
  if(bitnum==33)
  {
    bitnum=0;
   irreceok=1;
  }

}
else
{
   startflag=1;
  irtime=0;
}

}   
关键字:红外遥控  智能小车  传感器  电机 引用地址:红外遥控及智能小车程序

上一篇:AT24C02开机记忆
下一篇:单片机汇编延时程序的理解

推荐阅读最新更新时间:2024-03-16 13:06

电机控制用多输出开关电源设计
介绍了一种基于专用芯片UC3842的 开关 稳压 电源 。在电机调速 控制 器中,该 电源 提供功率 开关 元件基极(栅极) 驱动 电压和 控制 电路 工作电压。开关电源性能的好坏直接影响到电机调速控制器的工作可靠性。该电源是为30 kW开关磁阻电机控制器设计的,也适用于采用功率MOSFET或IGBT作为开关元件的中小功率感应电机调速控制器。 1主回路方案 1.1电源电路 此电源是为30 kW开关磁阻电机控制器设计的,此电机功率变换器的主电路为不对称半桥电路[1]。采用反激变换器结构[2],具有结构简单、损耗小的优点,但输出电压纹波较大,通常用在150 W以下的电源中。具体电路如图1所示。 此电源为单芯片集成稳压电源,
[电源管理]
PI推出BridgeSwitch IC为驱动的单相无刷直流电机精调控制软件
Power Integrations推出采用BridgeSwitch IC作为驱动的单相无刷直流电机精调控制软件 美国加利福尼亚州圣何塞,深耕于高压集成电路高能效功率变换领域的知名公司 Power Integrations 今日发布Motor-Expert软件,这是一款嵌入C语言应用程序、库及控制GUI的软件。使用该公司BridgeSwitch无刷直流(BLDC)电机驱动器IC的设计人员借助该软件可对单相电机的运行性能进行精确的控制和调整。无刷直流电机广泛用于现代高效家电应用,如家电中的压缩机、风扇和水泵,以及吊扇和室内空调系统。 无刷直流电机通常使用三个绕组(多相),需要六个高压IGBT或MOSFET才能运行。Motor
[电源管理]
PI推出BridgeSwitch IC为驱动的单相无刷直流<font color='red'>电机</font>精调控制软件
传感器+无线通信=?发挥你的想象力!
摘要:在无线通讯技术日趋成熟的今天,越来越多的行业开始在应用中尝试无线化。通讯线缆的减少带来的不仅仅是便捷性的提升,还激发了各式各样新兴应用的市场需求。 目前市场上近距离无线通信产品层出不穷,广泛应用的还是蓝牙(Bluetooth),红外(IrDA)和无线局域网802.11(WIFI)。同时还有一些非常具有发展潜力的近距离无线技术标准,它们分别是:zigbee、超宽频(UltraWideBand)、短距离通信(NFC),LORA等。它们都有各自立足的特点、或基于传输速度、距离、耗电量的特殊要求,随着5G时代的到来,无线通信技术必将大放异彩。 工业发达国家和新兴崛起国家为提高其产品在全球市场的竞争力,都力求在提高生产率的同时
[网络通信]
<font color='red'>传感器</font>+无线通信=?发挥你的想象力!
传感器技术及其产业发展特点分析
近年来,随着国家政策的各项刺激以及当今市场的需求增大, 传感器 迎来了快速发展的春天。纵观整个传感器行业,你会发现传感器技术及其产业有如下几个特点:基础、应用两头依附;技术、投资两个密集;产品、产业两大分散;机遇与挑战并存。 基础、应用两头依附 基础依附是指传感器技术的发展依附于敏感机理、敏感材料、工艺设备和计测技术这四块基石。敏感机理千差万别,敏感材料多种多样,工艺设备各不相同,计测技术大相径庭,没有上述四块基石的支持,传感器技术难以为继。 应用依附是指传感器技术基本上属于应用技术,其开发多依赖于制成检测装置和自动控制系统加以应用,才能真正体现出它的高附加效益并形成现实市场。也即发展传感器技术要以市场为导向,实行需求牵引
[工业控制]
爆:小米MIX 4还会有,而且搭载1亿像素传感器
昨天,小米正式发布了小米MIX Alpha环绕屏概念手机,但是19999元的定价让广大米粉直呼买不起,有许多网友询问MIX 4还会有吗?官方并未回应。 不过微博数码博主爆料称,小米MIX 4还是会有的,而且即将发布,且搭载三星的1亿像素传感器。 据称,定制一款核武器,肯定要物尽其用,明年的小米10,也将采用一亿像素传感器。看来接下来小米的旗舰产品,一亿像素传感器要变成标配了。 同时,有网友在小米公司产品总监王腾微博下追问下个月是否还会有小米发布会,王腾回复称“不能说,怕云姐。”疑似是一次暗示。 其实按照小米手机的做法,今年应该不会只让小米9 Pro一款5G手机对抗下半年市场,毕竟手机市场竞争惨烈已经不是一两年了,所以小
[手机便携]
爆:小米MIX 4还会有,而且搭载1亿像素<font color='red'>传感器</font>
新型自供电传感器,可用于关节手术患者的康复监测
伤筋动骨一百天,对于那些刚做了关节手术的患者,医生需要对其运动范围等因素进行监测,但早前的设备一直难以轻松完成这项任务。 好消息是,来自加拿大滑铁卢大学的科学家团队,已经开发出了一种基于小型柔性圆柱体、利用电磁和摩擦力来驱动的新型传感器原型。 后者设计通过一种特定类型的材料摩擦来产生电流,而传感器包含了两种这样的材料。 该装置采用了磁铁+聚合物的摩擦来生电 无论支架怎样安装, 只要传感器被弯曲或扭曲,它都会产生足够的电力,去支撑无线信号的传输。 这些信号可以通过计算机、智能手机、智能手表等设备拾取,然后分析确定患者的运动范围和其它改善指标。 之后,远程医生或物理治疗师可以通过忽略访问这些信息,而不用患者频繁地跑到诊所
[医疗电子]
无人驾驶车辆--移动的传感器平台
随着高级驾驶员辅助系统 (ADAS) 系统的问世以及无人驾驶的推动与发展,汽车需要对周围的环境了如指掌。驾驶员能够感知我们周围的环境,同时做出判断,并在不同的情况下迅速反应。然而人无完人,我们会疲惫、分神,也会因为失误而犯错。为了提升安全性,汽车制造商正在设计应用于小客车的ADAS解决方案。汽车依靠各种各样的传感器来感测不同情况下复杂的周围环境。然后,这些数据将被传送给例如TI TDA2x等高精密的处理器,最后被用于自动紧急刹车 (AEB),车道偏离报警 (LDW) 和盲点监测等功能。   目前,用于周围环境感测的传感器主要有以下几种。 被动传感器——主要用于感测从物体上反射或发射出来的射线。 可视图像传
[嵌入式]
步进电机开环控制与闭环控制有什么区别?
步进电机开环控制和闭环控制的区别 概述: 步进电机是一种特殊的电机,与其他电机不同的是它能够以固定步进角度旋转,能够控制其转速和转向。步进电机常用于控制精度要求较高的场合,如打印机、数码相机等。而对于步进电机的控制,一般有开环控制和闭环控制两种方法。 开环控制基本概念: 开环控制(Open Loop Control)就是将电脑或其他控制器输出的控制信号直接作用于电机,以期望实现所需的控制任务。开环控制没有反馈回路,不能对步进电机运动实时监测和调整,只能使电机在所给定的控制信号下按照预先设定的步距顺序运行。 优点: 开环控制简单、直观,有较高的自动化水平。 缺点: 在实现控制效果和性价比之间是充满矛盾的,而且误差一般较大。由
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved