欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8566|回復: 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 單片機教程網

快速回復 返回頂部 返回列表