蓝桥杯单片机----超声波传感器的基本控制

        超声波传感器是将超声波信号转换成其他能量信号(通常是电信号)的传感器。超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中。超声波碰到杂质或分界面会产生显著反射形成反射回波,碰到活动物体能产生多普勒效应。超声波传感器广泛应用在工业、国防、生物医学等方面。

        人们能听到声音是由于物体振动产生的,它的频率在20HZ-20KHZ范围内,超过20KHZ称为超声波,低于20HZ的称为次声波。常用的超声波频率为几十KHz----几十MHz。

特性:

        (1) 超声波具有在气体、液体、固体等介质中进行效传播的能力。

        (2) 超声波具有很强的传递能量的能力。

        (3) 超声波具有反射特性,还会产生干涉、叠加和共振现象。

        (4) 超声波在液体介质中传播时,可在界面上产生空化现象和强烈的冲击。

应用:

        (1) 超声波在医学上的应用主要是诊断疾病,它已经成为了临床医学中不可缺少的诊断方法。超声波诊断的优点是:对受检者无痛苦、无损害、方法简便、显像清晰、诊断的准确率高等。

        (2) 在工业方面,超声波的典型应用是对金属的无损探伤和超声波测厚两种。过去,许多技术因为无法探测到物体组织内部而受到阻碍,超声波传感技术的出现改变了这种状况。

        可能我能听过最多关于超声波的应用不是上面两条,而是利用超声进行测距,我们本次的设计内容也是利用超声波传感器进行测距并利用数码管显示出来,在此之前我们先来看看超声波在测距方面的其他应用场景吧~

        1、超声波传感器可以对集装箱状态进行探测。将超声波传感器安装在塑料熔体罐或塑料粒料室顶部,向集装箱内部发出声波时,就可以据此分析集装箱的状态,如满、空或半满等。

        2、超声波传感器可用于检测透明物体、液体、任何表粗糙、光滑、光的密致材料和不规则物体。但不适用于室外、酷热环境或压力罐以及泡沫物体。

        3、超声波传感器可以应用于食品加工厂,实现塑料包装检测的闭环控制系统。配合新的技术可在潮湿环如洗瓶机、噪音环境、温度极剧烈变化环境等进行探测。

        4、超声波传感器可用于探测液位、探测透明物体和材料,控制张力以及测量距离,主要为包装、制瓶、物料搬检验煤的设备运、塑料加工以及汽车行业等。超声波传感器可用于流程监控以提高产品质量、检测缺陷、确定有无以及其它方面。

设计内容:

        1.第一位数码管数码管显示提示符"C",第二位到第五位数码管熄灭,后三位数码管显示距离,单位CM;

        2.超出测量距离范围数码管显示应为999,后三位未使用到的数码管应熄灭。

#include <stc15f2k60s2.h>
#include <intrins.h>

#define uchar unsigned char   //定义无符号字符类型uchar
#define uint unsigned int     //定义无符号整型类型uint

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}

sbit TX = P1^0;
sbit RX = P1^1;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x8e,0xc6};//数字0~9,“-”,“关”,“F”,“C”
uchar yi,er,san,si,wu,liu,qi,ba;   //定义字符型变量yi,er,san,si,wu,liu,qi,ba,当作数码管显示控制变量

uint time,Distance,trie;
bit flag=0;

void delayms(int ms);          //延时函数
void allinit();                //初始化函数
void display1(uchar yi,uchar er);   //第一、二段数码管函数
void display2(uchar san,uchar si);  //第三、四段数码管函数
void display3(uchar wu,uchar liu);  //第五、六段数码管函数
void display4(uchar qi,uchar ba);   //第七、八段数码管函数
void Timer0Init(void);		//2毫秒@12.000MHz
void Timer1Init(void);		//2毫秒@12.000MHz
void send_fb();
void Ultrasonic();

