超声波测身高.docx
《超声波测身高.docx》由会员分享,可在线阅读,更多相关《超声波测身高.docx(12页珍藏版)》请在冰豆网上搜索。
超声波测身高
超声波身高测量仪,该测量仪是由单片机组成的单片机中央控制系统,超声波发射电路由发射驱动电路和设于该驱动电路输出端的超声波换能器构成,超声波接收电路由超声波接收换能器、限位电路和超声波接收集成块电路构成。
1•传感器
超声波传感器是利用超声波的特性研制而成的传感器。
以超声波作为检测手段,必须产生和接收超声波,完成这种功能的装置就是超声波传感器。
超声波传感器主要由压电晶片组成,既可以发射超声波,也可以接收超声波。
超声波传感器的核心是其塑料外套或者金属外套中的一块压电晶片。
超声波传感器的主要性能指标是工作频率、工作温度、灵敏度。
2.超声波发生器
为了研究和利用超声波,人们已经设计和制成了许多超声波发生器。
超声波发生器可以分为两类:
一类是用电气方式产生超声波,一类是用机械方式产生超声波。
电气方式包括压电型、磁致伸缩型和电动型等;机械方式有加尔统笛、液哨和气流旋笛等。
目前较为常用的是压电式超声波发生器。
压电式超声波发生器的原理:
利用压电晶体的谐振来工作的。
超声波发生器内部结构由两个压电晶片和一个共振板构成。
当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两电极间未外加电压,当共振板接收到超声波时,讲压迫压电晶片做振动,讲机械能转换为电信号,这时它就成为超声波接收器了。
3.超声波测量仪原理
本设计是以超声波作为检测手段,必须产生超声波和接收超声波。
传感器通过声波的波长和发射声波以及接收到返回声波的时间差就能确定人体的身高,在发送脉冲的同时,接收器的计时器启动并计数,直至接收传感器接收反射回波后,计数停止,该时间差相当于测量的距离,从而可测算出测量仪与头顶之间的距离,即人体的身高。
4.EDA设计思路
该超声波测量仪有2个子模块:
测距、显示数据。
其中显示数据模块有3局部构成:
计数、显示、信号处理。
测量主要由超声波传感器完成。
将发射和接收的时间差转换为电信号,再有A/D转换器得到数字信号,然后将数字信号送入到计数局部,再到显示。
5.EDA设计
(1)・VHDL顶层设计顶层文件就是用原件例化格式将显示模式、计时模块、分频模
块组合在一起。
其源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std」ogic_unsigned.all;
entityclockis
port(
clk:
instdjogic;
enable:
instdjogic;
sekoutstd」ogic_vector(2downto0);
choose:
outstd_logic_vector(7downto0);segment:
outstd_logic_vector(6downtoo);-
endclock;
architecturert1ofclockiscomponentclk_div100■-分频器port(clk:
instdjogic;
clk_div:
outstdjogic);
endcomponent;
componenttime_counter-计数器(产生各分秒显示位)
port(
enable:
instd」ogic;clk0:
instdjogic;
sec10:
outstd」ogic_vector(2downto0);sec:
outstd」ogic_vector(3downto0);
seec10:
outstd」ogic_vector(3downto0);seec:
outstd_logic_vector(3downto0);
);
-与数码管连接,显示分秒位在其上
endcomponent;componentdisplayport(
clk:
instd」ogic;sec10:
instd」ogic_vector(2downto0);
sec:
instd_logic_vector(3downto0);seec10:
instd_logic_vector(3downto0);
seec:
instd_logic_vector(3downto0);
sekoutstd」ogic_vector(2downto0);
choose:
outstd_logic_vector(7downto0);segment:
outstd_logic_vector(6downto
0));~~
endcomponent;
signalsec10:
std」ogic_vector(2downto0);signalsec:
std」ogic_vector(3downto0);
signalseec10:
std」ogic_vector(3downto0);signalseec:
std」ogic_vector(3downto0);
signalclkO:
stdIJogic;
beginu0:
clk_div100portmap(clk,clk0);
u1:
timecounterportmap(enable,clk0,sec10,sec,seed0,seec);u2:
displayportmap(clk,sec10,sec,seec,seec10,choose,segment);u2:
displayportmap(clk,sec10,sec,seec10,seec,sel,segment);
endrt1;
(2)•传感器产生信号elk源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std」ogic_unsigned.all;
entityclk_div10isport(clk:
instdjogic;
clk_div:
outstdjogic);
endclk_div10;architecturert1ofclk_div10issignalq_tmp:
integerrange0to9;beginprocess(clk)begin
if(clk*eventandclk=11*)thenif(q_tmp=9)then
q_tmp<=0;
else
q_tmp<=q_tmp+1;
endif;
endif;
endprocess;process(clk)beginif(clk'eventandclk=11')thenif(q_tmp=9)thenclk_div<=1r;
else
clk_div<='O';
endif;
endif;
endprocess;
endrt1;
⑶•计时模块源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std」ogic_unsigned.all;
entitycountIOis
port(
enable:
instd_Jogic;elk:
instdjogic;cout:
outstdjogic;q:
outstd」ogic_vector(3downto0));
endcount10;architecturert1ofcountIOissignalq」mp:
std」ogic_vector(3downto0);beginprocess(clk)
begin
if(clk*eventandclk=11*)then
if(enable=11f)thenif(q_tmp=n1001")then
q_tmp<=(others=>10’);else
q_tmp<=q_tmp+1;
endif;
endif;
endif;
q<=q_tmp;
endprocess;
cout<='11whenq_tmp=M1001〞andenable=*1'elseOcout<='11whenq_tmp=〞1001"else*0';
endrt1;
libraryieee;
useieee.std_logic_1164.all;entitytime_counterisport(
enable:
instdloaic;
clk0:
instdjogic;
sec10:
outstd」ogic_vector(2downto0);sec:
outstd」ogic_vector(3downto0);
seec10:
outstd_logic_vector(3downto0);seec:
outstd_logic_vector(3downto0);
);
endtime_counter;
architecturert1oftime_counteriscomponentcountIOport(enable:
instd」ogic;
elk:
instdjogic;
cout:
outstdjogic;
q:
outstd_logic_vector(3downto0));
endcomponent;
signalcol,co2,co3,co4,co5,co6,co7:
std_logic;beginu0:
count10portmap(enable,clk0,co1,seec);u1:
countIOport
map(co1,clk0,co2,seec10);u2:
count10portmap(co2,clk0,co3,sec);u3:
count10portmap(co3,clk0,co4,sec10);
endrt1;
(4)•显示模块
其模块框图如下:
pr.ent・
八:
.'Tient
EFinmn*6
严訶pi:
:
丫
从图3-1中可以看出,显示模块有四个局部构成:
八进制计数器、计时位选择电路、七段显示译码电路、显示位选择译码电路。
衽外部时钟信号elk的作用下,8进制计数器的输出从000到111按顺序循环变化,输出信号为sei。
信号sei经过位选择电路译码后产生用来选通一个LED
七段显示数码管的choose信号,同时它还作为计时位选择电路的选择信号,用来选择对应位的数据并将其转换为四位位矢量。
,将其转换成用来点燃LED七段显示数码管的segment信号。
libraryieee;-三八译码器
useieee.std_ogic_1164.all;
useieee.std」ogic_unsigned.all;
entitycount8is
port(
clk:
instdjogic;
sekoutstd_logic_vector(2downto0);
endcount8;
architecturert1ofcount8is
signalsel_tmp:
std」ogic_vector(2downto0);
begin
process(clk)
begin
if(elk'eventandclk=11')then
if(sel_tmp=〞111")then
sel_tmpv=(others=>'O');
else
seitmp<=seltmp+1;
endif;
endif;
sel<=sel_tmp;
endprocess;
endrt1;
计时位选择电路的功能是根据8进制计数器的计数输出的选择信号来选择对应计时显示位的计时数据,作为送至七段显示译码电路的输入数据。
在计时位选择电路中我们要讲输入数据都转化成4位宽度的数据。
其VHDL源代码如下:
libraryieee;
useieee.std_logic_1164.all;
entitytime_chooseis
port(sel:
instd」ogic_vector(2downto0);
sec10:
instd_Jogic_vector(2downto0);
sec:
instd」ogic_vector(3downto0);
seec10:
instd」ogic_vector(3downto0);
seec:
instd_logic_vector(3downto0);
q:
outstd_logic_vector(3downto0);
);
endtimechoose;
architecturert1oftime_chooseis
beginprocess(sel,hrh,hr1,mi0,min,sec10,sec)begin
caseseiis
when
000〞
=>q<=seec;
when
001n
=>q<=seec10
••
when
01(T
=>q<=sec;
when
01
=>q<=sec10;
whenothers=>q<="
endcase;
endprocess;
endrt1;
显示位选择译码电路的功能是根据8进制计数器的计数输出产生用来选通一个LEDt段显示数码管的choose信号。
当计数器的输出为“000〞时,选通信号choose就被译成“000000L;当计数器的输出为“00T时,选通信号choose就被译成“0000002;依次类推。
显示位选择译码电路的VHDL源代码:
libraryieee;
useieee.std_logic_1164.all;
entitychoose_decoderisport(sel:
instd」ogic_vector(2downto0);
choose:
outstd_logic_vector(7downto0));
endchoose_decoder;
architecturert1ofchoose_decoderis
begin
数码管选择使能,每次只选择一个数码管
process(sel)
begincase
00000001
00000010
00000100
00001000
00010000
seiis
when〞=>choose<=
000〞〞
when〞=>choose<=
00T〞
when〞=>choose<=
010〞M
when"
110"=>choosev=〞
when"
endcase;endprocess;
endrt1;
libraryieee;-将要显示的数据译码成能点亮数码管的二进制码useieee.std」ogic_1164.all;
entityseg7isport(q:
instd_logic_vectoe(3downto0);segment:
outstdJogic_vectoe(6downto0));
endseg7;architecturert1ofseg7isbeginprocess(q)begin
caseqis
when"
0000〞
=>segmentv=
0111111"
■■
■
〞0〞对应的数码管码元为
when"
000T
=>segmentv=
••
0000110n
一
“[〞
when"
0010〞
=>segmentv=
1011011"
,一
when"
001T
=>segmentv=
1001111"
一
“3,,
when"
0100〞
=>segmentv=
1100110"
,一
“4"
when"
010T
=>segment<=
1101101"
,一
when"
0110〞
=>segmentv=
1111101"
5一
6
when"
0111"
=>segmentv=
0100111M
,一
“7〞
when"
1ooon
=>segment<=
1111111"
一
“8〞
when"
100T
••
=>segmentv=
1101111"
5一
“9,,
whenothers=>segmentv=〞xxxxxxxendcase;endprocess;
endrt1;
libraryieee;
useieee.std_logic_1164.all;
entitydisplayis
port(
clk:
instdjogic;sec10:
instd」ogic_vector(2downto0);sec:
instd」ogic_vector(3downto0);seec10:
instd_logic_vector(3downto0);
seec:
instd_logic_vector(3downto0);sekoutstd_logic_vector(2downto0);choose:
outstd_logic_vector(7downto0);segment:
outstd_logic_vector(6downto
0);
enddisplay;architecturert1ofdisplayiscomponentcount8■-丿\进制Ji十数器port(clk:
instdjogic;
sekoutstd_logic_vector(2downto0));
endcomponent;
componentchoose_decoder■-三丿睪码器port(sel:
instd_logic_vector(2downto0);choose:
outstd_logic_vector(7downto0));endcomponent;
componenttimechooseport(sel:
instd_logic_vector(2downto0);
sec10:
instdjogic_vector(2downto0);sec:
instd」ogic_vector(3downto0);seec10:
instd」ogic_vector(3downto0);
seec:
instd_logic_vector(3downto0);q:
outstd_logic_vector(3downto0));
endcomponent;comporientseg7port(q:
instd_logic_vector(3downto0);
segment:
outstd_logic_vector(6downto0));
endcomponent;
signalsel_tmp:
std」ogic_vector(2downto0);
signalq:
std」ogic_vector(3downto0);
signalchoose_tmp:
std」ogic_vector(7downto0);signalsegment_tmp:
std」ogic_vector(6downto0);
beginu0:
count8portmap(clk,sel_tmp);
u1:
choose_decoderportmap(sel,choose_tmp);u2:
time_chooseportmap(sel_tmp,sec10,sec,seed0,seec,q);u3:
seg7portmap(q,segment_tmp);sel<=sel_tmp;choose<=choose_tmp;
segment<=segment_tmp;
endrt1;