最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

公交车语音自动报站器的设计

来源:动视网 责编:小OO 时间:2025-09-23 16:21:15
文档

公交车语音自动报站器的设计

1绪论由于现在的公交车上大部分都采用投币的购票方式,不再设乘务员。如何方便、准确地指示乘客到站的以成为当务之急。虽然随着单片机的出现,早有设计出的语音自动报站器投入使用,但实践证明,只有语音的报站器并不能满足所有乘客的需要,比如在噪音比较大的场合或者聋哑人乘车时,就有可能因听不见语音报站而导致坐过站,为乘客带来不便。因此,我们研制这个具有汉字显示功能和语音输出功能的报站器单片机系统,以满足这个需要。本系统使用ATC51单片机作为CPU,由CPU来控制语音合成芯片ISD4004,使其工作在C
推荐度:
导读1绪论由于现在的公交车上大部分都采用投币的购票方式,不再设乘务员。如何方便、准确地指示乘客到站的以成为当务之急。虽然随着单片机的出现,早有设计出的语音自动报站器投入使用,但实践证明,只有语音的报站器并不能满足所有乘客的需要,比如在噪音比较大的场合或者聋哑人乘车时,就有可能因听不见语音报站而导致坐过站,为乘客带来不便。因此,我们研制这个具有汉字显示功能和语音输出功能的报站器单片机系统,以满足这个需要。本系统使用ATC51单片机作为CPU,由CPU来控制语音合成芯片ISD4004,使其工作在C
1 绪  论

由于现在的公交车上大部分都采用投币的购票方式,不再设乘务员。如何方便、准确地指示乘客到站的以成为当务之急。虽然随着单片机的出现,早有设计出的语音自动报站器投入使用,但实践证明,只有语音的报站器并不能满足所有乘客的需要,比如在噪音比较大的场合或者聋哑人乘车时,就有可能因听不见语音报站而导致坐过站,为乘客带来不便。因此,我们研制这个具有汉字显示功能和语音输出功能的报站器单片机系统,以满足这个需要。

本系统使用ATC51单片机作为CPU,由CPU来控制语音合成芯片ISD4004,使其工作在CPU控制模式下。当系统进行语音再生时,由CPU控制语音合成电路中的语音芯片来读取存储器内部的语音信息,并合成语音信号,再通过语音输出电路,进行语音报站和提示。语音是众多信息载体中具有最大信息容量的信号,具有很高的智能水平,人们在提高计算机系统智能化水平时,在人机对话方面就是寻求最好的语音信息交换手段。人们对语音发声的物理机能有了深刻的理解,便希望使机器能够用语音报告有关信息,这种人机界面上的渴求,促进了语音合成技术的商品化的通用化。

语音合成芯片的问世,是数字技术发展的结晶。人们只要利用大规模集成电路再配置少部分外围电路,如分力元件,就可以构成语音系统。LR3683语音合成芯片,是Sharp公司推出的比新的语音合成集成电路,它包括波形编码系统,可定时抽取语音数据样本,以供系统作量化和编码之用。LR3683语音合成芯片只是代表了一种语音合成芯片发展的形式。由于语音合成按其使用目的和约束条件等可分为多种合成方式,语音合成的数字方法也因编码方法的多样性而类型结构不一致。因此,语音芯片的种类很多,规格很丰富。世界有许多厂商研制开发语音芯片,我们就有了较多的选择余地。如美国ISD(Information Storage Devices)公司的ISD系列芯片采用直接模拟存储专利技术,把语音信号以原始的模拟形式直接存储在片内EEPROM存储器中,无需进行A/D转换和压缩处理等,从而减少了失真、大大提高了录放音质量,并具有抗断电、音质好、使用方便、可反复录放、无需专用的语音开发工具、能随意列改内容和耗电省等优点,很适合于现场录放音系统。本系统就是采用ISD4004语音合成芯片。

在通过语音输出电路,进行语音报站和提示同时,CPU同时通过程序读取汉字信息,送入128显示电路来进行汉字提示。

本显示电路采用由 ST7920 控制驱动 器决定。ST7920 同时作为控制器和驱动器,它可提供 33 路 com 输出和  路 seg 输出。在驱动器 ST7921 的配合下,最多可以驱动 256×32 点阵液晶。ST7920 系列产品硬件特性为提供 8 位,4 位并行接口及串行接口可选,自动电源启动复位功能,内部自建振荡源,×16 位字符显示 RAM(DDRAM 最多 16 字符×4 行,LCD 显示范围 16×4行)等特性。

使用128可以很好的显示出所要显示的内容。128M汉字图形点阵液晶显示模块,可显示汉字及图形,内置8192个中文汉字(16X16点阵)、128个字符(8X16点阵)及X256点阵显示RAM(GDRAM)。而且,128在日常学习及应用中是一种很常用的显示器,并且价格便宜。适用于大规模的使用。

128具有很强的通用性,可以与ATC51相连,可已通过软件很好的控制显示器内显示的内容,例如:可设置上、下行路线,可以预报站名、报站名,可以重复本次的报站;当汽车将到达某站时和出站,汽车司机通过键盘来控制本系统进行工作,控制行驶方向及站号(如与实际方向不符,司机可通过键盘来调整显示电路、语音电路的站名)。

有关于128与ISD4004我们将在下面的介绍中作出进一步的解释及特点。

本次毕业设计的硬件系统是在ATC51的基础上由ISD4004语音芯片、128液晶显示模块、键盘接口等部分组成。利用ATC51单片机作为CPU来进行总体控制,通过语音芯片ISD4004组成的语音控制电路能够建立多段语音库信息,并且可以对这些段的语音信息进行自由的组合,形成变化多样的语音提示信息,同时使用128液晶显示电路进行汉字显示,能够实现公交车的语音报站及汉字显示。在CPU控制模式下,选用4*4矩阵按键接入单片机的I/O口,CPU不断扫描I/O口状态,当有按键按下时,通过软件求出键值,再通过软件来实现该键号所对应的功能。因此当汽车到达某站时通过键盘来控制本系统进行工作,通过语音输出电路进行语音报站和提示,CPU同时通过程序读取汉字信息送入LCD液晶显示电路进行汉字提示。

2 主控电路的设计

2.1 Protel 99的功能及相关介绍

2.1.1 Protel 99的基本历史

首先我们在做硬件的过程中,必须用到的一款软件,所以我们必须对该软件非常熟悉才能在做的过程中感到种种的不便。在此,我将着重介绍一下Protel 99的历史以及工作方式:

PROTEL:PROTEL是PORTEL公司在80年代末推出的EDA软件,在电子行业的CAD软件中,它当之无愧地排在众多EDA软件的前面,是电子设计者的首选软件,它较早就在国内开始使用,在国内的普及率也最高,有些高校的电子专业还专门开设了课程来学习它,几乎所有的电子公司都要用到它,许多大公司在招聘电子设计人才时在其条件栏上常会写着要求会使用PROTEL。早期的PROTEL主要作为印制板自动布线工具使用,运行在DOS环境,对硬件的要求很低,在无硬盘286机的1M内存下就能运行,但它的功能也较少,只有电原理图绘制与印制板设计功能,其印制板自动布线的布通率也低,而现今的PROTEL已发展到PROTEL99(网络上可下载到它的测试板),是个庞大的EDA软件,完全安装有200多M,它工作在WINDOWS95环境下,是个完整的板级全方位电子设计系统,它包含了电路原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计(包含印制电路板自动布线)、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能,并具有Client/Server (客户/服务器)体系结构,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,其多层印制线路板的自动布线可实现高密度PCB的100%布通率。在国内PROTEL软件较易买到,有关PROTEL软件和使用说明的书也有很多,这为它的普及提供了基础。

2.1.2 Protel 99的组成

按照系统功能来划分,Protel99se主要包含以下俩大部分和6个功能模块。 

