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

📄 超声波2.c

📁 通过测量超声波的的来回时间,(超声波速度:347m/s在25C时),达到测量距离的目的.
💻 C
字号:
#include <REG52.h>
#define uchar unsigned char
#define uint  unsigned int
#define soundspeed  17  // 17cm/ms  速度一半 使计算快速

uchar code  datebit[]={0x7f,0xbf,0xdf,0xef};//,0xef,0xdf,0xbf,0x7f};
uchar code  tvdate[]={0x3f,0x06,0x5b,0x4f,
                      0x66,0x6d,0x7d,0x07,
				      0x7f,0x6f,0x77,0x7c};

sbit ZHD=P3^4;
sbit en555=P3^0;
sbit BY1=P3^3;
sbit shb=P3^6;
unsigned long t=0,count=0,distance=0;
unsigned char disdat[4]; 
unsigned char flag_t0=0; //TO中断次数
unsigned char flag_t1=0; //T1中断次数
bit flag_f=0;  //flag_f=0近距离测试  flag_f=1远距离测试
int time;
//延时函数
void send()//开始发送超声波
{
	en555=1;    //发射超声波
	TR1=1;      //T1开始计时控制发送超声波的时间
	TH0=TL0=0;
}
void stop() //停止测试
{
		//en555=0;
		TR0=0;
		TR1=0;
		EX0=0;
		flag_t0=0;
		//shb=0;   //失败灯亮
		ZHD=1;   //成功的灯灭
}
void int0(void)interrupt 0
{ 
	//en555=0;
	TR0=0;  //关闭T0
	shb=1;  //完成灯灭
	t=TL0+TH0*256;//+65535*flag_t0;
	ZHD=0;  //接收到灯亮
	EX0=0;  //接收到一次中断 关闭
}
void time0(void)interrupt 1
{
	TH0=TL0=0;
	flag_t0++;
	/*if(flag_t0==1&&flag_f==0)//2个655536US没有中断  启动远距离测试模式
	 {
		flag_f=1; //测试一次失败
		stop();   //先暂时停止 
		send();   //重新启动
	 }*/
	if(flag_t0==5)//超出测试范围 停止.
	 {
	  stop();   //停止测试
	  flag_f=0; //一次失败标志清零 准备下一次测试
	  shb=0;   //失败灯亮
	 }
}
void time1(void)interrupt 3
{
	if(flag_f==0)  //近距离测试
	 {
		flag_t1++;
		if(flag_t1==1) 
			{
			 //TR0=1;
			 //TH1=TL1=100;
			}
		if(flag_t1==2) 
			{
			 en555=0;
			 TR0=1;
			 TH1=TL1=5;
			}
		if(flag_t1==3)
			{
				EX0=1;    //定时1ms以后打开接收中断,跳过余波干扰
				flag_t1=0;
				TR1=0;    //关闭定时T1	
			}
	  }
	/*if(flag_f==1)  //远距离测试(第一次测试失败在启动)
	 {
		flag_t1++;
		if(flag_t1==1) 
			{
			 TR0=1;
			}
		if(flag_t1==10)
			{
				en555=0; //远距离测试发送2ms时间的脉冲波
			}
		if(flag_t1==18)
			{
				EX0=1;    //定时3ms以后打开接收中断,跳过余波干扰
				TR1=0;    //关闭定时T1	
				flag_t1=0;
			}
	  }*/
}

void delay10ms(void) //延时程序
{ 
	unsigned char i,j; 
	for(i=20;i>0;i--) 
	for(j=248;j>0;j--); 
} 


key()           //按键判断程序
{ 
	if(BY1==0)  //判断是否按下键盘
		{ 
			delay10ms(); //延时,软件去干扰
			if(BY1==0)   //确认按键按下
				{ 
					send();//发送超声波
				}
	while(BY1==0);//按键锁定,每按一次count只加1.
} 
} 


void delay(time)
 {
   unsigned char i,j;
   for(j=0;j<time;j++)
   for(i=0;i<250;i++);
 }
display(void)
{	unsigned char k;
	distance=t*soundspeed;//此处T单位是ns;soundspeed单位是厘米(17cm/ms);distance值是实际值的1000倍
	//distance=distance*100; //将单位转换成厘米
	disdat[0]=distance/100000;//flag/1000;//
	disdat[1]=distance%100000/10000;//flag%1000/100;//
	disdat[2]=distance%10000/1000;//flag%100/10;//
	disdat[3]=distance%1000/100;//flag%10;//
	for(k=0;k<4;k++)
	{
		if(k==2) P0=tvdate[disdat[k]]|0x80;//加小数点
		else
	 	P0=tvdate[disdat[k]];
		P2=datebit[k];
		
		delay(10);
  	}
}

main()
{
  TMOD=0x21;     //T1都工作在方式2 T0工作在方式1 定时方式
 // IT0=1; IT1=1; 
  IE=IE|0x8A;    //允许T1 T0中断
  TH0=TL0=0;   
  TH1=TL1=5;     //250US中断一次
  en555=0;
  //TR0=1;
  while(1)  
   {
     display();
	 key();
   }
}

⌨️ 快捷键说明

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