超声波模块学习

来源:互联网 发布:java与c# 编辑:程序博客网 时间:2024/05/16 18:33

超声波模块学习第一阶段

   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 charsbit 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;//ÉèÖÃΪ¹¤×÷·½Ê½1TMOD=0X21;//ÉèÖüÆÊýÆ÷¹¤×÷·½Ê½2PCON=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;//µ¥Î»cms_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;elsebeep=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


原创粉丝点击