超声波模块学习第一阶段
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
#include
#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
12/22