找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波避障小车程序

[复制链接]
跳转到指定楼层
楼主
ID:72519 发表于 2015-1-21 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define  uint unsigned int
  4. sbit motor0=P1^0;//电机定义P1^0到P1^3正转,P1^4到P1^5反转;
  5. sbit motor1=P1^1;
  6. sbit motor2=P1^2;
  7. sbit motor3=P1^3;
  8. sbit motor4=P1^4;
  9. sbit motor5=P1^5;
  10. sbit motor6=P1^6;
  11. sbit motor7=P1^7;
  12. sbit pwm=P2^7; //舵机PWM信号输出
  13. sbit trig=P3^1;//超声波输入口
  14. sbit echo=P3^2;//超声波输出口
  15. uchar flag,i,count,jd;
  16. uchar b,low,k,high,d,e,f,h;//PWM调速高低电平定义
  17. uint time,s;
  18. /////////
  19. void delay(uint z)
  20. {
  21. uint x,y;
  22. for(x=z;x>0;x--)
  23. for(y=100;y>0;y--);
  24. }
  25. ///////
  26. void delay1(uchar k)//延时
  27. {
  28. uchar i,j;
  29. for(i=k;i>0;i--)
  30. for(j=110;j>0;j--);
  31. }
  32. ////////
  33. void delay20us()
  34. {
  35. uint a;
  36. for(a=0;a<100;a++);
  37. }
  38. /////////////
  39. void init()
  40. {
  41. TMOD=0x11;
  42. TH0=0;
  43. TL0=0;
  44. TH1=(65536-100)/256;//11.0592MHZ晶振,0.5ms
  45. TL1=(65536-100)%256;
  46. TR1=1; //定时起开始
  47. EA=1;
  48. //ET0=1;
  49. //ET1=1;
  50. }
  51. void estern() interrupt 0
  52. {
  53. flag=1;
  54. }
  55. void calculate()//超声波转换
  56. {
  57. time=TH0*256+TL0;
  58. TH0=0;
  59. TL0=0;
  60. s=time/58;
  61. //display();
  62. }
  63. ////////
  64. void qudong()//前后电机PWM调速处理
  65. {
  66. uchar i;
  67. if(low!=0)
  68. {
  69.   for(i=0;i<low;i++)
  70.   {
  71.   if(b==0)
  72.   {
  73.   motor0=0;
  74.   motor1=0;
  75.   motor2=0;
  76.   motor3=0;
  77.   delay1(5);
  78.   }
  79.   }
  80. }
  81. for(i=0;i<high;i++)
  82.   {
  83.   if(b==0)
  84.   {
  85.   motor0=1;
  86.   motor1=1;
  87.   motor2=1;
  88.   motor3=1;
  89.   delay1(5);
  90.   }
  91.   }
  92. }
  93. void  ultrasonic()//超声波处理
  94. {
  95. trig=1;
  96. delay20us();
  97. trig=0;
  98. while(!echo);
  99. TR0=1;
  100. while(echo);
  101. TR0=0;
  102. calculate();
  103. delay(20);
  104. //display();
  105. }
  106. void bb()//距离判断
  107. {
  108. uchar x=5;
  109. if((s<10)&&(jd==12))
  110. {  motor0=0;
  111.   motor1=0;
  112.   motor2=0;
  113.   motor3=0;
  114.   motor4=0;
  115. motor5=0;
  116. motor6=0;
  117. motor7=0;

  118.   ET1=0;
  119.      ultrasonic();
  120. while(x--)
  121. {
  122.   d=s;
  123. delay(2);
  124. }

  125. ET1=1;
  126. jd=5;
  127.   delay(500);
  128. ET0=0;
  129. }
  130.   else
  131.   {
  132. ET0=1;
  133. }
  134. if(jd==5)
  135. {   ET1=0;
  136.    ultrasonic();
  137.     while(x--)
  138. {
  139.    e=s;
  140. delay(2);
  141. }
  142.   ET1=1;
  143.   jd=19;
  144. delay(500);
  145. ET0=0;
  146. }
  147.   else
  148. ET0=1;

  149. if(jd==19)
  150. {   ET1=0;
  151.     ultrasonic();
  152.     while(x--)
  153. {

  154.    f=s;
  155. delay(2);
  156. }

  157.    ET1=1;
  158. jd=12;

  159. delay(500);
  160. ET0=0;
  161. }
  162.   else
  163. ET0=1;

  164. }
  165. void main()
  166. {
  167. uchar m=4;
  168. s=20;
  169. init();
  170. echo=0;
  171. jd=12;
  172. count=0;
  173. low=20;high=5;//设置速度
  174. while(1)
  175. {
  176.   if(e<f)
  177.   {
  178.   while(m--)
  179.   {
  180.    b=1;
  181. motor6=0;
  182. motor7=0;
  183. motor0=0;
  184. motor1=0;
  185. motor4=1;
  186. motor5=1;
  187. motor2=1;
  188. motor3=1;
  189.   delay(1);
  190.   }
  191.   e=0;
  192.   f=0;
  193.   }
  194. else
  195. {
  196. b=0;
  197. motor4=0;
  198. motor5=0;
  199. motor6=0;
  200. motor7=0;
  201. }
  202.   if(e>f)
  203.   {
  204.   while(m--)
  205.   {
  206.     b=1;
  207. motor0=1;
  208. motor1=1;
  209. motor6=1;
  210. motor7=1;
  211. motor2=0;
  212. motor3=0;
  213. motor4=0;
  214. motor5=0;
  215.   delay(1);
  216.   }
  217.   e=0;
  218.   f=0;
  219.   }
  220. else
  221. {
  222.   b=0;
  223. motor4=0;
  224. motor5=0;
  225. motor6=0;
  226. motor7=0;
  227. }
  228. bb();
  229. //turn();
  230. //kk();
  231. qudong();
  232. ultrasonic();
  233. h=s;
  234. }
  235. }
  236. //////////
  237. void Time1_Int() interrupt 3 //舵机中断程序
  238. {
  239. TH1=(65536-100)/256;//11.0592MHZ晶振,0.5ms
  240. TL1=(65536-100)%256;
  241. if(count<jd)//判断0.5ms次数是否小于角度标识
  242. pwm=1;//确实小于PWM输出高电平
  243. else
  244. pwm=0; //大于则输出低电平
  245. count=(count+1);//0.5ms次数加1
  246. count=count%40;// 次数使终保持40周期为20ms
  247. }
复制代码


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

使用道具 举报

沙发
ID:208396 发表于 2017-6-6 16:10 | 只看该作者
这是什么鬼
回复

使用道具 举报

板凳
ID:276445 发表于 2018-1-16 11:16 | 只看该作者
看下能用否
回复

使用道具 举报

地板
ID:315036 发表于 2018-8-25 21:02 | 只看该作者
为什么控制电机正转要用四个,反转只要两个,还有6,7是干嘛用的呀,是使能端吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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