(转)作者﹕ 梁武文
本文是一编介绍如何通过 51 系列单片机来实现语音输出的文章,相信现在大家可以轻 松地在网上,各种书本上找到如何用单片机来实现音乐及各种报警声的输出。当我在撑握 了各音乐及报警声的输出技巧后,我就一直在想,是否可以用单片机实现语音的输出?且 要如何才能实现语音的输出?后来在我查找和学习了各方面的资料后,终于找到了一种可 以使单片机实用语音输出的方法,并且是一种很简单的方法,下面我就同大家分享我的成 果。
原理在这样的,先在电脑中用 COOL EDIT PRO 2.0 来记录我的语音,记录完成后再进行一定的编辑和处理,把一些多余的声音删去(因为在这里一秒的语音数据就要占去 8k 的 空间)。然后再通过这个软件把我所要的语音信号输出转换为取样率为 8k 的数据(为文本 格式),然后再编程使单片机每间隔 1/8k 秒输出一字节的数据。这样每一次输出的 8 位数 据通过 DAC0800 数模转换,转换成相应的电流信号,然后再通过运放 LM358 转换成电压 信号来驱动扬声器来发出语音信号。下面就一步一步详细教大家如何完成这些工作。
1. 硬件
我们先按图(1)用面包板焊接好所需的线图(我就是用面包板做的),有条件的朋友 可以自已做热转印板或请 PCB 厂家加工。只要大家的元零焊接正确且参数正确,硬件部份 是没问题的。元零的参数如下:
R1 R2 R4 R5 R6——1k
R3———2k
C1 C2———30P
C3———100P
C4———10uF
Y1———12M
U1———89C52
U2———DAC0800
U3———LM358
图(1)
2.软件
写入到单片机中的程式如下面所示。每个指令我做了注释,相信大家应都可在看得明
的了。
dac_out equ p2 ;定义 p2 口为 DAC 的数据输出端口;
*****************************
org 00h
jmp start ;程式从 100 开始
org 0100h
start:
out_loop:
mov p2,#0h ;清 p2 口
mov dptr,#dac0800_table ;取 DAC 输出数据的首址到 dptr 中
mov a,#0h ;清累加器 A
movc a,@a+dptr ;取 A+dptr 所指位置的数据到累加器 A 中
mov dac_out,a ;把刚才取出的数据送到 DAC 输出口 p2
call delay_125us ;延时 125us,也即是 1/8k
inc dptr ;dptr 指针加一
cjne a,#255d,out_loop ;识别到了数据的结尾,不是则继续。
jmp $ ;送完所有的语音数据后,程式运行到此
delay_125us: ;延时 125us 的子程式
mov r5,#55
djnz r5,$
ret
dac0800_table: ;DAC 数据的首址
;***************************星号之间是处理好的数据
db 119
db 120
db 121
db 122
。。。。。。。。。。
。。。。。。。。。。
。。。。。。。。。。
db 107
db 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)所示。
512826028 2011-6-30 00:20
512826028 2011-6-30 00:07
用户1092539 2011-4-24 16:52