公交车自动报站系统设计.docx
《公交车自动报站系统设计.docx》由会员分享,可在线阅读,更多相关《公交车自动报站系统设计.docx(27页珍藏版)》请在冰豆网上搜索。
![公交车自动报站系统设计.docx](https://file1.bdocx.com/fileroot1/2023-1/29/c054994e-0e49-433b-9ef7-424f3d0a42a4/c054994e-0e49-433b-9ef7-424f3d0a42a41.gif)
公交车自动报站系统设计
公交车自动报站系统设计
摘要:
随着科技的不断进步,人们对事物的认知程度已经得到了广泛的提升,在实际生活中,大家都希望能使用简便、智能、人性化的产品。
在公交车自动报站方面,由于我国现状,人口众多,口音复杂,对于乘客而言,原来的人工报站存在着很多的问题。
为了跟随科技发展,提高公交系统的服务质量,提升城市形象。
开发一种能够节省人力和物力,而又能让乘客方便快捷的知道站台报站器就成为一种必然。
因此本次设计重点介绍单片机在公交报站中的应用,实现高效、准确的城市公交无线自动报站系统。
关键字:
单片机AT89S51;无线数据收发模块;语音录放芯片ISD4004
1概述
随着科技的不断进步,人们对事物的认知程度已经得到了广泛的提升,在实际生活中,大家都希望能使用简便、智能、人性化的产品。
在公交车自动报站方面,由于我国现状,人口众多,口音复杂,对于乘客而言,原来的人工报站存在着很多的问题。
为了跟随科技发展,提高公交系统的服务质量,提升城市形象。
开发一种能够节省人力和物力,而又能让乘客方便快捷的知道站台报站器就成为一种必然。
现今,自动报站方式有以下两种:
1.GPS定位系统报站。
这种报站方式非常精确但制作及运行成本也高不适合推广。
相反的,利用无线电技术的公交车车站自动识别、自动报站的技术方案,由车载无线接收机接收安装在公交车站站台上的无线发射机发出的编码信号,进行识别,并控制车载广播系统报站,实现了真正意义上的车站自动识别和自动报站。
由于在识别和报站过程中,不需要人工干预,减少了驾驶员的操作,也同时提高了车辆运行的安全性。
为此,我们以单片机AT89S51、无线数据收发模块、语音录放芯片ISD4004为主要功能模块,采用短距离无线数据通信技术,实现高效、准确的城市公交车无线自动报站系统。
2系统的硬件设计
2.1编码数据发射系统(车站系统)
车站系统主要由单片机小系统、编码设置电路、无线数据发射模块三部分组成。
系统结构如图1所示。
图1车站系统
2.1.1单片机小系统
微控制器是整个系统的核心,为保证系统的稳定,器件的选择比较重要。
该系统采用的是Atmel公司低功耗,高性能8位CMOS单片机AT89S51,片内含4KBISP(In-systemProgrammable)的可反复擦写1000次的Flash只读程序存储器。
该器件采用Atmel公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,设置4KBFlash片内程序存储器,256字节的随机存储数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断源,2层中断嵌套,2个16位可编程定时/计数器,1个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器,完全可以满足本设计的要求。
AT89S51可构成真正的单片机最小应用系统,增加系统的可靠性,降低系统的成本。
图2AT89S51引脚图
2.12编码设置电路
编码设置电路负责对每一个车站点进行编码,该编码经过CPU处理后送入无线数据发射模块进行发射。
电路中设8位拨码开关(实际产品可以将该编码固定),共能实现256种组合方式,对于一路公交车来说已经足够。
当拨动拨码开关时,送入单片机I/O口的电平组合发生变化,单片机将此电平进行编码后,以串行数据方式送入无线数据收发模块进行发射。
2.1.3无线数据收发模块
图3为无线数据发射模块原理图。
该模块工作频率为315MHz,采用声表谐振器SAW稳频,频率稳定度极高。
电路采用ASK方式调制,当数据信号停止时,发射电流降为零,功耗很低。
电路本身未设编码集成电路,而增加了一只数据调制三极管Q1,这种结构使得它可以方便的和其他固定编码电路、滚动码电路及单片机接口,,而不必考虑编码电路的工作电压和输出幅度信号值的大小。
模块输出功率由电压决定,电压变化时发射频率基本不变。
当发射电压为3V时,空旷地传输距离约20~50m,发射功率较小;当发射电压为5V时,空旷地传输距离约100~200m;当发射电压为9V时约300~500m;当发射电压为12V时,为最佳工作电压,具有较好的发射效果,发射电流约60mA,空旷地传输距离700~800m,发射功率约500mW。
综合考虑路面状况,通过试验,选择了200m左右的发射距离。
图3无线数据发射模块电路原理
2.2数据接收、语音报站系统(车载系统)
车载系统主要有无线数据接收模块、单片机小系统、语音录放电路、功放电路、显示电路组成。
系统功能结构图如图4所示。
图4车载系统
2.2.1无线数据接收模块
接收模块的工作电压为5V,静态电流为4mA,它为超再生接收电路,接收电路,接收灵敏度为-105Dbm,超再生电路的优点为:
1.天线输入端有选频电路,而不依赖1/4波长天线的选频作用,控制距离较近时可以剪短甚至去掉外接天线。
2.输出端的波形在没有信号时比较干净,干扰信号为短暂的针状脉冲,而不像其他超再生接收电路会产生密集的噪声波形,所以抗干扰能力较强。
3.模块自身辐射极小,加上电路模块背面网状接地铜箔的屏蔽作用,可以减少自身振荡的泄露和外界干扰信号的侵入。
4.采用带骨架的铜芯电感将频率调整到315MHz后封固,这与采用可调电容调整接收频率的电路相比,温度、湿度稳定性及抗机械振动性能都有极大改善。
接收模块接收到发射模块发射出来的信号时,将其解调还原出有效数据,经隔离处理后送入CPU。
电路原理图如图5所示。
图5无线数据接收模块电路原理图
2.2.2单片机小系统
车载系统中,单片机的作用是将无线数据接收模块传过来的信号进行解码,并以此为标准读取相应的地址,一方面送给语音芯片,启动语音芯片送出声音信号进行报站,另一方面将相应数据送数码管显示站名。
2.2.3语音录放电路
ISD4000系列单片声音录放器件是用CMOS工艺实现的高语音质量、3V工作电压的集成电路芯片,特别适合用于移动电话和各种便携式产品。
按录放时间又分ISD4002、ISD4003和ISD4004三个子系列。
片内集成有振荡器、抗混叠滤波器、平滑滤波器、自动静音电路、音频放大器和高密度多电平闪烁存储阵列。
内置微控制器串行通信接口,无需开发系统即可与微控制器并行工作,具有独立的协议与指令系统。
芯片采用多电平直接模拟量存储技术,每个采样值直接存贮在片内的闪烁存储器中,因而能够非常真实、自然的再现语音、音乐、音频和效果声,避免了一般固体录音电路固置化和压缩造成的量化噪音和多属音。
ISD4004的主要性能及其特点:
1)单片实现声音录放功能
2)采用单一3V工作电压
3)低功耗:
典型的录音工作电流为25mA
典型的放音工作电流为15mA
典型待机节能状态电流为1uA
4)单片机录放时间为8min、10min、12min、16min
5)高质量自然的声音/音频回放
6)自动静音电路可以在无声状态时消除背景噪音
7)不需要考虑实现算法
8)具有微控制器SPI或Microwire串行接口
9)可以多段信息寻址控制
10)可以通过SPI或Microwire控制寄存器控制功耗
11)语音数据断电不丢失,可以保存100年
12)允许反复录音十万次
13)片上带有时钟源
14)有PDIP、SOIC、TSOP和CSP多种封装形式
15)使用温度范围有商业用扩展型和工业用两种选择:
——商业品扩展型:
-20~+70℃
——工业品:
-40~+85℃
其外形和内部结构如图6、7所示。
图6ISD4004外形图
图7ISD4004内部结构图
CPU和ISD4004之间的连接较少,P2.2接ISD4004片选引脚SS,控制ISD4004的选通与否。
P2.1接ISD4004的串行输入引脚MOSI,从该引脚读入放音的地址。
P2.3和P2.5分别接ISD4004的串行时针引脚SCLK和中断引脚INT。
对于ISD4004芯片所需要的连接,还有音频信号输出引脚AUDOUT,该引脚通过一个滤波电容与功放电路连接,AMCAP为自动静音端,使用时通过一个电容接地。
此外,由于ISD4004的工作电压为3V,而单片机所需供电电压为5V,因此需要采用稳压电路得到3V电压供ISD4004使用。
在放音电路的调试过程中首先测量ISD4004的工作电压是否是3V,如果是,则进行下级调试。
然后看是否可以送入放音地址,对此可以测量AUDOUT引脚的电压,若为1.2V,则说明可以读入放音地址。
最后检查是否能够放音,测量AUDOUT引脚的电压,若为1.2V,则说明ISD4004芯片工作正常,可以放音。
如果没有听到放音,则调试后级放音电路,看是否是后级电路有问题。
数据接收模块将接收到的信号送入单片机,单片机将此信号进行解码。
信号通过校验确认正确后,一方面转换为BCD码送给74LS48译码,然后通过数码管显示出来;另一方面根据信号读取相应的地址,送给语音芯片,启动语音芯片送出信号,完成语音报站。
2.2.4功放电路
语音芯片输出的音频信号功率较小,而在报站是要求比较大的声音,这就要求对语音芯片的输出声音信号进行功率放大,电路采用的TDA2822是双声道音频功率放大器,适用于在袖珍式盒式放音机(WALKMAN)、收音机和多媒体音箱中作音频放大器。
电源电压范围宽(1.8~15V),低至1.8V仍能工作。
因此,该电路适合在低电源电压下工作。
它的特点在于静态电流小,交越失真很小,适用于单声道桥式(BTL)和立体声线路两种工作状态。
本系统采用BTL连接方式,最大输出功率可达3W,可以驱动扬声器发出做够大的声音,满足系统的要求,具体电路如图8所示。
图8TDA2822BTL电路
2.2.5显示电路
单片机驱动数码管显示是一种非常成熟的技术。
用单片机驱动LED数码管有很多方法。
按显示方式分,有静态显示和动态(扫描)显示。
静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后就不再管,直到下一次显示数据需要更新时再传送一次新数据,显示数据稳定,占用很少的CPU时间。
动态显示需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多。
本设计需要驱动两位数码管,采用动态扫描的方式固然能节省电路,但是考虑到无线数据收发模块和语音芯片的工作需要一个比较好的环境,采用动态扫描时产生的频率干扰可能会影响他们的正常工作,因此该系统选用了静态显示的方法,并采用了硬件译码74LS48驱动的方法。
这虽增加了电路,但是完全保证了系统稳定可靠的工作。
系统的总电路图见附录。
3系统软件设计
3.1程序流程图
根据系统功能和程序执行步骤得到车站系统和车载系统的流程图,如图9、10所示。
图9车站系统
图10车载系统
3.2系统的程序
具体程序部分,见附录。
4总结与展望
无线自动报站系统具有它本身无可比拟的优势,它成本不过百元,却能够很好的完成站点的自动识别、显示与语音报站等功能,避免了手动按键式报站的种种弊端。
它维护简单,无需专业人员操作,完全可以代替GPS等昂贵且操作复杂的报站系统,可扩展性很强,很适合各大中小城市推广使用。
公交车自动报站设计是采用单片机对每一个车站进行软件编码,然后通过无线数据发射模块在一定空间范围内发射该编码数据。
当汽车进入接收范围时,车载系统收到数据,进行软件编码,然后根据解码后的数据确定车辆所到的站点,启动语音报站系统报出相应的站名并进行站点显示。
采用这种方,系统功能齐全,性能可靠。
此外,本设计仍然存在很多不足之处,比如在报站时刻上达不到十分精确,存在一定的误差。
这些问题都需要在今后的工作中加以改进,使系统更完善,更好的利用到现实中。
在科技高速发展的今天,公交车在城市交通事业中占有举足轻重的位置,它给人们外出提供了方便快捷的服务,而报站器直接影响到公交车的服务质量,因此,我认为在不久之后,自动报站器将完全取代传统的人工报站,普遍使用于各大中小城市。
致谢
本课题在我的指导老师吴老师的悉心指导指导下完成,老师从开题报告到论文的完成,都离不开老师的严格要求,渊博的知识、严谨的学风和实事求是的科学态度,使我受益匪浅。
。
并且在毕业课题的设计上给于我很多的指导,使我的设计最终能顺利完成,在此,向关心和培养我的尊师表示最诚恳的谢意。
同时,论文的顺利完成,离不开其它各位老师、同学和朋友的关心和帮助。
在整个的论文写作中,各位老师、同学和朋友积极的帮助我查资料和提供有利于论文写作的建议和意见,在他们的帮助下,论文得以不断的完善,最终帮助我完整的写完了整个论文。
最后要感谢我的父母,他们对我的悉心照料使我能安心完成自己的学业。
参考文献
[1]徐伟,沈建良.单片机快速入门[M].北京:
北京航空航天大学出版社,2008
[2]孙育才,王荣兴,孙华芳.ATMEL新型AT89S52系列单片机及其应用[M].北京:
清华大学出版社,2004
[3]高卫东,辛友顺,韩彦征.51单片机原理及实践[M].北京:
北京航空航天大学出版社,2007
[4]张鑫,陈书谦.单片机原理及应用[M].北京:
电子工业出版社,2005
[5]唐继贤.51单片机工程应用实例[M].北京:
北京航空航天大学出版社,2008
[6]张义和,王敏男,许宏昌.例说51单片机(C语言版)[M].北京:
人民邮电出版社,2008
[7]朱兆优,林刚勇,马善农.电子电路设计技术[M].北京:
国防工业出版社,2006
[8]鲍卫兵,顾涵铮,张小英.通信原理[M].浙江:
浙江大学出版社,2006
[9]刘修文.实用电子电路图集[M].北京:
中国电力出版社,2005
[10]强世锦,荣健.数字通信原理[M].北京:
清华大学出版社,2007
[11]何书森,何华斌.实用电子线路设计速成[M].福建:
福建科学技术出版社,2004
附录1:
系统程序
//ISD4004Lib.h
#ifndefISD4004_H
#defineISD4004_H
#undefuchar
#undefuint
#defineucharunsignedchar
#defineuintunsignedint
#definePOWERUP
#defineSEIPLAY
#definePLAY
#defineSETREC
#defineREC
#defineSETMIC
#defineMIC
#defineSTOP
#defineSTOPPWRDN
#defineRINT
typedefenum{
LOW,
HIGH
}Level;
typedefuchar(*ISDSendByte)(ucharbyte);
typedefvoid(*SSLevel)(levellevel);
voidISD4004_FunInit(ISDSendByteisb,SSLevelsl);
voidISD4004_Play(unitaddr);
voidISD4004_Record(uintaddr);
voidISD4004_Stop(void);
voidISD4004_Rint(void);
#endif
//ISD4004Lib.c
#include"ISD4004Lib.h"
ISDSendByteIsb;
SSLevelSl;
staticvoidDelayMs(uintn)
{
uinti,j;
for(j=0;jfor(i=0;j<3000;i++);
}
}
staticuintSendCmd(uintcmd,uintaddr)
{
uchartmpL,tmpH;
uinttmp=cmd+addr;
S1(LOW);
tmpL=Isb(tmp-((tmp>>8)<<8));
tmpL=Isb(tmp>>8);
S1(HIGH);
return((((uint)tmpH)<<8)+tmpL);
}
voidISD4004_FunInit(ISDSendByteisb,SSLevelsl)
{
Isb=isb;
S1=s1;
SendCmd(STOPPWRDN,0);
SendCmd(POWERUP,0);
DelayMs(25);
}
voidISD4004_Play(uintaddr)
{
Sendcmd(POWERUP,0);
DelayMs(25);
SendCmd(SETPLAY,addr);
SendCmd(PLAY,0);
}
uintISD4004_Stop(void)
{
uinttmp;
tmp=SendCmd(STOP,0);
returntmp;
}
voidISD4004_Record(uintaddr)
{
SendCmd(POWERUP,0);
DelayMs(25);
SendCmd(POWERUP,0);
DelayMs(50);
SendCmd(SETREC,addr);
SendCmd(REC,0);
}
uintISD4004_Rint(void)
{
returnSendCmd(RINT,0);
}
*******************************************************************************
//I2CLib.h
#ifndefTWI_H
#defineTWI_H
#include
#include
#defineERROR
#defineSTART0x08
#defineMT_SLA_ACK0x18
#defineMT_DATA_ACK0x28
#defineMR_SLA_ACK0x40
#defineMR_DATA_ACK0x50
#defineMR_DATA_NACK0x58
voidTwiWrite(charsladdr,charaddr,char*dat,intlen);
voidTwiRead(charsladdr,charaddr,char*dat,intlen);
#endif/*TWI_H*/
//I2CLib.c
#include"I2CLib.h"
staticvoidDelay(intnum)
{
inti;
for(i=0;ii=i;
}
}
voidTwiWrite(charsladdr,charaddr,char*dat,intlen);
{
inti;
for(i=0;iTWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=START)ERROR(START);
TWDR=(sladdr<<1)&0xfe;
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MT_SLA_ACK)ERROR(MT_SLA_ACK);
TWDR=addr+1;
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MT_DATA_ACK)ERROR(MT_DATA_ACK);
TWDR=*(dat+i);
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MT_DATA_ACK)ERROR(MT_DATA_ACK);
TWCR=(1<Delay(3000);
}
}
voidTwiRead(charsladdr,charaddr,char*dat,intlen);
{
inti;
for(i=0;iTWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=START)ERROR(START);
TWDR=(sladdr<<1)&0xfe;
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MT_SLA_ACK)ERROR(MT_SLA_ACK);
TWDR=addr+1;
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MT_DATA_ACK)ERROR(MT_DATA_ACK);
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=START)ERROR(START);
TWDR=(sladdr<<1)|0x01;
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MR_SLA_ACK)ERROR(MR_SLA_ACK);
TWCR=(1<while(!
(TWCR&(1<if((TWSR&0xF8)!
=MR_DATA_NACK)ERROR(MR_DATA_NACK);
*(dat+i)=TWDR;
TWCR=(1<}
}
*******************************************************************************
//include.h
#ifndefINCLUDE_H
#defineINCLUDE_H
#include
#include
#include"ISD4004Lib.h"
#include"I2CLib.h"
#defineHEAD0
#defineTAIL1
#defineRECORD_NUM30
#def