普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 3757|回复: 0

超声波

[复制链接]

1

主题

1

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2021-2-5 10:50:49 | 显示全部楼层 |阅读模式
1金钱
#include  <STC15F2K60S2.H>
#include  <intrins.h>
#include  <STDIO.H>
#include        <SendDataByUart1.h>

//sbit Led=P0^6;        //Led在P0^6口
sbit Trig=P3^3; //P3.3连接超声波Trig脚
sbit Echo=P3^4;        //P3.4连接超声波Echo脚

uchar count;
uint distance;

/********************************************************/
void Delay_t_ms(uint t)         //延时函数,单位ms
{  
        uint j,i;   
        for(j=0;j<t;j++)   
        {   
                for(i=0;i<1100;i++);   
        }  
}
/********************************************************/
void Delay_15_us()                //@11.0592MHz
{
        uchar i=39;
        while (--i);
}

/********************************************************/
void Init_Timer0()
{
        TMOD=0x0E;        //定时器一工作在模式0.且gate=1
        TH0=0xfc;TL0=0x66;  //计时每一毫秒,则溢出
        ET0=1;EA=1;        //开定时器0中断
}
/********************************************************/
void Init_Supersonic()
{
        Trig=0;Echo=0;        //超声波两个管脚先置0
        count=0;distance=0;        //超声波的计数及距离变量置0       
}
/********************************************************/
void Trig_Supersonic()        //触发超声波
{
        Trig=1;
        Delay_15_us();
        Trig=0;
}
/********************************************************/
void Measure_Distance()        //测量脉宽的时间间隔
{
        uchar low=0;
        uint high=0,mid=0;
        TR0=1;        //开启定时器0
        while(Echo==1);        //等待计时完成
        TR0=0;        //关闭计时器
        low=TL0;high=TH0;
        mid=(high<<8)+low;mid=mid-0xfc66;        //计算微秒部分的时间(左移8位和乘以256效果一样)
        distance=(mid+1000*count)*170/10000;        //距离单位是cm
        Delay_t_ms(30);        //延时30ms,防止声波互相干扰
}
/********************************************************/
void main()
{
        P3M1=0xA03M0=0xC0;
        Init_Supersonic();        //初始化超声波
        Init_Timer0();        //初始化定时器0
        while(1)
        {
                        Trig_Supersonic();        //触发超声波
                        while(Echo==0);        //等待回声       
                        distance=0xAAAA;        //*
                  SendDataByUart1(distance/256);        //*        发送distance高8位
                        SendDataByUart1(distance%256);        //*        发送distance低8位
                        Measure_Distance();        //开始使用定时器计时
                        distance=0xAAAA;        //*
                  SendDataByUart1(distance/256);        //*        发送distance高8位
                        SendDataByUart1(distance%256);        //*        发送distan低8位
                        Delay_t_ms(2000);        //*        延时2s
                        Init_Supersonic();        //初始化超声波,进行第二次测距
        }
}
/*----------------------------------------------------*/
void Timer0_Rountine() interrupt 1
{
        count++;
        if(count>=18)
                count=0;
}
各位大佬可以帮忙看一下吗,不知道为什么程序一直卡在while(echo==0)那个地方,程序应该是在while(echo==0)之前出问题了,后面的都试过,没问题。

我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有0人回答

回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-25 07:48 , Processed in 0.087434 second(s), 29 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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