找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机超声波测距实验源码

[复制链接]
跳转到指定楼层
楼主
ID:313299 发表于 2018-4-21 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超声波测距实验单片机源程序如下:
  1. /*******************************************************************************  
  2. * 文件名称:超声波测距实验
  3. * 实验目的:1.掌握超声波测距原理
  4. *           2.掌握51单片机定时器工作模式和配置方法
  5. * 程序说明:设计延时函数,需要根据单片机的时钟频率进行调整,本例工作于11.0592MHz
  6. * 硬件说明:IAP15F2K61S2@11.0592MHz
  7. *******************************************************************************/

  8. #include "reg52.h"  //定义51单片机特殊功能寄存器
  9. #include "intrins.h"
  10. #include "absacc.h"

  11. #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();\
  12.                  _nop_();_nop_();_nop_();_nop_(); _nop_();}
  13. sbit TX = P1^0;  //发射引脚
  14. sbit RX = P1^1;  //接收引脚

  15. code unsigned char tab[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,\
  16.                              0xff};
  17. unsigned char dspbuf[8] = {10,10,10,10,10,10,10,10};  //显示缓冲区
  18. unsigned char dspcom = 0;

  19. unsigned int intr = 0;
  20. bit s_flag;
  21. unsigned int t = 0;

  22. void send_wave(void);
  23. void display(void);

  24. void main(void)
  25. {
  26.     unsigned int distance;

  27.     TMOD |= 0x11;  //配置定时器工作模式
  28.     TH0 = (65536-2000)/256;
  29.     TL0 = (65536-2000)%256;  
  30.     TH1 = 0;
  31.     TL1 = 0;  
  32.   
  33.     EA = 1;
  34.     ET0 = 1;  //打开定时器0中断
  35.     TR0 = 1;  //启动定时器   

  36.     while(1)
  37.     {
  38.         /** 200毫秒更新一次数据 */
  39.                 if(s_flag)
  40.         {
  41.             s_flag = 0;
  42.             /** 关闭定时器0中断:计算超声波发送到返回的时间 */
  43. //                         ET0 = 0;
  44.             send_wave();  //发送方波信号
  45.             TR1 = 1;  //启动计时
  46.                         while((RX == 1) && (TF1 == 0));  //等待收到脉冲
  47.                         TR1 = 0;  //关闭计时

  48.                         //发生溢出
  49.                         if(TF1 == 1)
  50.                         {
  51.                                 TF1 = 0;
  52.                                 distance = 9999;  //无返回
  53.                         }
  54.                         else
  55.                         {
  56.                                 /**  计算时间  */
  57.                                 t = TH1;
  58.                                 t <<= 8;
  59.                                 t |= TL1;
  60.                                 distance = (unsigned int)(t*0.017);  //计算距离                               
  61.                         }
  62.                         TH1 = 0;
  63.                         TL1 = 0;
  64.         }
  65.                 /** 数据处理                      */
  66.                      
  67.                 dspbuf[5] = distance/100;
  68.                 dspbuf[6] = distance%100/10;
  69.                 dspbuf[7] = distance%10;        
  70.     }
  71. }

  72. //定时器0中断服务函数
  73. void isr_timer_0(void)  interrupt 1  //默认中断优先级 1
  74. {
  75.     TH0 = (65536-2000)/256;
  76.     TL0 = (65536-2000)%256;  //定时器重载
  77.      
  78.         display();  //2ms执行一次

  79.         if(++intr == 200)
  80.         {
  81.         s_flag = 1;
  82.         intr = 0;
  83.     }
  84. }

  85. //显示函数  
  86. void display(void)
  87. {
  88.         XBYTE[0xE000] = 0xff;  //去除鬼影

  89.         XBYTE[0xC000] = (1<<dspcom);
  90.         XBYTE[0xE000] = tab[dspbuf[dspcom]];
  91.        
  92.         if(++dspcom == 8){
  93.                 dspcom = 0;
  94.         }       
  95. }

  96. //TX引脚发送40KHz方波信号驱动超声波发送探头
  97. //使用软件延时注意RC振荡器频率
  98. void send_wave(void)
  99. {
  100.         unsigned char i = 8;  //发送8个脉冲
  101.        
  102.         do
  103.         {
  104.                 TX = 1;
  105.                 somenop;somenop;somenop;somenop;somenop;somenop;
  106.                 somenop;somenop;somenop;somenop;               
  107.                 TX = 0;
  108.                 somenop;somenop;somenop;somenop;somenop;somenop;
  109.                 somenop;somenop;somenop;somenop;               
  110.         }
  111.         while(i--);
  112. }

  113. ……………………

  114. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
18.超声波测距实验.zip (45.03 KB, 下载次数: 16)


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

使用道具 举报

沙发
ID:403447 发表于 2019-8-1 18:47 | 只看该作者
先保存,以后有用,现正留意这方面的资料
回复

使用道具 举报

板凳
ID:361216 发表于 2019-8-8 18:05 | 只看该作者
好贴,谢谢大神
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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