利用51单片机,HC-SR04超声波模块实现测距,LCD显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/non_mainstream/article/details/79003275


  这些功能的实现的核心是超声波测距功能的实现。

  HC-SR04超声模块的工作原理为:给超声波至少10us的高电平,一般最好是20us的,模块的trig端会自动产生8个40kHz的矩形脉冲,反馈给ECHO端,产生高电平信号。利用定时器计时。距离S=time*1.7.

 所有功能的实现分为了几个模块:LCD显示模块、超声波测距模块、键盘扫描模块、最小距离设置模块、报警模块、串口通信模块。

 LCD显示模块:初始化、判忙、写入读写数据。

 超声波测距模块:检测、计算、定时器的初始化

 键盘扫描模块:在这个模块中采取了与以往不同的方式,直接分为行与列的扫描,减少了程序的复杂程度,更易理解。给了一个flag值,来判断按键是否按下。

 最小距离设置模块:上一个键盘扫描的返回值给到这个模块中,按下按键设置超声波测距模块测距的最小值s1,若距离,s<s1,则蜂鸣器鸣响,LCD显示error。

程序:

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
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[]={"     error       "};
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
sbit trig=P2^5;
sbit Echo=P2^4;
sbit beep=P1^5;
bit flag;
uint time,KeyValue,key;
uint S,a=0,s1;
void delay(uchar a)
{
	uchar i;
	while(a--)
	{
		for(i=0;i<250;i++)
		{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
    }
  }
}
/********ÅÐ溯Êý********/
void lcd_mang()
{
	rs=0;
	rw=1;
	e=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	while(P0&0x80);
	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 lcdInit()
{
  write_lcd(0x38,0);
	delay(1);
	write_lcd(0x08,0);
	delay(1);
	write_lcd(0x01,0);
	delay(1);
	write_lcd(0x06,0);
	delay(1);
	write_lcd(0x0c,0);
	delay(1);
}


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;
}
void count() //¼ÆË㺯Êý
{
  while(!Echo);//µ±ECHOΪ1£¬¿ªÊ¼¼Æʱ
  TR0=1;
  while(Echo);//µ±ECHOΪ0£¬¹Ø±Õ¼Æʱ
  TR0=0;
  time=TH0*256+TL0;
  TH0=0;
  TL0=0;
  S=(time*1.7)/100;	//¼ÆËã¾àÀë
} 
void Display(uint x)  
{  
  if(x==0)  
   {  
     write_lcd(0x30,1);  
   }  
  while(x!=0)  
    {  
      write_lcd(0x30+x%10,1);  
      x=x/10;  
    }  
     x=0;  
}  
void Timer0Init()
{
	TMOD=0X01;//Ñ¡ÔñΪ¶¨Ê±Æ÷0ģʽ£¬¹¤×÷·½Ê½1£¬½öÓÃTR0´ò¿ªÆô¶¯¡£
	ET0=1;//´ò¿ª¶¨Ê±Æ÷0ÖжÏÔÊÐí
	EA=1;//´ò¿ª×ÜÖжÏ		
	TH0=0;	//¸ø¶¨Ê±Æ÷¸³³õÖµ
	TL0=0;	
}
//°´¼üɨÃè
uchar keyscan()
{
	char a=0;
	flag=0;
	P1=0X0F;
	if(P!=0x0f)
	{
		delay(10);
		if(P1!=0x0f)
		{
			P1=0x0f;
			switch(P1)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=1;break;
				case(0X0d): KeyValue=2;break;
				case(0X0e):	KeyValue=3;break;
//				default:	KeyValue=17;	//¼ì²â³ö´í»Ø¸´17Òâ˼ÊÇ°ÑÊýÂë¹ÜÈ«Ãðµô¡£
			}
			//²âÊÔÐÐ
			P1=0XF0;
		  delay(10);
			switch(P1)
			{
				case(0X70):	KeyValue=KeyValue;flag=1;break;
				case(0Xb0):	KeyValue=KeyValue+4;flag=1;break;
				case(0Xd0): KeyValue=KeyValue+8;flag=1;break;
				case(0Xe0):	KeyValue=KeyValue+12;flag=1;break;
//				default:	KeyValue=17;
			}
			while((a<50)&&(P1!=0xf0))	 //¼ì²â°´¼üËÉÊÖ¼ì²â
			{
			  delay(10);
				a++;
			}
		}
	}
		if(flag==1)   
		return KeyValue;
	else             
		return 16;
}


//ÉèÖó¬Éù²¨×îС¾àÀë
uint minS(uchar KeyValue)
{
	  uint i;
	  uchar m;
		if(KeyValue==0||KeyValue==4||KeyValue==5||KeyValue==6||KeyValue==8||KeyValue==9||KeyValue==10||KeyValue==12||KeyValue==13||KeyValue==14)
		{
			a=a*10+table[KeyValue];    
			i=table1[KeyValue];
			Display(i);
		}
		else if(KeyValue==1||KeyValue==3||KeyValue==7||KeyValue==11||KeyValue==15)
		{
	      for(m=0;m<16;m++)
	     { 
	       write_lcd(table2[m],1);
	       delay(10);
	     } 
		}
		else if(KeyValue==2)
		{
	    write_lcd(0x01,0);//ÇåÆÁ
	    delay(20);
    }
		return a;
}
//±¨¾¯º¯Êý
void Error(uint ss)
{
  uchar m;
 	key=keyscan();
	if(key!=16)
	{
			s1=minS(key);
	}
	write_lcd(0x80+0x4f,0);   //LCDµÚ¶þÐÐ
	write_lcd(0x04,0);        //×óÒÆ
	Display(s1);
	if(ss<s1)
	{
		write_lcd(0x01,0);
		beep=1;
	  for(m=0;m<16;m++)
	  { 
	    write_lcd(table2[m],1);
	    delay(10);
	  } 
	}
	else
		beep=0; 
}
//Ö÷º¯Êý
void main()
{
	 lcdInit();
   Timer0Init();
	 while(1)
	 {
	    check();
		  count();
		  write_lcd(0x01,0);
		  delay(10);
      write_lcd(0x80+0x0f,0);  
      write_lcd(0x04,0); 
		  Display(S);
		  Error(S);
	 }
}

展开阅读全文

没有更多推荐了,返回首页