1、电路工程设计部分

  (1)电路原理设计部分(Advanced Schematic 99):电路原理图设计部分包括电路图编辑器(简称SCH编辑器)、电路图零件库编辑器(简称Schlib编辑器)和各种文本编辑器。本系统的主要功能是:绘制、修改和编辑电路原理图;更新和修改电路图零件库;查看和编辑有关电路图和零件库的各种报表。 

  (2)印刷电路板设计系统(Advanced PCB 99):印刷电路板设计系统包括印刷电路板编辑器(简称PCB编辑器)、零件封装编辑器(简称PCBLib编辑器)和电路板组件管理器。本系统的主要功能是:绘制、修改和编辑电路板;更新和修改零件封装;管理电路板组件。 

  (3)自动布线系统(Advanced Route 99):本系统包含一个基于形状(Shape-based)的无栅格自动布线器,用于印刷电路板的自动布线,以实现PCB设计的自动化。 

2、电路仿真与PLD部分

  (1)电路模拟仿真系统(Advanced SIM 99):电路模拟仿真系统包含一个数字/模拟信号仿真器,可提供连续的数字信号和模拟信号,以便对电路原理图进行信号模拟仿真,从而验证其正确性和可行性。 

  (2)可编程逻辑设计系统(Advanced PLD 99):可编程逻辑设计系统包含一个有语法功能的文本编辑器和一个波形编辑器(Waveform)。本系统的主要功能是;对逻辑电路进行分析、综合;观察信号的波形。利用PLD系统可以最大限度的精简逻辑部件,使数字电路设计达到最简化。 

(3)高级信号完整性分析系统(Advanced Integrity 99):信号完整性分析系统提供了一个精确的信号完整性模拟器,可用来分析PCB设计、检查电路设计参数、实验超调量、阻抗和信号谐波要求等。

2.2单片机的功能介绍

主控电路核心部分选用单片机ATC51是因为其优点较多,比如价格便宜、市场上常见。

2.2.1 ATC51单片机介绍

随着计算机技术的发展,单片机技术已成为计算机技术中的一个独特的分支,单片机的应用领域也越来越广泛,特别是在工业控制和仪器仪表智能化中扮演着极其重要的角色。实际上,单片机几乎在人类生活的各个领域都表现出强大的生命力,使计算机的应用范围达到了前所未有的广度和深度。单片机的出现尤其对电路工作者产生了观念上的冲击。过去经常采用模拟电路、数字电路实现的电路系统,现在相当大一部分可以用单片机予以实现,传统的电路设计方法已演变成软件和硬件相结合的设计方法,而且许多电路设计问题将转化为纯粹的程序设计问题。诚然,单片机的应用意义远不限于它的应用范畴或由此带来的经济效益,更重要的是它已从根本上改变了传统的控制方法和设计思想。是控制技术的一次,是一座重要的里程碑。 

ATC51是ATMEL公司生产的51系列单片机的一个型号,ATC51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的ATC51是一种高效微控制器。 ATC51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

主要功能特性:

4K字节可编程闪烁存储器 

寿命:1000写/擦循环 

数据保留时间:10年 

全静态工作:0Hz-24Hz 

三级程序存储器锁定 

128*8位内部RAM 

32可编程I/O线 

两个16位定时器/计数器 

5个中断源 

可编程串行通道 

低功耗的闲置和掉电模式 

片内振荡器和时钟电路 

2.2.2 ATC51单片机管脚及功能

ATC51采用模块式的结构,它是DIP40双列直插封装形式的器件,其引脚图和逻辑符号如图2.1所示。

图 2.1  ATC51引脚图

VCC正常运行和编程校验时为5V电源,VSS为电源接地端。

P0.0~P0.7 :P0口是一个8位双向I/O 口,每位能驱动8个LS型TTL负载。在访问外部存储器时,分时进行工作。在指令前半周期,P0口作为地总线的低8位,在ALE的下降沿地址被锁存,在指令的后半周期作为数据总线。

P1.0~P1.7 :P1口是一个带有上拉电阻的8位双向I/O口,每位能驱动4个LS型TTL负载。当向P1口锁存器中写入1时,P1为输入方式。

P2.0~P2.7 :P2口是一个带有上拉电阻的8位双向I/O口,每位能驱动4个LS型TTL负载。在访问外部存储器时,P2口送出地址总线的高8位;在对EPROM编程

时及程序校验时,它可以接受高8位地址。

P3.0~P3.7 :P3口是一个带有上拉电阻的8位双向I/O口,其驱动能力同P1口和P2口。P3口是一个双功能口,其第一个功能是作为通用的I/O口,第二功能是作为特殊信号线使用,只有第二功能所定义的信号线不使用时,P3口的引脚才能作为一般的I/O口使用。

P3口各引脚的特殊用途见表2.1。

表2.1  P3口的特殊功能

P3口

特殊功能说    明

P3.0RXD串行输入口
P3.1TXD串行输出口
P3.2外部中断0输入线

P3.3外部中断1输入线

P3.4T0定时器/计数器0外部计数脉冲输入线

P3.5T1定时器/计数器1外部计数脉冲输入线

P3.6外部数据存储器与脉冲输出线
P3.7外部数据存储读脉冲输出线
2.2.3 单片机的时钟及复位

单片机的时钟信号用来提供单片机片内各种微操作的时间基准,复位操作则使单片机的片内电路初始化,使单片机从一种确定的初态开始运行

1、时钟电路

   ATC52单片机的时钟信号通常用两种电路形式得到:内部振荡方式和外部振荡方式。在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振)或陶瓷谐振器,就构成了内部振荡方式。由于单片机内部有一个高增益反相放大器,当外接晶振后,就构成了自激振荡器并产生振荡时钟脉冲。内部振荡方式的外部电路如2.2图(a)所示。图中电容Cl和C2起稳定振荡频率、快速起振的作用,其电容值一般在5-30pF。晶振频率的典型值为12MHz,采用6MHz的情况也比较多。内部振荡方式所得的时钟信号比较稳定,实用电路中使用较多,外部振荡方式是把外部已有的时钟信号引入单片机内。这种方式适宜用来使单片机的时钟与外部信号保持同步。外部振荡方式的外部电路如2.2(b)图所示。

      

   (a)内部振荡方式                     (b)外部振荡方式

图2.2 两种振荡方式电路

由上图可见,外部振荡信号由XTAL2引入,XTAL1接地。为了提高输入电路的驱动能力,通常使外部信号经过一个带有上拉电阻的TTL反相门后接入XTAL2。

2、基本时序单位

单片机以晶体振荡器的振荡周期(或外部引入的时钟周期)为最小的时序单位,片内的各种微操作都以此周期为时序基准。振荡频率二分频后形成状态周期或称s周期,所以,1个状态周期包含有2个振荡周期。振荡频率foscl2分频后形成机器周期MC。所以,1个机器周期包含有6个状态周期或12个振荡周期。1个到4个机器周期确定一条指令的执行时间,这个时间就是指令周期。8051单片机指令系统中,各条指令的执行时间都在1个到4个机器周期之间。4种时序单位中,振荡周期和机器周期是单片机内计算其它时间值(例如,波特率、定时器的定时时间等)的基本时序单位。下面是单片机外接晶振频率12MHZ时的各种时序单位的大小: 

    振荡周期===0.0833μs

状态周期===0.0167μs

机器周期===1μs

指令周期=(1~4)机器周期=1~4μs

3、复位电路:

当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电或开关复位。上电复位要求接通电源后,自动实现复位操作。

                     图2.3 单片机的复位电路

上电或开关复位要求电源接通后,单片机自动复位,并且在单片机运行期间,用开关操作也能使单片机复位。常用的上电或开关复位电路如上图2.3 所示。上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。

4、单片机复位后的状态

