毕业设计公交车自动报站系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本科生毕业论文(设计)
论文题目公交车自动报站系统设计
[摘要]本设计主要解决如何方便、准确地指示乘客到站的问题,具有自动检测公交站台,模拟人声进行报站和预报站,对所报站数和站名进行文字显示等功能。
系统包括微控制器模块,语音录放电路,液晶显示模块,键盘接口电路,复位电路及电源等。
系统使用51单片机来控制语音合成芯片和液晶显示模组。
站台检测使用干簧管检测。
语音合成芯片ISD4004,采用模拟数据半导体存储器直接存储的专利技术,即将模拟语音数据直接写入单个存储单元,不需经过A/D、D/A转换,因此能够较好地真实再现语音的自然效果,避免了一般固体语音电路因为量化和压缩造成的量化噪声和失真现象。
配合液晶屏lcd1602显示,就使得该报站系统更加实用。
[关键字]单片机语音提示液晶显示公交报站
1绪论
随着现在社会的发展,由于公交车的快速发展,越来越多的人选择乘坐公交车,公交车吸引人的优点除了价格低廉外,还有一个就是它的便利,尤其是报站系统,尤其对于对路线不熟悉的乘客尤为重要。
一般的公交车报站系统分为两种,一种是司机通过按键来操作,熟悉路线的司机在车辆驶入站点一定距离范围内时,按下所对应的按钮,系统报站。
另一种是通过全球定位系统(GPS)的用户终端接收工作卫星的导航信息,从而解算出车辆的经纬度信息,进而计算出实时坐标,将其与站点坐标相比较,当车辆驶入站点一定距离范围内时,不用人工干预,系统自动报站。
两种报站方法来说,第一种不智能,容易出现失误,第二种花费昂贵巨大。
所以本设计就利用干簧管作为检测站牌的传感器,检测既准确又价格又低廉。
本设计的基本思路就是干簧管传感器检测到站牌后,单片机判断第几个站牌并发出指令进行相应的语音报站,并进行液晶显示。
本次设计以 Keil C51 开发环境为编程平台进行代码的编译和运行,并在 Proteus 上进行仿真。
2 方案设计
2.1 原理
本系统使用八位单片机作为控制器件。
当系统进行语音再生时,单片机控制语音合成电路中的语音芯片来读取其外接的存储器内部的语音信息,并合成语音信号,再通过语音输出电路,进行语音报站和提示。
同时,单片机读取传感器返回的站台信息,将信息显示在液晶上。
当系统进行语音录制时,语音信号通过语音录入电路送给语音合成电路中的语音芯片,由语音芯片进行数据处理,并将生成的数字语音信息存储到语音存储芯片中,从而建立语音库。
2.2系统框图
语音模块
图 2-1 系统框图
2.3 简介
主控制器使用单片机AT89C51,是美国ATMEL公司生产的低电压,高性能CMOS 8 位单片机。
片内含 4k byte的可反复擦写的只读程序存储器(PEROM)和 128 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MSC-51 指令系统,片内置通用 8 位中央处理器和FLASH存储单元,适合在开发阶段的使用。
AT89C51 提供以下标准功能:4k字节FLASH闪存存储器,128 字节内部RAM,32 个I/O口线,两个 16 位定时/计数器,一个 5 向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51 可降至 0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位[1]。
传感器使用的是干簧管,价格便宜,反应灵敏。
液晶显示模块使用的是LCD1602,工业字符型液晶,能够同时显示16x02即32个字符。
语音芯片语音提示模块选用ISD4004系列语音芯片,外接话筒和音箱组成语音录制和播放电路。
其中,音箱由音频功率放大器LM386驱动。
公交车使用买的无驱动的玩具车。
3 硬件设计
3.1 控制器
89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。
89C51单片机管脚图
图 3-1 89C51单片机管脚图
单片机最小系统及外围电路接口图
图 3-2 单片机最小系统及外围电路接口图
3.2显示模块
(1)LCD1602液晶显示屏主要技术参数如表3.2.1
表3.2.1
(2) LCD1602液晶显示屏引脚说明如表3.2.2
表3.2.2
1602采用标准的14脚接口,其中:
第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
另外引脚"A"和"K"为背光引脚,"A"接正,"K"接负便会点亮背光灯。
这两个管脚可以不接置空。
(3)LCD1602液晶显示屏指令说明如表3.2.3
表3.2.3
它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:1为高电平、0为低电平)
指令1:清显示,指令码01H,光标复位到地址00H位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所
有文字是否左移或者右移。
高电平表示有效,低电平则无效
指令4:显示开关控制。
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标
指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符
指令7:字符发生器RAM地址设置
指令8:DDRAM地址设置
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据
指令11:读数据
LCD1602液晶显示屏显示电路
图 3-2 LCD1602液晶显示屏显示电路图
3.3 站牌检测模块
在每个站牌下面都埋着一个永磁铁,在车的右端安有一个干簧管,当车子靠近站台时,干簧管闭合,触发单片机的外部中断,被单片机检测到从而做出相应判断。
干簧管通常由两个或三个软磁性材料做成的簧片触点,被封装在充有惰性气体(如氮、氦等)或真空的玻璃管里,玻璃管内平行封装的簧片端部重叠,并留有一定间隙或相互接触以构成开关的常开或常闭触点。
干簧管的工作电路图:
图3-3 干簧管的工作电路图
3.4 语音模块
ISD4004系列语音芯片工作电压为+3V,单片录放时间8到16分钟,音质好,适用于移动电话及其他便携式电子产品中。
芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存储陈列。
芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI或Microwire)送入。
芯片采用多电平直接模拟量存储技术, 每个采样值直接存储在片内闪烁存储器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和金属声。
采样频率可以是 4.0,5.3,6.4或8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存储器中,可在断电情况下保存一百年(典型值),可反复录音十万次。
3.4.1 内部结构
图3-4 ISD4004的内部结构图
3.4.2引脚描述
(1)电源(V CCD,V CCA) 芯片内部数字电路电源正极引脚和模拟电路电源正极引脚。
为使噪声最小,芯片的数字电路和模拟电路使用不同的电源供电,并且分别引到外封装的不同管脚上,数字和模拟电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。
(2)地线(V SSD,V SSA) 芯片内部数字电路电源地线和模拟电路电源地线引脚。
芯片的数字电路和模拟电路也要使用不同的地线。
图3-5 ISD4004芯片引脚图
(3)同相模拟输入(ANA IN+) 录音信号的同相输入端。
输入放大器可用单端或差分驱动。
单端输入时,信号由耦合电容输入,最大幅度为峰-峰值32mV,耦合电容和本端的3KΩ电阻输入阻抗决定了芯片频带的低端截止频率。
差分驱动时,信号最大幅度为峰-峰值16mV。
(13)自动静噪(AM CAP)当录音信号电平下降到内部设定的某一阈值以下时,自动静噪功能使信号衰弱,这样有助于滤除无信号(静音)时的噪声。
通常本端对地接1µF 的电容,构成内部信号电平峰值检测电路的一部分。
检出的峰值电平与内部设定的阈值作比较,决定自动静噪功能的翻转点。
大信号时,自动静噪电路不衰减,静音时衰减6dB。
1µF 的电容也影响自动静噪电路对信号幅度的响应速度。
本端接V CCA则禁止自动静噪。
3.4.3 操作规则
(1)串行外设接口 ISD4000系列语音芯片工作于SPI串行接口。
SPI协议是一个同步串行数据传输协议,设定微控制器的SPI移位寄存器在SCLK的下降沿将数据
送至MISO引脚。
以ISD4004为例,协议的具体内容如下:
①所有串行数据传输开始于SS下降沿。
②SS在传输期间必须保持低电平,在两条指令之间则保持高电平。
③数据在时钟上升沿移入,在下降沿移出。
④SS变低,输入指令和地址后,ISD4004才能开始录/放操作。
⑤指令格式是(八位控制码)加(十六位地址码)。
⑥ISD4004的任何操作如果遇到EOM或OVF,则产生一个中断,该中断状态在下一个SPI周期开始时被清除。
⑦使用“读”指令使中断状态位移出ISD4004的MISO引脚时,控制及地址数据也应同步从MOSI端移入。
因此,要注意移入的数据是否与器件当前进行的操作兼容。
当然,也允许在一个SPI周期里,同时执行读状态和开始新的操作(即新移入的数据与器件当前的操作可以不兼容)。
⑧所有操作在运行位(RUN)置1时开始,置0时结束。
⑨所有指令都在SS端上升沿开始执行。
(2)信息快进用户不必知道信息的确切地址就能快进跳过一条信息。
信息快进只用于放音模式,放音速度是正常的1600倍,遇到EOM后停止,然后内部地址计数器1,指向下一条信息的开始处。
(3)上电顺序器件延时TPUD(8KHz采样时,约为25ms)后才能开始操作。
因此,用户发完上电指令后,必须等待TPUD,才能发出下一条操作指令。
例如,从00处放音,应遵循如下时序:
①发POWER UP命令;
②等待TPUD(上电延时);
③发地址值为00的SET PLAY命令;
④发PLAY命令。
器件会从00地址开始放音,当出现EOM时,立即中断,停止放音。
如果从00处录音,则按以下时序:
①发POWER UP指令;
②等待TPUD(上电延时);
③发POWER UP命令;
④等待2倍TPUD;
⑤发地址值为00的 SET REC命令;
⑥发REC命令。
器件便从00地址开始录音,一直到出现OVF(存储器末尾)时,录音停止。
(4)指令码
ISD4004的指令码:
表3.4.3.1
注:快进只能在放音操作开始时选择。
(5)SPI端口的控制位
(6)SPI控制寄存器 SPI控制寄存器控制器件的每个功能,如录音、放音、信息检索(快进)、上电/掉电、开始/停止操作、忽略地址指针等。
ISD4004的SPI控制寄存器:
表3.4.3.2
注:IAB置0时,录/放操作从A9~A0地址开始。
为了能连贯地录/放到后续的存储空间,在操作到达该行末之前,应发出第二个SPI指令将IAB置1,否则器件会在同一地址上反复循环。
这个特点对语音提示功能很有用。
RAC引脚和IAB位可用于信息管理。
SPI端口简单框图如下:
图 3-7 SPI端口简单框图
3.4.4 语音放大模块
LM386是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产品。
为使外围元件最少,电压增益内置为20。
但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。
输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW。
LM386的外形和引脚的排列如右图所示。
引脚2为反相输入端,3为同相输入端;引脚5为输出端;引脚6和4分别为电源和地;引脚1和8为电压增益设定端;使用时在引脚7和地之间接旁路电容,通常取10μF。
LM386引脚图:
图 3-8 LM386引脚图
Lm386电路连接图:
图 3-9 Lm386电路连接图
4 软件设计
4.1总程序流程图
4.2放音程序
4.3 录音程序
电源与地线之间是否有短路现象。
第三步:加电检测。
给电路板板加电,检测所有的插座或是器件的电源端是否为符合要求的值。
4.5软件调试
软件调试是指在对程序的C编程、连接、执行过程中发现程序中存在的语法错误与逻辑错误并加以排除纠正的过程[8]。
5 总结
我毕业设计的题目是公交车自动报站器的设计,经过几个月的奋斗,终于完成了设计,使系统实现了自动报站功能。
本系统功能强大,成本低,系统稳定,无需人工介入,语音音质好,很好的实现了车辆报站的自动化,具有很强的实用性。
系统选用ISD4004语音芯片,它的录音数据被存放方法是通过ISD多级存储专利技术实现的,用声音和声频信号的自然形式直接存放在故态存储器,从而提供高质量回放语音的保真度,使得该系统与其他语音报站系统相比较,语音质量较好。
另外,本设计仍然存在的许多的不足之处,比如它在报站时刻上不能十分的精确,存在一定的误差。
这些问题都需要在今后的研究工作中加以改进,使系
统更完善,更好的为人们服务。
最后还要感谢吴波指导老师在我进行毕业设计过程中对我的悉心指导以及同学们对我的帮助,正是有了大家的帮助,我才能顺利的完成毕业设计。
在这里我衷心的对帮助过我的人表示感谢。
[参考文献]
[1]《电子系统设计(第三版)》何小艇.浙江大学出版社.2004
[2]《单片机原理与实践指导》邓兴成.机械工业出版社.2006
[3]《模拟电子技术基础》华成英,童诗白.高等教育出版社.2004
[4]网站参考:protues仿真论坛
[5] 李正浩.单片机在LED 数码管显示中的应用[J].试验科学与技术.2006. 12
[6] 邓兴成.单片机原理与实践指导[M].机械工业出版社.2010.2
[7] 余成波.单片机实用技术与应用[M].清华大学出版社.2010.7
[8] 王平.单片机应用设计与制作:基于Keil和Proteus开发仿真平台 .清华大学出版
社.2012.1
The bus stops automatic system
dongshuai
Physics and Electronic Engineering School Electronic Engineering Department
[abstract] This design is mainly to solve how convenient and accurate instructions approaching passengers, with automatic detection bus station, simulation and forecast station stops on vocals, the number of stops and the name of the text display function. System including micro controller module, voice recording circuit, liquid crystal display module, the keyboard interface circuit, reset
circuit and power supply. Systems use 51 SCM to control speech synthesis chip and LCD module. Platform detection using dry reed pipe detection. Speech synthesis ISD4004 chip, using simulated data storage directly semiconductor of the storage of patent technology, is about to analog voice data directly to A single storage unit, do not need to pass A/D and D/A conversion, thus better able to truly represent speech natural effect, to avoid the general solid voice circuits for quantification and the quantization noise caused by compression and distortion. Cooperate with lcd1602 LCD
screen display, and makes the newspaper stand system more practical.
[Key words] Single-chip microcomputer,V oice prompt,Liquid crystal display,Bus stops
附录:源程序
液晶初始化:
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define delaynop() {_nop_();_nop_();_nop_();_nop_();}
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
bit LCD_busy_check();
void LCD_init();
void LCD_set_pos(uchar);
void LCD_Write_Command(uchar);
void LCD_write_data(uchar);
void delayms(uint ms)
{
uchar t;
while(ms--) for(t=0;t<120;t++);
}
bit LCD_busy_check()
{
bit result;
RS=0;
RW=1;
EN=1;
delaynop();
result=(bit)(P0 & 0x80);
EN=0;
return result;
}
void LCD_Write_Command(uchar cmd) {
while(LCD_busy_check());
RS=0;
RW=0;
EN=0;
_nop_();
_nop_();
P0=cmd;
delaynop();
EN=1;
delaynop();
EN=0;
}
void LCD_write_data(uchar str)
{
while(LCD_busy_check());
RS=1;
RW=0;
EN=0;
P0=str;
delaynop();
EN=1;
delaynop();
EN=0;
}
void LCD_init()
{
delayms(5); LCD_Write_Command(0x38);
delayms(5); LCD_Write_Command(0x0c); delayms(5); LCD_Write_Command(0x06); delayms(5); LCD_Write_Command(0x01); delayms(5);
}
void LCD_set_pos(uchar position)
{
LCD_Write_Command(position | 0x80);
}
ISD4004主程序:
#include <reg52.h>
sbit SS =P1^0; //片选
sbit MOSI=P1^1; //数据输入
sbit MISO=P1^2; //数据输出
sbit SCLK=P1^3; //ISD4004时钟
sbit INT =P1^4; //中断
sbit LED =P1^7; //指示灯
sbit LED1=P1^6; //指示灯:亮是录音/不亮是放音sbit PR =P3^3; //录音和放音选择开关
sbit STOP=P3^4; //复位
sbit AN =P3^5; //执行
void delay(unsigned int time) //延迟n微秒
{
while(time!=0)
{
time--;
}
}
void delayms(unsigned int time) //延迟n毫秒
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
void isd_send(unsigned char isdx)//spi串行发送子程序,8位数据
{
unsigned char isx_counter;
SS=0;//ss=0,打开spi通信端
SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++)//先发低位再发高位,依次发送。
{
if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
void isd_stop()//stop指令(停止当前操作){
delay(10);
isd_send(0x30);
SS=1;
delayms(50);
}
void isd_powerup()//发送上电指令
{
delay(10);
SS=0;
isd_send(0x20);
SS=1;
delayms(50);
}
void isd_stopwrdn()//发送掉电指令
{
delay(10);
isd_send(0x10);
SS=1;
delayms(50);
}
void isd_play()//发送play指令
{
LED=0;
isd_send(0xf0);
SS=1;
}
void isd_rec()//发送rec指令
{
LED=0;
isd_send(0xb0);
SS=1;
}
void isd_setplay(unsigned char adl,unsigned char adh)//发送setplay指令{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xe0); //发送setplay指令字节
}
void isd_setrec(unsigned char adl,unsigned char adh)//发送setrec指令{
delayms(1);
isd_send(adl); //发送放音起始地址低位
delay(2);
isd_send(adh); //发送放音起始地址高位
delay(2);
isd_send(0xa0); //发送setplay指令字节
SS=1;
}
void isd_overflow()//芯片溢出,LED闪烁提醒停止录音
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
unsigned char chk_isdovf()//检查芯片是否溢出(读OVF,并返回OVF值) {
SS=0;
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if(MISO==1)
{
SCLK=0;
SS=1; //关闭spi通信端
isd_stop(); //发送stop指令return 1; //OVF为1,返回1 }
else
{
SCLK=0;
SS=1; //关闭spi通信端
isd_stop(); //发送stop指令return 0; //OVF为0,返回0 }
}
void main(void)
{
unsigned
char ovflog;
{
if(PR==0) {delayms(8);LED1=~LED1;while(PR==0);}
if(LED1==0)//如果PR=0则转入录音部分
{
if(AN==0)
{
isd_powerup(); //AN键按下,ISD上电并延迟50ms
isd_stopwrdn();
isd_powerup();
LED1=0;//表示录音模式
delayms(500); //延迟500ms录音
isd_setrec(0x00,0x00); //发送0x0000h地址的setplay指令
do
{
isd_rec(); //发送rec指令
while(AN==0) //等待录音完毕
{
if(INT==0) //如果芯片溢出,进行LED闪烁提示,
isd_overflow(); //如果取消录音(松开AN键)则停止录音,芯片复位}
if(INT==0)
break;
LED=1; //录音完毕,LED熄灭
isd_stop(); //发送停止命令
while(AN==1) //如果AN再次按下,开始录制下一段语音
{
if(isd_stop==0) //如果按下STOP按键,则芯片复位
break;
if(AN==0)
delayms(500);
}
}
while(AN==0);
}
}
if(LED1==1)//如果PR=0则转入放音部分//如果PR==1则转入放音部分{
if(AN==0)
{
isd_powerup(); //AN键按下,ISD上电并延迟50ms
isd_stopwrdn();
isd_powerup();
LED1=1;//表示录音模式
while(AN==0)
{;}
isd_setplay(0x00,0x00); //发送setplay指令,从0x0000地址开始放音
do
{
isd_play(); //发送放音指令
delay(20);
while(INT==1) //等待放音完毕的EOM中断信号
{;}
LED=1;
isd_stop(); //放音完毕,发送stop指令
if (ovflog=chk_isdovf()) //检查芯片是否溢出,如溢出则停止放音,芯片复位break;
while(AN==1) //等待AN键再次按下
{
if(isd_stop==0)
break;
if(AN==0)
delayms(20);
}
}
while(AN==0); // AN键再次按下,播放下一段语音
// isd_stop();
// isd_stopwrdn();
}
}
}。