標題: 基于at89s52 LED超聲波測距··· [打印本頁]

作者: daming    時間: 2014-12-29 01:15
標題: 基于at89s52 LED超聲波測距···
#include<reg52.h>
   
sbit TX =P3^6;   //信號發(fā)送端
sbit RX =P3^7;   //信號接收端
unsigned long S;
unsigned int time;
unsigned char qian,bai,shi,ge;
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //數(shù)碼管值
void delay(unsigned int i)   //定義一個小延時,哈哈
{
while(--i);
}
void sent()      //定義一個發(fā)送
{  
TX=1;       //發(fā)送端發(fā)送信號
delay(25);      //給一個大于10US的信號
TX=0;       //關閉發(fā)送端信號
}
void Count()
{
time=TH0*256+TL0;    //計算時間
TH0=0;       //復位
TL0=0;       //復位
S=(time*1.7)/10;    //計算距離,單位MM
if(S<5000)
{
  qian=tab[S/1000];    //定義第四位
  bai=tab[S/100%10];    //定義第三位
  shi=tab[S/10%10];    //定義第二位
  ge=tab[S%10];     //定義第一位
  P1=ge;     //送出顯示
  P0=3;
  delay(300);
  P1=shi;
  P0=2;
  delay(300);
  P1=bai;
  P0=1;
  delay(300);
  P1=qian;
  P0=0;
  delay(300);
}
}
void receive()     //定義一個接收
{
TR0=1;      //定時器0開
while(RX);     //持續(xù)延時RX為高電平的時間
TR0=0;      //定時器0關
Count();     //調(diào)用Count
}
main()
{
int lv;
EA=1;          //總中斷開
ET0=1;       //定時器中斷0開
ET1=1;       //定時器中斷1開
TMOD=0X11;      //定義TO,T1由TCON控制,工作方式為方式1
TH0=0;
TL0=0;
TH1=0;
TL1=0;
while(1)
{
  RX=1;      //給RX一個高電平
  sent();      //給發(fā)送端一個>10us的信號
  for(lv=2000;lv>0;lv--)
  {
   if(RX==1)
   {
    receive();   //調(diào)用RECEIVE
   }
  }
}
}

//寫了我一天的時間,唉,效率還是太低···努力,努力···






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1