单片机的复位操作使单片机进入初始化状态,其中包括使程序计数器PC=0000H,这表明程序从0000H地址单元开始执行。单片机冷启动后,片内RAM为随机值,运行中的复位操作不改变片内RAM区中的内容,21个特殊功能寄存器复位后的状态为确定值,见表2.2。值得指出的是,记住一些特殊功能寄存器复位后的主要状态,对于了解单片机的初态,减少应用程序中的韧始化部分是十分必要的。

  说明:表中符号*为随机状态;

  A=00H,表明累加器已被清零;

表2.2 特殊功能寄存器复位后的状态值

特殊功能寄存器初始状态特殊功能寄存器初始状态
A00HTMOD00H
B00HTCON00H
PSW00HTH000H
SP07HTL000H
DPL00HTH100H
DPH00HTL100H
P0~P3

FFHSBUF不定
IP***00000BSCON00H
IE0**00000BPCON0*******B
PSW=00H,表明选寄存器0组为工作寄存器组;

SP=07H,表明堆栈指针指向片内RAM 07H字节单元,根据堆栈操作的先加后压

法则,第一个被压入的内容写入到08H单元中;

P0-P3=FFH,表明已向各端口线写入1,此时,各端口既可用于输入又可用于输出;

IP=×××00000B,表明各个中断源处于低优先级;

IE=0××00000B,表明各个中断均被关断;

系统复位是任何微机系统执行的第一步,使整个控制芯片回到默认的硬件状态下。51单片机的复位是由RESET引脚来控制的,此引脚与高电平相接超过24个振荡周期后,51单片机即进入芯片内部复位状态,而且一直在此状态下等待,直到RESET引脚转为低电平后,才检查EA引脚是高电平或低电平,若为高电平则执行芯片内部的程序代码,若为低电平便会执行外部程序。

51单片机在系统复位时,将其内部的一些重要寄存器设置为特定的值,(在特殊寄存器介绍时再做详细说明)至于内部RAM内部的数据则不变[2]。

2.3 单片机扩展I/O的设计

2.3.1 扩展芯片74LS373的介绍

74LS373是常用的地址锁存器芯片,它实质是一个是带三态缓冲输出的8D触发器,在单片机系统中为了扩展外部接口,通常需要一块74LS373芯片。其引脚图如图2.4所示

图2.4 74LS373引脚图

74LS373工作原理简述:

(1).1脚是输出使能(OE),是低电平有效,当1脚是高电平时,不管输入3、4、7、8、13、14、17、18如何,也不管11脚(锁存控制端,G)如何,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)全部呈现高阻状态(或者叫浮空状态);

(2).当1脚是低电平时,只要11脚(锁存控制端,G)上出现一个下降沿,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)立即呈现输入脚3、4、7、8、13、14、17、18的状态.

锁存端LE 由高变低时,输出端8 位信息被锁存,直到LE 端再次有效。 当三态门使能信号OE为低电平时,三态门导通,允许Q0~Q7输出,OE为高电平时,输出悬空。

74LS373用作地址锁存器时,应使OE为低电平,此时锁存使能端LE为高电平时,输出Q0~Q7 状态与输入端D1~D7状态相同;当LE发生负的跳变时,输入端D0~D7 数据锁入Q0~Q7。51单片机的ALE信号可以直接与74LS373的LE连接。在MCS-51单片机系统中,常采用74LS373作为地址锁存器使用。其中输入端1D~8D接至单片机的P0口,输出端提供的是低8位地址,LE端接至单片机的地址锁存允许信号ALE。输出允许端OE接地,表示输出三态门一直打开。

  G是数据锁存控制端;当G=1时,锁存器输出端与输入端相同;当G由“1”变为“0”时,数据输入锁存器中。

  OE为输出允许端;当OE=“0”时,三态门打开;当OE=“1”时,三态门关闭,输出呈高阻状态。

2.3.2扩展芯片74LS244的介绍

74LS244是8路3态单向缓冲驱动,也叫做总线驱动门电路或线驱动。简单地说,它有8个输入端,8个输出端,可以增加信号的驱动能力.为单向驱动.

   G=0 的时候,输入->输出,G=1的时候,输出为高阻态。

         

图2.5  74LS244的引脚及功能

1G 为1Y1-1Y4输出控制端,低电平有效,高电平称高阻态。1A1-1A4为输入端,应的输出端为1Y1-1Y4。2G为2Y1-2Y4输出控制端,2A1-2A4为输入端对应的输出端为2Y1-2Y4。

3  键盘与显示接口模块的设计

键盘在单片机系统中是一个很重要的部分。输入数据、查询和控制系统的工作状态都要用到键盘,键盘是人工干预计算机的手段。

微机所用的键盘可分为编码和非编码键盘两种。编码键盘采用硬件线路来实现键盘编码,每按下一个键,键盘能自动生成按键代码,键数较多,而且还具有去抖功能。这种键盘使用方便,但硬件较复杂,PC机所用的键盘就属于这种。非编码键盘仅提供按键开关状态,其他工作由软件完成,这种键盘键数较少,硬件简单,一般在单片机应用系统中广泛使用。

3.1 矩阵式键盘接口电路设计

本系统键盘电路采用定时扫描控制方式。当有键按下时,系统产生连接,CPU响应连接后,即查询键号,通过软件来实现该键号所对应键的功能(具体电路略)。键盘的大体设置为:S3到S12为数字键,即每个键对应一个站位名,S13为加号键,即每按一次都显示下一个站的站名。S14为减号键。S15为播放键,按下此键该电路将处于播放状态。S16为录音键。S17为停止键,按下此键,电路如果是播放状态,那么将停止播放。S18为开关键,确定该电路是省电模式还是上电状态(如与实际方向不符,司机可通过键盘来调整显示电路、语音电路的站名)。

3.1.1键盘的去抖问题

(a)(b)

            图 3.1键操作和键抖动示意图

按键开关在电路中的连接如图3.1 (a)所示。按键未按下时,A点电位为高电平5V;按键按下时A点电位低电平。A点电位就用于向CPU传递开关状态。但由于按键的结构为机械弹性开关,在按键按下和断开时触点在闭合和断开瞬间还会接触不稳定,引起A点电平不稳定,如图3.1.1(b)所示,键盘的抖动时间一般为5~10ms,抖动现象会引起CPU对一次键操作进行多次处理,从而可能产生错误。因此,必须设法消除抖动的不良后果[4]。

消除按键去抖不良后果的方法有硬件和软件两种。在此系统中我们采用软件去抖的方法来实现按键去抖问题。根据抖动的特性,在第一次检测到按键按下后,执行一段延时10ms子程序后再确定该键是否确实按下,从而消除抖动的影响。

本次设计用的是矩阵式键盘,这种键盘连接简单使用较少的I/O口就可以接较多按键,其图如下3.2:

图3.2  4 * 4矩阵键盘

3.1.2 键盘扫描控制方式

在单片机应用系统中,对键盘的处理工作只是CPU工作内容的一部分,CPU还要

进行数据处理,显示和其他输入操作,因此键盘处理工作既不能占用CPU太多时间,又需要CPU对键盘操作及时作出响应,CPU对键盘处理控制的工作方式有以下几种。

1、程序控制扫描方式

程序控制扫描方式是在CPU工作空余,调用键盘扫描子程序,响应键输入信号要求。程序控制扫描方式的键处理程序固定在主程序的某个程序段。当主程序运行到该程序段时,依次扫描键盘,判断有键输入否。若有,则计算按键编号,执行相应键功能子程序。这种工作方式对CPU影响小,但应考虑键盘处理程序的运行间隔周期不能太长,否则会影响对键输入响应的及时性。本系统就采用此种键盘控制方式。

2、定时扫描控制方式

定时扫描控制方式是利用定时器/计数器每隔一段时间产生定时中断,CPU响应中断后对键盘进行扫描,并在有键闭合时转入该键的功能子程序。程序控制扫描方式与定时控制扫描方式的区别是,在扫描间隔时间内,前者用CPU工作程序填充,后者用定时器/计数器定时控制,还要占用一个定时/计数器。

