标题:
动手制作超声波测距板,为避障小车作准备
[打印本页]
作者:
dzdiy
时间:
2015-4-11 19:08
标题:
动手制作超声波测距板,为避障小车作准备
本帖最后由 dzdiy 于 2015-4-11 20:33 编辑
就是这个超声波测距,我有元件,只是不齐全,所以就买了一个测距模块,制作了一个超声波测距板。一切都用洞洞板焊,自己搭建电路,那样学得到更多东西,用套件的话,学到的只是编程,硬件原理就会有空缺。自己自学单片机也有一段时间了,看来还是要检测一下自己的能力才行,想来想去,觉得小车很不错,如果我可以一独立制作出自己的小车,哪是一件不错的事,所以从今天起,我开始制作和编写自己的小车,还是一步一步来哈。超声波测距只是第一步。下载超声波测距程序包
超声波测距源程序:
超声波测距模块程序包.zip
(28.17 KB, 下载次数: 31)
2015-4-11 18:30 上传
点击文件名下载附件
下载积分: 黑币 -5
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit trig=P1^5;//超声波测距模块//
sbit echo=P3^2;
bit flag1;//触发信号标志位//
sbit EN=P2^5; //1602相关端口定义//
sbit RS=P1^0;
sbit RW=P1^1;
sbit STA7=P0^7;
uchar count;
long int distance;//距离变量//
//………………………………延时函数…………………………//
void delayt(uint x)
{
uchar j;
while(x-- > 0)
{
for(j = 0;j < 125;j++)
{
;
}
}
}
//……………………LCD1602相关函数…………………………//
void panmang()//1602判忙//
{
P0=0xff;
do
{
RS=0;
RW=1;
EN=0;
EN=1;
}
while(STA7==1);
EN=0;
}
void w_data(uchar dat)//1602写数据//
{
panmang();
EN=0;
P0=dat;
RS=1;
RW=0;
EN=1;
EN=0;
}
void w_cmd(uchar cmd)//1602写指令//
{
panmang();
EN=0;
P0=cmd;
RS=0;
RW=0;
EN=1;
EN=0;
}
void init_1602()//1602初始化//
{
w_cmd(0x38);//设置16x2显示,5x7点阵,8位数据接口//
w_cmd(0x0c);//设置开显示,光标不显示,光标不闪烁//
w_cmd(0x06);//设置当读或写一个字符后地址指针加1,且光标加1,整屏不移动//
w_cmd(0x01);//清屏//
w_cmd(0x80+0x40);
w_data('D');
w_data('i');
w_data('s');
w_data('t');
w_data('a');
w_data('n');
w_data('c');
w_data('e');
w_data(':');
w_cmd(0x80+0x4c);
w_data('.');
w_cmd(0x80+0x4e);//单位是厘米//
w_data('c');
w_data('m');
}
//……………………………………………定时器1初始化,用于计算响应信号时间……………………………………………//
void init_t0()
{
TMOD = 0x01;
TL0 = 0x66;
TH0 = 0xfc; //1ms
ET0 = 1;
EA = 1;
}
//………………………………………触发信号………………………………………//
void trigger()
{
trig=1;
delayt(1);
trig=0;
}
//……………………………………………………初始化相应端口及变量…………………………………………………………//
void init_measuring()
{
trig=0;
echo=0;
count=0;
}
//…………………………………………………………测距相关函数……………………………………………………………………//
void measuring()
{
uchar l;
uint h,y;
TR0 = 1;
while(echo)
{
;
}
TR0 = 0;
l = TL0;
h = TH0;
y = (h << 8) + l;
y = y - 0xfc66;//us部分
distance = y + 1000 * count;//计算总时间,单位是微秒
TL0 = 0x66;
TH0 = 0xfc;
delayt(30);
distance = 3453* distance / 20000;//原始为:(0.34毫米/us)*时间/2//
}
//……………………………………………显示函数………………………………………………………//
void display(uint x)
{
uchar qian,bai,shi,ge;
qian=x/1000;
bai=(x/100)%10;
shi=(x/10)%10;
ge=x%10;
w_cmd(0x80+0x49);//单位是厘米//
w_data(qian+0x30);
w_data(bai+0x30);
w_data(shi+0x30);
w_cmd(0x80+0x4d);
w_data(ge+0x30);
}
//……………………………………………………主函数……………………………………………………//
void main()
{
init_1602();
init_t0();
init_measuring();
while(1)
{
trigger();
while(echo==0) //等待回声
{
;
}
measuring();
display(distance);
init_measuring();
delayt(600);//每次测量间隔60ms//
}
}
//……………………………………………中断服务函数…………………………………………………//
void T_0()interrupt 1
{
TF0 = 0;
TL0 = 0x66;
TH0 = 0xfc;
count++;
if(count==18)
{
TR0 =0;
TL0 = 0x66;
TH0 = 0xfc;
count = 0;
}
}
复制代码
作者:
6ningning
时间:
2015-4-12 14:33
不错。
作者:
Orz123
时间:
2017-3-22 21:38
电路和焊接能发下吗,小白伤不起
作者:
13756176595
时间:
2017-7-28 20:08
Orz123 发表于 2017-3-22 21:38
电路和焊接能发下吗,小白伤不起
同上
作者:
Kinarmy
时间:
2018-5-16 22:27
可以发张接线的图片么?新手不是很懂
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1