找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1661|回复: 1
收起左侧

51单片机超声波测距避障小车 进入不了while循环

[复制链接]
ID:308093 发表于 2018-4-27 21:04 | 显示全部楼层 |阅读模式
代码如上,我是小白~
请问下各位大佬 , 为什么进入不了while循环呢 轮子一直转但是超声波模块不能正常运转 帮忙改一下代码并给我一下理由和建议 谢谢啦
  1. #include <AT89x51.H>
  2. #include <intrins.h>
  3. #define ECHO P2_4 //超声波接口定义
  4. #define TRIG P2_5 //超声波接口定义
  5. #define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
  6. #define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机后转
  7. #define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边停止
  8. #define Right_moto_go {P1_4=1,P1_5=0,P1_6=1,P1_7=0;} //右边的两个前进
  9. #define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;} //右边的后转
  10. #define Right_moto_Stop {P1_4=0,P1_5=0,P1_6=0,P1_7=0;} //右边停止
  11. typedef unsigned int u16;
  12. typedef unsigned char u8;
  13. unsigned long S=0;
  14. unsigned int time=0; //时间变量
  15. unsigned int timer=0; //延时基准变量
  16. unsigned char timer1=0; //扫描时间变?
  17. bit           flag =0;
  18. /**********************测距**************************************************/
  19. void zd0() interrupt 1          //T0中断
  20. {
  21.     flag=1;                     //中断溢出标志
  22. }
  23. void delay(unsigned int k) //延时函数
  24. {
  25. unsigned int x,y;
  26. for(x=0;x<k;x++)
  27. for(y=0;y<2000;y++);
  28. }
  29. /************************************************************************/
  30. //前进
  31. void run(void)
  32. {
  33. Left_moto_go ; //左
  34. Right_moto_go ; //右
  35. }
  36. /************************************************************************/
  37. //后退
  38. void backrun(void)
  39. {
  40. Left_moto_back ; //左
  41. Right_moto_back ; //右
  42. }
  43. /************************************************************************/
  44. //左转
  45. void leftrun(void)
  46. {
  47. Left_moto_back ;
  48. Right_moto_go ;
  49. }
  50. /************************************************************************/
  51. //右转
  52. void rightrun(void)
  53. {
  54. Left_moto_go ;
  55. Right_moto_back ;
  56. }
  57. /************************************************************************/
  58. //停止
  59. void stoprun(void)
  60. {
  61. Left_moto_Stop ;
  62. Right_moto_Stop ;
  63. }
  64. /************************************************************************/
  65. void StartModule() //启动模块
  66. {
  67. TRIG=1;
  68. _nop_();
  69. _nop_();
  70. _nop_();
  71. _nop_();
  72. _nop_();
  73. _nop_();
  74. _nop_();
  75. _nop_();
  76. _nop_();
  77. _nop_();
  78. _nop_();
  79. _nop_();
  80. _nop_();
  81. _nop_();
  82. _nop_();
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. _nop_();
  87. _nop_();
  88. _nop_();
  89. TRIG=0;
  90. }
  91. /***************************************************/
  92. void Conut(void) //启动测距
  93. {
  94. while(!ECHO);
  95. TR0=1;
  96. while(ECHO);
  97. TR0=0;
  98. time=TH0*256+TL0;
  99. TH0=0;
  100. TL0=0;
  101. S=(time*1.7)/100;
  102. }
  103. /************************************************************************/
  104. void time1()interrupt 3 using 2
  105. {
  106. TH1=(65536-100)/256; //100US??
  107. TL1=(65536-100)%256;
  108. timer++; //???100US???????????  
  109. }
  110. void main(void)
  111. {  TMOD=0x21;                  
  112.     SCON=0x50;
  113.     TH1=0xFD;
  114.     TL1=0xFD;
  115.     TH0=0;
  116.     TL0=0;
  117.     TR0=1;  
  118.     ET0=1;                     
  119.     TR1=1;                       
  120.     TI=1;
  121.    
  122.     EA=1;                       
  123.      
  124. run();   
  125.     while(1)
  126. {
  127.     if(timer>=1000) //100MS检查一次
  128. {
  129. timer=0;
  130. StartModule(); //启动检测
  131. Conut(); //计算距离
  132. if(S<50)
  133. {
  134. stoprun(); //小车停止
  135. delay(500);
  136. backrun();
  137. delay(500);
  138. leftrun();
  139.     if(S<30)
  140.     {
  141.     stoprun();
  142.     delay(500);
  143.     rightrun();
  144.     delay(500);
  145.     run();
  146.     }
  147.     else
  148.     run();
  149. timer=0;
  150. StartModule(); //启动测超声模块
  151. Conut();
  152.     //计算
  153. }
  154. else
  155. run();
  156. }
  157. }
  158. }
复制代码



回复

使用道具 举报

ID:164602 发表于 2018-4-28 09:20 | 显示全部楼层
看了你的程序,我认为,程序肯定是进入了主循环的!
只是没有反应,原因是你的所有if语句都没起作用!!!

先搞清楚距离计算:声波空气中速度约340m/s,来回双程,定时器计次数的时间单位是us,好了,正确的计算公式为:S=(t*0.17)mm,看清楚没?算清楚没?以毫米为单位的距离结果。

而你的计算为:S=(time*1.7)/100,结果是十分一毫米。
你的if判断有这样几个:S<50,小于5毫米,S<30,小于3毫米,都是不会出现的条件,所以没有反应。

你改改看是不是我说的原因。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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