基于单片机的电子导游系统的软件设计.docx

上传人:b****6 文档编号:6580222 上传时间:2023-01-08 格式:DOCX 页数:38 大小:209.39KB
下载 相关 举报
基于单片机的电子导游系统的软件设计.docx_第1页
第1页 / 共38页
基于单片机的电子导游系统的软件设计.docx_第2页
第2页 / 共38页
基于单片机的电子导游系统的软件设计.docx_第3页
第3页 / 共38页
基于单片机的电子导游系统的软件设计.docx_第4页
第4页 / 共38页
基于单片机的电子导游系统的软件设计.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

基于单片机的电子导游系统的软件设计.docx

《基于单片机的电子导游系统的软件设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子导游系统的软件设计.docx(38页珍藏版)》请在冰豆网上搜索。

基于单片机的电子导游系统的软件设计.docx

基于单片机的电子导游系统的软件设计

1引言

随着科技的发展和社会的进步,社会的信息化为人们家具生活的舒适性、便利性、安全性和高效性带来了更高的自动化水平。

对于爱好旅游的人而言,有一款高效的电子导游系统,可以增加旅游的舒适性、便利性、安全性和高效性。

电子导游系统是利用单片机的优越性能与其广阔的应用空间为核心。

特别是随着集成电路技术的发展,单片微型计算机的功能也不断增强,许多高性能的新型机种不断涌现出来。

单片机以其功能强、体积小、可靠性高、造价低和开发周期短等优点成为自动化和各个测控领域中广泛应用的器件,尤其是在日常生活中发挥的作用也越来越大。

单片机技术的迅猛发展和人们保安意识的日渐提高,利用单片机及其他外围芯片实现自己控制已成为可能,且是一种发展趋势,特别是在电子导游系统中,单片机更是起到了不可替代的核心作用[3,4]。

针对当前人民的旅游热潮以及导游人员缺乏或素质较低,故为了提高人们旅游的质量,旨在开发出一种全自动的电子导游系统,系统由导游机和控制中心组成,游客通过手上的导游机可以很方便的获得该景点的信息及相关资料。

整个系统分为硬件设计和软件编程两部分,本部分属于软件编程,目的在于通过该课题的设计有力的提高学生的软件编程能力。

2单片机语言的简介

2.1汇编语言

51单片机的汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。

汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。

使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序[3]。

2.2单片机C语言的发展

C语言是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生压缩代码。

C语言可以进行许多机器级函数控制而不用汇编语言。

与汇编语言相比,有如下优点:

对单片机的指令系统不要求了解,仅要求对51的存储器结构有初步了解,寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理。

程序有规范的结构,它可分为不同的函数。

这种方式可使程序结构化,将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性、编程及程序调试时间显著缩短,从而提高效率[12]。

C语言提供的库包含许多标准子程序,其具有较强的数据处理,能将已编好的程序可容易地植入新程序,因为它具有方便的模块化编程技术。

C语言作为一种非常方便的语言而得到广泛的支持。

C语言程序本身并不依赖于机器硬件系统,基本上不做修改就可根据单片机的不同而较快地移植过来[4]。

C语言是一种结构化语言。

它层次清晰,便于按模块化方式组织程序,易于调试和维护。

C语言的表现能力和处理能力极强。

它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。

它还可以直接访问内存的物理地址,进行位(bit)一级的操作。

由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。

既可用于系统软件的开发,也适合于应用软件的开发。

此外,C语言还具有效率高,可移植性强等特点。

因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言[1]。

对于大多数51系列单片机,使用C语言这样的高级语言与使用汇编语言相比具有如下优点[1,7]:

(1)不需要了解处理器的指令集,也不必了解存储器结构。

(2)寄存器分配和寻址方式由编译器进行管理,编程时不需要考虑存储器的寻址和数据类型等细节。

(3)指定操作的变量选择组合提高了程序的可读性。

(4)可使用与人的思维更相近的关键字和操作函数。

(5)与使用汇编语言编程相比,程序的开发和调试时间大大缩短。

(6)C语言中的库文件提供许多标准的例程,例如格式化输出、数据转化和浮点运算等。

(7)通过C语言可实现模块化编程技术,从而可将已编制好的程序加入到新程序中。

(8)C语言可移植性好且非常普及,C语言编译器几乎适用于所有的目标系统,已完成的软件项可以很容易地转化到其他的处理器或环境中。

所有这些并不说明汇编语言就没有立足之地,很多系统特别是实时时钟系统都是用C语言和汇编语言联合编写的。

对时钟要求严格时使用汇编语言是唯一的方法。

除此之外,包括硬件接口的操作都应该用C语言来编写。

C语言的特点就是可以使程序员尽量少的对硬件进行操作,它是一种功能性和结构性很强的语言[1]。

3主要元器件介绍

3.1AT89C51

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案[2]。