3、中断控制方式

中断控制方式是利用外部中断源,响应键输入信号。当无按键按下时,CPU执行正

常工作程序。当有键按下时,CPU立即产生中断。在中断服务子程序中扫描键盘,判断是哪一个键被按下,然后执行该键的功能子程序,既能及时处理键输入,又能提高CPU运行效率,但占用一个宝贵的中断源。

3.2 LCD显示接口电路设计

    与LED数码管相比LCD液晶显示模块有很大的优越性,比如显示质量高、接口简单、操作简单、功率消耗小等优点。所以用LCD液晶显示模块实现设计的功能十分方便。本设计用的是FYD128液晶显示模块。

3.2.1 FYD128液晶显示模块介绍

FYD128-0402B是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。

逻辑工作电压(VDD):4.5~5.5V

电源地(GND):0V

工作温度(Ta):0~60℃(常温) / -20~75℃(宽温)

驱动方式:1/32DUTY,1/5BIAS

背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10

1.FYD128液晶显示模块引脚功能如表

引脚号引脚名称方向功能说明
1VSS-模块的电源地
2VDD+模块的电源正端
3V0-LCD驱动电压输入端

4RS(CS)H/L并行的指令/数据选择信号;串行的片选信号

5R/W(SID)H/L并行的读写选择信号;串行的数据口
6E(CLK)H/L并行的使能信号;串行的同步时钟
7DB0H/L数据0

8DB1H/L数据1

9DB2H/L数据2

10DB3H/L数据3

11DB4H/L数据4

12DB5H/L数据5

13DB6H/L数据6

14DB7H/L数据7

15PSBH/L并/串行接口选择:H-并行;L-串行

16NC空脚
17/RETH/L复位 低电平有效

18NC空脚
19LED_A+背光源正极(LED+5V)

20LED_K-背光源负极(LED-OV)

2.接口时序

模块有写时序和读时序两种时序如下:

(a)MPU写资料到模块

(b)MPU从模块读出资料

图3.3接口时序写/读资料图

基本操作时序:

读状态:输入:RS=L,R/W=H,CS=H,E=H    输出:D0~D7=状态字

写指令:输入:RS=L,R/W=L,D0~D7=指令码,CS=H,E=高脉冲          输出:无

读数据:输入:RS=H,R/W=H,CS=H,E=H     输出:D0~D7=数据

写数据:输入:RS=H,R/W=L,D0~D7=数据,CS=H,E=高脉冲       输出:无

3.具体指令介绍:

⑴清除显示

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLLLH
功能:清除显示屏幕,把DDRAM位址计数器调整为“00H”

⑵地址归零

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLLHX
功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM

⑶地址归位

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLHI/DS
功能:把DDRAM位址计数器调整为“00H”,游标回原点,该功能不影响显示DDRAM功能:执行该命令后,所设置的行将显示在屏幕的第一行。显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

⑷显示状态 开/关

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLHDC  B
功能: D=1;整体显示ON     C=1;游标ON     B=1;游标位置ON

⑸游标或显示移位控制

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLHS/CR/LX  X
功能:设定游标的移动与显示的移位控制位:这个指令并不改变DDRAM的内容

⑹功能设定

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLHDLX0 REX  X
功能:DL=1(必须设为1)   RE=1;扩充指令集动作    RE=0:基本指令集动作

⑺CGRAM位址

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLHAC5AC4AC3AC2AC1 AC0
功能:设定CGRAM位址到位址计数器(AC)

⑻设定DDRAM位址

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLHAC6AC5AC4AC3AC2AC1 AC0
 功能:设定DDRAM位址到位址计数器(AC)

⑼读取忙碌状态(BF)和位址

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LHBFAC6AC5AC4AC3AC2AC1 AC0
 功能:读取忙碌状态(BF)可以确认内部动作是否完成,同时可以读出位址计数器(AC)的值

⑽写资料到RAM

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

HLD7D6D5D4D3D2D1 D0
功能:写入资料到内部的RAM(DDRAM/CGRAM/TRAM/GDRAM)

⑾读出RAM的值

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

HHD7D6D5D4D3D2D1 D0
功能:从内部RAM读取资料(DDRAM/CGRAM/TRAM/GDRAM)

⑿待命模式(12H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLLL  H
功能:进入待命模式,执行其他命令都可终止待命模式

⒀卷动位址或IRAM位址选择(13H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLLH  SR
功能:SR=1;允许输入卷动位址      SR=0;允许输入IRAM位址 

⒁反白选择(14H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLLHR1  R0
功能:选择4行中的任一行作反白显示,并可决定反白的与否

⒂睡眠模式(015H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLLLHSLX  X
功能:SL=1;脱离睡眠模式   SL=0;进入睡眠模式

⒃扩充功能设定(016H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLLHHX1 REG L
功能:RE=1;扩充指令集动作    RE=0;基本指令集动作  G=1;绘图显示ON  G=0;绘图显示OFF

⒄设定IRAM位址或卷动位址(017H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLLHAC5AC4AC3AC2AC1 AC0 
功能:SR=1;AC5~AC0为垂直卷动位址   SR=0;AC3~AC0写ICONRAM位址

⒅设定绘图RAM位址(018H)

CODE:     RW   RS    DB7   DB6   DB5   DB4   DB3   DB2   DB1   DB0

LLHAC6AC5AC4AC3AC2AC1 AC0
功能:设定GDRAM位址到位址计数器(AC)

3.2.2 FYD128与单片机的接口设计

图3.4  128与单片机接口电路图

如3.4为128显示模块与单片机显示模块连接电路图:

1    VSS    为模块的电源地,所以1口接地。

2    VDD为模块的电源正端,则2口接电源。

3    V0为LCD驱动电压输入端,则需要连接电路来控制电路中的电压。

4    RS(CS)    H/L    并行的指令/数据选择信号;串行的片选信号,则要连接单片机来行使其片选功能。

5    R/W(SID)    H/L    并行的读写选择信号;串行的数据口。因为在本电路中始终都是写指令或数据,所以该端可以始终连接低电平。

6    E(CLK)    H/L    并行的使能信号;串行的同步时钟。该项需要连接入单片机,再在工作过程中的高/低电平决定该端口所起到的作用。

7~14接口为数据连接端口,与寄存器74LS373连接,通过寄存器传输单片机中的数据来获得相应的信息传送至128显示器中。

15    PSB    H/L    并/串行接口选择:H-并行;L-串行。

16    NC空脚,所以该处不接。

17    /RET    H/L    复位 低电平有效,则是直接连接高电平,使得128显示模块刚开始就处于复位状态

19和20分别为背光源的正负极,则分别连接相对应的电源正极和电源负极。

4 语音电路的设计

随着电子技术的发展和生产实际的需要,语音合成电路的应用日益广泛。尤其用在智能仪器表上,能使设备的功能增强,给使用者带来极大方便。在许多不便于直接目测的场合,将检测结果用语音输出,实现以耳听代替目测,会收到很好的效果。目前,市场上已有许多语音合成芯片供选择、开发利用。ISD4004 语音芯片是美国ISD 公司推出不久的新产品,具有多次重复录放,存储时间长,使用时不需扩充存储器,所需外围电路简单等特点。与普通的录音/重放芯片相比,ISD4004 具有如下特点:首先是记录声音没有段长度,并且声音记录不需要A/D 转换和压缩。其次,快速闪存作为存储介质,无需电源可保存数据长达100 年,重复记录10000 次以上。此外,ISD4004具有记录时间长(8~16分钟)的优点。最后,ISD4004 开发应用具有所需外围电路简单的优点。

4.1 LM317电源转换芯片

LM317是美国国家半导体公司的三端可调稳压器集成电路。国内和世界各大集成电路生产商均有同类产品可供选用,是使用极为广泛的一类串连集成稳压器。

LM317的输出电压范围是1.2V 至37V,负载电流最大为1.5A。它的使用非常简单,仅需两个外接电阻来设置输出电压。此外它的线性调整率和负载调整率也比标准的固定稳压器好。LM317 内置有过载保护、安全区保护等多种保护电路。通常LM317 不需要外接电容,除非输入滤波电容到 LM317 输入端的连线超过6 英寸(约 15 厘米)。使用输出电容能改变瞬态响应。调整端使用滤波电容能得到比标准三端稳压器高的多的纹波抑制比。

LM317主要特性:

1).可调整输出电压低到1.2V。

2).保证1.5A 输出电流。

3).典型线性调整率0.01%。

4).典型负载调整率0.1%。

5).80dB纹波抑制比。

6).输出短路保护。

