找回密码
 立即注册

QQ登录

只需一步,快速开始

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

二路超声波测距的单片机源码

[复制链接]
跳转到指定楼层
楼主
ID:321034 发表于 2018-5-28 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用2哥超声波 进行 避障 功能
源程序 如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit ENA_pwm = P2^6;    //PWM信号端
  6. sbit ENB_pwm = P2^7;    //PWM信号端

  7. sbit L298N_INA = P1^0;        
  8. sbit L298N_INB = P1^1;        
  9. sbit L298N_INC = P1^2;        
  10. sbit L298N_IND = P1^3;

  11. sbit Trlg1 = P3^1;
  12. sbit Echo1 = P3^2;

  13. sbit Trlg2 = P2^0;
  14. sbit Echo2 = P2^1;


  15. unsigned char pwm_val_left  =0;    //变量定义
  16. unsigned char pwm_val_right =0;

  17. unsigned char push_val_left =0;// 左电机占空比N/10
  18. unsigned char push_val_right=0;// 右电机占空比N/10

  19. unsigned int  time = 0;         //测距时间
  20. unsigned int  timer = 0;       //调速时间


  21. unsigned long S1 = 0;           //距离
  22. unsigned long S2 = 0;           //距离


  23. void delay(uint z)        //毫秒级延时
  24. {
  25.         uint x,y;
  26.         for(x = z; x > 0; x--)
  27.           {
  28.                 for(y = 114; y > 0 ; y--);
  29.           }
  30. }

  31. void Delay10us_CSB(uchar i)   //10us延时函数 超声波模块使用
  32. {
  33.         uchar j;
  34.         do
  35.           {
  36.              j = 10;
  37.              do
  38.                  {
  39.                 _nop_();
  40.                     _nop_();
  41.              }
  42.                     while(--j);
  43.         }
  44.                while(--i);
  45. }
  46. void pwm_out_left_moto(void)
  47. {  
  48.                 if(pwm_val_left<=push_val_left)
  49.                         ENA_pwm=1;
  50.                 else
  51.                         ENA_pwm=0;
  52.                 if(pwm_val_left==10)            //  0~10  ,  0最小,10最大
  53.                         pwm_val_left=0;
  54. }
  55. void pwm_out_right_moto(void)
  56. {
  57.                 if(pwm_val_right<=push_val_right)                          
  58.                         ENB_pwm=1;
  59.                 else
  60.                         ENB_pwm=0;
  61.                 if(pwm_val_right==10)           //  0~10  ,  0最小,10最大
  62.                         pwm_val_right=0;
  63. }
  64.                             /*定时器1中断输出PWM信号*/
  65. void time1() interrupt 3
  66. {
  67.           TH1=(65536-10)/256;
  68.         TL1=(65536-10)%256;
  69.           timer++;
  70.         pwm_val_left++;
  71.         pwm_val_right++;

  72.          pwm_out_left_moto();
  73.          pwm_out_right_moto();                        
  74. }
  75. void Go_forward()
  76. {
  77.     push_val_left=6;
  78.     push_val_right=6;
  79.     L298N_INA = 0;
  80.     L298N_INB = 1;
  81.     L298N_INC = 1;
  82.     L298N_IND = 0;

  83. }

  84. void Go_back()
  85. {
  86.     push_val_left=6;
  87.     push_val_right=6;
  88.     L298N_INA = 1;
  89.     L298N_INB = 0;
  90.     L298N_INC = 0;
  91.     L298N_IND = 1;        
  92. }

  93. void Go_left()
  94. {
  95.     push_val_left=5;
  96.     push_val_right=5;
  97.     L298N_INA = 0;
  98.     L298N_INB = 1;
  99.     L298N_INC = 1;
  100.     L298N_IND = 1;
  101. }

  102. void Go_right()
  103. {
  104.     push_val_left=5;
  105.     push_val_right=5;
  106.     L298N_INA = 1;
  107.     L298N_INB = 0;
  108.     L298N_INC = 0;
  109.     L298N_IND = 0;
  110. }

  111. void Stop()
  112. {
  113.     L298N_INA = 0;
  114.     L298N_INB = 0;
  115.     L298N_INC = 0;
  116.     L298N_IND = 0;
  117. }              

  118. void  CSB1_module()                          
  119. {
  120.         Trlg1=1;                                             
  121.         Delay10us_CSB(10);
  122.         Trlg1=0;
  123. }
  124. void  CSB2_module()                          
  125. {
  126.         Trlg2=1;                                             
  127.         Delay10us_CSB(10);
  128.         Trlg2=0;
  129. }
  130.                              /*计算超声波所测距离并显示*/
  131. void Conut1()
  132. {
  133.                  while(!Echo1);        //当(ECHO信号回响)为零时等待
  134.                  TR0=1;               //开启计数
  135.                  while(Echo1);        
  136.                  TR0=0;               //关闭计数               

  137.         time=TH0*256+TL0;
  138.         TH0=0;
  139.         TL0=0;
  140.         S1=(float)(time*1.085)*0.17;     //算出来是MM      
  141. }
  142. void Conut2()
  143. {                              
  144.                  while(!Echo2);        //当(ECHO信号回响)为零时等待
  145.                  TR0=1;               //开启计数
  146.                  while(Echo2);        
  147.                  TR0=0;               //关闭计数

  148.         time=TH0*256+TL0;
  149.         TH0=0;
  150.         TL0=0;
  151.         S2=(float)(time*1.085)*0.17;     //算出来是MM
  152. }

  153. void  bizhang()
  154. {
  155.           CSB1_module();
  156.           Conut1();         
  157.           CSB2_module();
  158.           Conut2();

  159.         if(S1<150 )//设置避障距离(单位毫米)
  160.         {
  161.            Stop();
  162.              delay(30);
  163.              Go_back();
  164.              delay(50);
  165.              if(S2<150)
  166.              {               
  167.                   Stop();
  168.                   delay(30);
  169.                   Go_right();
  170.              }
  171.              else
  172.              {
  173.                 Go_back();
  174.                   delay(50);
  175.                   Go_left();
  176.              }               
  177.         }
  178.           else if(S1>150)
  179.           {
  180.              if(S2>150)
  181.              {
  182.                 Go_forward();  
  183.              }
  184.              else
  185.              {
  186.                 Stop();
  187.                   delay(30);
  188.                   Go_right();
  189.              }
  190.           }     
  191. }


  192. void main()
  193. {
  194.         Stop();     
  195.         delay(1000);//延时1秒

  196.         TMOD |= 0x11;//定时器1工作模式2,8位自动重装。用于产生PWM
  197.           TMOD |= 0x01;//定时器0
  198.         TH1=(65536-10)/256;          //100US定时
  199.         TL1=(65536-10)%256;
  200.         TH0 = 0;
  201.         TL0 = 0;//T0,16位定时计数用于记录ECHO高电平时间         
  202.         ET1 = 1;
  203.         ET0 = 1;//允许T0中断
  204.         TR1 = 1;//启动定时器1
  205.          
  206.         EA  = 1;//启动总中断         
  207.         while(1)
  208.         {               

  209.                  bizhang();           //避障
  210.                  delay(30);                             
  211.           }
  212. }
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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