超声波避障小车程序设计_第1页
超声波避障小车程序设计_第2页
超声波避障小车程序设计_第3页
超声波避障小车程序设计_第4页
超声波避障小车程序设计_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、word/*/ /5路超声波避障实验:51单片机 +  HC-SR04超声波 / /*/            #include <AT89x52.H>  /器件配置文件   #include <intrins.h>    #define  RX1 

2、60;P3_6     /小车左侧超声波HC-SR04接收端   #define  TX1  P1_7     /发送端       #define  RX2  P3_3     /左前方超声波   #define  T

3、X2  P0_2         #define  RX3  P2_4     /正前方超声波   #define  TX3  P2_5    #define  RX4  P3_5     /右前方超

4、声波   #define  TX4  P3_4                #define  RX5  P3_7     /右侧超声波   #define  TX5  P1_6  

5、0;#define Left_moto_pwm   P1_5  /PWM信号端  #define Right_moto_pwm   P1_4   /PWM信号端    /定义小车驱动模块输入IO口   sbit IN1=P10;  sbit IN2=P11;  sbit IN3=P12;  

6、;sbit IN4=P13;  sbit EN1=P14;  sbit EN2=P15;     bit Right_moto_stop=1;  bit Left_moto_stop =1;   #define Left_moto_go      IN1=0,IN2=1,EN1=1;  /左电机向前走

7、0; #define Left_moto_back    IN1=1,IN2=0,EN1=1;  /左边电机向后走  #define Left_moto_Stop    EN1=0;  /左边电机停转               #define Right_moto_g

8、o     IN3=1,IN4=0,EN2=1; /右边电机向前走  #define Right_moto_back   IN3=0,IN4=1,EN2=1; /右边电机向后走 #define Right_moto_Stop   EN2=0; /右边电机停转     unsigned char pwm_val_left 

9、0;=0;/变量定义 unsigned char push_val_left =0;/ 左电机占空比N/20  unsigned char pwm_val_right =0;  unsigned char push_val_right=0;/ 右电机占空比N/20       unsigned int  time=0;  

10、60;  unsigned int  timer=0;       unsigned long S1=0;     unsigned long S2=0;     unsigned long S3=0;     unsigned long S4=0;

11、     unsigned long S5=0;      void delay_1ms(unsigned char x)          /1ms延时函数,100ms以内可用    unsigned char i;  while(x-) 

12、0;for(i=124;i>0;i-);      /*/    void Count1()   /计算左侧超声波距离的函数     while(!RX1);  /当RX1为零时等待   TR0=1;       /开启计数   while(RX1);&

13、#160; /当RX1为1计数并等待   TR0=0;    /关闭计数   time=TH0*256+TL0;   TH0=0;   TL0=0;         S1=(time*1.7)/100;     /算出来是CM     &#

14、160;void Count2()   /计算函数     while(!RX2);  /当RX2为零时等待 TR0=1;       /开启计数   while(RX2);  /当RX2为1计数并等待   TR0=0;    /关闭计数   time=TH0

15、*256+TL0;   TH0=0;   TL0=0;              S2=(time*1.7)/100;     /算出来是CM          void Count3()   /计算函数

16、60;      while(!RX3);  /当RX3为零时等待    TR0=1;       /开启计数    while(RX3);  /当RX3为1计数并等待    TR0=0;    /关闭计数    time=TH0

17、*256+TL0;    TH0=0;    TL0=0;           S3=(time*1.7)/100;     /算出来是CM         void Count4()   /计算函数  

18、60;    while(!RX4);  /当RX4为零时等待  TR0=1;       /开启计数    while(RX4);  /当RX4为1计数并等待    TR0=0;    /关闭计数   time=TH0*256+TL0;   

19、60;TH0=0;    TL0=0;               S4=(time*1.7)/100;     /算出来是CM         void Count5()   /计算函数   

20、60; while(!RX5);  /当RX5为零时等待  TR0=1;       /开启计数   while(RX5);  /当RX5为1计数并等待  TR0=0;    /关闭计数   time=TH0*256+TL0;   TH0=0;   TL0=0; 

21、60;         S5=(time*1.7)/100;     /算出来是CM  void leftrun(void)       push_val_left=20;       push_val_right=20;    Left_moto_

22、back  /左电机往后走  Right_moto_go  /右电机往前走   /*/  /右转  void rightrun(void)       push_val_left=20;       push_val_right=20;  Left_moto_go  /左电机往前

23、走  Right_moto_back  /右电机往后走   /*/  /停止  void stoprun(void)    Left_moto_Stop  /左电机停  Right_moto_Stop  /右电机停       /*/ /*     

24、               PWM调制电机转速                                 

25、60; */ /*/  /*                    左电机调速                       

26、60;                */ /*调节push_val_left的值改变电机转速,占空比            */    void pwm_out_left_moto(void)     

27、60;    if(Left_moto_stop)                    if(pwm_val_left<=push_val_left)                  

28、60;   Left_moto_pwm=1;                   else                        &

29、#160;Left_moto_pwm=0;               if(pwm_val_left>=20)         pwm_val_left=0;            else   

30、60;                           Left_moto_pwm=0;                /*/ /*  

31、             右电机调速                                  */  

32、;     void pwm_out_right_moto(void)       if(Right_moto_stop)            if(pwm_val_right<=push_val_right)           

33、        Right_moto_pwm=1;         else                 Right_moto_pwm=0;         

34、0;  if(pwm_val_right>=20)          pwm_val_right=0;          else                    &#

35、160;        Right_moto_pwm=0;                      /*/      void timer0() interrupt 1   &#

36、160;/T0中断             /*/   /*TIMER1中断效劳子函数产生PWM信号*/    void timer1()interrupt 3     TH1=(65536-1000)/256;  /1ms定时  TL1=(65536-1000)%256; &#

37、160; timer+;   pwm_val_left+;   pwm_val_right+;   pwm_out_left_moto();   pwm_out_right_moto();         /*  */   void  main(void)    

38、60;      TMOD=0x11;     /设T0为方式1,GATE=1; TH0=0;  TL0=0;            TH1=(65536-1000)/256;  /1ms定时  TL1=(65536-1000)%256;  ET0=1;  &

39、#160;          /允许T0中断  ET1=1;      /允许T1中断  TR1=1;      /开启定时器  EA=1;      /开启总中断   while(1)   

40、0;         TX1=1;     /开启超声波1探测   delay_1ms(1);   TX1=0;      Count1();   /测距        TX2=1;   delay_

41、1ms(1);   TX2=0;      Count2();           TX3=1;   delay_1ms(1);   TX3=0;       Count3();         TX4=1;   delay_1ms(1);   TX4=0;      Count4();              TX5=1;   delay_1ms(1);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论