找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5537|回复: 6
收起左侧

超声波避障(51单片机程序)

[复制链接]
ID:389243 发表于 2018-8-23 13:34 | 显示全部楼层 |阅读模式
超声波避障程序,使用51单片机芯片

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define MOTOR_C P2                //P1口作为电机的控制口。
  5. #define BACK 0xfa                 //后退,0b1111 1010
  6. #define FORWARD 0xf5    //前进,0b1111 0101
  7. #define Sum 100                  //总周期,为100倍的定时器时间大约27ms
  8. #define tim 200         //初值数 200约270us
  9. uint distance;
  10. sbit Trig=P2^6;
  11. sbit Echo=P2^7;

  12. sbit PWM_L=P2^0;                //左电机前进
  13. sbit PWM_R=P2^2;        //右电机前进
  14. sbit PWM_HL=P2^1;                //左电机后退
  15. sbit PWM_HR=P2^3;                //右电机后退
  16. void timer0_init(void); //定时器0初始化函数。
  17. void timer1_init(void); //定时器1初始化函数。
  18. void right(void);       //前进右转弯函数。
  19. void left(void);                //前进左转弯函数。
  20. void forward(void);                //前进函数。
  21. void hright(void);                //后退右转函数。
  22. void hleft(void);                //后退左转函数。
  23. void back(void);                //后退函数。
  24. void stop(void);                //停止
  25. void backright(void);        //右后倒车
  26. void Delayms();                  //延时1ms
  27. void Delay100ms(unsigned int d);//延时100ms??

  28. void bizhang();                        //避障;

  29. uchar percent_l=0;                //(前进)左轮占空比。
  30. uchar percent_r=0;                //(前进)右轮占空比。
  31. uchar percent_hl=0;                //(后退)左轮占空比。
  32. uchar percent_hr=0;                //(后退)右轮占空比。
  33. uchar run_time=0;                //车轮运行一步的时间。??
  34. int shu,i;

  35. void delay(uint z)
  36. {
  37.   uint x,y;
  38.   for(x=z;x>0;x--)
  39.    for(y=110;y>0;y--);
  40.    
  41. }

  42. void delay_us()
  43. {     
  44.         uchar t;
  45.         for(t=0;t<10001;t++)
  46.         {
  47.         if(Echo==1)
  48.                 shu=t;
  49.         else
  50.                 break;
  51.         }
  52. }
  53. void turn_on()
  54. {
  55.         Trig=Echo=0;
  56.         delay(1);
  57.         Trig=1;
  58.         delay(1);
  59.         Trig=0;
  60.         while(Echo!=1);
  61.         delay_us();
  62. }
  63. void bizhang()
  64. {
  65.                 timer0_init();
  66.                 timer1_init();
  67.                 MOTOR_C=0x00;
  68.         if(0<distance&&distance<20)
  69.         {
  70. //                timer0_init();
  71. //                timer1_init();
  72. //                MOTOR_C=0x00;
  73.                 backright();  
  74. //                Delay100ms(10);
  75.         }                                 
  76.         else
  77.         {
  78. //                timer0_init();
  79. //                timer1_init();
  80. //                MOTOR_C=0x00;
  81.                 forward();
  82. //                Delay100ms(10);                 
  83.         }
  84. }

  85. void main()
  86. {
  87.         while(1)
  88.         {
  89.                 turn_on();
  90.                 distance=shu*0.45/2.0;
  91.             delay(5);
  92.                 for(i=0;i<2;i++)
  93.                 {
  94.                         bizhang();
  95.                         delay(20);
  96.                 }
  97.         }
  98. }

  99. void timer0_init(void)
  100. {
  101.         TMOD=0X11;
  102.         TH0=(65536-tim)/256;
  103.         TL0=(65536-tim)%256;
  104.         EA=1;                                        //开总中断。
  105.         ET0=1;                                        //开定时器0中断。
  106.         TR0=1;                                        //启动定时器0。
  107. }
  108. void timer1_init(void)
  109. {
  110.         TH1=(65536-tim)/256;
  111.         TL1=(65536-tim)%256;
  112.         ET1=1;
  113.         TR1=1;
  114.         }
  115. /**************前进方向****/
  116. void right(void)
  117. {
  118.         percent_l=50;                        //左轮速度快,最好去50以上
  119.         percent_r=0;                        //右轮速度慢。
  120.         percent_hl=0;
  121.         percent_hr=0;
  122. }
  123. void left(void)
  124. {
  125.         percent_l=0;            //左轮速度慢。
  126.         percent_r=50;                        //右轮速度快。
  127.         percent_hl=0;
  128.         percent_hr=0;
  129. }
  130. void back(void)
  131. {
  132.         percent_l=50;//左轮同速度。
  133.         percent_r=50;//右轮同速度。
  134.         percent_hl=0;
  135.         percent_hr=0;
  136. }
  137. /************后退方向*************///void?hright(void?)?//{?
  138. //?percent_hr?=?90;?//?percent_hl?=?0;?//?percent_r?=?0;?//?percent_l?=?0;?//}?//?
  139. //void?hleft(?void?)?//{?
  140. //?percent_hr?=?0;?//?percent_hl?=?90;?//?percent_r?=?0;?//?percent_l?=?0;?//}??
  141. void forward(void)
  142. {       
  143.         percent_hl=50;
  144.         percent_hr=50;
  145.         percent_l=0;
  146.         percent_r=0;
  147. }
  148. void stop(void)
  149. {
  150.         percent_l=0;                                                                //左轮零速度。
  151.         percent_r=0;                                                                //右轮零速度。
  152.         percent_hl=0;
  153.         percent_hr=0;
  154. }
  155. void backright(void)
  156. {
  157.         percent_hl=0;
  158.         percent_hr=0;
  159.         percent_l=50;
  160.         percent_r=0;       
  161. }
  162. /**************中断服务*******************/
  163. void timer_0 (void) interrupt 1 using 1
  164. {
  165.         static uchar temp=0;                                                //中断次数计数
  166.         TR0=0;
  167.         if(temp<Sum)
  168.                 {                                                                                //关总中断,屏蔽其他中断。
  169.                         if(temp<percent_l)
  170.                         {
  171.                                 PWM_L=1;                                                //左电机高电平。
  172.                         }
  173.                         else
  174.                         {
  175.                                 PWM_L=0;                                                //左电机低电平。
  176.                         }
  177.                         if(temp<percent_r)
  178.                         {
  179.                                 PWM_R=1;                                                //右电机高电平。
  180.                         }
  181.                         else
  182.                         {
  183.                                 PWM_R=0;                                                //右电机低电平。
  184.                         }
  185.                 }
  186.         else
  187.         {
  188.                 temp=0;
  189.         }
  190.         temp++;
  191.         TH0=(65536-tim)/256;
  192.         TL0=(65536-tim)%256;                                                //实现计数。
  193.         TR0=1;                                                                                //开总中断。
  194. }
  195. void timer1(void) interrupt 3 using 2
  196. {
  197.         static uchar temp1=0;
  198.         TR1=0;                                                                                //关总中断,屏蔽其他中断。
  199.         if(temp1<Sum)
  200.         {
  201.                 if(temp1<percent_hl)
  202.                 {
  203.                         PWM_HL=1;                                                        //左电机高电平。
  204.                 }
  205.                 else
  206.                 {
  207.                         PWM_HL=0;                                                        //左电机低电平。
  208.                 }
  209.                 if(temp1<percent_hr)
  210.                 {
  211.                         PWM_HR=1;                                                        //右电机高电平。
  212.                 }
  213.                 else
  214.                 {
  215.                         PWM_HR=0;                                                        //右电机低电平。
  216.                 }
  217.         }
  218.         else
  219.         {
  220.                 temp1=0;
  221.         }
  222.         temp1++;
  223.         TH1=(65536-tim)/256;
  224.         TL1=(65536-tim)%256;                                                //实现计数。
  225.         TR1=1;                                                                                //开总中断。
  226.         }
  227. /*void?Delayms(void)????{?
  228. ????unsigned?char?a,b,c;?????for(c=1;c>0;c--)?
  229. ????????for(b=23;b>0;b--)?
  230. ????????????for(a=13;a>0;a--);?}*/
  231. void Delay100ms(unsigned int d)
  232. {                                                                       
  233.         unsigned int a,b,c;
  234.         for(c=d;c>0;c--)
  235.                 for(b=60;b>0;b--)
  236.                         for(a=130;a>0;a--);
  237. }
