色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 紅外遙控及智能小車程序

          紅外遙控及智能小車程序

          作者: 時間:2012-08-18 來源:網(wǎng)絡 收藏
          #includereg52.h>
          #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;// 障礙物掃描位置基數(shù)
          uchar alter_time=0;//報警計數(shù)值
          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;
          /****程勛數(shù)據(jù)****/
          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]==0x51ircode[3]==0xAEflag==1)
          {
          yaokong=~yaokong; //打開遙控模式
          flag=0;
          }

          if(ircode[2]==0x55ircode[3]==0xAAflag==1) //前進后退模式選擇
          {
          model=~model;
          right=0;
          left=0;
          flag=0;
          }

          if(ircode[2]==0x56ircode[3]==0xA9flag==1)
          { //遙控前進標志位
          stop_stop=~stop_stop;
          left=0;
          right=0;
          flag=0;
          }

          if(ircode[2]==0x17ircode[3]==0xE8flag==1) //遙控左拐標志位
          {
          left=1;

          right=0;
          stop_stop=0;
          flag=0;
          }
          if(ircode[2]==0x16ircode[3]==0xE9flag==1) //遙控右轉(zhuǎn)標志位
          {

          right=1;

          stop_stop=0;
          left=0;
          flag=0;
          }
          if(ircode[2]==0x11ircode[3]==0xEEflag==1) //遙控右轉(zhuǎn)標志位
          {

          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) //紅外處理函數(shù)
          {

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

          }
          irproseok=1;

          }
          void irwork() //紅外解碼函數(shù)
          {
          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;i8;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; i110; i++);
          }
          void go_along(void) //直走
          {
          inl1=1;
          inl2=0;

          inr1=1;
          inr2=0;
          }
          void go_left(void) // 向左轉(zhuǎn)
          { left_light=0;
          inl1=0;
          inl2=0;


          inr1=1;
          inr2=0;
          }
          void go_right(void) //向右轉(zhuǎn)
          { 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) //左轉(zhuǎn)彎后退
          { left_light=0;
          inl1=0;
          inl2=0;

          inr1=0;
          inr2=1;
          }

          void right_back(void) //右轉(zhuǎn)彎后退
          { 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;
          }
          /***************先掃描中間傳感器如不再黑線上剎停,掃描
          左右兩個傳感器,如果左邊在黑線上,向右轉(zhuǎn),如果右邊在黑
          向上向左轉(zhuǎn)知道都在黑向上前進*******************/
          void scan_sensor(void) //掃描前面?zhèn)鞲衅?并前行
          {
          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);
          }
          }

          }
          /**********如果遇見障礙物先向左轉(zhuǎn)到180度還有障礙物,
          之后向右轉(zhuǎn)到?jīng)]有障礙物為止之后前進***************/
          void bizhang() //避開障礙物函數(shù)
          {
          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;
          }
          }
          /****發(fā)現(xiàn)鐵片則停止三秒鐘****/
          void fironalter() //發(fā)現(xiàn)鐵報警清楚函數(shù)
          {
          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==0s_left==0s_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;
          }

          }
          紅外遙控器相關文章:紅外遙控器原理

          pid控制相關文章:pid控制原理


          蜂鳴器相關文章:蜂鳴器原理


          評論


          相關推薦

          技術專區(qū)

          關閉