超声波模块学习

超声波模块学习第一阶段

   1,了解了HC-SR04超声波模块的工作原理,由单片机提供一个30us左右的高电平,模块的Trig端会自动产生8个40KHZ的矩形脉冲波,Echo端接收到信号后后会产生高电平,用定时器记录所需时间,从而可以计算出距离。

  2,如何用信号发生器,电源和示波器检测超声波模块的好坏。通过示波器观察Echo端产生的波的周期,计算出距离来与实际情况比较,来判断超声波模块的好坏。

  3,理解了电脑与单片机(全双工通信)之间的串口通信,通过设置波特率与电脑建立联系,通过定时器来设置波特率

                                                                                                                                                                                2017/12/12

  4.超声波模块的功能已经基本实现,能够测距并在LCD上显示,也能够设置报警阈值,当距离过近的时候,蜂鸣器蜂鸣。超声波测距程序的基本理解,超声波检测函数,给定义的trig端口大约60us的高电平,Echo端接收到信号后令TR0=1打开定时器记时当echo端变低电平时就关闭定时器,所用的时间就是超声波所测距离的两倍,写一个计算函数,s=v*t/2,算出距离,将距离作为参数传出,传入到警报函数通过if语句判断,当距离过近,则蜂鸣器蜂鸣。这几天调试出现的主要问题时,当距离逐渐变大时,显示没有问题,但是当距离由远变近时,之前的数据无法清除,导致无法准确显示,通过一步步分析得知,是LCD显示完之后没有即时清除数据。现在能够正常使用,下一步建立单片机与电脑的串口通信。

/****************************************************************/

    又在原基础的程序上加了串口通信,实现了能够在串口助手界面上实时显示测量数据。

1.要想使用好串口通信,首先要设置只根据晶振设置好正确的波特率,调好正确的初值。

2.串口通信在使用的时候主要分为两个方面,一个是由电脑向单片机传输数据,这里需要用到串口中断,来接受收数据

这次的超声波测距数据在单片机内部计算得到,则可直接传送到输出缓存区,不需要再设置串口中断了,需要你将算得的距离传给SBUF即可。

代码如下:

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P2^3;
sbit echo=P2^4;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit beep=P1^5;
uchar code table[]={0,0,0,0,7,8,9,0,4,5,6,0,1,2,3,0};
uchar code table1[]={0,0x3d-0x30,0x01-0x30,0x2f-0x30,7,8,9,0x2a-0x30,4,5,6,0x2d-0x30,1,2,3,0x2b-0x30};
uchar code table2[]={"rorre           "};
uint s1,s;
uint keyvalue,a=0,key_data,t;
uint s_data[10];
/******ÑÓʱº¯Êý******/
void delay(uchar a)
{
	uchar i;
	while(a--)
	{
		for(i=0;i<250;i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
    }
  }
}
/*****lcdÅÐ溯Êý*****/
void lcd_mang()
{
	rs=0;
	rw=1;
	e=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	while(P0&0x80);//½á¹ûÊÇ1£¬±íʾæµִÐÐwhile(1)ËÀÑ­»·£¬Îª0£¬±íʾ²»Ã¦
	e=0;
}
/******д³ÌÐòдÃüÁÊý*********/
void write_lcd(uchar com,uchar i)
{
	lcd_mang();
	e=0;
	rs=i;
	rw=0;
	_nop_();
	_nop_();
	e=1;
	_nop_();
	_nop_();
	P0=com;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	e=0;
}
/*****************lcd³õʼ»¯******************/
void lcd_init()
{
	write_lcd(0x38,0);
	delay(1);
	write_lcd(0x08,0);
	delay(1);
	write_lcd(0x01,0);//ÇåÆÁ
	delay(1);
	write_lcd(0x0c,0);
	delay(1);
}

/************ÏÔʾº¯Êý****************/
void xianshi(uint x)
{
		if(x==0)
		{
			write_lcd(0x30,1);
		}
		while(x!=0)
		{
		  write_lcd(0x30+x%10,1);
		  x=x/10;
		}
		x=0;
}
/********´®¿Ú³õʼ»¯**********/
void UsartInit()
{
	SCON=0X50;			//ÉèÖÃΪ¹¤×÷·½Ê½1
	TMOD=0X21;			//ÉèÖüÆÊýÆ÷¹¤×÷·½Ê½2
	PCON=0X80;			//²¨ÌØÂʼӱ¶
	TH1=0XF3;				//¼ÆÊýÆ÷³õʼֵÉèÖã¬×¢ÒⲨÌØÂÊÊÇ4800µÄ
	TL1=0XF3;
	//ES=1;						//´ò¿ª½ÓÊÕÖжÏ
	//EA=1;						//´ò¿ª×ÜÖжÏ
	TR1=1;					//´ò¿ª¼ÆÊýÆ÷
}

