小R科技-WIFI机器人网·机器人创意工作室

标题: 【分享】wifi小车超声波测试代码改进 [打印本页]

作者: cjnt007    时间: 2012-8-4 22:03
标题: 【分享】wifi小车超声波测试代码改进
近几日折腾超声波测距功能始终不能调试出正常的功能,弄得焦头烂额。参见【求助】关于超声波测距代码
仔细反思,关键在于本人基础太差,于是找了一些单片机基础资料恶补了下相关知识,然后对原先的超声波测距功能进行了一点改进(自认为的:)),拿出来跟大家分享下,如有差错也欢迎各位指正。
主要改进的地方:原先的代码测距距离限制在0.5米内,我们知道现在常用的超声波模块都能达到4米。下面我提供的代码能发挥出超声波模块的最大测距潜能,同时不会影响到原有驱动接收数据时LED闪烁的功能。
代码如下:
main.c
  1. #include "stc_new_8051.h"
  2. #include "motor.h"
  3. #include "uart.h"
  4. #include <stdio.h>
  5. #include "type.h"
  6. #include "timer.h"

  7. extern void UART_send_byte(uint8 byte);
  8. uint32 t1_conter;  //记录定时器1溢出中断次数

  9. void Send_wave(void)
  10. {
  11.     uint16 i;

  12.         Trig = 1;
  13.         for(i=0;i<250;i++);
  14.         Trig = 0;
  15. }

  16. uint32 Get_Distance(void)
  17. {
  18.     uint32 Distance = 0;
  19.     Send_wave();
  20.         while(Echo!= 1);        //等Echo高电平到来
  21.         TH1 = 0;
  22.         TL1 = 0;                          //清零,开始计时
  23.         t1_conter=0;
  24.         while(Echo == 1);        //等待Echo低电平到来
  25.         Distance = TH1;
  26.         Distance = (Distance<<8)|TL1;
  27.         Distance += (t1_conter*65536); //测距时长超过计时器循环周期时,根据t1_conter补偿
  28.                                                                         //这样可在超声波传感器最大限度内测距
  29.         //定时器1工作在16位计时方式,
  30.         //stc11f32xe一个机器周期等于一个晶振周期,计满22118为1ms
  31.         Distance = Distance * 17 / 22118;         //* 340m/s /2即34000cm/1000ms /2即17cm/ms
  32.         return Distance;   //返回值不限于8位
  33. }

  34. void Send_Distance(void)
  35. {
  36.    uint32 dis;
  37.    dis=Get_Distance();
  38.    UART_send_byte(0xFF);
  39.    UART_send_byte(0x03);
  40.    UART_send_byte((uchar)(dis/256));
  41.    UART_send_byte((uchar)(dis%256));
  42.    UART_send_byte(0xFF);                        //返回值格式为FF 03 xx yy FF,则距离为xx*256+yy(cm)
  43.    Delay_Ms(1000);
  44. }

  45. void main(void)
  46. {
  47.         UART_init();
  48.        
  49.         /* 定时器0作为舵机专用,不建议更改配置 */
  50.         Timer0_Init();
  51.         /* 定时器1为自由状态,用户可灵活使用 */
  52.         Timer1_Init();
  53.         Motor_Init();

  54.     while(1)
  55.         {
  56.             Send_Distance();  //向上位机发送超声波距离(单位 CM)
  57.         }
  58. }
复制代码


