用51系列单片机实现语音输出.doc
6页用 51 系列单片机实现语音输出本文是一编介绍如何通过 51 系列单片机来实现语音输出的文章,相信现在大家可以轻 松地在网上,各种书本上找到如何用单片机来实现音乐及各种报警声的输出当我在撑握 了各音乐及报警声的输出技巧后,我就一直在想,是否可以用单片机实现语音的输出?且 要如何才能实现语音的输出?后来在我查找和学习了各方面的资料后,终于找到了一种可 以使单片机实用语音输出的方法,并且是一种很简单的方法,下面我就同大家分享我的成 果原理在这样的,先在电脑中用 COOL EDIT PRO 2.0 来记录我的语音,记录完成后再进行一定的编辑和处理,把一些多余的声音删去(因为在这里一秒的语音数据就要占去 8k 的 空间)然后再通过这个软件把我所要的语音信号输出转换为取样率为 8k的数据(为文本 格式),然后再编程使单片机每间隔 1/8k 秒输出一字节的数据这样每一次输出的 8 位数 据通过 DAC0800 数模转换,转换成相应的电流信号,然后再通过运放 LM358 转换成电压 信号来驱动扬声器来发出语音信号下面就一步一步详细教大家如何完成这些工作1. 硬件我们先按图(1)用面包板焊接好所需的线图(我就是用面包板做的),有条件的朋友 可以自已做热转印板或请 PCB 厂家加工。
只要大家的元零焊接正确且参数正确,硬件部份 是没问题的元零的参数如下:R1 R2 R4 R5 R6——1kR3———2kC1 C2———30PC3———100PC4———10uFY1———12MU1———89C52U2———DAC0800U3———LM358图 (1 )2.软件写 入到 单 片 机 中 的程式 如下 面所示 每 个 指令 我做了 注 释 , 相 信大家 应都 可在看 得明的了 dac_out equ p2 ;定义 p2 口为 DAC 的数据输出端口 ;*****************************org 00hjmp start ;程式从 100 开始org 0100hstart:out_loop:mov p2,#0h ;清 p2 口mov dptr,#dac0800_table ;取 DAC 输出数据的首址到 dptr 中mov a,#0h ;清累加器 Amovc a,@a+dptr ;取 A+dptr 所指位置的数据到累加器 A 中mov dac_out,a ;把刚才取出的数据送到 DAC 输出口 p2 call delay_125us ;延时 125us,也即是 1/8kinc dptr ;dptr 指针加一cjne a,#255d,out_loop ;识别到了数据的结尾,不是则继续。
jmp $ ;送完所有的语音数据后,程式运行到此 delay_125us: ;延时 125us 的子程式mov r5,#55djnz r5,$ret dac0800_table: ;DAC 数据的首址;***************************星号之间是处理好的数据db 119db 120db 121db 122db 107db 114;***************************db 255 ;此 255 是数据结束标志end大家要注意的是,在程式中 db 119 到 db 114 之间的数据(为十进制)是我从 cool edit pro 2.0 中转出来的语音数据,而db 255 这一行是我自已加入去的数据结束示志位,而不是数据。
因为单片机的空间有限,所以我的程式的取样率定的是 8K(我觉用 8K 的取样率 语音质量也不差了),比较小(但一秒钟也有 8000 行数据),所以程式每输出一行数据要延时 125US(1/8K),如果延时时间不对,语音会变调,大家到时可以试试,很爽的另如果在软件 COOL EDIT PRO 2.0 中的数据取样率有所变动,在单片机的程式中的延时时间也要相映变动取样率越大数据所占的空间就会越大,这里就是为什么我选用 AT89C52 的原因了,52 有 8K 的程式空间,而一秒钟的数据也是 8K,当我取不到 一秒钟的数据时再加上几十个字节的程式空间,就刚可以放入到 52 中去了大家可能 觉一秒钟的语音太少了,不够爽那怎么办?有两个为法,一是选用空间更大的单片 机,另一办法是扩展外部的数据空间,外接一个 EEPROM 这样就行了扩展多大你就看着办吧,呵呵!是不是3.语音数据的处理在 PC 机中可以进行语音数据处理的工具软件实用太多了,但我试了各种软件,还是觉得 COOL EDIT PRO 2.0(大家可以在网上下载这个软件,我用的就是汉化版的) 这个工具软件用得比较顺手,所以下面我就按这个软件来价绍如何进语音数据的处理。
图(2)就是这个软件的界面,不错吧!图(2 )(1)打开此软件后,点击软件左上角的“文件”菜单选择“ 新建“命令就可进到图( 3) 所示的选项界面图(3 )(2)进入图(3)的选项界面后,按图中所示的选项进行设定就可以了点击“ 确定”按 钮后就完成了对将要采样的语音信号的格式定义,如图(4)所示就是确认后的界面这样 下一步就可以开始记录我们需要的语音信号了图(4 )(3)在开始录音之前,大家要做的工作就是先在电脑上插上一个话筒(大家可以在电脑市场买到,如果有条件也可以自已做一个,很简单的,找来一个驻极体话筒,焊上两根线,其中与话筒的外壳相连的是地,另一为信号输出端,再的另一端焊上一个立体声插头就可以了),接着确认你的话筒是否能正常工作4)完成输入设备话筒的准备工作后,大家就可以开始录音了点击图(5)中红色的录 音按钮就可以开始录音,这时你就可以对着话筒说话这样此软件就会记录下你的语音信息了,再次点击红色的按钮你就完成了语音输入的工作,数据如图(6)所示接下来就你 需要对刚才录下的语音信息进行编辑处理图 (5 )图 ( 6)( 5) 你 需 要 将 图 ( 6) 中 的 语 音 信 号 的 头 尾 处 没 用 的 数 据 删 掉 , 删 掉 后 的 数 据 如 图 ( 7) 所 示 。
大 家 可 能 会 觉 删 掉 头 尾 的 数 据 后 怎 么 两 图 会 相 差 那 么 远 , 其 实 你 删 除 头 尾 的 数 据 后 软 件 会 自 动 拉 长 , 所 以 就 会 变 成 这 样 了 同时 大 家 在 处 理 数 据 时 也 要 相 应 地 注 意 一 下 左 下 角 的 时 间 值 如 图 ( 8) 所 示 (图 ( 8) 所 示 的 时 间 为 0.9 秒 , 数 据 所 占 空 间 为 7K 左 右 ), 以 保证 在 一 秒 以 内 , 因 为 现 在 选 用 的 是 有 8K 内 存 空 间 的 89C52, 所 以 数 据 加 程 式 不 能 大 于 8K(用 8000 的 采 样 率 , 一 秒 就 占 用 8K 的 空 间 ),如 果 大 家 用 更 大 空 间 的 单 片 机 , 记 录 的 数 据 就 可 以 相 应 更 大 一 些 大 家 就 自 已 计 算 了 图(7 )图(8 )(6)完成数据的处理工作后,就可以输出此数据了点击左上角的“文件” 菜单选择“保存为”的命令,就会出现图(9 )所示的对话框,大家按图所示那样将刚才处理好的数据保存为文本格式(*.TXT)就完成了本步骤的工作。
完成后的数据如图(10)所示不知大家 是否有注意到图中的数据都没有大于 255 的(当然啦 8 位的取样采一定不会大于 255 的)图(9 ) 图 ( 10)( 7) 完 成 数 据 输 出 后 , 还 要 做 一 些 简 单 的 处 理 在 每 一 行 数 据 的 前 面 加 上“DB” 只 有 这 样 处 理 后 , 单 片 机 的 程 式 才 能 调 用 可 能 大 家又 会 问 , 这 7000 多 行 我 一 行 一 行 要 加 到 何 时 啊 , 大 家 不 要 急 , 开 始 时 我 就 是 这 样 一 行 一 行 处 理 的 , 共 花 了 几 个 钟 的 时 间 才 加 好 , 但到 了 后 来 我 想 到 一 个 好 办 法 下 面 我 就 教 大 家 这 个 好 办 法 8) 大 家 先 打 开 微 软 的 EXCEL,将 你 输 出 的 数 据 文 件 中 的 数 据 部 份 复 制 到 ECCEL 中 , 将 数 据 的 头 部 删 去 , 注 意 是 复 制 到 第 二 列 , 如图 ( 11) 所 示 图(11)(9)完成上面的工作后,再利用 EXCEL 的特殊复制功能(这个功能是这样的,你先在第 一行输入“DB” ,再选取这一个栏,接着按着 CTRL 键,再点选这一栏进行拖动,一直拖 到再后一行,就可以了),在第一列复制出一列的“DB” ,如图(12 所示)图(12)(10)完成加“DB”的工作后,就可以把这些处理好的数据复制到单片机的程式中了,结 果如前面程式中所示。
好了,到了这一步,所有的工作就算已经完成了,大家接着好做的工作就是编绎程式,写入到单片机中,再插入到线路板,加上电源就可以工作。