/************/
void Init()
{
	TMOD=0X21;
	EA=1;
	ET0=1;
	TH0=0;
	TL0=0;
}
/*******´®¿ÚͨÐÅÖжÏ********/
//void Usart() interrupt 4
//{
//	s=SBUF;//³öÈ¥½ÓÊÕµ½µÄÊý¾Ý
//	RI = 0;//Çå³ý½ÓÊÕÖжϱê־λ
//	SBUF=s;//½«½ÓÊÕµ½µÄÊý¾Ý·ÅÈëµ½·¢ËͼĴæÆ÷
//	while(!TI);			 //µÈ´ý·¢ËÍÊý¾ÝÍê³É
//	TI=0;						 //Çå³ý·¢ËÍÍê³É±ê־λ
//}
/*******³¬Éù²¨¼ì²â********/
void check()
{
	trig=1;
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_(); 
  _nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	_nop_(); 
	_nop_(); 
	_nop_(); 
	_nop_();
	trig=0;
}
/******¼ÆËã¾àÀë*******/
uint count()
{
	float time;
	while(!echo);
	TR0=1;
	while(echo);
	TR0=0;
	time=TH0*256+TL0;
	TH0=0;TL0=0;
	s=(time*1.7)/100;//µ¥Î»cm
	s_data[t++]=s;
	if(t==9)
	{t=0;}
	return s;
}
/*******°´¼üÉèÖþ¯±¨¾àÀë*******/
uint keydown()
{
	uint temp;
	char a=0;
	int flag_key=0;
	P1=0x0f;
	if(P1!=0x0f)
	{
		delay(10);
		if(P1!=0x0f)
		{
			P1=0x0f;
			temp=P1;
			switch(temp)
			{
				case(0X07):	keyvalue=0;break;
				case(0X0b):	keyvalue=1;break;
				case(0X0d): keyvalue=2;break;
				case(0X0e):	keyvalue=3;break;
			}
			P1=0XF0;
			temp=P1;
			switch(temp)
			{
				case(0X70):	keyvalue=keyvalue;flag_key=1;break;
				case(0Xb0):	keyvalue=keyvalue+4;flag_key=1;break;
				case(0Xd0): keyvalue=keyvalue+8;flag_key=1;break;
				case(0Xe0):	keyvalue=keyvalue+12;flag_key=1;break;
			}
			while((a<50)&&(P1!=0xf0))	 //¼ì²â°´¼üËÉÊÖ¼ì²â
			{
				delay(10);
				a++;
			}
		}
	}
	if(flag_key==1)   
		return keyvalue;
	else             
		return 16;
}
/*********/
uint jiance(uchar keyvalu)
{
	uint i,d;
		if(keyvalu==0||keyvalu==4||keyvalu==5||keyvalu==6||keyvalu==8||keyvalu==9||keyvalu==10||keyvalu==12||keyvalu==13||keyvalu==14)
		{
			a=a*10+table[keyvalu];
			i=table1[keyvalu];
			xianshi(i);
		}
		else if(keyvalu==1||keyvalu==3||keyvalu==7||keyvalu==11||keyvalu==15)
		{
	     for(d=0;d<16;d++)
			{
		    write_lcd(table2[d],1);
	      delay(1);
			}
		}
		else if(keyvalu==2)
		{
			write_lcd(0x01,0);a=0;
		}
		return a;
}
/******************************/

/**°²È«¾àÀ뾯±¨**/
void jinbao(uint ss)
{
	key_data=keydown();
	if(key_data!=16)
	{
			s1=jiance(key_data);
	}
	write_lcd(0x80+0x4f,0);
	write_lcd(0x04,0);
	xianshi(s1);
	if(ss<s1)
		beep=1;
	else
		beep=0;
}

/**********Ö÷º¯Êý************/
void main()
{
	Init();
	lcd_init();
	UsartInit();
	while(1)
	{
		check();
		count();
		write_lcd(0x01,0);
		delay(1);
		write_lcd(0x80+0x0f,0);
	  write_lcd(0x04,0);
	  xianshi(s);
		jinbao(s);
		delay(50);
		SBUF=s_data[t];//½«½ÓÊÕµ½µÄÊý¾Ý·ÅÈëµ½·¢ËͼĴæÆ÷
	  while(!TI);			 //µÈ´ý·¢ËÍÊý¾ÝÍê³É
	  TI=0;						 //Çå³ý·¢ËÍÍê³É±ê־λ
	}
}
                                                                                                                                                                                                                                            12/22


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值