找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的超声波测距制作 附程序

[复制链接]
余清风 发表于 2020-12-20 15:00 | 显示全部楼层 |阅读模式
作品以STC89C52为主控制器,通过HC-SR04超声波测距模块,从超声波模块的发射、接收、检测、显示硬件进行分析,模块发射超声波到遇到障碍物模块接收端响应,输出相应比例的高电平响应到将超声波,经过时间算法,向主控传输时间,转换后在LCD上显示出相应的距离,实现距离测量。
以51单片机为主控,外部拓展距离采集的超声波传感器和显示的LCD设备。
利用超声波模块的发射、接收、检测、将数据信息发送到寄存器,控制LCD读操作,进行显示。本次系统的设计主要包括两部分,即硬件电路和软件程序。
硬件电路主要包括单片机电路、发射电路、接收电路、显示电路和电源电路等。本次设计采用以AT89C52单片机为核心的低成本、高精度、微型化数字显示超声波测距仪的硬件电路。整个电路采用模块化设计,由信号发射和接收、供电、显示等模块组成。发射探头的信号经放大和检波后发射出去,单片机的计时器开始计时,超声波被发射后按原路返回,信号被接受电路接受,然后被单片机接收,计数器停止工作并得到时间。

软件程序主要由主程序、预置子程序、发射子程序、接收子程序、显示子程序等模块组成。它控制单片机进行数据发送与接收,实现数据正确显示在数码管上。另外程序控制单片机消除各探头对发射和接收超声波的影响。相关部分附有硬件电路图、程序流程图。

制作出来的实物图如下:
2.jpg

电路原理图如下:
1.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include<LCD.h>
  4. typedef unsigned char u8;
  5. typedef unsigned char u16;
  6. sbit Trig = P2^1;
  7. sbit Echo = P2^0;
  8. sbit beep=P1^5;       

  9. void delay(u16 i)
  10. {
  11.         while(i--);       
  12. }

  13. unsigned char PuZh[]=" Pechin Science ";
  14. unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

  15. static unsigned char DisNum = 0; //显示用指针                                  
  16.        unsigned int  time=0;
  17.            unsigned long S=0;
  18.            bit      flag =0;
  19.            unsigned char disbuff[4]           ={ 0,0,0,0,};
  20.                  
  21.                  char data1=0,data2=0,data3=0;
  22.                  
  23. void UsartInit()
  24. {
  25.         SCON=0X50;                       
  26.         TMOD=0X21;                       
  27.         PCON=0X80;                       
  28.         TH1=0XF3;                               
  29.         TL1=0XF3;
  30.         ES=1;                                       
  31.         EA=1;               
  32.   TR1= 1;       
  33. }                 

  34. char dat=0;

  35. /*******************************************************************************
  36. * 函 数 名         : main
  37. * 函数功能                   : 主函数
  38. * 输    入         : 无
  39. * 输    出         : 无
  40. *******************************************************************************/
  41. void Conut(void)
  42.         {
  43.          time=TH0*256+TL0;
  44.          TH0=0;
  45.          TL0=0;
  46.        
  47.          S=(time*1.7)/100;     //算出来是CM
  48.          if((S>=700)||flag==1) //超出测量范围显示“-”
  49.          {         
  50.           flag=0;
  51.          
  52.           DisplayOneChar(0, 1, ASCII[11]);
  53.           DisplayOneChar(1, 1, ASCII[10]);        //显示点
  54.           DisplayOneChar(2, 1, ASCII[11]);
  55.           DisplayOneChar(3, 1, ASCII[11]);
  56.           DisplayOneChar(4, 1, ASCII[12]);        //显示M
  57.          }
  58.          else
  59.          {
  60.           disbuff[0]=S%1000/100;
  61.           disbuff[1]=S%1000%100/10;
  62.           disbuff[2]=S%1000%10 %10;
  63.           DisplayOneChar(0, 1, ASCII[disbuff[0]]);
  64.           DisplayOneChar(1, 1, ASCII[10]);        //显示点
  65.           DisplayOneChar(2, 1, ASCII[disbuff[1]]);
  66.           DisplayOneChar(3, 1, ASCII[disbuff[2]]);
  67.           DisplayOneChar(4, 1, ASCII[12]);        //显示M
  68.                  
  69.                  data1=disbuff[0]+48;
  70.                  data2=disbuff[1]+48;
  71.                  data3=disbuff[2]+48;
  72.         if(dat=='1'||dat=='2')
  73.         {               
  74.         SBUF=data1;
  75.         while(!TI);
  76.         TI=0;

  77.         SBUF='.';
  78.         while(!TI);
  79.         TI=0;
  80.                  
  81.         SBUF=data2;
  82.         while(!TI);
  83.         TI=0;
  84.   
  85.         SBUF=data3;
  86.         while(!TI);
  87.         TI=0;
  88.        
  89.                 SBUF='M';
  90.         while(!TI);
  91.         TI=0;
  92.        
  93.                 SBUF=0x0d;
  94.         while(!TI);
  95.         TI=0;
  96.        
  97.         SBUF=0x0a;
  98.         while(!TI);
  99.         TI=0;
  100.          }
  101.         if(dat=='1'){dat=0;}
  102. }
  103.          
  104.          
  105.         }

  106. void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  107.   {
  108.     flag=1;                                                         //中断溢出标志
  109.   }

  110. void  StartModule()                          //启动模块
  111.   {
  112.           Trig=1;                                             //启动一次模块
  113.           _nop_();
  114.           _nop_();
  115.           _nop_();
  116.           _nop_();
  117.           _nop_();
  118.           _nop_();
  119.           _nop_();
  120.           _nop_();
  121.           _nop_();
  122.           _nop_();
  123.           _nop_();
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           Trig=0;
  135.   }



  136. void delayms(unsigned int ms)
  137. {
  138.         unsigned char i=100,j;
  139.         for(;ms;ms--)
  140.         {
  141.                 while(--i)
  142.                 {
  143.                         j=10;
  144.                         while(--j);
  145.                 }
  146.         }
  147. }

  148. void main(void)
  149. {

  150.          TMOD=0x01;                   //设T0为方式1,GATE=1;
  151.          TH0=0;
  152.          TL0=0;         
  153.          ET0=1;             //允许T0中断
  154.          EA=1;                           //开启总中断       

  155.         InitLcd1602();
  156.         LcdShowStr(0,0,PuZh);
  157.         UsartInit();
  158. ……………………

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

所有程序51hei提供下载:
程序.zip (37.71 KB, 下载次数: 23)

评分

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

查看全部评分

回复

使用道具 举报

江红 发表于 2020-12-22 12:25 | 显示全部楼层
似乎运行错误哦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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