找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用51单片机怎么实现HC-SR04测距

[复制链接]
跳转到指定楼层
楼主
ID:126898 发表于 2016-6-15 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

用12864 51单片机  HC-SR04
超声波测距设计。
要求:
1.      第一排显示:超声波测距仪
2.      第二排显示  超声波测距仪
3.      第三排显示:电子科学与技术
4.      第四排显示:当前距离为:
.同时蜂鸣器的报警声随距离缩短而加快(倒车雷达设计)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:188933 发表于 2017-4-20 20:10 | 只看该作者
/***********************************************************************************************************/
//HC-SR04 超声波测距模块 DEMO 程序
//晶振:11。0592
//接线:模块模块 TRIG接 P2.0  ECH0 接P2.1  VCC接单片供电正极5V,GND接单片系统板的GND
//蜂鸣器接p2.5
/***********************************************************************************************************/         
    #include   <AT89X51.H>
    #include   <intrins.h>
    #include   <STDIO.H>

    #define uchar unsigned  char
    #define uint  unsigned   int  
    #define  RX  P2_1
    #define  TX  P2_0
    #define  buzzer P2_5

    unsigned int  time=0;
    unsigned int  timer=0;
    float         S=0;
    bit           flag =0;
        
/********************************************************/
void delayms(unsigned int ms)
{
        unsigned char i=60,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}
/********************************************************/
    void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
         S=(time*1.87)/100;     //算出来是CM
         if((S>=42000)||flag==1)                    //超出测量
         {
          flag=0;
          buzzer=1;//printf("S=-----CM\n");
         }
          else
          {
           buzzer=1;
                   //delayms(500);
                   delayms(S);        //printf("S=%fCM\n",S);                       
            buzzer=0;
                   delayms(S);
                   }
         
        }

/********************************************************/
     void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
  {
    flag=1;                                                         //中断溢出标志
  }
/********************************************************/
   void  StartModule()                          //T1中断用来扫描数码管和计800MS启动模块
  {
          TX=1;                                         //800MS  启动一次模块
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();         
         
          TX=0;
  }
/********************************************************/
void main(void)
{  
    TMOD=0x21;                   //设T0为方式1,GATE=1;
        SCON=0x50;
        TH1=0xFD;
        TL1=0xFD;
        TH0=0;
        TL0=0;
        TR0=0;  
        ET0=1;             //允许T0中断
        TR1=1;                           //开启定时器
        TI=1;
        EA=1;                           //开启总中断
    //delayms(100);               
        //printf("超声波串口测量系统\n");

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

        }

}  
回复

使用道具 举报

板凳
ID:188933 发表于 2017-4-20 20:11 | 只看该作者
距离越短蜂鸣器频率越高
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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