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

📄 改进程序.c

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

uint c=340;
ulong l,time;
char i=1,j=1,k=80,aa;
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 k2=P1^1;
sbit k1=P1^0;
sbit k3=P1^2;
sbit k4=P1^3;

sbit sg=P3^7;
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);//光标从左往右移,内容不移//
 }

/**************温度输入程序***********************/

void inptt()
{while(1)
 {if(k2==0){tp++;if(tp>=99)tp=99;}
  delay(7000);
  if(k1==0){tp--;if(tp<=(-30))tp=(-30);}
  delay(7000);
  t=tp;
  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  ");
  writercom(0xba);
  writer_d("Press K4 finish ");
  if(k4==0)break;
  }
}

//**********超声波发射程序**************************//

void sen()	   //超声波发射程序//
{uchar times=0; 
 TMOD=0x12;    //定时器1工作在定时方式1,定时器0工作在定时方式2//
 IE=0x84;	   //中断设置//
 TH0=244;
 TL0=244;
 TR0=1;
 TR1=1;        //开定时器//
 while(1)
 {while(TF0==0);
  sg=~sg;
  times++;     //翻转20次,发送10个脉冲信号的超声波//
  TF0=0;   
  if(times==20)break;}
  TR0=0;
  times=0;
}

//**********外中断服务程序******************************//

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

//************数据处理,显示结果***************//

void dataxs()
{if(tp>=10)c=338+(tp-10)*0.6;
 else c=338+(10-tp)*0.6;
 cb=c/100;
 cs=c%100/10;
 cg=c%100%10;
 lb=l/1000000;
 ls=l%1000000/100000;
 lg=l%1000000%100000/10000;

/******显示********/
  writercom(0x80);
 if(l<=130000)writer_d("too near!       ");
 else if(l>=5000000)writer_d("too long!       ");
 else {writer_d("L=");
       writerdata(lb+0x30);
       writerdata('.');
       writerdata(ls+0x30);
       writerdata(lg+0x30);
       writer_d("m ");	     
       writer_d("c=");
       writerdata(cb+0x30);
       writerdata(cs+0x30);
       writerdata(cg+0x30);
       writer_d("m/s ");
       }
}

//****状态1,手动控制******************//

void unauto()
{while(i)
 {while(k--)
  {writercom(0xba);
   writer_d("Press K4 measure");
   if(k4==0||k3==0){i=0;break;}
   delay(2000);}
   k=20;
  while(k--)
  {writercom(0xba);
   writer_d("                ");
   if(k4==0||k3==0){i=0;break;}
   delay(2000);}
   k=20;
  }
  i=1;
  ctl=0;
  sen();//调超声波发射程序;
  delay(50);
  ctl=1;
  }

//****状态2,实时监控******************//

void aut()
{writercom(0xba);
 writer_d("real time measur");
 ctl=0;
 sen();
 delay(50);
 ctl=1;
 }

//*****状态选择************************//
ztxz()
{while(k3==0&&aa==0)
 {while(1)
  {if(k3==1)break;}
  aa=1;
  }
 while(k3==0&&aa==1)
 {while(1)
  {if(k3==1)break;}
  aa=0;
  }
 }
//********主程序*******************//

main()
{xsinit();
 inptt();//温度输入//
 while(1)
 {while(!aa)
  {unauto();
   break;
  }
  while(aa) 
  {aut();
   break;
  }
 
  while(k--)//等待回波//
  {ztxz();//状态切换键判断
   delay(2000);
   }
   k=20;
  dataxs();
  }
}

⌨️ 快捷键说明

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