timer.c
  1. #include "stc_new_8051.h"
  2. #include "timer.h"
  3. #include "steer.h"

  4. extern uint8 rec_flag;
  5. extern uint32 t1_conter;
  6. extern void Steering_Engine_Control(void);
  7. /* ms 延时 */
  8. void Delay_Ms(uint32 t)
  9. {  
  10.     uint16 i;
  11.         while(t--)
  12.         {
  13.            for(i=0;i<1050;i++);
  14.         }
  15. }

  16. void Timer0_Init(void)
  17. {
  18.         TMOD   &=   0xf0;
  19.     TMOD   |=   0x01;
  20.         AUXR   |=   0XC0;        // 辅助寄存器(不可位寻址)
  21.         TR0=1;                                //开定时器0
  22.         ET0=1;                                //et0是定时/计数器0的中断容许位。ET0=0 禁止T0 中断;ET0=1 允许T0 中断
  23. }

  24. void Timer1_Init(void)
  25. {
  26.       ET1     =          1;
  27.       TMOD   &=   0x0f;
  28.       TMOD   |=   0x10;   
  29.       TH1     =   0xA9;   //1MS定时
  30.       TL1     =   0x9A;
  31.       TR1     =   1;    //开定时器1

  32. }

  33. void Timer_0(void) interrupt 1
  34. {
  35.         Steering_Engine_Control();
  36. }


  37. void Timer_1(void) interrupt 3
  38. {
  39. t1_conter++;  
  40. //改进,定时器溢出一次,
  41. t1_conter
  42. 就+1

  43.         if((t1_conter*3)%9==0)        //9ms切换一次
  44.         {
  45.                  if(rec_flag)
  46.                  {
  47.                      LED5 = ~LED5;        //控制LED5在接收数据时闪烁
  48.                  }
  49.                  else
  50.                  {
  51.                      LED5 = 1;                //不接收时不亮
  52.                  }
  53.         }
  54. }
复制代码



作者: liuviking    时间: 2012-8-4 22:51
那天忘了回复你,驱动组给了个如何加大探测距离的建议,算法基本和你这个一致,看来你的基本功相当扎实!很不错~
作者: 赤龙之吼    时间: 2012-8-4 23:02
学习了
作者: cjnt007    时间: 2012-8-5 06:12
liuviking 发表于 2012-8-4 22:51
那天忘了回复你,驱动组给了个如何加大探测距离的建议,算法基本和你这个一致,看来你的基本功相当扎实!很 ...

谢谢鼓励,我会继续努力。
作者: aking_gong    时间: 2012-8-22 09:10
感谢。很好的教材
作者: 看这个号熟吗    时间: 2012-8-24 10:42
我也在鼓捣这方面的知识////报了个单片机培训的机构,系统学习一下
作者: zxcvxj    时间: 2012-8-24 22:42
佩服啊 我这门外汉就只剩伸手的能力了
作者: 卧室2    时间: 2012-10-7 01:46
之前也做过这方面工作,支持一下
作者: pengox    时间: 2012-10-20 21:49
支持一下 :)
作者: Magic.4℃    时间: 2013-4-10 01:28
MARK~~~~~~~~~~~~~~~~~~~~~
作者: cjwei    时间: 2013-12-17 17:16
不错!不错!        
作者: sanbenshiyuan    时间: 2014-12-5 19:08
你这超声波模块这么牛逼,数据都没处理就是准确的 ? 我这好歹10次平均,效果都不理想。崩溃啊。
作者: suyijiang    时间: 2015-1-27 23:07
学习中进步顶
作者: nsp    时间: 2015-2-12 12:36

感谢。很好的教材
作者: Hugo    时间: 2015-3-14 02:42
请教大神,超声波数据通过WiFi传给android上位机,上位机应该如何写呢?能否提供思路
作者: nsp    时间: 2015-4-18 12:05
支持一下 :){:soso_e130:}
作者: 静而思之    时间: 2015-7-27 15:02
谢谢分享!很有用。
作者: 叶落凡尘    时间: 2015-12-11 23:37
高手    学习了    我还要继续学习才行
作者: 学员2015    时间: 2016-2-14 21:27
支持一下 :)
作者: 香凝小公举    时间: 2016-4-21 11:49
按着改了 但是串口收了几次 就收不到了
作者: 骑着蜗牛游世界    时间: 2016-5-10 22:27
不错顶一个
作者: jy05393591    时间: 2016-11-8 11:11
香凝小公举 发表于 2016-4-21 11:49
按着改了 但是串口收了几次 就收不到了

问一下,你按这个程序改后能测到更远的距离了吗?我改后测试距离还是超不过50CM去啊
作者: hekevin    时间: 2017-3-27 14:56
谢谢分享,顶一个!




欢迎光临 小R科技-WIFI机器人网·机器人创意工作室 (http://www.wifi-robots.com/) Powered by Discuz! X3.4