《家庭语音控制系统》毕业设计报告
姓名:
学校:柳州职业技术学院 学号: 年级:2010级
班级:2010级应用电子技术班
前言
什么才是让生活更“方便”。方便,是动一动拇指来操控一些家中的控制程序?方便,是看一看监控视频来知晓家中的一切?方便,是...。到底怎么样的“方便”才可以回答生活上的方便。以上提到的“方便”确实能够满足我们生活上的方便,但是只有这些“方便”是美中不足的,要尽可能的增加更多“方便”在我们的生活中,那样才可以真正的做到方便我们的生活,才是真正意义上的“智能生活”。 想过没有,一句话的事儿。用说“一句话”去命令和操控家中的智能家居控制系统。放眼整个软件行业,不论是苹果手机、苹果电脑,还是百度输入法、腾讯的微信、米聊、UC的浏览器以及新浪的微博等等一些应用程序,都已经成为当下很多人以此取代传统短信进行交流的必备工具,这些软件在手机终端上面都有语音控制的功能。简单说,就是“一句话”的事儿就可以控制和操作一些程序和系统。如:在苹果手机上面,打开语音控制键后,说出你想要的功能或软件的名字,系统就会自动的将您需要的程序调出来,不用再在繁多的应用程序中,辛苦的找寻自己想要用的程序了。又如:百度输入法中,也有一个语音控制功能,只需按下那个“麦克风”似的按键,说出你想打出的字、词或句,该输入法就可以将说的内容以文字的形式出现在打字的框框中,省去了一个一个字母打字的麻烦,也节省了不少的时间。甚至,语音还控制了手机中的照相系统,一句“拍”,照相机就开始启动照相了,是不是有点不可思议,但是现在的实际情况,这个是真实存在的,而且,的确是十分方便易用的。以上提及的这些都是用“语音”控制的,当然这些只是小编简单阐述的一部分。当然,还有很多的这样的例子,在这里就不一一介绍了。市场上,各大厂商应广大消费者的需求以及人性化的设计理念,各大IT巨头都在“智能语音”市场上积极的布局、创新以及设计研发更多的语音智能化产品,只有这样的创新开发,才有可能让企业和产品“永葆青春”。
所以我想在家庭电器控制方面进行设计,满足社会越来越需要方便的生活,简单而且实用,应用范围也广,我们都有过深心体验,在家里,开灯往往是件麻烦事,在漆黑的晚上,到处在找电灯的开关而烦恼,小孩子想开灯但是又够不着开关而烦恼,当独自一人在家没人陪而烦恼,为想睡懒觉不想起床拉开窗帘而烦恼等等的这些都可以通过语音来控制,也就是简单的一句话,她就可以为您服务,简单的一句话,就可以为您带来无限的乐趣,简单的一句话,就可以帮你哄孩子睡觉,简单的一句话,就可以给小孩子讲故事等等。语音控制真的毫无疑问在未来社会发展中,将会从手动遥控的打开方式转变为靠说就可以的形式,所以我就设计了一款家庭语音控制系统。
目录
家庭语音控制系统的简介---------------------------------------------------------------------4 家庭语音控制系统的组成模块---------------------------------------------------------------4 语音控制系统的各大模块的功能和介绍---------------------------------------------------4 语音采集模块功能------------------------------------------------------------------------------4 【1】 口令检测模式:------------------------------------------------5 【0】 普通检测模式:------------------------------------------------5 麦克风的设置:------------------------------------------------------5 语音模块的常遇问题和解决方法----------------------------------------6 常遇问题:----------------------------------------------------------6 单片机如何发送ASR指令的---------------------------------------------7 小兰我为其设置的指令程序--------------------------------------------7 单片机温度采集显示模块---------------------------------------------------------------------9 中央总处理单片机------------------------------------------------------------------------------9 电压功率显示模块----------------------------------------------------10 A. 功能-------------------------------------------------------------------------------------------10 B. 外形圖,按键功能說明-------------------------------------------------------------------10 按键盘/ LCD功能說明------------------------------------------------11 C.功能設定--------------------------------------------------------------------------------------11 D.功能及显示-----------------------------------------------------------------------------------12 参数------------------------------------------------------------------------------------------------12 电流---------------------------------------------------------------13 电量---------------------------------------------------------------13 功率---------------------------------------------------------------14 时间---------------------------------------------------------------14 E.注意事项---------------------------------------------------------14 F.规格参数---------------------------------------------------------------------------------------14 单片机电压测量显示模块---------------------------------------------------------------------15 家庭250v10A控制继电器模块 8位-------------------------------------------------------16 Mp3播放器模块--------------------------------------------------------------------------------16 模块特点-----------------------------------------------------------------------------------16 面板按键说明-----------------------------------------------------------------------------17 遥控按键说明------------------------------------------------------------------------------------17 电源供电模块------------------------------------------------------------------------------------18 按键模块------------------------------------------------------------------------------------------18
家庭语音控制系统整体介绍------------------------------------------------------------------18 制作过程-----------------------------------------------------------------------------------------18- 总结------------------------------------------------------------------------------------------------19 温度检测显示程序------------------------------------------------------------------------------20 中央处理程序--------------------------------------------------------30
正文
一、 家庭语音控制系统的简介 我把它命名叫做小兰,她是一个语气平和的女士的声音,她没有设置特定语音识别的特性,什么人都是可以唤醒她的,所以她无论是主人还是客人,都可以唤醒她,这样就免去为特定人而设计特定的语音识别程序了,可以说她是一个大众化得语音识别系统,但是因为其在语音采集模块中是需要标准的普通话识别的,所以说她也是一个可以训练普通话的好帮手,她的工作方式是将声音转化成单片机可以识别的数字信号的,在唤醒她时是需要叫她兰的,比如“兰开灯”她将会回答你“好的,主人小兰马上为您开灯”并作出反应打开电灯。 二、 家庭语音控制系统的组成模块
我设计的家庭语音控制系统,可以分为以下模块: 1、 语音采集模块
2、 单片机温度采集显示模块 3、 中央总处理单片机 4、 电压功率显示模块
5、 单片机电压测量显示模块
6、 家庭250v10A控制继电器模块 8位 7、 Mp3播放器模块 8、 电源供电模块 9、 按键模块
三、 语音控制系统的各大模块的功能和介绍 (一) 语音采集模块功能
1、 所采用的单片机是STC11L16XE,这是一种高速单片机,内部已经写入了
语音的识别采集程序,模块需要通过usb转换模块进行转换,就可以和电脑在线实时通信,方便写入主要的控制程序。 2、 下面试语音控制模块的关键控制程序及使用说明:
【00】:关键词所在的行,模块最多只能存入50行,取值范围:00-49,每条关键词占一行,不能重叠。
【bei jing】:需要识别的词语或者句子,文字的拼音用空格键隔开。
【001】:对应SD卡中语音文件的名称,同时也是串口输出的返回值,取值范围:001-254(十进制)。 【指令的功能】:
识别到人讲“北京”两个字时,播放SD卡中以“0001.AD4”命名的语音文件,同时从串口输出数据“1”,用单片机等可编程器件处理此数据便能做成语音控制系统。 【举例】:
识别到人讲“开灯”两个字时,播放SD卡中以“0026.AD4”命名的语音文件,同时从
串口输出数据“26”(“26”也就是16进制的“1A”),此命令应该这样写:00,kai deng,026,$
erase$ 此程序为语音模块的擦除程序,可以擦除所有已经写入的控制识别程序,但是这个程序一旦写入,所有程序就要从新写入。
enrst,1,$ 值为“1”时,每次向模块发送命令后模块自动重启,命令立即生效。 值为“0”时, 需手动复位模块后命令才生效。 【9600】模块波特率。
模块支持1200,2400,4800,7200,9600,14400,19200,38400,57600,115200Baud共10种波特率,发货时默认为9600Baud,客户可以根据自己的实际情况更改。 注意:波特率更改后立即生效,重新选择波特率后才能再次发送和接收命令。我们现在使用的是9600的波特率。 Start,FF,End,EE,Enable,0,$
【FF】指令的开始标志,用户可任意设置。 【EE】指令的结束标志,用户可任意设置。 【1】命令使能。
【命令使能位为“1”时,串口输出格式如下】: 例:设置关键词发送指令:00,beijing,219,$
识别到“北京”之后,串口输出的数据为:“FF 21 09 2A EE”,其中“FF”和“EE”分别为开始标志和结束标志,“21”是指令返回值的十位和百位(十六进制数),“09”是返回值的个位(十六进制数),“2A”是21+09的和(十六进制数)。如果接收端接收到的数据不符合这个加法运算,说明数据传输过程中出错,接收端可通过发送“重发上一次识别结果”指令“ReSend$”通知模块再重新发送一次,这样可以有效避免传输出错。
【命令使能位为“1”时,串口输出格式如下】: 直接输出指令的返回值对应的十六进制数。 例如,设置关键词发送指令:00,beijing,219,$
识别到“北京”之后,串口直接输出指令返回值“219”的十六进制数:“DB”。 【1】口令检测模式:设置一个关键词,然后将返回值设置成254,这个关键词将作为进入其他关键词识别的入口,这个关键词我们称为“口令”。在没有识别到口令之前,其他所有的关键词都无法识别。在识别到口令之后,必须在8秒钟之内说出要识别的关键词,否者又要重新讲口令之后方可识别。这种方式可以有效的降低误识别率。识别到口令之后,模块首先会播放SD卡中以“0254.AD4”命名的音频文件,播放完毕后再通过串口自动发送“FF AA AA EE”。建议“0254.AD4”作为提示音,例如“提示:请在8秒钟之内确认!”串口返回的“FF AA AA EE”则可作为设备端的准备信号。
【0】普通检测模式:不需要口令所有的关键词都可以随时被识别。 麦克风的设置:
【078】:可理解为麦克风输入信号的摄取量,此值不宜过高,否者会导致信号输入载波,无法检测语音。取值范围:000-127
【08】:可理解为麦克风输入信号的放大系数,值为00时放大能力最好,值为79时放大能力最差。取值范围:00-79
【1】:此值为“0”时,语音播放过程中不允许检测。此值为“1”时,播放语音的过程中允许检测。取值范围:0-1
小提示:
如果发现麦克风检测不到语音时,请用此命令的默认值设置后再试试。因为每个麦克风的造工都不同,所以每更换一个外置麦克风都需要重新设置这两个参数(当然,没插入外置麦克风的时候事实上设置的就是内置麦克风的参数),请细心调节这两个数值,直到检测距离最远抗环境噪声能力最好为止。 ReSend$
重新返回上次输出的结果。在单片机系统应用中,如果数据传输出错,发送此指令给模块可重新获取上一次识别结果。
模块支持1200,2400,4800,7200,9600,14400,19200,38400,57600,115200Baud共10种波特率,发货时默认为9600Baud,客户可以根据自己的实际情况更改。 注意:波特率更改后立即生效,重新选择波特率后才能再次发送和接收命令。 SD_INI,0000,$
SD_INI,0000,$命令主要用于设置SD卡的初始化等待时间,如果发现模块播放不了语音文件就要好好利用此命令。
【0000】:SD卡初始化等待时间,单位为毫秒。0000指0毫秒。
注意:一般情况下0000就能正常读卡。如果发现不能读卡,请将此值设置0550以上,值为0900时还是读不了卡那就基本没希望了,换卡吧!卡的容量需要1GB以下,SD卡使用前要事先格式化为FAT格式,卡内只能存放AD4格式的音频文件,其他无用的文件请移除。
以上就是语音控制模块的主要程序控制,内部的主程序我们是无法知道的,这毕竟是生产厂家的商业秘密的。
3、 语音模块的常遇问题和解决方法 常遇问题:
1.问什么ASR设置器.exe界面突然不显示返回值了?
2.为什么我和别人谈话模块也识别到了?误识别率很高? 3.为什么我不讲话也被识别到了?
4.为什么发送命令总会显示一部分乱码? 5.为什么语音播放一段后自动停止了? 6.为什么播放不了SD卡中的音频文件? 7.我把返回值设置成255,为什么模块识别到之后不返回255也不播放SD卡中的音频文件,似乎不做任何动作。 8.为什么插入耳机的音量很小? 9.为什么我没讲话指示灯也会闪烁?
11.在极少数情况下观察到指示灯不停的快闪,一阵子又不闪了。 12.为什么模块不接收指令了? 解决方法:
1问:问什么ASR设置器.exe界面突然不显示返回值了? 发送命令也无返回提示了,是不是模块有问题?
答:1.请把ASR设置器.exe软件关掉,再把USB设置器从USB 口拔出,然后重新插入USB设置器,再打开ASR设置 器.exe软件,一般情况下就恢复正常了,是电脑串口 出现异常所致,非模块有问题。
2.可以尝试更简单的方法,点击ASR设置器.exe软件正上 放“关闭”按钮,点击之后按钮旁边的红色方块会变成 蓝色,然后再点击“打开”,如无意外这样就恢复正常 了。不行的话再按照第一种方法去做。
2问:为什么我和别人谈话模块也识别到了?误识别率很高。 答:可以设置“垃圾管关键词”吸收掉错误的发音,尽量消除
误识别。详情请看《如何提高模块的识别率.pdf》第1条。 3问:为什么我不讲话也被识别到了?
答:播放SD卡中的音频文件的同时,模块又重新检测到了那个 关键词,所以又重复播放,然后又检测到了,不断循环。 解决办法:点击右下角“麦克风灵敏度计增益设置、语音 播放时是否允许检测”这条指令,将指令修改成
mic_vol,078,vag,08,bnv,0,$ ,注意1改成0了,意思就 是播放SD卡中的语音文件时不允许检测。这样就OK了。
4问:为什么波特率较低时,ASR设置器.exe界面显示的中文很多乱码? 答:因为计算机软件在分析简体中文编码时是以串口接收到的两个数字之间的时间作为限定的,中文简体编码是2个8位二进制数据组成,必须在规定的时间之内把这两个8位的二进制数传送到电脑上电脑才能识别出来这是个中文。如果波特率太低的话,传送数据的速度太慢,所以电脑分辨不出来,然后就造成了显示乱码。事实上,ASR M08-A模块从串口输出的数据是绝对100%正确的,大家无需担心,有时候清空一次再发送就能显示出来了。显示只是个提示其实如果命令发送成功了就行了,不用管接收区的提示乱码问题。那是电脑的处理上的问题,和模块无关,波特率越大出现乱码的机率就越小。 5问:为什么语音播放一段后自动停止了?
答:电池没电了,更换电池。建议把电池盒的电源线剪 断,然后接入5V电压供电。记住红线为正极,黑线 为负极,千万别接错,否者会烧毁模块。 6问:为什么播放不了SD卡中的音频文件?
1.首先检查音频文件的格式是否是AD4格式,并且文件 名为0001.AD4~0255.AD4,超出0255.AD4将读不了。 2.检查音频文件转换时的采样率是否与源文件一致(例如讯飞语音生成的音频文件就是16000采样率的,所以在转换成AD4音频文件时也要选择16000采样 率。) 3.可能是SD卡质量上的问题,部分山寨卡是读不了的。可以尝试发送“SD卡设置”命令把SD卡初始化等待 时间设置大一点看看是否能解决,如果不行请换卡。(如:发送指令SD_INI,0650,$)
4.SD卡的容量必须小于或者等于1GB,SD卡的格式要格式化为FAT格式,卡内不能存放除了AD4文件之外的其他无用文件。 问:我把返回值设置成255,为什么模块识别到之后不返回255也不播放SD卡中的音频文件,似乎不做任何动作。
答:255是本模块设定的一个特殊值,用来吸收垃圾关键词的,请看《如何提高模块的识别率.pdf》。
问:为什么插入耳机的音量很小? 答:LINE OUT接口是音箱输出接口,必须接到带有功放电路的音箱上才能听到声音。注意:LINE OUT并不是耳机接 口,请别误解。
问:为什么我没讲话指示灯也会闪烁? 答:人没讲话模块也会采集环境声音,一段时间后模块会对采集到的声音做处理,指示灯闪烁表示模块在忙,属于正常现象。
问:在极少数情况下观察到指示灯不停的快闪,一阵子又不闪了。 答:这现象是处理器内部发生错乱,多数是电源干扰太大造成建议更换一个质量好的电源。模块内部有监控程序,一旦处理器内部出现错乱模块会自动重启,无需担心。
问:为什么模块不接收指令了? 答:①请确定你已经从电源输入端输入了5V-8V(500MA以上供电能力)的直流电。 ②请把模块上的开关打到右边,让模块工作在循环检测模式或者口令检测模式,同时按一下模块上的按钮。模块休眠的时候是无法接收指令的。 4、 单片机如何发送ASR指令的
ASR MO8-A非特定人语识别模块支持有格式的ASR指令,指令均由ASCLL码组成,下面举一例说明如果通过单片机发送ASR指令。 例如播放第一个语音的指令:play,001,$ 其对应的ASCLL码的十六进制数如下:
P—0x70
l—0x6c a—0x61 y—0x79 ,--0x2c 0—0x30 0—0x30 1—0x31 ,--0x2c $--0x24
那么,我们通过串口发送指令的ASCLL码对应的十六进制数就相当于发送了那条指令了,例如单片机发送play,001,$和发送70 6c 61 79 2c 30 31 2c 24是等效的(先发70,最后发24,按照顺序来)。 5、 下面是小兰我为其设置的指令程序:
1. 00,lan zan ting,001,$ 2. 01,lan kai deng,002,$ 3. 02,lan guan deng,003,$ 4. 03,lan kai dian nao,004,$ 5. 04,lan guan dian nao,005,$ 6. 05,lan kai dian shi ji,006,$ 7. 06,lan guan dian shi ji,007,$
8. 07,lan kai tou ying yi,008,$ 9. 08,lan guan tou ying yi,009,$
10.09,lan la kai chuang lian,010$ 11.10,lan guan bi chuang lian,011,$ 12.11,lan kai feng shan,012,$ 13.12,lan guan feng shan,013,$ 14.13,lan kai kong tiao,014,$ 15.14,lan guan kong tiao,015,$ 16.15,lan kai yin yue,016,$ 17.16,lan guan yin yue,017,$
下面的都是超值的设置的了,这里就不必展示。语音模块的外观就在后面附图1 (二)单片机温度采集显示模块
我采用的温度采集显示模块是STCAT89C52的单片机来作为主控制的,负责采集温度的是温度检测管DS18B20,它的外包装和三极管很相像,(其外观及引脚如后附图2示),其数据返回教接的是单片机的P3-5,显示的是8*8的led点阵显示屏,因为点阵显示需要的单片机的控制端口是P0和P2口,还有七内部程序已经使用的中断计时器,所以很难在加如其他的外部程序进去,所以温度显示模块可以说是独立的,只负责检测和显示温度,它与主控制单片机没有通信的来往 其控制程序在后附。(点阵显示如后示图3) (三)中央总处理单片机
我采用的中央总处理单片机也是STCAT89C52单片机,其主要负责的是与语音模块进行通信,按键输入控制,控制8位继电器的工作,如下示意图
语音模块 STCAT89C52 中央处理 外置的单片机供电独立检测显示2位数码管 按键模块8键控制四路开与关 8位继电器控制
控制程序如后附图
(四)电压功率显示模块 下面是模块的资料 产品型号: PZEM-002(V2.0)
A.功能
1.电参数测量功能(电压、电流、有功功率、电能)。 2.运行时间功能(记录负载累积工作时间)。 3.超载报警功能(超过功率报警门限背光闪烁报警)。 4.功率报警门限预置功能(可自行设置功率报警门限)。 5.电量、运行时间按键清零功能。 6.带背光功能。
7.掉电数据保存功能(保存掉电前累计电量、运行时间、显示项、背光亮灭状态)。 8.大屏幕LCD显示功能(显示电压、电流、电能、有功功率、累积运行时间) B.外形圖,按键功能說明
图1 平面示意图 按键盘/ LCD功能說明 按 键 功能描述 1.正常显示状态下短按逆序循环显示时间、功率、电量、电流、电压。 上翻 2.在功率报警门限设置状态下短按则数位加1。 3..在电量和时间清零状态下短按则退出清零状态。 1.正常显示状态下短按顺序循环显示电压、电流、电量、功率、时间。 下翻 2.在功率报警门限设置状态下短按则数位减1。 3..在电量和时间清零状态下短按则退出清零状态。 1.在功率显示状态下长按3秒进入功率报警门限设置状态。 设置 2.在电量或时间显示状态下长按3秒进入电量或时间清零状态。 1.在正常显示状态下短按打开或关闭背光。 确认 2.在功率报警门限设置状态下短按切换设置数位。 3.在电量或时间清零状态下短按清零电量或时间并退出清零状态。 C.功能設定
一.功率过载门限设置
1.正常显示状态下按“上翻”或“下翻”键切换到功率显示菜单。 2.长按“设置”键大约3秒屏幕出现闪动,然后松开按键。
3.默认左边第一个数位(即千位)闪烁,通过短按“上翻”或“下翻”键改变此数字( 用“下翻”键为数据递减,用“上翻”键为数据递增键), 短按“确认”键确认完成此数位后进入下一个数字的设置; 依次从左到右为千位→百位→十位→个位, 个位设置完成后按“确认”键完成过载门限设置,LCD屏返回“功率”显示项。
4. 过载门限值最大功率为9999W, 如果设置的过载门限值超出此极限值LCD屏会显示“Err”字样提示 ,持续3秒后返回过载设置界面重新开始设置。 二.累计时间、电量清零设置
1.正常显示状态下按“上翻”或“下翻”键切换到累计时间或电量显示菜单。 2.长按“设置”键大约3秒屏幕出现闪动,然后松开按键。
3.短按“确认”键, 累计时间或电量数据被清零, LCD屏即返回累计时间或电量显示项,若不想清零,则短按“上翻”或“下翻”键退出清零状态返回菜单显示。 D.功能及显示 一.背光功能
1. 上电后背光自动点亮,正常显示状态短按“确认”键点亮或关闭背光。背光亮灭状态具有记忆功能,即重新上电后要恢复掉电前的亮灭状态
2.当负载功率大于设定的过载功率门限值时,背光闪烁报警;当功率值小于过载功率门限值时,背光停止闪烁并恢复之前背光亮灭状态。 二.菜单显示
1.上电后默认显示功率,短按“上翻”键逆序循环显示时间、功率、电量、电流、电压;短按“下翻”键则顺序循环显示电压、电流、电量、功率、时间。 2.当负载功率大于报警门限,不管当前是哪个参数显示状态都会立即返回功率显示菜单并闪烁报警。
3.菜单显示具有记忆功能,即重新上电后要恢复掉电前的显示项。
三.参数 1.电压
计量并显示当前电源电压,计量范围80~264VAC,数据显示格式80.00~264.00,如图2所示:
图2 电压显示示意图 2.电流
计量并显示当前负载电流,计量范围0~40A,数据显示格式0.00~40.00,如图3所示:
图3 电流显示示意图 3.电量
计量并显示当前累计电量,计量范围0~9999.99kWh,数据显示格式0.00~
9999.99,如图4所示: 图4 电量显示示意图
4.功率
计量并显示当前负载功率,计量范围0~9000W,数据显示格式0.0~9000.0,如图5所示:
图5 功率显示示意图 5.时间
显示当前负载累计运行时间,计量范围0~9999:59小时,数据显示格式0:00~9999:59,如图6所示:
图6 时间显示示意图 E.注意事项
1.本模块适用于户内,不能户外使用。 2.所加负载不能超过额定功率。 3.接线顺序不能搞错。 F.规格参数
1.工作电压:80~270VAC
2.测试电压:80~270VAC 2.额定功率:30A/6600W 3.工作频率:45-65Hz 4.计量精度:1.0级
此模块主要是检测市电输入电压及功率不过模块电压检测偏大8v其他的测量没有错。
(五)单片机电压测量显示模块
下面是模块的资料
本电压表采用0.36英寸数码管拥有超小体积,面积仅与一枚硬币相仿,采用全自动SMD工艺制造,工艺精湛;电压显示精准,显示和测量效果打败一般的数字表头。电源与测量输入合二为一,仅有两根接线,方便连接。工作电压范围(即量程)宽,可工作于直流DC3.2-30V范围。可为汽车/电瓶车/摩托车使用,可用于各种电压测量用途。方便接入线路,用于监视电瓶电压,及时掌握电瓶状态,也可用于其它电压测量用途。
本电压表基本性能参数如下:
外形尺寸:29x15x9mm(长*宽*高)下面为图示:
量程:DC3.2-30V两线接入
显示:三位0.36″LED数码管
显示颜色:红色/蓝色/绿色/三色可选刷新速度:约500mS/次
测量精度:1%(+/-1个字)
供电电源:DC3.2-30V(无需电源,直接使用受测电压作为电源)
工作温度:-10℃~65℃ 此模块主要是实时检测单片机及语音模块的电压。
(六)家庭250v10A控制继电器模块 8位
示意图附后图
此模块每位继电器主要是靠单片机的低电位有效,单片机控制端口是P1端口,分别是P1^0,P1^1,P1^2,P1^3,P1^4,P1^5,P1^6,P1^7.继电器的每一位的控制250v接线端口有三个接口,中间位公共接线,一组位常开,一组位常闭,当单片机控制引脚为低电位时,常开吸和为常闭,常闭反之,继电器的耐压值是250v,额定电流为10A,总的功率可以达到2500w,完全可以胜任家用电器的使用功率,当然除了大功率的功率大于2500w的电器也可以使用大功率的继电器来控制,还有系统中另外多置了一个4位继电器控制,可以做为增加控制端口,根据客户需要增加。
(七)Mp3播放器模块 下面是Mp3播放器模块的资料 一、模块特点:
支持外信号直接切换。
支持USB/SD/AUX/FM自动切换。 模块内含MP3歌曲解码芯片。
支持USB,SD、MMC卡进行播放。
支持USB/SD卡切换、上一曲、下一曲、音量调节、EQ、播放/暂停、停止、单曲重复、静音、关机、直选歌曲。 支持FAT16、FAT32的文件系统。
支持MP1 Layer3、MP2 Layer3、MP3 Layer3版本的歌曲。 支持32-320kbps的MP3歌曲。
支持断电记忆功能:记忆断电前播放的歌曲和音量。 支持日期、时间显示,歌词同步。 二、面板按键说明
1、“POWER”:长按此键进入待机省电模式;再长按此键开机。 2、“SET”:设置时间键,TIME→ALARM→SLEEP→language→完成。 3、“VOL-”:设置音量减;设置时间、闹铃、定时关机减。 4、“VOL+”:设置音量加;设置时间、闹铃、定时关机加。
5、“PLAY/PAUSE”:在USB/SD状态短按播放/暂停;在FM状态短按全频道搜台并存台。
6、“MODE”:有SD卡和U盘时:切换顺序为USB→SD→AUX→FM→USB;只有U盘时:切换顺序为USB→AUX→FM→USB;只有SD卡时:切换顺序为SD→AUX→FM→SD;在待机下按一下背光亮。
7、“PREV”:在USB/SD状态短按上一曲;在FM状态短按上一电台;设置时间、闹铃、定时关机的位。
8、“NEXT”:在USB/SD状态短按下一曲;在FM状态短按下一电台;设置时间、闹铃、定时关机的位。 三、遥控按键说明
1、POWER:待机(STANDBY)此键不能开关。
2、MODE:有SD卡和U盘时:切换顺序为USB→SD→AUX→FM→USB;只有U盘时:切换顺序为USB→AUX→FM→USB;只有SD卡时:切换顺序为SD→AUX→FM→SD。 3、PREV:同面板按键。 4、NEXT:同面板按键。 5、VOL+:同面板按键。 6、VOL-:同面板按键。
7、REP: USB/SD播放时单曲重复和全部循环之间的切换键,开机为全部循环。 8、“SET”:设置时间键,TIME→ALARM→SLEEP→language→完成。(原SOTP的位置)
9、MUTE:静音键,按一下静音,再按一下解除。
10、EQ:声场模式. NORMAL→JAZZ→ROCK→POP→CLASSIC→NORMAL 11、PLAY/PAUSE:在USB/SD状态播放/暂停;在FM状态全频道搜台并存台。 12、0~9:在USB/SD做直选键,超过10首连续输入要选的数字即可。 其中Mp3播放器模块的控制端口是单片机的P1^7脚,低电位为开启,高电位为关闭,还有Mp3播放器模块的按键控制只有面板控制和遥控控制,中央处理只负责开断。
(八)电源供电模块
电源供电模块主要分为三个电源,1、温度检测显示模块供电模块。2、中央处理单片机供电。3、mp3解码模块供电模块。
1、温度检测显示模块供电模块。电源供电是4.5v小型开关电源,额定电流
为1000毫安,主要是为温度检测显示模块进行供电。因为点阵显示需要的电流较大。
2、中央处理单片机供电模块。电源供电是4.6-5v小型开关电源,额定电流
是500毫安。
3、mp3解码模块供电模块。电源供电是额定5v,采用的是三星原装800毫
安的直接变压器型电源,因为mp3自带有小功放模块,所以需要的电压和电流叫苛刻。
还有就是电源供电是不受中央处理单片机的控制的。也是独立的。
(九)按键模块
按键由于系统面板空间有限,所以只做了8个按键,按键的主要功能是控制4位继电器的工作,列入第一位主要是电灯,当客户不想说话,或者不会普通话又或者生病了,说话不清时就可以使用按键来控制了,避免了特殊情况下的尴尬。其中按键的从右到左的顺序,第一个按键是电灯开,第二按键为关灯,第三按键为开电脑,第四为关电脑,第五按键为开电视机,第六按键为关电视机,第七按键为开音乐,第八按键为关音乐。
(十)家庭语音控制系统整体介绍
这个系统是我独自一个人完成的,包括硬件,软件,外包装,首先我先介绍下我制作的全过程: 制作过程: 1、寻找材料。
需要寻找的材料分别是:盒子、单片机、点阵8*8、电源变压器、继电器、 电压测量模块、mp3解码模块、连接线、语音模块(可以与单片机通信的)、 黑色喷漆、喇叭、螺丝钉。
其中盒子,电源变压器可以在柳州二手市场购买到。 其余的原件模块是通过网上淘宝网购买到。 2、制作方法
首先是寻找一个适合的盒子来安放全部的器件,我是到柳州航银路二手市场
购买了一个宽15厘米,长23厘米的36格的电子元件盒子,首先把盒子的内部的分隔片全部取出,把多余的塑料用小刀一点一点的割掉,把原件和模块按照预定的空间摆放好,用油性笔画好区域,或用小刀刮出区域,定位好螺丝位,其中表面模板用小刀一点点割出来,螺丝定位用电钻打孔还有按键也是电钻打孔。
然后给盒子喷漆,晒干。
接下来就是安装各个模块,连接好连接线。 3,测试
测试是逐级测试,先从电源部分开始,接好先,接入220v市电,用万用表测量三个电源的输出电压是否有,然后接各个模块,看各模块指示灯是否亮。
4、设计软件
主要是针对单片机的,就是温度检测显示模块和中央处理的。软件设计先是从温度检测模块开始设计的,上网查找18b20温度检测管子的性能特点设计单片机程序的。一点点的修改最终成功为止。然后是设计中央处理单片机的程序,也是一个一个模块的测试添加程序的。 5、最终做整体的测试其中发现以下特点
优点:温度检测显示模块运行良好,而且检测非常准确,检测范围大,mp3解码模块可以正常工作,音质也非常好,市电功率电压测量模块也非常准确, 语音测量模块也能正常工作,和单片机通信良好控制方便。单片机供电电压检测也显示准确。
缺点:语音模块需要的普通话要很标准才可以激发,容易出现误识别。还有其控制存在8s延时特点。说完话要等8s后才能做出反应,市电检测模块因为换了个无极电容所以测量电压时比正常值高8v,其他没有影响。 6、花费
以下是系统的物料及价格 盒子:38元
单片机:4元一片 两片 8元 连接线:杜邦线 共10元 点阵显示模块 20元
电压检测模块:单片机电压检测模块5元 市电检测模块 47元 Mp3解码播放模块:51元 语音模块:271元 继电器:共27元 按键:8元
电源:三个共15元 喷漆:8元 总价:509元
总结
首先先说说我为何会想到做这样一个系统吧,其实也是在一次安防系统课程中看到的,老师给我们看了一部关于未来安防系统的发展方向,其中就提到了家庭语音控制系统,但是那个系统是使用电脑实时控制的全智能型语音控制系统,
很高级,然后我回到宿舍就上网搜关于语音控制系统的资料,看了现代发展的趋势,目前市场上很少有这种系统,这应该是一个潜在的发展商机,所以我就想到了做一个家庭语音控制系统,其中在制作的过程中,我可以温习了数电,模电,硬件设计等等知识,从中也学到了很多的新知识,很多的东西都是一点点通过网上查找了解。通过这个系统的制作曾强了我的动手能力和思维能力,作为应用电子专业的学生,就应该不断的学习的知识,当今世界最发达的就是电子行业,变化最快的也是电子行业,电子在生活中占有的地位也越来越重要了,所以我们需要不断的进行创新,才能在未来的发展中生存。
以下就是系统的后附程序和图片了
温度检测显示程序:(大部分为网上寻找得)
#include #define BUSY1 (DQ1==0) sbit DQ1=P3^5; //定义busy信号 //定义18B20单总线引脚 void ds_reset_1(void); //声明18B20复位函数 //声明18B20写入函数 void wr_ds18_1(char dat); void time_delay(unsigned char time);//声明延时函数 int get_temp_1(void); //声明18B20读入温度函数 //声明延时函数 void delay111(unsigned int x); void read_ROM(void); //声明18B20读ROM函数 //声明获取温度函数 //声明18B20初始化函数 //声明18B20获得温度显示值函数 int get_temp_d(void); void ds_init(void); void ds_getT(void); /****************以下定义各种变量********************/ unsigned char ResultSignal; int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH; unsigned char ROM[8]; unsigned char idata TMP; unsigned char idata TMP_d; unsigned char f; unsigned char rd_ds18_1(); unsigned int TemH,TemL; unsigned int count; //温度的整数部分和小数部分 //定义小数计算部分 //这里定义行扫描值,1-该行有效,0-该行无效 unsigned char code a[80]={0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,//00x20,0x60,0x20,0x20,0x20,0x20,0x20,0x20,10x60,0x90,0x10,0x10,0x20,0x40,0x80,0xF0,//20x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,//30x20,0x60,0xA0,0xA0,0xA0,0xF0,0x20,0x20,//40xF0,0x80,0x80,0xF0,0x10,0x10,0x90,0x60,//50x60,0x90,0x80,0xE0,0x90,0x90,0x90,0x60,//60xF0,0x10,0x10,0x20,0x40,0x40,0x40,0x40,//70x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,//80x60,0x90,0x90,0x90,0x70,0x10,0x10,0xE0//9};/* //打开本定义为显示笑脸(默认打开),注意b数组不可以重复定义,打开一组,应该关闭前一组 unsigned char b[8]={0x04,0x62,0xa4,0xa0,0xa0,0xa4,0x62,0x04};*//**///打开本定义为显示旋涡unsigned char b[8]={0xff,0x01,0xfd,0x85,0xb5,0xbd,0x81,0xff}; void delay() {unsigned int c; c=100; //延时函数 while(c--){} } void main(void) { unsigned int i; //主函数 P0=0XFF; ds_init(); while(1) { ds_getT(); //使用该函数获得温度,整数部分存储到TemH,小数部分 //P0口各脚输出高电平,点阵不显示 //18B20初始化 存储到count的低8位 } void ds_init(void) { unsigned int k=0; ds_reset_1(); ds_reset_1(); //reset //skip rom } for(i=0;i<8;i++) //点阵8列动态扫描法显示,每次扫描一列并发送数据码 { } P0=a[8*(TemH/10%10)+i] | (a[8*(TemH%10)+i]>>4); P2=~(1<//扫描该列 //P0数据口 //延时 wr_ds18_1(0xcc); _nop_(); wr_ds18_1(0x7f); ds_reset_1(); wr_ds18_1(0xcc); } void ds_getT(void) { } void time_delay(unsigned char time) { } void ds_reset_1(void) { time=time-10; time=time/6; while(time!=0)time--; wr_ds18_1(0xcc); wr_ds18_1(0xbe); TemH=get_temp_1(); TemL=get_temp_d(); TemH&=0x00ff; TemL&=0x00ff; count=(TemH*256+TemL)*6.25; _nop_(); wr_ds18_1(0x44); for(k=0;k<11000;k++) time_delay(255); ds_reset_1(); unsigned char idata count=0; DQ1=0; time_delay(240); } void check_pre_1(void) { while(DQ1); while(~DQ1); time_delay(30); } void read_ROM(void) { } bit tmrbit_1(void) { idata char i=0; int n; ds_reset_1(); check_pre_1(); wr_ds18_1(0x33); for(n=0;n<8;n++){ROM[n]=rd_ds18_1();} time_delay(240); DQ1=1; return; bit dat; DQ1=0;_nop_(); DQ1=1; _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); dat = DQ1; time_delay(50); return dat; } unsigned char rd_ds18_1() { unsigned char idata i,j,dat=0; for(i=1;i<=8;i++) { j=tmrbit_1(); dat=(j<<(i-1))|dat; } return dat; } void wr_ds18_1(char dat) { signed char idata i=0; unsigned char idata j; bit testb; for(j=1;j<=8;j++) { testb=dat & 0x01; dat = dat>>1; if(testb) { DQ1=0; _nop_(); _nop_(); DQ1=1; time_delay(60); } else { DQ1=0; time_delay(50); DQ1=1; _nop_(); _nop_(); } } } int get_temp_1(void) { unsigned char idata a=0,b=0; unsigned char idata i; EA=0; ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0x44); while(BUSY1); ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0xbe); a=rd_ds18_1(); b=rd_ds18_1(); i=b; /*若b为1则为负温 */ i=(i>>4); if(i==0) { f=0; TMP=((a>>4)|(b<<4)); a=(a&0x0f); if (a>8) { } int get_temp_d(void) { unsigned char idata a=0,b=0; unsigned char idata i,m; EA=0; ds_reset_1();//复位 check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0x44); } else { } EA=1; return(TMP); f=1; a=a>>4; b=b<<4; TMP=(a|b); TMP=~TMP; TMP=(TMP+1); } TMP=(TMP+1); while(BUSY1); ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0xbe); a=rd_ds18_1(); b=rd_ds18_1(); i=b; /*若b为1则为负温 */ i=(i>>4); if(i==0) { f=0; TMP=((a>>4)|(b<<4)); a=(a&0x0f); TMP_d=a; } else { f=1; a=~a; a=(a+1); b=~b; b=(b+1); m=a; } EA=1; return(TMP_d); a=a>>4; b=b<<4; TMP=(a|b); m=(m&0x0f); TMP_d=m; }void delay111(unsigned int x) { unsigned int i; for(i=0;i #include #define kai 0; //串口接收到0时,P2.7输出0,开台灯 #define guan 1;//串口接收到1时,P2.7输出1,关台灯 unsigned char a; bit flag0=0,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0,flag6=0,flag7=0; void delay(x) { unsigned char i,z; for(i=0;i TMOD=0x20;//定时器1使用初值自动重装方式,方式2 TH1=0xfd; TL1=0xfd;//9600波特率初值 TR1=1;//允许定时器计数 SM0=0;//方式1设置 SM1=1; REN=1; //允许串口接收 EA=1; //开总中断 ES=1; //开串口中断 while(1) { if(a==1)//如果a=1,P1.7=0,继电器吸合,台灯打开 { } P1=0xff; //P1.7=0, //======================================================// if(a==2)//如果a=1,P1.7=0,继电器吸合,台灯打开 { } else if(a==3)//如果a=2,P1.7=1,继电器松开,台灯关闭 { } //=====================================================// else if(a==4) { } else if(a==5) { } JDQ2=guan;//如果a=4,第二路关 JDQ2=kai;//如果a=3,第二路开 JDQ=guan;//P1.7=1, JDQ=kai; //P1.7=0, else if(a==6) { } else if(a==7) { } //====================================================// else if(a==8) { } else if(a==9) { } //====================================================// else if(a==10) { } else if(a==11) { JDQ5=kai;//如果a=3,第五路开 JDQ4=guan;//如果a=4,第四路关 JDQ4=kai;//如果a=3,第四路开 JDQ3=guan;//如果a=4,第三路关 JDQ3=kai;//如果a=3,第三路开 } JDQ5=guan;//如果a=4,第五路关 //====================================================// else if(a==12) { } else if(a==13) { } //====================================================// else if(a==14) { } else if(a==15) { } //====================================================// else if(a==16) { JDQ8=kai;//如果a=3,第八路开 JDQ7=guan;//如果a=4,第七路关 JDQ7=kai;//如果a=3,第七路开 JDQ6=guan;//如果a=4,第六路关 JDQ6=kai;//如果a=3,第六路开 { } else if(a==17) { } if(P2_0==0&&flag0==0) JDQ8=guan;//如果a=4,第八路关 delay(5); if(P2_0==0&&flag0==0) { flag0=1; P1_0=0; } } if(P2_0==1) { delay(5); if(P2_0==1) { flag0=0; } } { if(P2_1==0&&flag1==0) delay(5); if(P2_1==0&&flag1==0) { flag1=1; P1_0=1; } } if(P2_1==1) { delay(5); if(P2_1==1) { flag1=0; } } { delay(5); if(P2_2==0&&flag2==0) { if(P2_2==0&&flag2==0) flag2=1; P1_1=0; } } if(P2_2==1) { delay(5); if(P2_2==1) { flag2=0; } } { if(P2_3==0&&flag3==0) delay(5); if(P2_3==0&&flag3==0) { flag3=1; P1_1=1; } } if(P2_3==1) { delay(5); if(P2_3==1) { flag3=0; } } { if(P2_4==0&&flag4==0) delay(5); if(P2_4==0&&flag4==0) { flag4=1; P1_2=0; } } if(P2_4==1) { delay(5); if(P2_4==1) { flag4=0; } if(P2_5==0&&flag5==0) } { delay(5); if(P2_5==0&&flag5==0) { flag5=1; P1_2=1; } } if(P2_5==1) { delay(5); if(P2_5==1) { flag5=0; } } if(P2_6==0&&flag6==0) { delay(5); if(P2_6==0&&flag6==0) { flag6=1; P1_7=0; } } if(P2_6==1) { delay(5); if(P2_6==1) { flag6=0; } } if(P2_7==0&&flag7==0) { delay(5); if(P2_7==0&&flag7==0) { flag7=1; P1_7=1; } } if(P2_7==1) { delay(5); if(P2_7==1) { flag7=0; } } } void serial() interrupt 4 //中断法 { } 以下为各个模块的图片介绍: if(RI==1)//如果是接收中断,进行下面工作 { } if(TI==1)//如果是发送中断,直接清零发送中断标志,不做任何工作 { } TI=0; //发送中断标志位清零 a=SBUF;//串口接收到到的数据存放到a中 RI=0;//接收中断标志位标志 else ; } 语音模块2、市电检测模块 3、mp3模块 4、温度检测显示模块 5、中央处理单片机 6、八为继电器 7、四位继电器 8、 mp3解码供电 9、 内部整体 10、 外部整体 11、语音模块的功能介绍 因篇幅问题不能全部显示,请点此查看更多更全内容