㈠ 基于51单片机的超声波测距仪为什么只能测到1m远
哈!才不了,选用好的器件和搭建好的电路可到十多米没问题的。从发射开始,一定功率要做够。再就是接收放大能力要好并最好用低噪声放大电路。这才是整形处理了,也是很重要的。对,最后还有个指向问题也要注意。最好找光滑的平面为最佳。
㈡ 51单片机控制的超声波测距仪程序
希望对你有帮助
//超声波模块显示程序
#include <reg52.h> //包括一个52标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //产生脉冲引脚
sbit Rx = P3^2; //回波引脚
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管0-9
uint distance[4]; //测距接收缓冲区
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定义寄存器
bit succeed_flag; //测量成功标志
//********函数声明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
i=0;
flag=0;
Tx=0; //首先拉低脉冲输入引脚
TMOD=0x11; //定时器0,定时器1,16位工作方式
TR0=1; //启动定时器0
IT0=0; //由高电平变低电平,触发外部中断
ET0=1; //打开定时器0中断
EX0=0; //关闭外部中断
EA=1; //打开总中断0
while(1) //程序循环
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //产生一个20us的脉冲,在Tx引脚
while(Rx==0); //等待Rx回波引脚变高电平
succeed_flag=0; //清测量成功标志
EX0=1; //打开外部中断
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //
TR1=1; //启动定时器1
EA=1;
while(TH1 < 30);//等待测量的结果,周期65.535毫秒(可用中断实现)
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断
if(succeed_flag==1)
{
distance_data=outcomeH; //测量结果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//与低8位合并成为16位结果数据
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
} //为什么除以58等于厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //没有回波则清零
}
distance[i]=distance_data; //将测量结果的数据放入缓冲区
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
pai_xu();
distance_data=distance[1];
a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中断0,用做判断回波电平
INTO_() interrupt 0 // 外部中断是0号
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
//定时器0中断,用做显示
timer0() interrupt 1 // 定时器0中断是1号
{
TH0=0xfd; //写入定时器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=;P2=0xdf;flag=0;break;
}
}
//显示数据转换程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;
_data=SEG7[_data];
shi_data=SEG7[shi_data]&0x7f;
ge_data =SEG7[ge_data];
EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}
㈢ 有谁做过基于单片机的激光测距。急求脉冲激光发射与接收电路图
我没做过,不过我可以说说原理与构造,高手补充
激光测距原理是利用光的速度判定距离,比如我们发射的激光1秒传回,距离是15万公里(因为光是每秒30万公里)而传回等于两个距离,把30除以2 就等于15万。要是用上0.1秒就是1.5万公里,而0.000001秒就是0.15公里.根据以上是说150米需要1微秒,当我们发出一组数据,数据是一微秒一个方波,接收可以是个计数器,记录的方波和发射的比较,如果是时间为两个方波,断定距离为300米,因为一个脉冲为150米
以上只是大概的比较说明一下,也就是说你有一个脉冲发生器,还有一个脉冲比较器,
激光发色和接收就能做出激光测距仪器
㈣ 基于单片机的超声波测距仪/汽车倒车雷达报警系统怎么样
你是问价格还是问你的毕业设计题目怎样?
单片机可以接部分设备做 超声波测距仪/汽车倒车雷达报警系统。
㈤ 基于51单片机的激光测距并用12864显示出来
一般的激光收发头根本测不出距离,激光测距分脉冲式激光测距仪和相位式激光测距仪
如果用单片机测收发的时间间隔,因激光的速度很快,近距离会有很大误差,远距离你根本收不到反射回来的信号
相位式激光测距仪电路更得杂
所以只能用现成的模块,价格不便宜,其使用方法说明书上会有的
我认为近距离测量声波测距比较靠谱
㈥ 基于51单片机的超声波测距仪为什么只能测到1m远
这个和你的测距仪的测距电路有关。单片机只处理数据,不参与测量。
提高超声波测试距离的办法有三种:
1、降低超声波的频率;
2、加大超声波发射功率;
3、提高超声波接收的灵敏度,提高放大电路的增益;
如果用的是模块,要注意它的技术文档。
㈦ 帮忙详细解答一下基于单片机的超声波测距仪的汇编源程序(急求啊)
我可以负责的告诉你,用C吧,完全可以胜任。
2003年的时候我们为了确保MCU的效率(时效性),强制使用汇编写的超声波程序,结果程序写不大,汇编你也知道,写百八十行可以,代码多了,这程序就没法看了,更谈不上程序升级和维护了。因此,那一代超声波产品的功能很弱。
2006年,我们要重新设计第二代超声波产品,要求可靠性好、功能强大,自然的代码量也要多了,当时我们仍然固执的使用汇编、绝不用C,可汇编的代码仍然写不长,为了方便技术人员管理和后续的产品升级,我把这一套复杂的系统代码分成了4级,也就是4套汇编代码,分别在32个MCU里运行(同一个设备里),这4套代码分别交给4个人来编写和维护,这4个人中若有人跳槽走了,由于他掌握的代码量小,功能又单一,接替他的人也很容易接手。(否则,这4套汇编程序,集中在一个冗长的代码里,那么这套代码将很难维护,而且几乎只能有1个人才能完全看懂它,一旦这个人走了,别人很难接手这套‘烂’程序,这对于产品的持续改进非常不利)
2008年,我们试探性的,在DSP(TMS320F28335)上用C完成了所有的功能,而且程序量比汇编要少得多,可读性、可维护性也要好得多。后来,我们在单片机上,也用C完成了绝大部分功能,原来担心的时效性问题从没有发生,这才领悟:2003-2008这5年,我们绕了一个大圈。
从此以后,我们就不再用汇编了,用C写超声波程序一直至今(偶尔嵌入汇编代码),算一下也有5年了,从没觉得C有任何局限性。
那么,你是还觉得必须要用汇编么?
㈧ 基于单片机红外测距仪
看来咱们的毕业论文一样,我做完了。
㈨ 关于基于51单片机的超声波测距仪的汇编编程问题
需要一个查满程序。
51单片机驱动LCM1602
;作者:eleclike
;功能;驱动LCM1602,LCM1602为深圳誉信公司的16*2液晶字符型显示模块,程序使用读写方式控制LCM1602,地址分别为:写指令口:80H; 读忙检查口:81H; 写数据口:82H; 读数据口:83H;
;子程序1:写控制指令子程序
;子程序2:写CGRAM数据子程序
;子程序3:写DDRAM子程序
;子程序4:写数据子程序
;子程序5:读忙子程序
RG_DLY EQU 2H
ORG 0000H
AJMP MAI
ORG 0030H
MAI: MOV SP,#60H
LP_MAI: NOP
LCALL SB_WRIN;调用写控制指令子程序
LCALL SB_WRCG;调用写CGRAM
LP2_MAI:NOP
LCALL SB_WRDR;调用写DDRAM
RT_MAI: AJMP LP2_MAI
;---------------------------------------------------------
;---------子程序---开始------------------------------------
;-1------写控制指令子程序----------
SB_WRIN:PUSH ACC
MOV R0,#80H ;写指令口
MOV A,#01H ;(INSTR.1)
LCALL SB_WAT ;清屏
MOVX @R0,A
MOV A,#02H ;(INSTR.2)
LCALL SB_WAT ;A光标归位
MOVX @R0,A
MOV A,#06H ;(INSTR.3)
LCALL SB_WAT ;AC自动加一,画面不动;
MOVX @R0,A
MOV A,#0CH ;(INSTR.4)0FH:显示开,关标 开,闪烁开
LCALL SB_WAT ;0CH 显示开,关标、闪烁关
MOVX @R0,A
;MOV A,#18H ;(INSTR.5)
;LCALL SB_WAT ;光标 或画面平移指令
;MOVX @R0,A
MOV A,#38H ;(INSTR.6)
LCALL SB_WAT ;8位数据,2行显示,5-7点阵
MOVX @R0,A
POP ACC
RET
;-2----写CGRAM数据子程序------
SB_WRCG:PUSH ACC
MOV DPTR,#CGR
MOV R1,#40H;=CGRAM的首地址
MOV R2,#4;=4个字符
LP_WG0: MOV R3,#8;=每个字符有8位数据即8行
LP_WG1: MOV R0,#80H
MOV A,R1
LCALL SB_WAT
MOVX @R0,A
CLR A
MOVC A,@A+DPTR
LCALL SB_WRTD
INC R1
INC DPTR
DJNZ R3,LP_WG1
DJNZ R2,LP_WG0
NOP
POP ACC
RET
;-3-----写DDRAM子程序--------
SB_WRDR:PUSH ACC
MOV R0,#80H
MOV A,#80H ; 写第一行DDRAM数据
LCALL SB_WAT
MOVX @R0,A
MOV A,#49H ; I
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#4CH ; L
LCALL SB_WRTD
MOV A,#4FH ; O
LCALL SB_WRTD
MOV A,#56H ; V
LCALL SB_WRTD
MOV A,#45H ; E
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#4DH ; M
LCALL SB_WRTD
MOV A,#59H ; Y
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#42H ; B
LCALL SB_WRTD
MOV A,#41H ; A
LCALL SB_WRTD
MOV A,#42H ; B
LCALL SB_WRTD
MOV A,#59H ; Y
LCALL SB_WRTD
MOV A,#20H ; EMPTY
LCALL SB_WRTD
MOV A,#20H ; EMPTY
LCALL SB_WRTD
MOV R0,#80H
MOV A,#0C0H ;写第二行DDRAM
LCALL SB_WAT
MOVX @R0,A
MOV A,#49H ; I
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#41H ; A
LCALL SB_WRTD
MOV A,#4CH ; L
LCALL SB_WRTD
MOV A,#53H ; S
LCALL SB_WRTD
MOV A,#4FH ; O
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#4DH ; M
LCALL SB_WRTD
MOV A,#49H ; I
LCALL SB_WRTD
MOV A,#53H ; S
LCALL SB_WRTD
MOV A,#53H ; S
LCALL SB_WRTD
MOV A,#20H ; SPACE
LCALL SB_WRTD
MOV A,#59H ; Y
LCALL SB_WRTD
MOV A,#4FH ; O
LCALL SB_WRTD
MOV A,#55H ; U
LCALL SB_WRTD
MOV R2,#50 ;延时229ms
ACALL SB_DLY
POP ACC
RET
;-4---写数据子程序---------
SB_WRTD:MOV R0,#82H ;
LCALL SB_WAT
MOVX @R0,A ;
RET
;-5---读忙子程序-----------
SB_WAT: PUSH ACC
PUSH 00H
MOV R0,#81H
LP_WAT: MOVX A,@R0
RLC A
JC LP_WAT
POP 00H
POP ACC
RET
;---------子程序----结束-----------------------------------
;---------------------------------------------------------
;------延时子程序-----------
SB_DLY: PUSH RG_DLY ;
LP1_DLY:PUSH RG_DLY
LP2_DLY:PUSH RG_DLY
DJNZ R2,$
POP RG_DLY
DJNZ R2,LP2_DLY
POP RG_DLY
DJNZ R2,LP1_DLY
POP RG_DLY
DJNZ R2,SB_DLY
RET
;----------CGRAM区----------
CGR:...................;(用户自编码字符区)
END
㈩ 我在做基于单片机89C51的超声波测距仪,如果接受电路不用CX20106A可以用什么芯片替代,或者不用芯片,求解
用NE5532或者TL082吧,TL072也行。这些都是双运放,四运放也可以使用TL084、TL074。用双电源供电,把接收的信号放大1万倍左右即可,别忘了中加一个带通滤波器,注意小信号和信噪比,如果不考虑温飘问题,LC滤波器是个很简单有效的办法。
放大后的超声波信号,可以通过一个比较器或者检波电路,接进单片机的IO口或AD口,剩下的就是您的软件工作了。
以上的建议只能帮助您在实验室里完成这个替代CX20106的电路。如果您要设计产品,考虑到可靠性方面,那么工作量要比这个多很多,需要考虑到接口的保护、探头老化、空气在不同条件下的损耗、抗干扰、温飘处理等等,可能要用上DSP,开发周期至少得1年,完善产品恐怕还得1年。