7).过流、过热保护。

8).调整管安全工作区保护。

9).标准三端晶体管封装。 

10).1.25V 至 37V 连续可调

下图4.1为典型的LM317连接电路:

     图 4.1  LM317连接电路

决定LM317输出电压的是电阻R1,R2的比值,假设R2是一个固定电阻.因为输出端的电位高,电流经R1, R2流入接地点. LM317的控制端消耗非常少的电流,可忽略不计.所以, 控制端的电位是I x R2,又因为LM317 控制端, 输出端接脚间的电位差为1.25 V,所以Out(输出)的电压是: 

接下来,计算I: out与adj接脚间的电位差为1.25 V,电阻R1.电流I是: 1.25/R1。

    

使用注意事项:

1. 适当调整R1, R2,可以达成高压稳压的目的。但LM317的in, out接脚间的电位差不能超过35 V。所以在高压应用时,通常都会在in与out之间加入特定电路保护LM317。

2. 另一个要注意的是: LM317的最大供应电流是1.5 A。如果需要更高的电流,则应寻求不同的封装形式,或者使用其他编号,如LM317对应的LT1085CT或LM337对应的LT1033CT,就能够提供3A的电流,但仍为TO-220封装。 

3. LM317使用时,如果R2并联一个电容,可以大幅提高抵抗谐波的能力.并联一个电容的同时,您应该多加一个二极管,使得电容放电时,保护LM317不受损坏。

我们在电路中使用的电压大小,一般都无法直接提供,必须要通过一定的转化才能达到所需要的电量。例如:本次设计中所要提供的为3V的电压,这样我们必须通过LM317在加一定的转化才能从5V转化到3V电压。如图4.2中R21为300欧,R20为200欧,根据上述公式可得输出电压为3V。

图4.2   电压转换电路5V——3V

4.2 LM386语音功放芯片的介绍

   LM386是一种音频集成功放,具有自身功耗低、电压增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点,广泛应用于录音机和收音机之中。 

LM386是美国国家半导体公司生产的音频功率放大 器,主要应用于低电压消费类产品。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mw,使得LM386特别适用于电池供电的场合。 

LM386的引脚图如图4.3所示:

图4.3  LM386引脚图

   LM386的工作特性(Features): 

       静态功耗低,约为4mA,可用于电池供电。 

    工作电压范围宽,4-12V or 5-18V。 

    外围元件少。 

    电压增益可调,20-200。 

    低失真度。 

4.3 ISD4004语音芯片

SPI(Serial Peripheral Interface)是MOTOROLA公司推出的同步串行扩展接口。该接口共使用4条信号线:主机输出片选信号线、主机输出时钟信号线SCLK、主机输出/从机输入的数据线MOSI及主机输入/从机输出的数据线MISO。串行时钟SCLK用于同步MOSI和MISO传输信号。SPI串行扩展接口是全双工同步通信口。主机方式传输数据的最高速率达1.05Mb/s。SPI组成的系统如图4.4所示。SPI总线上可挂接多种具有SPI接口的器件。ISD4004即为带SPI接口的语音芯片。

    

    SCLK

    MOSI

    MISO

        

图4.4 SPI组成的系统图

4.3.1 ISD4004语音芯片介绍

ISD4004系列工作电压3V,单片录放时间8至16分钟,音质好,适用于移动电话及其他便携式电子产品中。芯片采用CMOS技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮器中,可在断电情况下保存100年(典型值),反复录音10万次。

    ISD4004用3V单电源供电,工作电流为25~30mA,维持电流为1µA。具有SPI串行通信接口,便于与单片机通信。我们选用的芯片是ISD4004-16M,其录音、放音时间为16min,其内部语音存储器共分为2400段,每段占用的时间长度为400ms。程序可选定任一段作为录音、放音操作的起始地址。分段地址范围为0000H~0960H。ISD4004的引脚图如图4.5所示。

图4.5  ISD4004引脚图

ISD4004引脚说明如下:

VCCA,VCCD:供电电源3V

VSSA,VSSD:地线

IN+:录音信号的同相输入端,输入放大器可用单端或差分驱动

IN-:录音信号的反相输入端

OUT:音频输出端,可驱动5K的负载

:片选端。当控制器将此端置低时,控制器可向ISD4004发送数据

MOSI:串行输入端。主控制器应在串行时钟上升沿之前半个周期将数据放到此端,供ISD4004使用

MISO:串行输出端,主控制器的串行输入端

SCLK :时钟输入端。SCLK由主控制器产生,用于同步MOSI和MISO数据传输

:中断输出,漏极开路。在出现EOM或OVF时,INT跳到低电平

XCLK:外部时钟输入端(不用时接地)

RAC :行地址时钟,漏极开路输出

AMCAP:自动静噪音控制端

ISD4004通过SPI接口传输数据的步骤如下:

1)串行数据传输开始于下降沿,在数据传输期间,必须保持为低电平;

2)从控制器发来并出现在引脚MOSI上的数据,在SCLK上升沿被锁存入ISD4004,在SCLK下降沿,将ISD4004中送出的数据放到引脚MISO上,可供控制器读取;

3)ISD4004从控制器输入指令和地址后,才能开始录/放操作;

4)指令格式是8位控制码加16位地址码,或8位控制码(不带地址码);

5)ISD4004在进行任何操作时,如果遇到EOM或OVF,则产生一个中断,该中断状态在下一个SPI周期开始时被清除;

6)所有指令操作都在端为高时执行。

OVF即OVERFLOW,是存储器末尾标志,EOM(End Of Message)指信息结尾标志。

ISD4004指令操作码格式如下:

(1)POWERUP指令:20H

00100XXX
      

    上电操作,单字节指令,不送地址

(2)SETPLAY指令:E0H+地址(A0~A15)

11100XXXA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0
 送出放音指令和放音的起始地址,3字节指令。

(3)SETREC指令:A0H+地址(A0~A15)

10100XXXA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0
送出录音指令和录音的起始地址,3字节指令。

(4)SETMC指令:E8H+地址(A0~A15)

11101XXXA15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0
快进指令,制定快进的起始地址,3字节指令。

(5)PLAY指令:F0H

11110XXX
从当前地址开始放音,直到出现EOM或OVF为止,单字节指令。

(6)REC指令:B0H

10110XXX
从当前地址开始录音,直到出现OVF或“停止”指令为止。

(7)MC指令:F8H

11111XXX
执行快进操作,直到EOM出现,单字节指令。

(8)STOP指令:30H

00110XXX
停止当前操作,单字节指令。

(9)STOPRDN指令:10H

00010XXX
停止当前操作并掉电,单字节指令。掉电后ISD4004耗电1µA。

(10)RINT指令:30H

00110XXX
读中断状态位OVF和EOM,单字节指令。

注:①X为0或1均可;

  ②ISD4004的分段地址(A0~A15)为0000H~0960H。