3.1.1主要特性

·与MCS-51兼容

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

·寿命:

1000写/擦循环

·数据保留时间:

10年

·全静态工作:

0Hz-24Hz

·三级程序存储器锁定

·128*8位内部RAM

·32可编程I/O线

·两个16位定时器/计数器

·5个中断源

·可编程串行通道

·低功耗的闲置和掉电模式

·片内振荡器和时钟电路[2,16]

3.1.2管脚说明

管脚说明如下[2,7,13]:

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

P3口管脚备选功能

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(记时器0外部输入)

P3.5T1(记时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。

在闲置模式下,CPU停止工作。

但RAM,定时器,计数器,串口和中断系统仍在工作。

在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止[10]。

3.2ISD4004语音芯片

ISD系列语音芯片是美国ISD公司推出的产品。

该系列语音芯片采用多电平直接模拟存储(DAST)专利技术,声音不需要A/D转换和压缩,每个采样值直接存储在片内的闪烁存储器中,没有A/D转换误差,因此能够真实、自然地再现语音、音乐及效果声。

避免了一般固体录音电路量化和压缩造成的量化噪声和金属声。

由于4004内含大容量的闪速存储器(2840KB),单片电路就能实现长达16min的录音或放音[16,17]。

ISD4004语音芯片采用CMOS技术,内含晶体振荡器、防混叠滤波器、平滑滤波器、自动静噪、音频功率放大器及高密度多电平闪烁存储阵列等,因此只需很少的外围器件就可构成一个完整的声音录放系统。

芯片设计是基于所有操作由微控制器控制,操作命令通过串行通信接口(SPI或Microwire)送入。

采样频率可为4.0KHz、5.3KHz、6.4KHz、8.0kHz,频率越低,录放时间越长,而音质则有所下降。

片内信息存于内存存储器中,可在断电情况下保存100年(典型值)反复录音10万次。

器件工作电压3V,工作电流25~30mA,维持电流1μA。

单片录放语音时间8~16min,音质好,适用于移动电话机及其它便携式电子产品中[10,16]。

 

图1ISD4004语音芯片引脚图

引脚描述[17]

同相模拟输入(ANAIN+)这是录音信号的同相输入端。

输入放大器可用单端或差分驱动。

单端输入时,信号由耦合电容输入,最大幅度为峰峰值32mV,耦合电容和本端的3KΩ电阻输入阻抗决定了芯片频带的低端截止频率。

差分驱动时,信号最大幅度为峰峰值16mV,为ISD33000系列相同。

反相模拟输入(ANAIN-)差分驱动时,这是录音信号的反相输入端。

信号通过耦合电容输入,最大幅度为峰峰值16mV。

音频输出(AUDOUT)提供音频输出,可驱动5KΩ的负载。

片选(SS)此端为低,即向该ISD4004芯片发送指令,两条指令之间为高电平。

串行输入(MOSI)此端为串行输入端,主控制器应在串行时钟上升沿之前半个周期将数据放到本端,供ISD输入。

串行输出(MISO)ISD的串行输出端。

ISD未选中时,本端呈高阻态。

串行时钟(SCLK)ISD的时钟输入端,由主控制器产生,用于同步MOSI和MISO的数据传输。

数据在SCLK上升沿锁存到ISD,在下降沿移出ISD。

中断(/INT)本端为漏极开路输出。

ISD在任何操作(包括快进)中检测到EOM或OVF时,本端变低并保持。

中断状态在下一个SPI周期开始时清除。

中断状态也可用RINT指令读取。

OVF标志----指示ISD的录、放操作已到达存储器的末尾。

EOM标志----只在放音中检测到内部的EOM标志时,此状态位才置1。

行地址时钟(RAC)漏极开路输出。

每个RAC周期表示ISD存储器的操作进行了一行(ISD4004系列中的存贮器共2400行)。

该信号175ms保持高电平,低电平为25ms。

快进模式下,RAC的218.75μs是高电平,31.25μs为低电平。

该端可用于存储管理技术。

4硬件方案概述

基于单片机的电子导游系统其主要功能是:

在景点先安放无线发射模块,这些发射模块可以控制工作范围,这样在各个景点就有不同的编码信号。

游客到达景点后,游客手上的导游机会自动接收编码信号,经过解码后,由控制中心控制语音播放即可。

该系统的硬件部分包括,录音,放音驱动模块;编码,解码模块,无线发射模块;无线接收模块;单片机控制模块以及键盘模块。

具体工作过程是:

发射部分不断的发送信号,接收部分由单片机向解码芯片循环发送地址信号,由接收头将接收到的信号送至解码芯片解码,将解码信号送至单片机,如果解码的信号和单片机的预设信号一致,再由单片机控制语音芯片发出报警语音,该语音是由录音电路事先录制入ISD4004的语音段。

系统框图如图3.1所示。

图2硬件图

5系统的软件部分

5.1软件部分的总体设计

图3软件总流程图

本系统由单片机C语言编写而成,采用模块化结构设计。

基于单片机的电子导游系统要实现的主要功能是:

本系统模块包含:

键盘模块、信号发送模块、语音录入模块、信号接收模块。

其中语音的录入模块是录入确定存储与ISD4004语音芯片中的语音,其功能的实现可通过键盘来响应何时开始录音。

主程序流程图如下:

流程图说明:

当单片机上电复位后,首先对其电路中所需要的资源进行初始化。

判断此时检测电路中有没有键按下,若有键按下,则判断是何键按下。

若开始按下的键是录音键时,则程序转到对ISD4004录音处执行录音程序,录完音按下单片机复位键,程序从新开始执行;若功能键按下,判断是不是放音,是就放音,不是就待机;另外系统还预留了一部分按键为以后的功能扩展所使用。

5.2方案各模块的软件设计

5.2.1键盘模块

键盘电路是通过中断的方式实现各按键的功能[15,16]。

通过单片机读取P1.4-P1.7口的电平识别出是何键按下。

本系统设定按键的功能如下:

一号键:

导航键。

系统在待机状态下按此键后有个延时,在放音状态下按此键。

二号键:

录音键。

按住此键开始录音,松开停止录音。

占用系统资源:

P1.4-P1.5口,P3.3口。

键盘程序流程图如下:

 

图4键盘程序流程图

……

{

If(P1^4==0)

{

switch(set)//根据SET标志散转

{

case0:

stop();break;//关机

case1:

fy();break;//放音

default:

break;

}

}

elseif(P1^5==0){lfy()}//录音工作

}

程序说明:

当中断响应时通过判断P1.4-P1.7口的值判断是何键按下。

当P1.4==0时,设定此按键为功能键,利用switch指令定义SET的值跳入相应子程序,系统进行工作。

当P1.5口为0时,程序转向录音处执行。

P1.6-P1.7为以后扩展用的键盘,在本系统中不定义。

5.2.2信号发送模块

PT/SC/BHM2262是一种CMOS工艺制造的低功耗低价位通用编解码电路是目前在无线通讯电路中作地址编码识别最常用的芯片之一。

2262将从数据和地址输入管脚并行输入的“地址/数据”转换为串行的、适用于RF或IR调制的波形,由DOUT管脚输出。

2262最多可有12位三态地址,提供531441(3的12次方)个地址码,减少了地址码冲突的可能性,提高了抗非法代码扫描的能力。

2262最多可有6位(D0-D5)数据端管脚。

图52262引脚图

引脚描述

地址输入端(A0~A5)这六个三态输入端的输入状态决定编码波形的第0~5位。

可被设为“0”、“1”或“f”(悬空)。

地址输入端(A6~A11)/数据输入端(D5~D0)这六个三态输入端的输入状态确定编码波形的第6~11位。

当做为地址端使用时,可被设“0”、“1”或“f”(浮空)。

做为数据端时,它们只能是“0”或“1”。

输出使能端(TE_)“0”有效。

为“0”时2262将编码波形由DOUT输出。

振荡器端/振荡器端(OSC1/OSC2)在这两脚之间连接一个电阻,此电阻决定2262的主频。

数据输出(DOUT)编码后的波形从此管脚串行输出。

TE_为高电平时,DOUT输出低电平。

电源VCC

地GND

当TE_置“0”时,2262将从A0~A5和A6/D5~A11/D0管脚输入的“地址/数据”转换为专用的波形由DOUT输出。

DOUT输出提供给RF调制器或IR转换器,然后用无线电波或红外线将“地址/数据”信息发射出去。

发射的无线电波或红外线被RF解调器或IR接收器接收并恢复为原波形。

然后,2272对波形译码。

如果地址正确,就将其中的数据由相应管脚输出。

至此,完成了一次编解码。

本系统由单片机1给2622的地址输入端写入相应的地址,TE为0的时候通过J04循环发出信号。

所需单片机1资源:

P3.3口,P1.0-P1.7口

流程图如下:

程序:

……

voidmain(void)

{

P3=0xff;//上电初始化

while(!

TE){//为0的时候有效

for(addr_user_a1=100;addr_user_a1;addr_user_a1--)d50us();//50uS延时

addr_user_a0=0xff;

addr_user_a1=0x00;//编码设定为:

A0~A7地址编码为:

悬空

}

}

 

图6信号发送软件流程图

PT2262编码格式(CodeBit)

'1'HHHHHHHHHHHHLLLLHHHHHHHHHHHHLLLL

'0'HHHHLLLLLLLLLLLLHHHHLLLLLLLLLLLL

'F'HHHHLLLLLLLLLLLLHHHHHHHHHHHHLLLL

SyncHHHHL.......124..................L

PT2262代码字(CodeWord)

A0A1A2A3A4A5A6/D5A7/D4A8/D3A9/D2A10/D1A11/D0SYNC

A0:

FirsttransmittedSYNC:

Lasttransmitted

PT2262输出数据帧(CodeFrame)

每一帧包含4个连续的代码字,帧与帧间连续无间隔

图72262AD位波形图

5.2.3信号接收模块

PT/SC/BHM2272是CMOS解码器,与2262编码器构成一对编解码电路。

2272最多可有12位三态地址,提供531441(3的12次方)个地址,减少了代码冲突的可能性,提高了抗非法代码扫描的能力。

2272有多种可选型号:

数据输出端从0~6个可选,数据输出方式有锁存/不锁存两种。

2272最多可有12个地址位,包括6个地址/数据位。

图82272引脚图

引脚描述

地址输入端(A0~A5)这六个三态输入端的输入状态决定编码波形的第0~5位。

可被设为“0”、“1”或“f”(悬空)。

地址输入端(A6~A11)/数据输入端(D5~D0)当作为地址管脚使用时(与型号有关),这些三态输入端的输入状态决定接收到的波形第6~11位应该有的状态。

可被设为“0”,“1”或“f”(悬空)。

当做为数据输出端时,

(1)如果接收到的波形的地址部分与地址管脚设置的一致,则波形的数据部分从相应管脚输出。

(2)其它情况数据管脚总是输出低电平

数据输入脚(Din)编码波形从该端串行输入。

振荡器端/振荡器端(OSC1/OSC2)在这两脚之间连接一个电阻,此电阻决定2272的主频。

数据输出(DOUT)编码后的波形从此管脚串行输出。

TE_为高电平时,DOUT输出低电平。

电源VCC

地GND

2272将从Din管脚输入的波形解码,波形被解码成包含地址、数据和同步位的代码字。

解码后的地址部分与地址输入管脚设定的地址进行比较,如果连续三次地址比较结果符合,2272将:

(1)数据部分从数据管脚输出,

(2)VT管脚输出高电平,表示2262进行了一次有效接收。

接收到的信号为发送信号的反码因为每检测到按键有效一次PT2262都发送四次编码。

我们可以利用这一特点来解码先检测有没有接收到信息当有的时候,我们就去掉第一次编码的信号,检测5ms的高电平来检测编码的开始信号,接收到5ms的高电平后才开始解码。

我们可以发现每个码的长度都是1.2ms左右,每一个编码都是由低电平开始然后到高电平又到低电平又回到高电平,我们从第一个高电平的宽度可以把1码区分出来,剩下的悬空码和0码可以从第二个高电平的宽度区分出来。

具体的单片机译码方法如下:

由高电平开始检测到下降沿时就延时300us,读取接收的状态记为A0,然后再检测下一个下降沿,降沿后又延时300us读取接收的状态记为A1这样就把一个编码给译出来了。

A0A1和悬空1码0码的关系如下:

A0A1代码

001码

01错误

10悬空

110码

所需单片机1资源:

P3.3口,P1.0-P1.7口

流程图如下:

程序:

……

PT2272_deco()//解码

{

uchari,cnt;

if(recv_flg);

else{//清除上次解码内容

cnt=12;//接收12位编码

//解码

//先找出接收码的开头即5ms左右的高电平

//设置高电平时间为4~6ms

//检测和等待4ms的高电平

for(i=80;i;i--){//延时4mS

if(!

W_REM)i=80;

elsed50us

(1);

}

//等待在2ms内接收到的低电平

for(i=40;i;i--){//延时2mS

if(!

W_REM)break;

elsed50us

(1);

}

//4ms到6ms内接收到下降沿则跳去解码否则返回

//超出6ms接收错误返回

if(i){

recv_flg=0;//清按键没有放开过标志

gotoPT2272_deco_exit;//返回

}

//等待第一个下降沿

while(!

W_REM);

while(W_REM);

d50us(6);//等待300us后采集接收信号

a_0.word=a_1.word=0;

for(i=0;i<6;i++){

if(W_REM){

a_0.word|=0x01;//采集接收信号并记录

}

a_0.word<<=1;

while(!

W_REM);//等待第二个下降沿

while(W_REM);

d50us(6);//等待300us后采集接收信号

if(W_REM){

a_1.word|=0x01;

}

a_1.word<<=1;

a_0.word<<=4;//把接收的编码左移4位将8位密码放在同一字节上

a_1.word<<=4;

//比较密码

if((a_0.bytes.byte_addr==addr_user_a0)&&(a_1.bytes.byte_addr==addr_user_a1)){

recv_flg=1;

lianji_flg=1;

}else{

recv_flg=0;

lianji_flg=0;

}

}

PT2272_deco_exit:

return;

}

 

图9信号

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1