找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7680|回复: 12
收起左侧

超声波测距程序里为什么要先把echo回波接收端置1?

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:139175 发表于 2016-10-30 16:36 | 显示全部楼层 |阅读模式
#include <STC89C5xRC.H>
#define uint unsigned int//宏定义unsigned int
#define uchar unsigned char//宏定义unsigned char
sbit echo=P3^2;//接收
sbit trig=P3^3;//发送
sbit led=P1^0;//蜂鸣器
sbit bw=P2^0;//百位
sbit sw=P2^1;//十位
sbit gw=P2^2;//个位
sbit sfw=P2^3;//十分位
uint timeh,timel,distance,time;
uchar bai,shi,ge,shifen;
bit flag;
uchar code list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管不带小数点代码数组
uchar code listtwo[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管带小数点代码数组
void delay(uint z)//延时z毫秒函数
{
uint x,y;
for(x=z;x>0;x--)
  for(y=123;y>0;y--);
}
void delay20us()//延时20微秒函数
{
uchar a;
for(a=7;a>0;a--);
}
void ini()//初始化函数
{
TMOD=0x01;//设置定时器0为16位定时器/计数器
TH0=0;//定时器0高8位清0
TL0=0;//定时器0低8位清0   
flag=0;//中断标志位置0
trig=0;//trig信号置0
EA=0;//关闭总中断
ET0=0;//关闭定时器0中断
EX0=0;//关闭外部中断0中断
}
void display(distance)//显示函数
{
bai=distance/1000;//分离百位
shi=distance%1000/100;//分离十位
ge=distance%100/10;//分离个位
shifen=distance%10;//分离十分位
P0=list[bai];//发送百位代码
bw=0;//显示百位
delay(1);//延时1毫秒
bw=1;//消隐百位
P0=list[shi];//发送十位代码
sw=0;//显示十位
delay(1);//延时1毫秒
sw=1;//消隐十位
P0=listtwo[ge];//发送个位代码
gw=0;//显示个位
delay(1);//延时1毫秒
gw=1;//消隐个位
P0=list[shifen];//发送十分位代码
sfw=0;//显示十分位
delay(1);//延时1毫秒
sfw=1;//消隐十分位
}   
void main()//主函数
{
ini();//调用初始化函数  初始化定时器,关中断
while(1)//无限循环
{
  uchar i;
  echo=1;//接收端置1,准备接收echo信号   这里的这句话不太懂,置1了还怎么接收回响信号输出的高电平?
  trig=1;//发送trig信号
  delay20us();//延时20微秒
  trig=0;//发送trig信号完毕


  while(echo==0);//等待接收echo信号,如接收到echo信号则继续执行

  
      
  flag=0;//中断标志位置0
  TH0=0;//定时器0高8位清0
  TL0=0;//定时器0低8位清0
  EA=1;//打开总中断
  EX0=1;//打开外部中断0
  TR0=1;//打开定时器0


  for(i=1000;i>0;i--)//循环显示100次
  {
   display(distance);//调用显示函数
  }


  EA=0;//关闭总中断
  EX0=0;//关闭外部中断0中断
  TR0=0;//关闭定时器0


  if(flag==1)//如果进入中断
  {
   time=timeh*256+timel;//计算时间
   distance=time*0.172;//计算测定距离
  }
  else//否则
  {
   distance=0;//距离为0
  }
   if(distance<200)
   {
     led=0;
   }
   else
   {
     led=1;
   }
}
}
void ex0() interrupt 0//外部中断0中断函数
{
timeh=TH0;//把定时器0高8位装入timeh
timel=TL0;//把定时器0低8位装入timel
flag=1;//中断标志位置1
EX0=0;//关闭外部中断0中断
TR0=0;//关闭定时器0
}  

回复

使用道具 举报

ID:139175 发表于 2016-10-30 16:37 | 显示全部楼层
求解答
回复

使用道具 举报

ID:145229 发表于 2016-10-30 17:14 | 显示全部楼层

回帖奖励 +5 黑币

把echo端置1是因为到接收到回波时echo会变为零 通过定时计算这段时间能算出距离
回复

使用道具 举报

ID:123732 发表于 2016-10-30 18:45 | 显示全部楼层

回帖奖励 +5 黑币

这句没有用,删掉echo=1;//接收端置1,准备接收echo信号
回复

使用道具 举报

ID:111634 发表于 2016-10-30 19:11 | 显示全部楼层

回帖奖励 +5 黑币

本帖最后由 zl2168 于 2016-10-30 19:14 编辑

51单片机复位时,各I/O端口均自动置1,除非在程序中清过0,它将始终保持置1。因此echo=1虽然无用,但也无害。I/O端口置1的作用是准备接受输入信号,I/O=1,输入信号可传输到数据总线上;I/O=0,输入信号将被对地短路,这是由51单片机I/O端口的硬件电路决定的。。
回复

使用道具 举报

ID:139175 发表于 2016-10-30 22:53 | 显示全部楼层
zl2168 发表于 2016-10-30 19:11
51单片机复位时,各I/O端口均自动置1,除非在程序中清过0,它将始终保持置1。因此echo=1虽然无用,但也无害 ...

我感觉这个程序写的不是很规范,外部中断0的触发方式也没定义,请问你觉得这段程序写的怎么样?
回复

使用道具 举报

ID:111634 发表于 2016-10-31 07:57 | 显示全部楼层
本帖最后由 zl2168 于 2016-10-31 08:01 编辑
keil 发表于 2016-10-30 22:53
我感觉这个程序写的不是很规范,外部中断0的触发方式也没定义,请问你觉得这段程序写的怎么样?

我一般不看人家的程序,有看人家程序的时间,我自己已经写好了。
希望初学者不要看网上这种不靠谱的程序,以免浪费时间。
找一些靠谱的书,认真研读,必有收获,才是正道。
回复

使用道具 举报

ID:111634 发表于 2016-10-31 08:09 | 显示全部楼层
本帖最后由 zl2168 于 2016-10-31 08:14 编辑

本网站常有人将调不通的程序让“大神”诊断,而且这些程序冗长且无必要的注释,让人猜谜揣摩么?为什么不找一些可靠即肯定能调通的程序仿真研读呢?若欲了解某一条语句错了以后的副作用,你可以改错后再仿真,看看后果。
改变学习方法,拿正确的程序改错后去辨析,不要拿错误的程序去辨析,这样太费时,甚至可能得不到正确的解答。
回复

使用道具 举报

ID:139175 发表于 2016-11-2 11:37 | 显示全部楼层
zl2168 发表于 2016-10-31 08:09
本网站常有人将调不通的程序让“大神”诊断,而且这些程序冗长且无必要的注释,让人猜谜揣摩么?为什么不找 ...

谢谢指导
回复

使用道具 举报

ID:139175 发表于 2016-11-2 11:38 | 显示全部楼层
问题已得到解答,谢谢大家
回复

使用道具 举报

ID:7485 发表于 2016-11-2 14:32 | 显示全部楼层

回帖奖励 +5 黑币

这是一个许多初学者都感到迷茫的问题。51单片机的IO的读和写是不一样的,读端口,写寄存器。所以在读端口之前,都要将端口寄存器置1,否则将有可能会出错。当然51单片机IO上电初始化后的默认状态就是高电位,但是当程序运行以后难免会有改变的情况,所以规范的程序写法就应该先置1。
对于单片机的基本特性还是要读懂才好。
回复

使用道具 举报

ID:7485 发表于 2016-11-2 14:36 | 显示全部楼层
自己纠正一下:严格说,IO端口是锁存器。
回复

使用道具 举报

ID:470469 发表于 2019-1-19 23:44 | 显示全部楼层
楼主我被学长要求也是写这个代码,现在有几个疑惑的地方想请教一下你,不麻烦的话可以加下我QQ603619540
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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