4.3.2 语音硬件电路设计

    语音报站器主要是指装在车上的放音电路,不包含录音电路,在实际应用中由录音电路完成报站内容的录音工作,并存储到语音芯片中。报站器主电路主要由单片机ATC52和ISD4004 构成。该系统的硬件电路连接如图4.4 所示。此图包含录音电路和放音电路。控制部分则主要由单片机C51 构成,包含必要的按键电路、复位电路和看门狗电路等外围电路。放音部分主要由ISD4004 构成,包含配套的变压电路,功放电路等。图中MIC1为麦克风,用于语音录入。LS1是喇叭,用于语音播放。信号线MOSI,MISO,SCLK和分别与单片机的P1.0,P1.1,P1.2和P1.7引脚相连,用C51的I/O口线模拟。由于ISD4004自身的工作电源为3V,故用HT1030将5V供电转换为3V供电。为加强ISD4004输出语音的功率,采用LM386作语音放大器使用。 

图4.6  ISD4004与单片机的连接图

5 软件设计

5.1 KEILC51的介绍

   在此次软件设计中我们都将用到一款软件,该软件在此与Protel 99有相辅相成的效果。该软件KEIL C51与C51亦有很好的融合性。

  KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 

5.2 C语言简介

C语言是国际上广泛流行且很有发展前途的计算机高级语言,不仅用来编写应用软件,也用来编写系统软件。

在C语言诞生以前,操作系统及其他系统软件主要是用汇编语言实现的。由于汇编语言程序设计依赖于计算机硬件,其可读性和可移植性都很差,而一般的高级语言又难以实现对计算机硬件的直接操作,因此人们需要一种兼有汇编语言和高级语言特性的语言。C语言就是在这种环境下产生的。

它最早是由Dennis Richie于1973年设计并实现。它的产生同UNIX系统之间具有非常密切的联系——C语言是在UNIX系统上开发的。而无论UNIX系统本身还是其上运行的大部分程序,都是用C语言编写实现。同时,它同样适合于编写不同领域中的大多数程序。C语言已经成为全球程序员的公共语言,并且由此产生了当前两个主流的语言C++和Java——它们都建立在C语言的语法和基本结构的基础上,而且现在世界上的许多软件都是在C语言及其衍生的各种语言的基础上开发而成。C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。

C语言在很多方面都可以用,不仅仅是在软件开发上,各类科研都是需要用到C语言的。具体应用比如我这次毕业设计中学要用到的单片机以及嵌入式系统都可以用C来开发。

C语言具有的特点如下:

语言简洁,结构紧凑,使用方便、灵活,且源程序书写格式自由。

·算符极其丰富,数据处理能力强。C语言一共有45种运算符,它把括号、赋值符号、强制类型转换符号等都作为运算符处理,使得C语言的运算符类型极为丰富,表达式类型多样化。灵活使用可以实现其他高级语言难以实现的运算和操作。

数据结构丰富。C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,用它们可以实现各种复杂的数据结构(如链表、树等)。特别是指针类型,使用起来灵活多变。

具有结构化的控制语句,是一种模块化的程序设计语言。如if…else语句、while语句、for语句等,可以在程序中使用所有的控制语句。另外,函数是C语言的基本单位,用函数作为程序模块的基本单位,以实现程序的模块化。

 可移植性好。C程序本身基本上可以不作任何修改,就能运行在各种不同型号的计算机和各种操作系统环境上。

C语言提供了某些接近汇编语言的功能,能直接访问物理地址,直接对硬件操作,从而有利于编写系统软件。

正因为以上诸多的优点,使得C语言在生产生活中有着极其广泛的引用。例如在本次毕业设计中C语言就有着很好的运用。再用C语言时,思路清晰,在写程序时目标明确,能大大降低我们在设计过程中的难度。

5.3  有关本次论文中软件设计

程序工作思想为:电路上电后,程序首先完成程序的初始化,随后查询按键状态,进入系统工作状态。如果有按键按下,则转去执行该按键指向的工作程序。按键包括放音键,录音键、停止键,开关键、加一,减一键以及10个站名键。

5.3.1 4*4矩阵式键盘软件设计

     在本次毕业设计中4*4矩阵式键盘有很重要的作用,例如:通过键位控制显示器中显示的内容,和通过键位来控制语音的输入和输出。在控制过程中,必须通过74LS244和C51在通过程序软件的设计,来间接的达到控制的目的。在此我们着重讨论一下键盘与74LS244和单片机的关系。

键盘扫描子程序:

void keyscan()

{    

    uchar temp;

    p2_0=0;            //表示74LS373不会参与到接下来的工作中。

    p2_1=0;            

    p2_2=1;            //1G和2G为负电平有效,则表示1A与1Y工作。

    P0=0X01;

    p2_1=1;

    p2_2=0;

    temp=P0;

    if(temp!=0X01)

    {

        delay(10);                    //防抖

        if(temp!=0X01)                //证明确实有键按下

        {

            switch(temp)

            {

                case 0X81:num=1;break;

                 case 0X41:num=2;break;

                case 0X21:num=3;break;

                case 0X11:num=4;break;

            }

        }

    }

}

 根据的程序可知,p2_0=0,p2_1=0,p2_2=1则表示74LS373不工作,而74LS244中1A与1Y工作。P0=0X01,p2_1=1,p2_2=0,temp=P0则表示通过寄存器中寄存数值0001,然后则使寄存其中1A与1Y部分停止工作,而2A与2Y部分工作,并将P0值赋予给temp。如果temp!=0X01,则说明有键按下,而且如果temp=OX81则说明1键按下,temp=0X41说明2积案按下,temp=0X21说明3键按下等。

同理P0依次输入0X02,0X04,0X08,来依次确定16个键中的那个键位按下。

 自此完成了4*4键盘的一次扫描,在程序中则利用键盘的不断扫描在配合其他相应的程序来完成相应的功能。例如:与128显示芯片则可完成显示的功能,与语音芯片相配合加上相应的程序可控制播放器播放的内容。

5.3.2 LCD显示模块的软件设计

     在公交车上,显示器在提醒人们下车中有很重要的作用,它几乎不会受到外界的影响,不像语音有时噪声较大等原因是会影响人的感官而使你无法确定你所要知道的站名,所以公交车上显示器的存在是绝对必要的,而且显示模块控制容易,价格便宜,有很大的通用性。

     在LCD显示过程中,他的程序并不是特别复杂,并且较容易理解,例如这次毕业设计中只要将程序适当的添加到C51单片机中,就可以实现显示出所要显示内容的目的。

#include

#define uint unsigned int 

#define uchar unsigned char

sbit p2_3=P2^3;

sbit p2_4=P2^4;

uchar code table[][]={

                         “华北科技学院    ”,

                         “电子信息工程系  ”,

                         “自动化3班      ”,

                         “设计:张无病    ”,

                         “指导教师:黄轶  ”

}

void init()                    

{

    ss=0;

    CS=1;

    p2_0=1;

    p2_1=1;

    p2_2=1;

    wr_com(0x30);                        //功能设定指令

    delay(1);

    wr_com(0x30);                        //功能设定指令

    delay(1);

    wr_com(0X0c);                        //去游标

    delay(1);

    wr_com(0x08);                        //显示开指令

    delay(1);

    wr_com(0x01);                        //清屏指令

    delay(15);

    wr_com(0x06);                        //进入设定点指令

}

void wr_com(uchar com)            //写指令

{

    p2_3=0;

    P0=com;

    delay(5);

    p2_4=1;

    delay(5);

    p2_4=0;        

}

void wr_data(uchar date)            //写数据

{

    p2_3=1;

    P0=date;

    delay(5);

    p2_4=1;

    delay(5);

    p2_4=0;        

}

void display(num)           //写站名

