大学毕业论文,只要是英语相关专业,方向上不偏离,是可以写的,不放心可以直接问导师。内容担心有雷同的论文,可以用论文检测软件进行查重。
基于单片机的语音录放系统设计
关键词: 单片机;数字语音电路; ISD1490;波形存储法
摘要:
设计了基于单片机的语音录放系统.该系统以 MCS89C51 单片机为核心器件, 控制四片 ISD1490 语音芯片工作, 每个语音芯片配以简单的外围电路自成独立的语音录放电路, 各个语音录放电路的录放功能及录放时间由单片机来控制, 编写不同的程序可实现不同的录放效果。
前沿
用磁带记录、 存储、 还原模拟语音信号的方法已有很长的历史, 基于这一方法的电子产品也到处可见,且这些产品的体积都很大,在使用的范围上受到了一定的限制. 单片机语音录放系统就是为解决这一问题而设计的.单片机语音录放系统是以数字电路为基础, 利用数字语音电路来实现语音信号的记录、 存储、 还原等任务. 数字语音电路是一种集语音合成技术、 大规模集成电路技术以及微控制器技术为一体的并在近十几年迅速发展起来的一种新型技术.语音集成电路与微处理器相结合, 具有体积小、 扩展方便等特点, 具有广泛的发展前景。
1 固体录音机原理
语音数字处理方法可以分为规则合成法、 参数合成法和波形存储法三类, 前两类复杂且难度大, 目前使用较少, 波形存储法是普遍采用的一种.波形存储法的技术基础是A / D、 D/ A 转换技术和多种的编码、 解码算法.图1 说明了波形存储法的语音数字处理、 记录及存储过程:首先用麦克风取得语音的电模拟量信号, 经适当放大后, A/ D转换器以一定的频率对其进行采样并转换为二进制数字量,并实时地对其进行编码,实现对实时数据的压缩以减少数据量,然后送入数据存储器中储存.
图一 语音记录过程
图2 是数字语音还原的基本过程:按一定顺序从数据存储器中读出数据, 以对应的算法进行解码,合成为语音数据,这是一种实时的数据解压过程,恢复的语音数据送入D/ A 转换器还原成语音的模拟信号输出.
图二 语音回放过程
2. 1 ISD1490 基本录放电路
ISD1490 语音芯片的内部已以 EEPROM 作为数据存储器,因此无需电池即能保存数据10 年以上,擦除和写入均可在片内自动完成而无需外部设备. 此外, 其片内还含有时钟振荡器、 话筒扩大器自动增益控制电路、 抗干扰滤波器、 音频功率放大器等.因此它自身已具备了语音录放系统所需的全部基本电路, 只需配备一只驻极体话筒、 一只喇叭、 两只按钮、 一个电源及少量电阻电容,就可以构成一个基本的录放系统(如图3 所示) .
图 3 ISD1490 基本的语音录放系统
该芯片具有下列显著特点:外围元件少, 操作方便;零功率信息存储, 无需备用电源; 信息能可靠保存10 年以上,可重复录音10 万次;语音固化无需编程开发设备; 通过地址的选址可以分段录放,因此可以独立存放汉字语音,构成语音库;具有自动省电模式,在非录放状态时自动省电.有单一电源供电( + 5v) ;静态电流典型值 0. 5uA,最大值2uA;工作电流典型值15mA,最大值30mA.
2. 2 单片机语音录放系统本电路使用了四片 ISD1490, 每片都如图 3
所示接成基本的录放电路,最后用单片机将四个基本录放电路连接成一个整体. 因为每片录音芯片可录音 90 秒,四片共可录音 360 秒, 用单片微处理器 MCS89C51 进行控制, 当录音时间在 90秒之内时,只用 1# 芯片, 如录音时间超过90 秒时,启用2# 芯片, 在录音时间超过 180 秒时, 启用3# 芯片, 这样,用微处理器来完成定时和芯片自动选择,就可实现360 秒内任何时间长度
的语音录制与回放, 从而实现录音放音功能. 系统结构如图4.
图 4 单片机语音录放系统结构图
3 系统的软件设计
本系统软件设计较为简单, 主要是定时选片控制,每片语音电路的地址端均接地,录放控制端受MCS89C51 控制, 根据微处理器的定时, 当需要某一芯片录放时, 单片机相应的控制端起作用,即启动语音电路工作,部分程序框图如图5 所示.
图 5 部分程序框图
4 结束语
单片机语音录放系统解决了传统录放机体积大、 扩展不方便的缺点.本系统所设计的电路可实现360 秒内任意长时间的语音录放. 在此基础上对硬件和软件稍作改动, 便可完成其他的功能,如语音报警器,智能语音控制器等,为各种智能仪器仪表扩展语音功能奠定了基础, 具有广泛的发展前景。
可以。可以从四个方面写:语音、词汇、语法、俗语。主要是语音部分,
1、属于哪个音系可以在网上查。
2、对比找出方言与普通话的区别。
3、对比考察境内语音的差异。至于方言的构词、句法特别是俗语与普通话在很大的区别。
可以到好的论文网站上搜索一下汉语言文学方面的优秀范文做参考。
1. 汉语初级阶段学习者集中式文化课教学教学方法的反观与思考
汉语初级阶段学习者集中式文化课教学教学方法的反观与思考
一、对教学方法的反观
笔者对集中式文化课教学方法的反观,主要基于自身教学实践经验和对课堂组织相关的调查结
2. “汉语桥”中国文化技能展示部分的培训与建议
“汉语桥”中国文化技能展示部分的培训与建议
中国文化技能展示部分,是每年比赛特别吸引眼球的部分,学生以各种中国文化的形式来表现中国文化的内容,选手不仅
3. 汉语初级阶段学习者集中式文化课教学内容的反观与思考
汉语初级阶段学习者集中式文化课教学内容的反观与思考
一、对教学内容的反观
前文提到,笔者进行教学内容设计时,参考《大纲》一级目标及内容中关于文化意识的标准,W中
4. 夏威夷大学"星谈"夏令营STEM汉语课的特点
夏威夷大学"星谈"夏令营STEM汉语课的特点
STEM汉语课是通过汉语进行交流、获得信息和理解信息,进而解决有关S咒M整合知识的活动任务。在这一过程中包含了科学
5. 汉语初级阶段学习者集中式文化课的整体反思
汉语初级阶段学习者集中式文化课的整体反思
经过课程设计、教学实践与问卷、访谈调查,根据调查结果的统计分析,本章将从教学原则、教学目标、教学内容和教学方法这四个角
6. STEM适用于夏威夷大学"星谈"夏令营汉语教学的原因分析
STEM适用于夏威夷大学"星谈"夏令营汉语教学的原因分析
上文已经对夏威夷大学"星谈"夏令营的教学背景和STEM汉语课的教学背景进行了分析,下面,笔者尝试从W下
7. 夏威夷大学"星谈"夏令营STEM汉语裸教学背景分析
夏威夷大学"星谈"夏令营STEM汉语裸教学背景分析
一、教学对象的分析
教师对教学对象的分析,可W更加了解学习者的学习需求、学习动机化及他们当前的汉语水平,在教
8. 汉语夏令营教学活动的现状研究
汉语夏令营教学活动的现状研究
目前,有关汉语夏令营的研究大致可分为兰类,一类是对汉语夏令营所采用的教学模式或课程设置的应用研究,如蒋蕾《主题教学法在夏令营教学中
9. 硕士论文开题报告:海外高级汉语课教学内容的补充与改进研究
硕士论文开题报告:海外高级汉语课教学内容的补充与改进研究
——以巴塞罗那孔子学院为例
一、问题的提出和研究意义
1.1问题的提出
本文的研究方向缘于笔者于
10. "汉语桥"比赛演讲话题分类
"汉语桥"比赛演讲话题分类
由于演讲比赛和教材的特点不同,因此学者们针对教材话题提出的话题分类并不适用于本文的研巧对象。在已有的研究成果中,只有汲传波的研究对象
11. 任务型汉语课外活动中应注意的问题
任务型汉语课外活动中应注意的问题
一、活动前阶段
笔者认为对于组织课外活动的教师来说,活动前阶段是工作量最大的时候。在此阶段教师需要完成以下工作:
(一)任务
12. 对"汉语桥"世界大学生中文比赛的研究
对"汉语桥"世界大学生中文比赛的研究
汉语桥"比赛虽然己举行了千H届,但是关于该项赛事的研巧却是从2012年W后才开始兴起,但数量并不多。目前针对"汉语桥"世界
13. 对外汉语教育硕士论文开题报告(孔子学院)
对外汉语教育硕士论文开题报告(孔子学院)
维也纳大学孔子学院初级班任务型汉语课外活动反思一、研究意义
近年来,随着中国的发展和崛起,“汉语热”在全
14. 名量词“对”“双”“副”的研究(汉语言文学论文范文)
研究依据:作为汉语当中表示确切数量的名量词,“对”“双”“副”都指二,除了它们源远流长的发展背景和进化历史,它们的具体用法在实际生活当中已经约定俗成,何时何物使用选择哪个表面看似无
15. 汉语言文学毕业论文选题方向参考、撰写提示及参考书目
汉语言文学选题方向参考、撰写提示及参考书目汉语言文学专业本科毕业论文的主要类型有研究性论文、文献综述、调查报告等几种:(一)研究性论文研究性论文按目的、功能和作用分,又可分为基础理
16. 文言语境缺失与现代汉语写作研究
文言语境缺失与现代汉语写作研究 朱自清散文的贡献更多的显然在建构现代文句上。他对“语言”问题的论述最多,也最自觉。粗略地统计一下,朱自清专门研讨文学语言的论文就有10多篇
17. 汉语歌曲语音的审美特征研究
汉语歌曲语音的审美特征研究 普通话语音是歌唱的标准语音,说好普通话是歌唱的前提。说话的语音要转变成歌唱语音必须要有歌唱的技术,我国的民族唱法是继承传统的戏曲、曲艺、民歌的唱法,吸
18. 认同危机与汉语文化传统重建研究
认同危机与汉语文化传统重建研究 一、全球化与传统价值的失落 我们无法回避也无法否认文化全球化带来了的一切,90年代信息的无限流通使得人们在文化方面的选择日益全球化,在20世纪最后20
19. 汉语言学位本科毕业论文开题报告范文[2010]
汉语言学位本科毕业论文开题报告范文[2010]《浅析〈四世同堂〉中的老派市民形象》[摘要]:在老舍的长篇小说中有几大人物类型中,写得最好的是“老派市民”形象系列。以《四世同堂》为
20. 暨南大学汉语言文学硕士学位论文开题报告
暨南大学汉语言文学硕士学位论文开题报告题名:将就类语气副词研究1.选题原因 语气副词的语义和语用功能比较复杂,特别是语气副词大多表示某种语气,主观性强,学生很难掌握。尽管教师在讲解时
“对图中的那些函数,我这里稍加解释一下。”
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
功能是初始化Windows Socket Dll,在Windows下必须使用它。
参数:
“wVersionRequested”表示版本,可以是1.1、2.2等;
“lpWSAData”指向WSADATA数据结构的指针。
int socket(int family, int type, int protocol);
功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。
参数:
“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;
“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);
“int protocol”参数通常设置为0。
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
功能是把套接字和机器上一定的端口关联起来。
参数:
“sockfd”是调用socket()返回的套接字值;
“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;
“addrlen”设置为sizeof(struct sockaddr)。
int listen(int sockfd, int backlog);
功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。
参数:
“sockfd”是调用socket()返回的套接字值;
“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
功能是客户端连接服务端监听的端口。
参数:
“sockfd”是调用socket()返回的套接字值;
“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;
“addrlen”设置为sizeof(struct sockaddr)。
int accept(int sockfd, void *addr, int *addrlen);
功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。
参数:
“sockfd”是和listen()中一样的套接字值;
“addr”是个指向局部的数据结构sockaddr_in的指针;
“addrlen”设置为sizeof(struct sockaddr_in)。
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。
参数:
“sockfd”是发/收数据的套接字值;
“msg”指向你想发送的数据的指针;
“buf”是指向接收数据存放的地址;
“len”是数据的长度;
“flags”设置为 0。
int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
功能和send、recv类似,不过是用于无连接数据报套接字的传输。
int closesocket(int sockfd)
功能是关闭套接字。
参数“sockfd”为要关闭的套接字值。
程序:
“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是:
socket()→bind()→listen→accept()→recv()/send()→closesocket()
具体代码如下:”
★
#include
#include
#pragma comment(lib,"Ws2_32")
#define MYPORT 830 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
int main()
{
int sockfd, new_fd; /*定义套接字*/
struct sockaddr_in my_addr; /*本地地址信息 */
struct sockaddr_in their_addr; /*连接者地址信息*/
int sin_size;
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll
//建立socket
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
//如果建立socket失败,退出程序
printf("socket error\n");
exit(1);
}
//bind本机的MYPORT端口
my_addr.sin_family = AF_INET; /* 协议类型是INET */
my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/
my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
{
//bind失败,退出程序
printf("bind error\n");
closesocket(sockfd);
exit(1);
}
//listen,监听端口
if (listen(sockfd, BACKLOG) == -1)
{
//listen失败,退出程序
printf("listen error\n");
closesocket(sockfd);
exit(1);
}
printf("listen...");
//等待客户端连接
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
printf("accept error\n");
closesocket(sockfd);
exit(1);
}
printf("\naccept!\n");
//有连接,发送ww0830字符串过去
if (send(new_fd, "ww0830\n", 14, 0) == -1)
{
printf("send error");
closesocket(sockfd);
closesocket(new_fd);
exit(1);
}
printf("send ok!\n");
//成功,关闭套接字
closesocket(sockfd);
closesocket(new_fd);
return 0;
}
对服务端程序的流程概括:
先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);
然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)
再bind本机的MYPORT端口:
my_addr.sin_family = AF_INET; /* 协议类型是INET */
my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口 */
my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP */
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
接下来监听端口: listen(sockfd, BACKLOG)
如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)
最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0)
收尾工作,关闭socket: closesocket(sockfd); closesocket(new_fd); ”
编译、执行,就会一直监听830端口
客户端程序了。其流程是:
socket()→connect()→send()/recv()→closesocket()
比服务端更简单吧!其实现代码如下:”
★
#include
#include
#include
#pragma comment(lib,"Ws2_32")
#define PORT 830 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct sockaddr_in their_addr; /* 对方的地址端口信息 */
if (argc != 2)
{
//需要有服务端ip参数
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
//如果建立socket失败,退出程序
printf("socket error\n");
exit(1);
}
//连接对方
their_addr.sin_family = AF_INET; /* 协议类型是INET */
their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */
their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
{
//如果连接失败,退出程序
printf("connet error\n");
closesocket(sockfd);
exit(1);
}
//接收数据,并打印出来
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
//接收数据失败,退出程序
printf("recv error\n");
closesocket(sockfd);
exit(1);
}
buf[numbytes] = '\0';
printf("Received: %s",buf);
closesocket(sockfd);
return 0;
}
对客户端程序的流程概括:
首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws);
然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0)
接着连接服务器方:
their_addr.sin_family = AF_INET; /* 协议类型是INET */
their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */
their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */
connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr))
连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0)
最后把收到的数据打印出来并关闭套接字:
printf("Received: %s",buf); closesocket(sockfd);
编译结束后,运行服务端,然后。客户端 服务端IP 回车
你会看到服务端发来得数据。
那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。
当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。
流程如下:
A客户端发登录消息-----》服务器
服务器验证发送用户消息----》客户端
A客户端想发消息给B客户端----》先发给服务端
服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)
通信结束。