微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > HC-SR04超声波模块问题求解答

HC-SR04超声波模块问题求解答

时间:10-02 整理:3721RD 点击:
我的超声波运行过一会就会死机,卡在echo高电平上不变,敲它一下它就能正常运行,但是过一会又卡死了,在里面加了一段跳出代码也不行:
        while(!Echo);
        TR0=1;
        while(Echo)
                {
                        if(temp>=100)
                        {
                                temp=0;
                                Echo=0;
                        }
                }
        TR0=0;   
temp是在定时器里改变的0.5毫秒改变一次,
是程序问题还是模块坏了还是什么原因#include<reg52.h>
#include<intrins.h>
#define uint  unsigned int
#define uchar unsigned char

sbit led1=P1^0;
sbit led7=P1^7;
sbit Trig=P1^3;
sbit Echo=P1^5;//超声波端口的定义   Trig为触发口   Echo为状态口
static unsigned int s;
unsigned int time=0;//用来存储计时时间
uint temp, i=0;//定时时间长度控制
bit flag=0;

void Delay20us()                //@11.0592MHz
{
        unsigned char i;
        _nop_();
        i = 6;
        while (--i);
}
void main()
{
        TMOD=0x11;
        TH0=0;
        TL0=0;//定时器0用作定时 来计时而测量距离  
        TL1 = 0x33;                //设置定时初值        500us
        TH1 = 0xFE;                //设置定时初值
        ET1=1;
//        ET0=1;
        EA=1;
        TR1=1;
                        //定时器的初始化设置
while(1)
    {
        while(!Echo);
        TR0=1;
        while(Echo)
                {
                        if(temp>=100)
                        {
                                temp=0;
                                Echo=0;
                        }
                }
        TR0=0;          //超声波测量   
        time=TH0*256+TL0;
        TH0=0;
        TL0=0;
        s=(time*0.034)/2;
                if(s<=15)
                {
                led1=0;
                led7=1;
                }
                else
                {
                led1=1;
                led7=0;
                }
                 
    }
}


//void timer0() interrupt  1  //超出测量范围
//{
//        flag=1;
//}

void timer1() interrupt 3 //定时器1中断函数
{   

          TL1 = 0x33;                //设置定时初值        500us
        TH1 = 0xFE;                //设置定时初值
        temp++;
    i++;                //每次20毫秒产生一次中断                        500us
    if(i>=140)            //每80毫秒发送一次状态
    {
        i=0;
        Trig=1;
                Delay20us();
        Trig=0;
    }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top