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

 找回密码
 立即注册
查看: 25418|回复: 22

【分享】wifi小车超声波测试代码改进

[复制链接]
发表于 2012-8-4 22:03:05 | 显示全部楼层 |阅读模式
近几日折腾超声波测距功能始终不能调试出正常的功能,弄得焦头烂额。参见【求助】关于超声波测距代码
仔细反思,关键在于本人基础太差,于是找了一些单片机基础资料恶补了下相关知识,然后对原先的超声波测距功能进行了一点改进(自认为的:)),拿出来跟大家分享下,如有差错也欢迎各位指正。
主要改进的地方:原先的代码测距距离限制在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. }
复制代码


评分

参与人数 1威望 +1 金钱 +3 贡献 +2 收起 理由
liuviking + 1 + 3 + 2 那天忘了回复你,驱动组给了个如何加大探测.

查看全部评分

回复

使用道具 举报

发表于 2012-8-4 22:51:40 | 显示全部楼层
那天忘了回复你,驱动组给了个如何加大探测距离的建议,算法基本和你这个一致,看来你的基本功相当扎实!很不错~
回复 支持 反对

使用道具 举报

发表于 2012-8-4 23:02:06 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-5 06:12:47 来自手机 | 显示全部楼层
liuviking 发表于 2012-8-4 22:51
那天忘了回复你,驱动组给了个如何加大探测距离的建议,算法基本和你这个一致,看来你的基本功相当扎实!很 ...

谢谢鼓励,我会继续努力。
回复 支持 反对

使用道具 举报

发表于 2012-8-22 09:10:39 | 显示全部楼层
感谢。很好的教材
回复 支持 反对

使用道具 举报

发表于 2012-8-24 10:42:28 | 显示全部楼层
我也在鼓捣这方面的知识////报了个单片机培训的机构,系统学习一下
回复 支持 反对

使用道具 举报

发表于 2012-8-24 22:42:07 | 显示全部楼层
佩服啊 我这门外汉就只剩伸手的能力了
回复 支持 反对

使用道具 举报

发表于 2012-10-7 01:46:54 | 显示全部楼层
之前也做过这方面工作,支持一下
回复 支持 反对

使用道具 举报

发表于 2012-10-20 21:49:30 | 显示全部楼层
支持一下 :)
回复 支持 反对

使用道具 举报

发表于 2013-4-10 01:28:06 | 显示全部楼层
MARK~~~~~~~~~~~~~~~~~~~~~
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-4-19 16:51 , Processed in 1.086750 second(s), 20 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

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