51自动避障小车整体程序

#include<reg52.h>

#include<intrins.h>

#define uchar unsigned char

#define uint  unsigned int

sbit Trig=P3^0;

sbit Echo=P3^3;

sbit control=P3^5;

uint  dis,flag=0,timeH,timeL,succeed_flag,time;

void   tran_ret();

void  delay_nus(uint n);

void  delay_ms(long int m);

void  delay_n100us(uint n);

void  run();

//void  backrun();

//void  freestop(); 

void  turnleft();

void  turnright ();

void  Sturnround();

void  Nturnround();

void  servo_turn(int gao);

//**********************************************************************

//主函数

void main()                                  

      TMOD=0x01;

       EA=1;

       ET0=1;

       IT1=0;

       Trig=0;

       servo_turn(0);

       delay_ms(5000);

       while(1)

       {

              tran_ret();

              if(dis>30)    

              {    

                     run();            

              }

              else

              {

                     P1=0XFF;

                     servo_turn(-90);

                     delay_ms(5000);

                     tran_ret();

                     if (dis>30)

                     {    

                            turnleft();

                            P1=0XFF;

                         servo_turn(0);

                            delay_ms(5000);

                            run();

                     }

                     else

                     {

                            P1=0XFF;

                            servo_turn(90);

                            delay_ms(5000);

                         tran_ret();

                            if (dis>30)

                            {

                                   turnright();

                                   servo_turn(0);

                                   delay_ms(5000);

                                   run();

                            }

                         else

                            {

                                   Nturnround ();

                                   servo_turn(0);

                                   delay_ms(5000);

                                   run();

                            }

                     }

              }

       }    

}

//*************************************************************************************

//子函数

//**************************************************************************************

//全速前进

void run() 

{

       P1=0xaa;

       //delay_ms(60);    

       //P1=0xff;

}

 

/*//全速后退

 void  backrun()

{     P1=0x55;

       delay_ms(19);      

       P1=0x00;

       delay_ms(1);                                                  

} */

//自由停止

/*void freestop ()

{

       P1=0x00;

       delay_ms(20);             

} */  

//左转

void  turnleft()

{

       P1=0x0a;

       delay_ms(100);    

       //P1=0xff;

      

}

 

//右转

void  turnright()

{

       P1=0xa0;

       delay_ms(100);    

//     P1=0xff;

      

}

/*//原地顺时针打转

void  Sturnround()

{

       P1=0xa0;

       delay_ms(40);      

       P1=0x00;

       delay_ms(1);

} */

//原地逆时针打转

void  Nturnround ()

{

       P1=0x0a;

       delay_ms(100);    

//     P1=0x00;

      

}

//发射

void tran_ret()

{

              EA=0; //关总中断

              Trig=1; //超声波输入端

              delay_nus(20);//延时20us

              Trig=0; //产生一个20us的脉冲

              while(Echo==0); //等待Echo回波引脚变高电平

              succeed_flag=0; //清测量成功标志

              EA=1;

              EX1=1; //打开外部中断0

              TH0=0;//定时器1清零

              TL0=0; //定时器1清零

              TF0=0; //计数溢出标志

              ET0=1;

              TR0=1; //启动定时器1

              delay_ms(20); //等待测量的结果

              TR0=0; //关闭定时器1

              EX1=0; //关闭外部中断0

              if(succeed_flag==1)

              {

                     time=timeH*256+timeL;

                     dis=time*0.0182; //cm                                                                          /12MHZ疑问之处us/

///                 display(distance);

              }

              if(succeed_flag==0)

              {

                     dis=200; //

                test = !test; //测试灯变化

              }

}

//延时函数1

void delay_ms(long int n)

{

       uint i,j;

       for(i=n;i>0;i--)

              for(j=110;j>0;j--);

}

//延时函数2

void delay_nus(uint n)

{

       uint i;

       for(i=n;i>0;i--);

}

 

//延时函数3

void delay_n100us(uint n)

{

       uint i;

       while(n--)

       {

              for(i=7;i>0;i--);

    }

                          

}

//中断函数

void exter1() interrupt 2 // 外部中断1

{

       timeH =TH0; //取出定时器的值

       timeL =TL0; //取出定时器的值

       succeed_flag=1;//至成功测量的标志

       EX1=0; //关闭外部中断

       TR0=0;

}

void  servo_turn(int offset)

{    

       int servo,gao;

       control=0;

       servo=14;

       offset/=9;

       gao=servo-offset;

 

       control=1;

       delay_n100us(gao);

       control=0;

       delay_n100us(200-gao);

}

  • 21
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沄边小卖部

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值