原创 用 51 系列单片机实现语音输出

2011-6-30 00:18 3452 13 16 分类: MCU/ 嵌入式

用 51 系列单片机实现语音输出




(转)作者﹕  



本文是一编介绍如何通过 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






 



 20110630001302399.jpg


 


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)就是这个软件的界面,不错吧!

20110630001340882.jpg


图(2


1)打开此软件后,点击软件左上角的“文件”菜单选择“新建“命令就可进到图(3) 所示的选项界面。




20110630001358380.jpg


图(3


2)进入图(3)的选项界面后,按图中所示的选项进行设定就可以了。点击“确定”按 钮后就完成了对将要采样的语音信号的格式定义,如图(4)所示就是确认后的界面。这样 下一步就可以开始记录我们需要的语音信号了。



  20110630001431888.jpg



 


图(4


3)在开始录音之前,大家要做的工作就是先在电脑上插上一个话筒(大家可以在电脑市场买到,如果有条件也可以自已做一个,很简单的,找来一个驻极体话筒,焊上两根线,其中与话筒的外壳相连的是地,另一为信号输出端,再在线的另一端焊上一个立体声插头就可以了),接着确认你的话筒是否能正常工作。


4)完成输入设备话筒的准备工作后,大家就可以开始录音了。点击图(5)中红色的录 音按钮就可以开始录音,这时你就可以对着话筒说话。这样此软件就会记录下你的语音信 息了,再次点击红色的按钮你就完成了语音输入的工作,数据如图(6)所示。接下来就你 需要对刚才录下的语音信息进行编辑处理。


 

  


20110630001445320.jpg







 


5


 


20110630001512798.jpg 





 


图(6


5)你需要将图(6)中的语音信号的头尾处没用的数据删掉,删掉后的数据如图(7)所示。


大家可能会觉删掉头尾的数据后怎么两图会相差那么远,其实你删除头尾的数据后软件会自动拉长,所以就会变成这样了。同时大家在处理数据时也要相应地注意一下左下角的时 间值如图(8)所示(图(8)所示的时间为 0.9 秒,数据所占空间为 7K 左右),以保证在一 秒以内,因为现在选用的是有 8K 内存空间的 89C52,所以数据加程式不能大于 8K( 8000 的采样率,一秒就占用 8K 的空间),如果大家用更大空间的单片机,记录的数据就可以相 应更大一些。大家就自已计算了。


 

 


20110630001537176.jpg 


图(7


20110630001550188.jpg

 

图(8


6)完成数据的处理工作后,就可以输出此数据了。点击左上角的“文件”菜单选择“保存为”的命令,就会出现图(9)所示的对话框,大家按图所示那样将刚才处理好的数据保存为文本格式(*.TXT)就完成了本步骤的工作。完成后的数据如图(10)所示。不知大家 是否有注意到图中的数据都没有大于 255 的(当然啦 8 位的取样采一定不会大于 255 的)。


 

 


20110630001610690.jpg 



图(9



20110630001626762.jpg 


图(10


7)完成数据输出后,还要做一些简单的处理。在每一行数据的前面加上“DB”。只有这样处理后,单片机的程式才能调用。可能大家又会问,这 7000 多行我一行一行要加到何 时啊,大家不要急,开始时我就是这样一行一行处理的,共花了几个钟的时间才加好,但到了后来我想到一个好办法。下面我就教大家这个好办法。


8)大家先打开微软的 EXCEL,将你输出的数据文件中的数据部份复制到 ECCEL  中,将数 据的头部删去,注意是复制到第二列,如图(11)所示。


 


20110630001655397.jpg 



图(11


9)完成上面的工作后,再利用 EXCEL  的特殊复制功能(这个功能是这样的,你先在第 一行输入“DB”,再选取这一个栏,接着按着 CTRL 键,再点选这一栏进行拖动,一直拖 到再后一行,就可以了),在第一列复制出一列的“DB”,如图(12 所示)


 


 


20110630001718920.jpg


图(12


10)完成加“DB”的工作后,就可以把这些处理好的数据复制到单片机的程式中了,结 果如前面程式中所示。好了,到了这一步,所有的工作就算已经完成了,大家接着好做的工作就是编绎程式,写入到单片机中,再插入到线路板,加上电源就可以工作。爽吧!


文章评论3条评论)

登录后参与讨论

512826028 2011-6-30 00:20

现在把图片给添加上了。 文章的源出处: http://xky19870905.blog.163.com/blog/static/5185541720102172436122/

512826028 2011-6-30 00:07

不好意思,这篇文章是转载的,图片被封了。

用户1092539 2011-4-24 16:52

??请问图片怎么看不到?
相关推荐阅读
512826028 2015-09-07 00:32
Discuz论坛插件开发资料留存区
这部分就是我用过的资料网站资源等等的汇总。   第一个插件开发 新手教程 http://www.cnblogs.com/upmyself/archive/2013/01/16/286339...
512826028 2015-09-06 21:39
学习Discuz论坛插件开发二
    使用filezille对指定的config文件修改之后,就在discuz论坛后台的插件里面看到了多了一项,就是我需要的 插件开发一项。点进去之后,系统会自动提示此功能仅限开发者使用。 ...
512826028 2015-09-06 20:53
学习Discuz论坛插件开发一
     接触Discuz论坛有几个月的时间了,最近感觉里面的插件很是让我激动,于是,鼓起勇气,开始学习一下怎么自己开发一下插件。       首先接触插件学习,看的是Discuz论坛提供的插...
512826028 2015-09-06 20:27
正式开始蓝线技术,自己重新写博客
        由于CSDN博客很久没有使用,结果给我封了。就暂时把网络部分写这里了。后期会有单片机和蓝牙部分,以后也发表到这个板块里面了。   给自己打打气,加油!      至于啥...
512826028 2012-08-12 11:03
POV LED(我的新版旋转灯)二
  视频的播放地址 http://v.youku.com/v_show/id_XNDM4MTYyMjIw.html   2.       程序编写         首先,我还是想的...
512826028 2012-08-12 10:46
POV LED(我的新版旋转灯)三
由于我没有画电路图。所以,也没有什么电路图给大家看。电路很简单。LED电路使用共阳接法,串接的是330欧姆的电阻。电阻和LED的型号都是0805. 从最外圈向里数,依次是一个绿色LED灯(接P6口),...
我要评论
3
13
关闭 站长推荐上一条 /2 下一条