void main()//主函数
{
	allinit();                  //初始化函数
	Timer0Init();
	Timer1Init();
	yi=11;er=11;san=11;si=11;wu=11;liu=11;qi=11;ba=11;//关闭所有数码管
	while(1)
	{
		yi=13;er=11;san=11;si=11;wu=11;
		if(Distance>=100){liu=Distance/100;qi=Distance%100/10;ba=Distance%10;}
		else if(Distance>=10){liu=11;qi=Distance/10;ba=Distance%10;}
		else if(Distance<10){liu=11;qi=11;ba=Distance;}
		
		Ultrasonic();
		display1(yi,er);          //第一、二段数码管函数
		display2(san,si);         //第三、四段数码管函数
		display3(wu,liu);         //第五、六段数码管函数
		display4(qi,ba);          //第七、八段数码管函数
	}
}
void Ultrasonic()
{
	if(flag == 1)
	{
		flag = 0;
		send_fb();
		TR1 = 1;
		while((RX == 1)&&(TF1 == 0));
		TR1 = 0;
		if(TF1 == 1)
		{
			TF1 = 0;
			Distance = 999;
		}
		else 
		{
			time = TH1 << 8;
			time |= TL1;
			Distance = time*0.017;
			Distance = Distance/12;
		}
		TH1 = 0;
		TL1 = 0;
	}
}
void send_fb()
{
	unsigned int i = 8;
	do
	{
		TX = 1;
		somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
		TX = 0;
		somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;somenop;
	}while(i--);
}
void Timer0Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x40;		//设置定时初值
	TH0 = 0xA2;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;ET0 = 1;
}
void Timer1Init(void)		//2毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
}
void time0() interrupt 1
{
	TL0 = 0x40;		//设置定时初值
	TH0 = 0xA2;		//设置定时初值
	
	if(++trie == 100)
	{
		trie = 0;
		flag = 1;
	}
}
void delayms(int ms)//延时函数
{
	uint i,j;
	for(i=ms;i>0;i--)
		for(j=845;j>0;j--);
}
void allinit()//初始化函数
{
	P2=0XA0;P0=0X00;      //关闭蜂鸣器继电器
	P2=0X80;P0=0XFF;      //关闭所有LED灯
	
	P2=0XC0;P0=0XFF;      //选中所有数码管段选
	P2=0XFF;P0=0XFF;      //关闭所有数码管
}
void display1(uchar yi,uchar er)//第一、二段数码管函数
{
	P2=0XC0;P0=0X01;               //选中第一个数码管段选
	P2=0XFF;P0=tab[yi];            //让第一个数码管显示yi指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X02;               //选中第二个数码管段选
	P2=0XFF;P0=tab[er];            //让第一个数码管显示er指向的值
	delayms(1);	                   //延时1ms
}
void display2(uchar san,uchar si)//第三、四段数码管函数
{
	P2=0XC0;P0=0X04;               //选中第s三个数码管段选
	P2=0XFF;P0=tab[san];           //让第一个数码管显示san指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X08;               //选中第四个数码管段选
	P2=0XFF;P0=tab[si];            //让第一个数码管显示si指向的值
	delayms(1);	                   //延时1ms
}
void display3(uchar wu,uchar liu)//第五、六段数码管函数
{
	P2=0XC0;P0=0X10;               //选中第五个数码管段选
	P2=0XFF;P0=tab[wu];            //让第一个数码管显示wu指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X20;               //选中第六个数码管段选
	P2=0XFF;P0=tab[liu];           //让第一个数码管显示liu指向的值
	delayms(1);	                   //延时1ms
}
void display4(uchar qi,uchar ba)//第七、八段数码管函数
{
	P2=0XC0;P0=0X40;               //选中第七个数码管段选
	P2=0XFF;P0=tab[qi];            //让第一个数码管显示qi指向的值
	delayms(1);                    //延时1ms
	
	P2=0XC0;P0=0X80;               //选中第八个数码管段选
	P2=0XFF;P0=tab[ba];            //让第一个数码管显示ba指向的值
	delayms(1);                    //延时1ms
}

 

Guess you like

Origin blog.csdn.net/qq_45385706/article/details/115470930