⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 超声波发射程序.c

📁 基于单片机的超声波测距程序,用C编写.液晶显示
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

uint c;
ulong l,time;
char i=1,j=1,k=80;
char t,tp=10,ts,tg,lb,ls,lg,lsf,fh,cb,cs,cg;
sbit RW=P2^1;
sbit RS=P2^0;
sbit E=P2^2;
sbit rece=P3^3;
sbit tup=P1^1;
sbit tdown=P1^0;
sbit aj=P1^2;
sbit reset=P1^3;

sbit sg=P3^7;
sbit DQ=P3^5;
sbit ctl=P3^5;


void delay(uint i)
{while(i--);
 }

//************液晶显示***************//

void writercom(uchar q)
{E=1;
 RS=0;
 RW=0;
 P0=q;
 E=0;
 delay(20);
 }

void writerdata(uchar o)
{
 E=1;
 RS=1;
 RW=0;
 P0=o;
 E=0;
 delay(20);
 }

void writer_d(uchar *u)
{while(*u)
  writerdata(*u++);
 }

void xsinit(void)
{writercom(0x01);
 writercom(0x38);//使用8位数据,显示两行,使用5*7的字型//
 writercom(0x0c);//显示设置,不显示光标,字符不显闪琐//
 writercom(0x06);//光标从左往右移,内容不移//

  }

pdisplay()
{writercom(0x80);
 writer_d("Press any key   ");
 writercom(0xba);
 writer_d("  to continue...");
 delay(2000);

}

bdisplay()
{writercom(0x80);
 writer_d("Ultrasonic      ");
 writercom(0xba);
 writer_d("    range finder");
 delay(60000);
 }

ipdisplay()
{writercom(0x80);
 writer_d(" Please input   ");
 writercom(0xba);
 writer_d("T(");
 writerdata(0xdf);
 writer_d("C) with K1,K2.");
 delay(2000);
 }



//*************超声波测距*************************//

void csbinit()    //初始化程序,计数/定时器状态 //
{TMOD=0x12;    //定时器1工作在定时方式1,定时器0工作在定时方式2//
 IE=0x84;	   //中断设置//
 TH0=244;
 TL0=244;
 }

void sen()	   //超声波发射程序//
{uchar times=0;
 TR0=1;
 TR1=1;        //开定时器//
 while(1)
 {while(TF0==0);
  sg=~sg;
  times++;     //翻转20次,发送10个脉冲信号的超声波//
  TF0=0;   
  if(times==20)break;}
  times=0;
}

csbdata()
{lb=l/1000000;
 ls=l%1000000/100000;
 lg=l%1000000%100000/10000;
 lsf=l%1000000%100000%10000/1000;
 if(lsf>=5)lg=lg+1;
}

rec()interrupt 2 using 2//接收中断程序//
{TR1=0;//关计数器//
 ctl=0;
 time=TH1*256+TL1; //算出t的值,t的单位为us//
 l=time*c/2;
 TH1=0;
 TL1=0;
 }

display1()
{
 while(k--)
  {ipdisplay();
   if(tup==0||tdown==0||reset==0||aj==0){i=0;break;}
   }
   k=60;
 while(k--)
  {pdisplay();
   if(tup==0||tdown==0||reset==0||aj==0){i=0;break;}
   }
   k=60;
 }
measure()
{csbdata();
  while(1)
  {if(aj==1)break;}
  ctl=0;
  sen();
  delay(200);
  ctl=1;
 }


display2()
{writercom(0x80);
 writer_d("T:");
 writerdata(fh);
 writerdata(ts+0x30);
 writerdata(tg+0x30);
 writerdata(0xdf);
 writer_d("C ");
 writer_d("c=");
 writerdata(cb+0x30);
 writerdata(cs+0x30);
 writerdata(cg+0x30);
 writer_d("m/s");
 while(i)
 {while(k--)
  {writercom(0xba);
   writer_d("Press K3 measure");
   if(aj==0){i=0;break;}
   delay(2000);}
   k=20;
  while(k--)
  {writercom(0xba);
   writer_d("                ");
   if(aj==0){i=0;break;}
   delay(2000);}
   k=20;
  }
  i=1;
 measure();
 delay(2000);
 csbdata();
 writercom(0x80);
 if(l<=360000)writer_d("too near!       ");
 else if(TH1>=93)writer_d("too long!       ");
 else {csbdata();
       writer_d("L=");
       writerdata(lb+0x30);
       writerdata('.');
       writerdata(ls+0x30);
       writerdata(lg+0x30);
       writer_d("m  ");	     
       writer_d("T:");
       writerdata(fh);
       writerdata(ts+0x30);
       writerdata(tg+0x30);
       writerdata(0xdf);
       writer_d("C ");
       }
 while(i)
{writercom(0xba);
 writer_d("Press K4 again..");
 if(tup==0&&tdown==0){j=0;break;}
 if(reset==0){i=0;break;}
  
 }
}
//***************温度输入程序**************//
iptemp()
{while(1)
 {if(t<0){fh=0x2d;t=~t+1;}
  else{fh=0x20;}
  ts=t/10;
  tg=t%10;
  writercom(0x80);
  writer_d("    T:");
  writerdata(fh);
  writerdata(ts+0x30);
  writerdata(tg+0x30);
  writerdata(0xdf);
  writer_d("C  ");
  if(tup==0){tp++;if(tp>=99)tp=99;}
  delay(7000);
  if(tdown==0){tp--;if(tp<=(-30))tp=(-30);}
  t=tp;
  delay(7000);
  writercom(0xba);
  writer_d("Press K4 finish ");
  if(reset==0)break;
  }
}
//********声速处理程序************************//
sscl()
{c=340;

 cb=c/100;
 cs=c%100/10;
 cg=c%100%10;
 }

//***************主程序***************//
main()
{while(1)
{xsinit();
 csbinit();
 bdisplay();
 bdisplay();
 bdisplay();
 bdisplay();
 bdisplay();
 ipdisplay();
 ipdisplay();
 while(i)
 {display1();
  }
 i=1;
 delay(20000);
 iptemp();  //调温度输入函数//
 sscl();
 delay(20000);
while(j)
{display2();
 i=1;
 
}
j=1;
delay(60000);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -