我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1240|回复: 15

基于51单片机,超声波测距

[复制链接]

该用户从未签到

9

主题

9

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2020-4-3 20:51:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include"reg51.h"

#include <intrins.h>
sbit RX=P2^1;
sbit TX=P2^0;
unsigned int  time=0;
unsigned int  timer=0;
unsigned char posit=0;
unsigned long S=0;
bit      flag =0;
//--定义使用的IO--//
#define GPIO_DIG P0

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char disbuff[4]       ={ 0,0,0,0,};
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能           : 使用数码管显示
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void DigDisplay()
{
    unsigned char i;
    unsigned int j;
    for(i=0;i<8;i++)
    {
        switch(i)     //位选,选择点亮的数码管,
        {
            case(0):
                LSA=0;LSB=0;LSC=0; break;//显示第0位
            case(1):
                LSA=1;LSB=0;LSC=0; break;//显示第1位
            case(2):
                LSA=0;LSB=1;LSC=0; break;//显示第2位
            case(3):
                LSA=1;LSB=1;LSC=0; break;//显示第3位
            case(4):
                LSA=0;LSB=0;LSC=1; break;//显示第4位
            case(5):
                LSA=1;LSB=0;LSC=1; break;//显示第5位
            case(6):
                LSA=0;LSB=1;LSC=1; break;//显示第6位
            case(7):
                LSA=1;LSB=1;LSC=1; break;//显示第7位   
        }
        GPIO_DIG=disbuff;//发送段码
        j=10;                         //扫描间隔时间设定
        while(j--);   
        GPIO_DIG=0x00;//消隐
    }
}
/********************************************************/
    void Conut(void)
    {
     time=TH0*256+TL0;
     TH0=0;
     TL0=0;
   
     S= (long)(time*0.17);     //算出来是CM
     if((S>=4000)||flag==1) //超出测量范围显示“ERR0”
     {     
      flag=0;
      disbuff[0]=0x3f;       //“-”
      disbuff[1]=0x50;       //“-”
      disbuff[2]=0x50;       //“-”
      disbuff[3]=0x79;       //“-”
     }
     else
     {
      disbuff[3]=DIG_CODE[S%10000/1000];
      disbuff[2]=DIG_CODE[S%1000/100];
      disbuff[1]=DIG_CODE[S%100/10];
      disbuff[0]=DIG_CODE[S%10/1];
     }
    }
/********************************************************/
     void zd0() interrupt 1          //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                             //中断溢出标志
  }
/********************************************************/
   void  zd3()  interrupt 3          //T1中断用来扫描数码管和计800MS启动模块
  {
     TH1=0xf8;
     TL1=0x30;
     DigDisplay();
     timer++;
     if(timer>=100)
     {
      timer=0;
      TX=1;                            //800MS  启动一次模块
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      TX=0;
     }
  }
/*********************************************************/

    void  main(  void  )

  {  
    TMOD=0x11;           //设T0为方式1,GATE=1;
    TH0=0;
    TL0=0;         
    TH1=0xf8;           //2MS定时
    TL1=0x30;
    ET0=1;             //允许T0中断
    ET1=1;               //允许T1中断
    TR1=1;               //开启定时器
    EA=1;               //开启总中断

    while(1)
    {
     while(!RX);        //当RX为零时等待
     TR0=1;                //开启计数
     while(RX);            //当RX为1计数并等待
     TR0=0;                //关闭计数
     Conut();            //计算
    }

  }
回复

使用道具 举报

该用户从未签到

2

主题

1541

回帖

0

积分

二级逆天

积分
0

终身成就奖优秀斑竹奖

发表于 2020-4-4 00:36:58 | 显示全部楼层
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-7-8 15:22
  • 签到天数: 1 天

    [LV.1]初来乍到

    78

    主题

    5331

    回帖

    1万

    积分

    PADS-181217初级班

    积分
    16088

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-4-4 03:08:16 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6750

    回帖

    1285

    积分

    二级逆天

    积分
    1285

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-4-4 08:27:37 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-12-7 21:08
  • 签到天数: 57 天

    [LV.5]常住居民I

    2

    主题

    1万

    回帖

    2万

    积分

    三级逆天

    积分
    20573

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-4-4 08:30:49 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-29 20:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    112

    主题

    6493

    回帖

    7867

    积分

    二级逆天

    积分
    7867

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-4-4 08:41:12 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    难过
    昨天 09:49
  • 签到天数: 134 天

    [LV.7]常住居民III

    45

    主题

    3574

    回帖

    3922

    积分

    二级逆天

    积分
    3922

    终身成就奖社区居民忠实会员社区劳模最爱沙发特殊贡献奖优秀斑竹奖

    QQ
    发表于 2020-4-4 08:58:00 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-7-20 08:39
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    34

    主题

    1907

    回帖

    6481

    积分

    PADS-2020国庆特训班

    积分
    6481

    终身成就奖特殊贡献奖

    发表于 2020-4-4 08:59:27 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    99

    主题

    2522

    回帖

    0

    积分

    PADS-181217初级班

    积分
    0

    终身成就奖原创先锋奖

    QQ
    发表于 2020-4-4 10:18:09 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 11:50
  • 签到天数: 158 天

    [LV.7]常住居民III

    2

    主题

    6032

    回帖

    1万

    积分

    三级逆天

    积分
    14630

    终身成就奖社区居民特殊贡献奖优秀斑竹奖

    QQ
    发表于 2020-4-4 10:24:06 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    每日签到,有金币领取。


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表