{   

 uchar num1;

for(num1=0;num1<8;num1++)

{

    wr_date(table[num][num1]);

    delay(20);

}

在该程序中编写了,该字符段在显示器中显示的过程。首先num=1,则字符段为华北科技学院。随着num的不同,则选择显示的字符段也不同。

5.3.3 语音模块的软件设计

     语音模块部分是本次毕业设计的主要实现目标。其实在现在的公交车上,语音播放早就已经得到了广泛的运用。例如:在我们去北京时每次要坐的车930,每次都能听见“华北科技学院到了”或“八王坟到了”等提示音,这极大地提醒了我们是否该下车了。语音的提示给我们带来极大的方便,到了现在已几乎成了我们生活中不可或缺的存在。

     语音模块的实现不仅需要硬件的支持,软件的支持也是实现语音的录放中必不可少的。我们在此则根据本次论文的具体需要来说明一下语音模块的软件设计。        

     在此我们将利用状态变量法来书写程序,来控制键位的输入与输出。首先我们把键盘控制的状态分为四种(录音状态,放音状态,上电/下电状态)。再分别在某种状态下,可能会出现的事件全部写为在上述状态的程序中。这样在通过事件的调用等可以实现语音的播放。程序见附录1。

6总结

目前,在公交车报站方面,由传统的人工报站,逐渐改变为使用微电脑控制的语音文字报站系统。本文设计了实现公共汽车的语音自动报站以及汉字提示的功能的系统。具体将整个系统分为几个大的模块,对每个模块进行详细的设计,系统基本上完成设计要求。最终所用的这些芯片均是常见的并且价格比较便宜的,其制作过程也是不很复杂的,整个系统高科技含量大,并很实用,所以有很好的发展前景。在设计制作过程中利用普通的元件,在短期内便可以开发出来,所以很适合大批量生产。

由于时间、条件等各方面的,系统本身还是有一些不尽完美之处。键盘和显示比较简单,采用线选式键盘,键数较少,使一些功能受到,设计中还可以增加日期时间及文明宣传语等功能。这些方面,还是希望在以后的研究和设计中得以完善。目前国内公交事业正处于大发展阶段,相信带GPS功能的语音自动报站器将更加广泛应用于城市公交车上。

公交车辆跟踪和客流跟踪的实时数据是公交调度的基础,实现公交的实时动态调度,不仅需要实现实时的车辆跟踪,更需要快速、准确地获取客流信息,实现实时的客流跟踪。车载设备通过GPS进行精确定位,可以准确、实时地进行车辆跟踪和实现交通管理等功能,但并没有及时准确地获取客流信息,难以实现客流的实时跟踪。目前车载IC卡的使用为广大乘客提供了方便,而且IC卡的客流信息也可以通过无线信道实时发送到调度中心。公交管理实时掌握客流信息,那么实现公交的实时动态调度,建立实时的公交请求、应答及调度一体化系统就成为可能。

参考文献

[1] 陈明荧.2004.8051单片机课程设计实训教材,北京:清华大学出版社

[2] 高锋.2008.单片机微型计算机原理与接口技术.北京:科学出版社

[3] 吴金戌,沈庆阳,郭庭吉.2002.8051单片机实践与应用[M],北京:清华大学出版社

[4] 薛栋梁.1995.单片机原理与应用[M],北京:中国水利水电出版社

[5] 何立民.2006.单片机实验与实践教程(一).北京:北京航空航天大学出版社

[6] 张俊謨.2000.单片机中级教程.北京:北京航空航天大学出版社

[7] 李广弟.2001.单片机基础.北京:北京航空航天大学出版社 

[8] 朱定华.戴汝平编著.2003.8.单片机原理与应用.北京:清华大学出版社北方交通大学出版社

[9] 李伯成.2004.7 .基MCS-51单片机的嵌入式系统设计.北京:电子工业出版社。

[10] 钟富昭.2007.8051单片机典型模块设计与应用.北京:人民邮电出版社

[11] 方建淳.1993.语音合成技术与单片机微机综合系统[M].北京:北京航空航天大学出版社

[12] 仇玉章.2000.32位微型计算机原理与接口技术[M].北京:清华大学出版社

程序清单

#include

#define uint unsigned int 

#define uchar unsigned char

sbit sclk=P1^2;

sbit mosi_spi= P1^0;

sbit p2_0=P2^0;

sbit p2_1=P2^1;

sbit p2_2=P2^2;

sbit p2_3=P2^3;

sbit p2_4=P2^4;

sbit CS=P2^5;

sbit ss=P2^6;

sbit p2_7=P2^7;

sbit INTR=P3^3;

uint  num;

uchar old_key,zhuangtai;

uchar code display[][]={

                         “华北科技学院    ”,

                         “电子信息工程系  ”,

                         “自动化3班      ”,

                         “设计:张无病    ”,

                         “指导教师:黄轶  ”

}

/*****************************延时子程******************************/

void delay(uint z)                

{

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--);    

}/*************************LCD初始化子程序**************************/

void init_lcd()                    

{

    ss=1;

    p2_0=1;

    wr_com(0x30);

    delay(1);

    wr_com(0x30);

    delay(1);

    wr_com(0x08);

    delay(1);

    wr_com(0x01);

    delay(15);

    wr_com(0x06);

}

/*************************isd4004初始化子程序**************************/

void init_isd4004()

{

    zhuangtai=1;

    powerup();

delay(50);

    powerup();

    delay(50);

}

/*************************LCD写命令子程序***************************/

void wr_com(uchar com)            

{

    p2_3=0;

    P0=com;

    delay(5);

    p2_4=1;

    delay(5);

    p2_4=0;        

}

/************************/LCD写数据子程序***************************/

void wr_data(uchar date)            //写数据指令

{

    p2_3=1;

    P0=date;

    delay(5);

    p2_4=1;

    delay(5);

    p2_4=0;        

}

/***************************写站名子程序***************************/

void display(num)           //写站名

{   

 uchar num1;

for(num1=0;num1<8;num1++)

{

    wr_date(table[num][num1]);

    delay(20);

}

}

/*************************键盘扫描子程序****************************/

void keyscan()

{    

    uchar temp;

    p2_0=0;

    p2_1=0;

    p2_2=1;

    P0=0X01;

    p2_1=1;

    p2_2=0;

    temp=P0;

    if(temp!=0X01)

    {

        delay(10);

        if(temp!=0X01)

        {

            switch(temp)

            {

                case 0X81:num=1;break;

                 case 0X41:num=2;break;

                case 0X21:num=3;break;

                case 0X11:num=4;break;

            }

        }

    }

    p2_1=0;

    p2_2=1;

    P0=0X02;

    p2_1=1;

    p2_2=0;

    temp=P0;

    if(temp!=0X02)

    {

        delay(10);

        if(temp!=0X02)

        {

            switch(temp)

               {

                case 0X82:num=5;break;

                 case 0X42:num=6;break;

                case 0X22:num=7;break;

                case 0X12:num=8;break;

            }

        }

    }

    p2_1=0;

    p2_2=1;

    P0=0X04;

    p2_1=1;

    p2_2=0;

    temp=P0;

    if(temp!=0X04)

    {

        delay(10);

        if(temp!=0X04)

        {

            switch(temp)

            {

                case 0X84:num=9;break;

                 case 0X44:num=0;break;

                case 0X24:num=11;break;

                case 0X14:num=12;break;

            }

        }

    }

    p2_1=0;

    p2_2=1;

    P0=0X08;

    p2_1=1;

    p2_2=0;

    temp=P0;

    if(temp!=0X08)

    {

        delay(10);

        if(temp!=0X08)

        {

            switch(temp)

            {

                case 0X88:num=13;break;

                 case 0X48:num=14;break;

                case 0X28:num=15;break;

                case 0X18:num=16;break;

            }

        }

    }

}

/*************************4004语音报站子程序************************/

void powerup()                //上电指令

{

    ss=0;

   wr_8date(20);                

    delay(20);

    ss=1;

}

void powerdown()                //掉电指令

{

    ss=0;

    wr_8date(10);

    ss=1;

}

void setrecord(add)                //设定录音地址指令

