电子系统设计应用论文
声音引导系统
专业:电子信息工程
班级:110404
姓名:孙凯东
学号:20111539
目录
摘要·····························································3
Abstract························································3
一、 系统方案···················································4
1、整体方案的论证与比较·······································4
2、系统控制方案···············································4
二、 设计与论证·················································5
1、误差信号理论分析···········································5
2、理论分析···················································5
三、 单元电路的设计············································6
1、系统组成···················································6
2、声音发射模块的设计·········································6
3、声音接收模块的设计·········································7
4、无线收发模块的设计·········································9
5、电机驱动电路的设计·········································9
6、液晶显示模块的设计·········································10
四、 系统测试··················································11
1、使用的仪器和设备··········································11
2、测试的方法和步骤··········································11
参考文献························································12
附录(原件清单、电路图、程序)·····································13
摘要
本文采用基于 STC89C52 单片机的声音引导系统,由单片机产生周期性音频
脉冲信号,通过 LM386N 功率放大器进行放大后驱动喇叭;声源接收模块采用
驻极体话筒作为声电转换元件,将声音信号转化成电信号。通过单片机来判断声
源的位置,由 PT226 编码芯片以及 PT2272 解码芯片组成的集成电路实现信号的
无线传输,以实现控制小车的运动。
由单片机来控制全桥驱动芯片 L298N 驱动直流减速电机的转速和转向。
关键字:声音引导、功率放大器、声电转换、无线编码/解码、全桥驱动
Abstract
This paper based on STC89C52 SCM voice guide system, the single-chip
computer produce periodic audio pulse signal, through the LM386N power amplifier
amplification drive speaker after; Receiving module USES sound in a body
microphone as electric conversion components, will sound voice signal into electrical
signals. Through the single-chip microcomputer to judge the position of the sound
source, the PT226 coding and decoding chips chip PT2272 composed of integrated
circuit realize signal of wireless transmission, so as to realize the control of the sports
car.
The single-chip computer to control the whole bridge L298N driver drive chip dc
slow motor speed and steering.
Key word: Voice guide, Power amplifiers, Sound electric conversion, Wireless
encoding/decoding, Full bridge driver
一、系统方案
1、整体方案的论证与比较
(1)超声波测距方案
由于超声波指向性强,消耗缓慢,在介质中传播的距离较远,经常用于距离
的测量,且其测量精度高,不易受干扰。但此方案并不能满足设计要求,而且成
本高、硬件电路较为复杂,故不采用此方案。
(2)时间差测距方案
单片机测量两个声音接收器接收到声波信号的时间差,由计算可得声源与两
个声音接收器之间的距离差。通过要求中定位误差,可得到在该误差下的时间为
。通过单片机计算使得接收两时间差 时,可移动声源停止运动,从而达
到定位的目的。因此,本文采用此方案。
2、系统控制方案
用两个最小系统板,作为可移动声源模块和主控模块。其控制方案如下:
t T t
声源控制信号发射
声音控制信号接收
主单片机
声源驱动
按键
2个声音接收器接收信号
电机驱动
喇叭
显示
从单片机
电源
电源
图 1 控制方案的系统框图
二、设计与论证
1、误差信号理论分析
本系统声源控制信号接收模块中的单片机采用的晶振为 ,周期
为 。又由于声音的传播速度为 ,因此声音
距中点 所需要的时间为 ,此时
,即单片机可以执行 163 条指令,完全满足设计所要求的
精度。
2、理论分析
如下图所示,单片机接收到 A 和 B 接收头的音频触发信号,控制小车向前
运动,若二者接收到的信号时间差为零,则可移动声源必在 线上。同理,可
以控制可移动声源运动到 点。
1 12 s 340m s
1cm 3 340 s
163
t
N
T
Ox
W
BA O
X
E
图 2 系统示意图
三、单元电路设计
1、系统组成
系统包括含两片 STC89C51 单片机;声源控制信号发射接收采用超再生发射
接收模块,通过 PT2262 和 PT2272 进行编码和解码;声源接收采用驻极体话筒,
接收声音信号并转化成电信号,通过放大和比较器后转化为脉冲信号,再接收通
过单稳态电路去除每个周期第一个以后的脉冲,然后再送入主单片机。实现方案
的系统方框图如下所示。
2,、声音发射模块设计
输入信号经过电位器分压后输入到 LM386 的第 3 脚,通过调节电容 C8 从
而调节放大器的增益,组成音频功率放大电路。其电路的原理图如下,该电路具
有功耗低、工作电压范围宽、所用外界元件少、调整简便等优点。输出的信号经
过电解电容 C9,再接发射头,进而产生放大的声源信号。
PT2262发射
电路
声源接收
放大、比较
器
单稳态电路
STC89C52单片
机(主机)
声源发射
STC89C52单片机
(从机)
音频功率放大
控制小车运
动状态
PT2272接收
电路
超再生接收
模块
图 3 系统方框图
3、声音接收模块的设计
(1)工作原理的分析
声源接收模块的原理图如下所示,该电路采用驻极体话筒作为声电转换元件。
驻极体话筒输出端是内部场效应管的漏极 D 和源极 S,此电路采用漏极输出的连
接方式,故在漏极 D 与电源正极之间须接入电阻 R11。通过单电源供电的同向
交流放大器电路,放大交流信号,再经过比较器输出矩形波信号。输出信号经
过 555 触发的单稳态电路进行滤波。
图 4 声音发射模块示意图
图 5 声音接收模块示意图
(2)参数计算机器件选择
运放 6 脚输入信号的放大倍数取 ,故取
, 。将 电压定位在 左右,故取 ,
和 的电位器达到控制灵敏度。NE555 单稳态触发的刷新时
间由 和 决定,暂稳态持续时间 ,刷新时间定为 17ms 左右,所
以取 , 为电解电容 F。
4、无线收发模块的设计
采用超再生发射接收模块,通过 PT2262 和 PT2272 进行编码和译码,实现
无线传输。编码芯片 PT2262 的振荡电阻取 ,解码芯片 PT2272 的振荡电阻
取 。产生误差信号通过主机单片机进行处理后,将数据通过 PT2262 发送
到射频发射模块的数据输入端发射出去。超再生接收模块接收后送到解码芯片
PT2272,然后再送给从单片机,以此控制小车的运动。
5、电机驱动电路的设计
声源通过单片机控制并安装在车上。小车的两个后轮为直流减速电机受控
于全桥驱动芯片 L298N,L298N 内部包含 4 通道逻辑驱动电路,可以方便的驱
动两个直流电机,或一个两相步进电机。L298N 可接受标准 TTL 逻辑电平信号
VSS,VSS 可接 4.5~7 V 电压。4 脚 VS 接电源电压,VS 电压范围 VIH 为+2.5~
46 V。输出电流可达 2.5 A,可驱动电感性负载。L298N 的 OUT1,OUT2 和 OUT3,
OUT4 之间可分别接电动机,本实验装置我们选用驱动两台电动机,通过调节占
空比控制电机转速。
13
17 172
1 19 19
1 1 20
C
R RU
U R X R
17 200R 19 10R 3U 2
Vcc
14 12R
18 10R 2 5PR
15R 11C 15 R C
15 12R 11C
1
150
小车驱动电路的原理图如下。在 L298N 的 4 脚使能信号有效(逻辑电平 1)
时,当 5 脚和 7 脚的电平为 10 时,电机 正转;当 5 脚和 7 脚的电平为 01 时,
电机 反转;当 5 脚和 7 脚的电平为 00 或 11 时,电机 不工作。同理可得 。
6、其它模块的设计
显示模块主要用于显示小车声源的响应时间、行驶路程、平均速度。采用的
是 LCD1602 液晶,并行数据传输。速度检测部分采用霍尔传感器,采用的是开
关型霍尔 A3144E。
1B
1B 1B 2B
图 6 电机驱动电路模块示意图
四、系统测试
1、使用仪器及设备
序号 名称 数量
1 万用表 1
2 蓄电池 1
3 示波器 1
4 最小系统板 2
2、测试的方法和步骤
可移动声源转向 时,侧地垂直距离 S、时间 t、定位误差和任意时刻超过
线左侧的最大距离,其平均速度为 。测试第 11 页 共 21 页数据记录如
下。
次数 垂直距离 响应时间 平均速度 定位误差
超过 线的
最大距离
1 72 4 0
2 64 5 11 0
3 70 5 0
0o xO
SV t
S
cm
t
s
1V scm
cm
xO
cm
参考文献
[1] 童诗白,华程英.模拟电子技术基础(第四版)[M].北京:高等教育出版社,2009.
[2] 阎石.数字电子技术基础(第五版)[M].北京:高等教育出版社,2009.
[3] 黄智伟,王彦,陈文光等.全国大学生电子设计竞赛训练教程[M].北京:电子工业
出版社,2007.
[4] 高吉祥,唐朝京.全国大学生电子设计竞赛培训系列教程(电子仪器仪表设计)
[M].北京:电子工业出版社,2007.
[5]张友德 、赵志英、涂时亮.单片微型机原理、应用与实践(第五版)[M].上海:
复旦大学出版社,2009.
[6]郭天祥.新概念 51 单片机 C 语言教程.入门、提高、开发[M].北京:电子工业
出版社,2009.
[7]梁明理.电子线路(第五版)[M].北京:高等教育出版社,2008.
附录
1、元件清单
STC89C52 2 个
7805 2 个
P5A3144E 1 个
L298N 1 个
LM358 2 个
LM386 1 个
555 3 个
液晶显示屏 1 个
驻极体话筒 2 个
喇叭 1 个
12M 晶振 1 个
晶振 1 个
三极管 2 个
电机 2 个
电容、电阻、导线 若干
2、电路图
(1)小车声源部分
(2)接收部分
3、程序
(1)小车部分:
#include<>
#define uchar unsigned char
#define uint unsigned int
sbit stop=P2^0; //发射控制端
uint num1,time;
void main(void)
{
EA=1;
EX0=1;
EX1=1;
IT1=1;
IT0=1; // 外部中断
TMOD=0X10;
TL1=0X00;
TH1=0X00;
ET1=1 ;
while(1) ;
}
void INTO_rupt() interrupt 0
{
TR1=1;
}
void INT1_rupt() interrupt 2
{
TR1=0;
time=TH1*256+TL1;
if((0==num1)&&((time<250)&&(ti
me>50)))
stop=0;
else
{
TH1=0;
TL1=0;
num1=0;
}
time=0;
}
void time1_rupt() interrupt 3
{
num1=num1+1;
}
(2) 接收部分
#include<>
#define uint unsigned int
#define uchar unsigned char
uchar code lcdnum[]="0123456789";
uchar code lcdtime[]="time: s";
uchar code lcddistance[]="distan:
cm";
uchar code lcdspeed[]="speed:
cm/s";
sbit fm=P1^0;
sbit rs=P1^1;
sbit rw=P1^2;
sbit e=P1^3;
bit flag=1;
sbit fm2=P2^6;
sbit lift1=P2^0;
sbit lift2=P2^1;
sbit enlift=P2^2;
sbit enright=P2^3;
sbit right1=P2^4;
sbit right2=P2^5;
uint count,timeov,timecount,timeov2;
bit speedflag=1;
uint speedcount=1;
bit fmflag=1;
uint fmcount=15;
void delay(uint x)
{
uint y;
for(x;x>0;x--)
for(y=110;y>0;y--);
}
void wrcom(uchar stacom) //写命令
{
rs=0;
rw=0;
e=0;
P0=stacom;
delay(1);
e=1;
delay(1);
e=0;
}
void wrsta(uchar stata)//写数据
{
rs=1;
rw=0;
e=0;
P0=stata;
delay(1);
e=1;
delay(1);
e=0;
}
void inintlcd()//液晶初始化
{
uint a;
wrcom(0x38); //显示模式
delay(20);
wrcom(0x01);//清屏
delay(20);
wrcom(0x0c); //开显示
delay(20);
wrcom(0x06);//地址指针加 1
wrcom(0x80);
a=0;
while(lcdtime[a]!='\0')
{
wrsta(lcdtime[a]);
a++;
}
wrcom(0x80+0x40);
a=0;
while(lcddistance[a]!='\0')
{
wrsta(lcddistance[a]);
a++;
}
}
void sysint()
{
EA=1;
ET1=1;
IT1=1;
IT0=1; //外中断跳边沿
EX0=1;
EX1=1;
ET0=1;
TMOD=0x11;
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
//设置定时器 1
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
TR1=1;
inintlcd();
fm=0;
///////////////////////////////////////////////////////////
/////////////////////
}
void speed() interrupt 0
{
EA=0;
TR1=0;
EX0=0;
EX1=0; //关闭所有中断
flag=0;
fm=1;
}
void stop() interrupt 2
{
count++;
}
void tim() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
speedcount--;
if(speedcount==0)
{
if(speedflag==1)
{
enlift=0;
enright=0;
speedcount=1;
speedflag=0;
}
else
{
enlift=1;
enright=1;
speedcount=1;
speedflag=1;
}
}
}
void timet() interrupt 3
{
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
timeov++;
timeov2++;
fmcount--;
if(timeov==25)
{
timecount++; //count 为
的整数倍
timeov=0;
}
if(fmcount==0)
{
if(fmflag==1)
{
fm=1;
fmcount=4;
fmflag=0;
}
else
{
fm=0;
fmcount=15;
fmflag=1;
}
}
}
void dis1602()
{
wrcom(0x80+0x48);
wrsta(lcdnum[count*8/100]);
wrsta(lcdnum[count*8%100/10]);
wrsta(lcdnum[count*8%100%10]);
wrcom(0x80+0x06);
wrsta(lcdnum[timecount*5/1000]);
wrsta(lcdnum[timecount*5%1000/1
00]);
wrsta(lcdnum[timecount*5%1000%
100/10]);
}
void stopsys()
{
float sped;
uint b,c,d,e,i;
wrcom(0x01);//清屏
sped=count*
c=(uint)sped/100;
d=(uint)sped%100/10;
e=(uint)sped%100%10;
wrcom(0x80);
b=0;
while(lcdspeed[b]!='\0')
{
wrsta(lcdspeed[b]);
b++;
}
wrcom(0x80+0x07);
wrsta(lcdnum[c]);
wrsta(lcdnum[d]);
wrsta('.');
wrsta(lcdnum[e]);
for(i=0;i<10;i++)
{
fm2=0;
delay(100);
fm2=1;
delay(100);
}
}
void main()
{
sysint();
enlift=1;
enright=1;
lift1=0;
lift2=1;
right1=1;
right2=0;//小车前进
while(flag)
{
dis1602();
}
fm=0;
enlift=0;
enright=0; //小车停
stopsys();
while(1);
}