超声波模块的使用——不使用51的串口实现
作者:互联网
一、此次使用的显示为lcd1602,话不多说,直接看程序:
#include "reg51.h"
sbit RS=P3^5;
sbit RW=P3^4;
sbit E=P3^3;
sbit echo=P3^2;
sbit tr=P3^1;
unsigned long time=0;
unsigned char s[]={"0123456789"};
unsigned char s1[]={"DISTANCE:"};
unsigned int x=0;
void delay(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
void delay1(unsigned int i)
{
for(;i<0;i--);
}
void ceju()
{
tr=1;
delay1(15);
tr=0;
}
void dsqcsh()
{
TMOD=0x01;//0000 0101
TH0=0;
TL0=0;
// TH1=0xf8;
// TH1=0x30
// TR1=1
TR0=0;
ET0=1;
EA=1;
}
void count()
{
ceju();
while(!echo);
TR0=1;
while (echo);
TR0=0;
time=TH0*256+TL0;
TH0=0;
TL0=0;
x=(time*1.7)/100;
}
void writecom(unsigned char com)
{
RS=0;
E=0;
RW=0;
P2=com;
delay(5);
E=1;
E=0;
}
void writedat(unsigned char dat )
{
RS=1;
E=0;
RW=0;
P2=dat;
delay (5);
E=1;
E=0;
}
void xled()
{
writecom (0x38);
writecom (0x0C);
writecom (0x06);
writecom (0x01);
}
void display()
{
unsigned int bai=0,shi=0,ge=0;
unsigned int i=0;
writecom(0x80);
delay(10);
while (s1[i]!='\0')
{
writedat(s1[i]);
delay(10);
i++;
}
x=x+1;
bai=x/100;
shi=(x%100)/10;
ge=x%10;
writecom(0xc6);
delay(10);
writedat(s[bai]);
delay(10);
writedat (s[shi]);
delay(10);
writedat(s[ge]);
delay(10);
writedat ('C');
delay(10);
writedat('M');
delay(10);
}
void main()
{
ceju();
dsqcsh();
xled();
while (1)
{
display();
count();
delay(50);
}
}
//void zd() interrupt 1
//{
//
//
//}
完整的程序就这样,已经焊接出模块,其实有很多bug,有什么问题请指正,这里仅供参考。
二、程序解读
1.超声波模块
2、超声波模块时序图,
如图 根据触发信号,我们需要把它拉高,然后作一个延时即可,就是这个函数,有了这个函数就可以开始发出信号
void ceju()
{
tr=1;
delay1(15);
tr=0;
}
这里使用的是定时器0,里面的时间全部清空,就是TR0=0;方便回响信号的计时
void dsqcsh()
{
TMOD=0x01;//0000 0101
TH0=0;
TL0=0;
TR0=0;
ET0=1;
EA=1;
}
初试化好触发信号与定时器0之后就可以使用超声波模块了,这里的思想是根据时序图的,看程序说明
void count()
{
ceju(); // 发送触发信号,根据时序图,触发信号发出后,超声波模块自动循环发出8个40khz的脉冲,于是下面就是判断echo引脚是否收到回响信号,收到则为高电平,反之;
while(!echo); //判断超声波模块的echo引脚是否为高电平,若是则跳出while;
TR0=1; //打开定时器0,开始计时
while (echo); //判断回响是否发送数据完毕,发送完毕则为0,跳出while;
TR0=0; //关闭定时器0,这个时候定时器0里面已经存有了时间,
//模块发送的超声波到达物体然后返回被模块接收到的时间
4.超声波模块测距原理公式
测试距离=(高电平时间*声速(340M/S))/2
s=(time*340m/s)/2
s=(time*1.7)/100
time=TH0*256+TL0; //时间
TH0=0; //TR0清零方便下次测量计算
TL0=0;
x=(time*1.7)/100; //距离厘米级别
}
三、总结
关于LCD1602的程序就不讲了,里面大多是初始化,后面是应用,这个超声波模块程序真的有很多BUG,它可以测量但是远距离不稳定,我不使用串口的原因是当时还不怎么会,所以自己随便用一个I/O口(上面是sbit echo=P3^2;sbit tr=P3^1这两个口;),好了,第一次写,后面会记录一下所学过的模块。
标签:10,void,51,unsigned,delay,模块,串口,TR0,超声波 来源: https://blog.csdn.net/qq_44941069/article/details/120106253