{

    ss=0;

    wr_16date(add);

    wr_8date(A0);

    ss=1;

}

void setplay(add)                    //设定放音地址指令

{

 ss=0;

    wr_16date(add);

    wr_8date(E0);

    ss=1;

}

void record()                        //录音指令

{

    ss=0;

    wr_8date(B0);

    ss=1;

}

void play()                        //放音指令

{

ss=0;

wr_8date(F0);

    ss=1;

}

void stop()                        //停止指令

{

ss=0;

wr_8date(30);

    ss=1;

}

void wr_8date(uchar 8date)            //写入8位数据指令

{

    uchar i;

    ss=0;

    sclk=1;

for(i=0;i<8;i++)

{

    mosi_spi=8date&0X01;

    sclk=0;

    _nop_();

    sclk=1;

    8date>>=1;

}

}

void mosi(uchar 16date)        //向4004写16位数据

{

    uchar i;

    sclk=1;                       //时钟上升

for(i=0;i<16;i++)

{

    P1_0=16date&0X0001;         //数据放入P1_0口发送

    sclk=0;                     //时钟下降

    _nop_();

    _nop_();

sclk=1;                      //时钟上升

    16date >>=1;                //发送下一位数据

}

}

void control4004()

{

    switch(zhuangtai)

    {

        case 1:

            switch(num)

            {

                case 1:key1_fy();break;

                case 2:key2_fy();break;

                case 3:key3_fy();break;

                case 4:key4_fy();break;

                case 5:key5_fy();break;

                case 6:key6_fy();break;

                case 7:key7_fy();break;

                case 8:key8_fy();break;

                case 9:key9_fy();break;

                case 10:key10_fy();break;

                case 11:key11_fy();break;

                case 12:key12_fy();break;

                case 13: ;break;

                case 14:zhangtai=2;break;

                case 15:stop();break;

                case 16:zhangtai=3;powerdown();break;

            }

        case 2:

            switch(num)

            {

                case 1:key1_ly();break;

                case 2:key2_ly();break;

                case 3:key3_ly();break;

                case 4:key4_ly();break;

                case 5:key5_ly();break;

                case 6:key6_ly();break;

                case 7:key7_ly();break;

                case 8:key8_ly();break;

                case 9:key9_ly();break;

                case 10:key10_ly();break;

                case 11: ;break;

                case 12: ;break;

                case 13:zhuangtai=1;break;

                case 14: ;break;

                case 15:stop();break;

                case 16:zhuangtai=3;powerdown();break;

            }

        case 3:

            if(num==16)

            {

                zhuangtai=1;

                powerup();

}

}

}

void key1_fy()

{

    setplay(0x0000);

    play();    

    wr_com(0x80);

display(1);

old_key=1;

return;

}

void key2_fy()

{

    setplay(0x0096);

    play();    

    wr_com(0x80);

display(2);

old_key=2;

return;

}

void key3_fy()

{

    setplay(0x0096*2);

    play();    

    wr_com(0x80);

display(3);

old_key=3;

return;

}

void key4_fy()

{

    setplay(0x0096*3);

    play();    

    wr_com(0x80);

display(4);

old_key=4;

return;

}

void key5_fy()

{

    setplay(0x0096*4);

    play();    

    wr_com(0x80);

display(5);

old_key=5;

return;

}

void key6_fy()

{

    setplay(0x0096*5);

    play();    

    wr_com(0x80);

display(6);

old_key=6;

return;

}

void key7_fy()

{

    setplay(0x0096*6);

    play();    

    wr_com(0x80);

display(7);

old_key=7;

return;

}

void key8_fy()

{

    setplay(0x0096*7);

    play();    

    wr_com(0x80);

display(8);

old_key=8;

return;

}

void key9_fy()

{

    setplay(0x0096*8);

    play();    

    wr_com(0x80);

display(9);

old_key=9;

return;

}

void key10_fy()

{

    setplay(0x0096*9);

    play();    

    wr_com(0x80);

display(10);

old_key=10;

return;

}

void key11_fy()

{

    switch(old_key)

            {

                case 1:key2_fy();break;

                case 2:key3_fy();break;

                case 3:key4_fy();break;

                case 4:key5_fy();break;

                case 5:key6_fy();break;

                case 6:key7_fy();break;

                case 7:key8_fy();break;

                case 8:key9_fy();break;

                case 9:key10_fy();break;

                case 10:key1_fy();break;

                case 11:;break;

                case 12:;break;

                case 13:;break;

                case 14:;break;

                case 15:;break;

                case 16:;break;

            }

}

void key12_fy()

{

    switch(old_key)

            {

                case 1:key10_fy();break;

                case 2:key1_fy();break;

                case 3:key2_fy();break;

                case 4:key3_fy();break;

                case 5:key4_fy();break;

                case 6:key5_fy();break;

                case 7:key6_fy();break;

                case 8:key7_fy();break;

                case 9:key8_fy();break;

                case 10:key9_fy();break;

                case 11: ;break;

                case 12: ;break;

                case 13: ;break;

                case 14: ;break;

                case 15: ;break;

                case 16: ;break;

            }

}

void key12_fy()

{

    zhangtai=2;

}

void key1_ly()

{

    setrecord(0x0000);

    reord();

    old_key=1;

return;

}

void key2_ly()

{

    setrecord(0x0096);

    reord();

    old_key=2;

return;

}

void key3_ly()

{

    setrecord(0x0096*2);

    reord();

    old_key=3;

return;

}

void key4_ly()

{

    setrecord(0x0096*3);

    reord();

    old_key=4;

return;

}

void key5_ly()

{

    setrecord(0x0096*4);

    reord();

    old_key=5;

return;

}

void key6_ly()

{

    setrecord(0x0096*5);

    reord();

    old_key=6;

return;

}

void key7_ly()

{

    setrecord(0x0096*6);

    reord();

    old_key=7;

return;

}

void key8_ly()

{

    setrecord(0x0096*7);

    reord();

    old_key=8;

return;

}

void key9_ly()

{

    setrecord(0x0096*8);

    reord();

    old_key=9;

return;

}

void key10_ly()

{

    setrecord(0x0096*9);

    reord();

    old_key=10;

return;

}

void main()               //主程序

{

    init();                 //LCD初始化

init_isd4004();            //isd4004初始化

while(1)

 {

       keyscan();             //键盘扫描

   control4004();          //语音控制

     }

}

附录2 (原理图)

致  谢

本次毕业设计终于完成了,在这里我要感谢一下黄轶老师。在这次毕业论文设计中,老师给了许多相关的资料和建议。使我以前不懂的地方都有了相关的较好的理解。并且,在我不懂得地方总是会及时的给予相关的建议和帮助。

在设计时,老师为了使我们能够更加直观的了解自己设计的项目。还提倡我们做出实物,在我做实物的过程中,我更加直观的的认识到自己在学习过程中许多以前没有注意到的问题。在这过程中老师给我们讲解许多以前不明白的地方,并且还给我们积极准备器件让我们做实物。

黄老师在我这次毕业论文设计中起到了很好的监督和提供了很多的帮助作用。在这里,再次感谢黄老师给予的认真的辅导和帮助。

文档

公交车语音自动报站器的设计

1绪论由于现在的公交车上大部分都采用投币的购票方式,不再设乘务员。如何方便、准确地指示乘客到站的以成为当务之急。虽然随着单片机的出现,早有设计出的语音自动报站器投入使用,但实践证明,只有语音的报站器并不能满足所有乘客的需要,比如在噪音比较大的场合或者聋哑人乘车时,就有可能因听不见语音报站而导致坐过站,为乘客带来不便。因此,我们研制这个具有汉字显示功能和语音输出功能的报站器单片机系统,以满足这个需要。本系统使用ATC51单片机作为CPU,由CPU来控制语音合成芯片ISD4004,使其工作在C
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top