复制代码

所有资料51hei提供下载:
51.zip (28.35 KB, 下载次数: 43)

评分

参与人数 1黑币 +5 收起 理由
啧啧啧啧啧啧啧 + 5 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:518433 发表于 2019-5-20 19:46 | 显示全部楼层
首先感谢楼主的分享,小白想问一下 电机驱动模块是用的L298N吗?P1口与电机接线是怎样的 ?
回复

使用道具 举报

ID:595011 发表于 2019-8-5 17:04 | 显示全部楼层
谢谢楼主的分享 想问一下距离计算中0.45是什么?
回复

使用道具 举报

ID:595011 发表于 2019-8-5 20:01 | 显示全部楼层
这个程序是直接将超声波探头按到开发板上的吗 不是用线连的对吧
回复

使用道具 举报

ID:361216 发表于 2019-8-9 12:36 | 显示全部楼层
不错,学习了
回复

使用道具 举报

ID:829883 发表于 2020-10-14 18:18 | 显示全部楼层
我看了你的超声波避障程序 下载了后小车不能驱动是什么原因
回复

使用道具 举报

ID:328014 发表于 2020-10-14 21:45 | 显示全部楼层
cxml 发表于 2020-10-14 18:18
我看了你的超声波避障程序 下载了后小车不能驱动是什么原因

你的电路和这个程序不配套吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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