51单片机 HC-SR04超声波测距 我写的C语言代码,请问

/*HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。下面是我写的代码:我... /*

HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。
下面是我写的代码:我想测试自己使用该模块是否正确,于是就想实现如果echo端接受到了高电平,蜂鸣器BEEP就响。但是实际使用的时候发现并非预期结果,情高人帮忙看看下面的代码有何问题。代码不长,望大神赐教!
*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

/*位定义*/
sbit CHUFA=P0^1; //位定义超声波触发端(10us以上高电平触发)
sbit JIESHOU=P0^3; //接收端(接受高电平)
sbit BEEP=P2^0; //蜂鸣器
sbit OUT0=P3^2; //外部中断0

uchar JS_FLAG; //接收标志
uint CF_TIME,t0,t1,shu;

/*函数声明*/
void timer0();
void int0();
void display(uint);

main(){
CHUFA=0; //初始化拉低触发端和接收端电平
JIESHOU=0;

JS_FLAG=0;
CF_TIME=15; //初始化触发时间(大于10us)

TMOD=0x11; //定时器方式选择
EA=1; //开总中断
ET0=1; //开定时器0中断
EX0=1; //开外部中断0
IT0=0; //外部中断选择下降沿触发
//JIESHOU=1;

while(1){
OUT0=JIESHOU; //外部中断0被赋值为接收端信号,当出现下降沿是触发外部中断0

if(JS_FLAG==0){ //如果没有接收到高电平则触发
CHUFA=1;
while(CF_TIME--); //10us以上高电平触发传感器
}

if(JIESHOU==1){
TR0=1; //如果接收端收到高电平则启动定时器
JS_FLAG=1; //并且标志位置1
BEEP=0; //蜂鸣器响
}

display(t1); //显示测量时间(秒)
}
}
/*定时器0中断程序*/
void timer0() interrupt 1{
TH0=(65536-10000)/256; //装初值 10ms
TL0=(65536-10000)%256;
t0++; //每进入一次中断t0加1
}
/*外部中断0中断程序*/
void int0() interrupt 0{
TR0=0; //一旦进入外部中断0,说明接收端收到下降沿信号。关闭定时器0
JS_FLAG=0; //接收标志位置0
BEEP=1; //关闭蜂鸣器
t1=t0*10/1000; //测量时间为 进入定时器中断次数t0乘以每次时间10ms,除以1000化为秒为单位
t0=0; //t0清零
}
/*数码管显数函数*/
void display(uint shu){
//数码管显示函数
}
展开
 我来答
tattackor
推荐于2017-09-05 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:887万
展开全部

1、HC-SR04使用方法:给触发端子trig一个10us以上的高电平即可触发,触发后echo端子将接受到高电平,高电平的持续时间就是测距的往返时间。


2、例程:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*位定义*/
sbit CHUFA=P0^1;    //位定义超声波触发端(10us以上高电平触发)
sbit JIESHOU=P0^3;    //接收端(接受高电平)
sbit BEEP=P2^0;        //蜂鸣器
sbit OUT0=P3^2;        //外部中断0
uchar JS_FLAG;        //接收标志
uint CF_TIME,t0,t1,shu;
/*函数声明*/
void timer0();        
void int0();
void display(uint);
main(){
    CHUFA=0;        //初始化拉低触发端和接收端电平
    JIESHOU=0;
    JS_FLAG=0;        
    CF_TIME=15;        //初始化触发时间(大于10us)
    TMOD=0x11;        //定时器方式选择
    EA=1;             //开总中断
    ET0=1;            //开定时器0中断
    EX0=1;             //开外部中断0
    IT0=0;             //外部中断选择下降沿触发
    //JIESHOU=1;
    while(1){
        OUT0=JIESHOU;      //外部中断0被赋值为接收端信号,当出现下降沿是触发外部中断0
        if(JS_FLAG==0){        //如果没有接收到高电平则触发
            CHUFA=1;
            while(CF_TIME--);    //10us以上高电平触发传感器
        }
        if(JIESHOU==1){        
            TR0=1;            //如果接收端收到高电平则启动定时器
            JS_FLAG=1;         //并且标志位置1
            BEEP=0;            //蜂鸣器响    
        }
        display(t1);    //显示测量时间(秒)
    }
}
/*定时器0中断程序*/
void timer0() interrupt 1{    
    TH0=(65536-10000)/256;    //装初值 10ms
    TL0=(65536-10000)%256;
    t0++;                    //每进入一次中断t0加1    
}
/*外部中断0中断程序*/
void int0() interrupt 0{
    TR0=0;            //一旦进入外部中断0,说明接收端收到下降沿信号。关闭定时器0
    JS_FLAG=0;        //接收标志位置0
    BEEP=1;               //关闭蜂鸣器
    t1=t0*10/1000;    //测量时间为 进入定时器中断次数t0乘以每次时间10ms,除以1000化为秒为单位
    t0=0;            //t0清零
}
/*数码管显数函数*/
void display(uint shu){
    //数码管显示函数
}
华芯测试
2024-09-01 广告
深圳市华芯测试科技有限公司是一家专业从事半导体晶圆检测设备的企业,公司集制造、研发、销售和服务于一体,不仅拥有专业的生产设备、精湛的加工工艺及品质检测体系,具有经验丰富的设计与研发团队及完善的售后服务团队,并集成相关测试仪器、仪表,提供半导... 点击进入详情页
本回答由华芯测试提供
百度网友f7fee79f7
2013-05-14 · TA获得超过395个赞
知道小有建树答主
回答量:341
采纳率:0%
帮助的人:321万
展开全部
初学C,只懂些简单语法,不懂单片机。
不知道这个会不会影响:
sbit JIESHOU=P0^3; //接收端(接受高电平)
JIESHOU=0;
//JIESHOU=1;
后面就没有见到再给JIESHOU赋值。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
第一个李伟杰
2018-11-26 · 超过17用户采纳过TA的回答
知道答主
回答量:45
采纳率:100%
帮助的人:16.9万
展开全部
一,你计时器初值填错了
二,每次,while(CF_TIME--); 之后没置CF_TIME为15
还有你us级延时可能不能用循环,要用_nop()_
然而现在还是不对
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
suiruop
2013-05-12 · TA获得超过341个赞
知道小有建树答主
回答量:210
采纳率:100%
帮助的人:115万
展开全部
CHUFA=1;
while(CF_TIME--); //10us以上高电平触发传感器

要产生10us的脉冲 拉高后你要拉低啊

CHUFA=1;
while(CF_TIME--); //10us以上高电平触发传感器
CHUFA=0;
追问
你好,谢谢指出这个问题。但是我修改后依然无法实现其功能。这段代码是我自己写的,你能不能帮我检查一下哪里存在错误呢?麻烦你啦!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式