找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机控制AJ-SR04M超声波测试程序 实测版

[复制链接]
跳转到指定楼层
楼主
该测试程序经过实际验证,并有实际数据输出,期间调试所出现的问题进行备注注释中添加,解决办法计算公式都已注明,在程序主函数中注明;

同时附录:
            程序的部分有相应详细注释解释,方便不太理解的朋友观看;

单片机源程序如下:
  1. #include<reg51.h>

  2. #include<intrins.h>

  3. typedef unsigned char uint8; //重定义u8

  4. typedef unsigned int uint16; //重定义u16

  5. sbit Trig=P3^3;              //触发引脚定义
  6. sbit Echo=P3^2;              //测量引脚定义
  7. uint16 distance;             //定义全局变量 距离变量
  8. uint16 flag;                 //定义全局变量 标志位


  9. /******************************************

  10. 延时让Trig引脚产生大于10us的脉冲

  11. ********************************************/
  12. void Delay1ms(uint16 time)                //@11.0592MHz 基于该晶振的1ms延时计算
  13. {
  14.         unsigned char i, j,n;
  15.         for(n=0;n<time;n++)
  16.         {
  17.                 _nop_();
  18.                 _nop_();
  19.                 _nop_();
  20.                 i = 11;
  21.                 j = 190;
  22.                 do
  23.                 {
  24.                         while (--j);
  25.                 } while (--i);
  26.         }        
  27. }


  28. void delay(void) //进行脉冲输出延时时间
  29. {

  30.         uint8 i;
  31.         for(i=0;i<100;i++); //进行空运转延时

  32. }

  33. void Init()
  34. {

  35.                 EA=1;      //开总中断
  36.                 IT0=0;     //外部中断0,低电平触发
  37.                 TMOD|=0x01;//定时器0 工作模式1
  38.                 TH0=0;                 //定时器装载值清0
  39.                 TL0=0;                 //定时器装载值清0
  40.                 TR0=0;     //关闭定时器0 特定条件触发开启
  41. }

  42. //串口设置函数

  43. void UART_init()
  44. {

  45.                 SCON=0x50;  //使能串口接收,同时配置相应的定时器
  46.                 TMOD=0x20;
  47.                 TH1=0xFD;   //波特率9600
  48.                 TL1=0xFD;
  49.                 TR1=1;      //开启定时器1

  50. }

  51. //发送一个字节函数

  52. void UART_send_byte(uint8 dat)
  53. {

  54.         SBUF=dat;    //数据直接赋值给SBUF
  55.         while(TI==0);//等待发送中断硬件置1 发送完成
  56.         TI=0;        //硬件中断软件清0

  57. }

  58. //串口发送距离函数
  59. void UART_send_dat(uint16 temp)
  60. {

  61.                 UART_send_byte((temp/10000)%10 + '0'); //发送距离千位 +‘0’为输出字符转化
  62.                 UART_send_byte((temp/1000)%10 + '0');  //发送距离百位 +‘0’为输出字符转化
  63.                 UART_send_byte((temp/100)%10 + '0');   //发送距离十位 +‘0’为输出字符转化
  64.                 UART_send_byte((temp/10)%10 + '0');    //发送距离个位 +‘0’为输出字符转化
  65.                 UART_send_byte('.');                   //发送小数点字符
  66.                 UART_send_byte(temp%10 + '0');         //发送距离小数点后一位
  67.                 UART_send_byte('c');                   //发送单位CM 字符C
  68.                 UART_send_byte('m');                   //发送单位CM 字符M

  69. }

  70. void main()
  71. {

  72.                 UART_init();  //串口初始化
  73.                 Init();              //初始化
  74.                 Trig=0;       //先把引脚拉低

  75.                 while(1)     //进入主循环
  76.                 {

  77.                                 Trig=1; //电平拉高
  78.                                 delay();//产生脉冲延时
  79.                                 Trig=0; //电平拉低
  80.                                 while(Echo==0);//等待引脚被拉高
  81.                                 TR0=1;//打开定时器0
  82.                                 EX0=1;//打开外部触发中断
  83.                                 while(flag==0); //等待信号测算标志位
  84.                                 flag=0; //信号标志位清0
  85.                                 TR0=0;  //关闭定时器0
  86.                                 TL0=0;  //定时器装载值清0
  87.                                 TH0=0;  //定时器装载值清0
  88.                                 UART_send_dat(distance);//向串口发送测得的距离值
  89.                                 UART_send_byte('\r');
  90.                                 UART_send_byte('\n');  
  91.                                 //发送回车换行
  92.                                 Delay1ms(10); //方便观察,延时一定时间,进行距离测算

  93.                 }
  94.                
  95. //                1.型号是
  96. //                        AJ-SR04M 收发一体化 倒车雷达防水型超声波传感器测距模块 K02
  97. //                        模块版本是:新版本
  98. //                        模块背面信息为:RCWL-1655
  99. //                        模块正面丝印为R7
  100. //                        NC      默认模式下兼容HCSR04 双探头超声波测距模块


  101. //                2.测试 代码:
  102. //                (1)当R7为NC 默认不焊接 悬空时,该例程代码测试代码输出正常;
  103. //                                此程序为P32为Echo - P33为Trig 进行脉冲发送测距
  104. //                        a.实际数据反馈结果可行,测量范围>=20cm (注意测量量程)
  105. //                        b.当小于20cm时 距离为不可靠   (很多朋友这里不注意)
  106. //                                实际测试距离:0063.6cm
  107. //                                实际测试距离:0063.6cm(未加滤波处理或者其他算法处理)

  108. //                (2)当R7位10K时 位串口9600 停止位1 数据位8 无奇偶校验
  109. //                        a.串口助手可实际发送0XA0 (切记是16机制发送)
  110. //                                数据返回 03 06 CE
  111. //                        距离计算方式为:((0x03<<16)+(0x06<<8)+0xce)/1000  MM
  112. //               

  113. }

  114. void EXIT_interrupt() interrupt 0        //外部中断函数地址入口
  115. {

  116.                 distance=(256*TH0+TL0)*0.184;//测得最小精度位mm(晶振为11059200Hz)
  117.                 flag=1;                      //标志位置1,表明距离测算完成
  118.                 EX0=0;                       //关闭外部中断

  119. }
复制代码


程序注释.png (102.27 KB, 下载次数: 65)

程序注释截图

程序注释截图

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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