基于凌阳单片机的多路语音灯光控制内容摘要:

写 SPEC061A 有 32K字的内嵌入闪存( Flash存储器),这 32K字内存给划分为128个页,每个页的存储容量为 256字,第一页的范围为 0x800~0x80FF,最后一页的地址范围为 0XFF00~0XFFFF。 它们在 CPU空闲状态下均可通过编程被设置为只读或出 /写方式。 全部 32K字均可在 ICE工作方式下被编程写入或被擦除。 Flash存储器的控制端的地址为 0x7555( P_Flash_Ctrl = 0x7555; Flash存储器的匹配数据为 0Xaaaa(C_FLASH_MATCH = 0xAAAA); Flash存储器的页擦 除控制字为 0x5511( C_FLASH_PAGE_ERASE = 0x511); Flash存储器字的写入控制字为 0x5533( C_FLASH_1WORD_PGM = 0x5533); Flash存储器的顺序写入多字的控制字为 0x5544( C_FLASH_SEQUENT_PGM = 0x5544)。 ( 1) Flash存储器的页擦除的过程如图 11所示: 开始 P_Flash_Ctrl = C_FLASH_MATCH P_Flash_Ctrl = C_FLASH_PAGE_ERASE P_Flash_Ctrl = P_age_Address 延时 20ms 结束 图 11 Flash 页擦除流程 11 32KB的内嵌式闪存地址从 0x8000开始被划分为 128页(每页存储容量为256B) ,它们在 CPU正常运行 状态下均可通过程序擦除或写入。 全部 32KB闪存均可在 ICE工作方式下被编程写入或擦除。 擦除一页的流程是: 先给命令用户接口地址 0x7555里送 0xAAAA,然后给命令用户接口地址 0x7555里送 0x5511,在给要擦除页地址送任意数,约 20ms即可完成擦除操作,然后可以执行其他操作。 例如,擦除第六页( 0x8500~0x85FF)流程如下 :先向 0x7555送 0xAAAA;在向 0x7555送 0x5511;最后向 0x85XX至0Xxxxx 送任意数即可。 Flash存储器页擦除程序: =========================================================== //函数: F_FlashErase() //语法: void F_FlashErase(sector) //描述:擦除 256字节 //参数 : 擦除页的起始地址 //返回:无=========================================================== .PUBLIC _F_FlashErase _F_FlashErase: .proc push bp to [sp] bp = sp + 1 r1 = C_FLASH_MATCH //AAAA [P_Flash_Ctrl] = r1 r1 = C_FLASH_PAGE_ERASE //5511 [P_Flash_Ctrl] = r1 r1 = [bp+3] //擦除一页 [r1] = r1 pop bp from [sp] retf .ENDP 12 .END ( 2) Flash存储器的写入 一个 字的过程: 写入一个字的流程是:先给命令用户接口地址 0x7555里送 0xAAAA,然后给命令用户接口地 址 0x7555里送 0x5533,再给要写入地址送数据,约 40us即可写入操作,然后可以执行其他操作。 例如,向 0x8000写入 0xFFFF流程如下: 0x7555到 0xAAAA; 0x7555到 0x5333; 0x8000到 0Xffff。 程序流程图如图 12所示。 Flash存储器的写入字的程序:======================================================== 函数 : F_FlashWrite1Word() 语法 : void F_FlashWrite1Word(int addr,int Value) 描述:写一个字到 FLASH中 参数 : 被写数据的存储地址 P_Flash_Ctrl = C_FLASH_MATC 开始 P_Flash_Ctrl = C_FLASH_1WORD_PGM Data_Adress = Writed_Data 延时 40ms 结束 图 12 Flash 写入字流程 13 被写数据 返回:无=========================================================== .PUBLIC _F_FlashWrite1Word _F_FlashWrite1Word: .proc push bp to [sp] bp = sp+1 r1 = C_FLASH_MATCH //AAAA [P_Flash_Ctrl] = r1 r1 = C_FLASH_1WORD_PGM //5533 [P_Flash_Ctrl] = r1 r1 = [bp+3] //flash address r2 = [bp+4] //data [r1] = r2 pop bp from [sp] retf .ENDP ( 3) Flash存储器的顺序写入字: 在 Flash存储器按顺序写入多字的子程序中,当写入字结束时,需要写入一个数据(可为任意数)到 P_Flash_Ctrl寄存器当中,以结束当前多字节写入状态。 以上各子程序当中,延时由硬件完成,用户无需在软件当中做软件延时。 在没有写入 Flash存储器时,(如果 Flash存储器已经被擦除)读出 0xA000的数据是 0xFFFF,所以在开始时读出的数据是 0xFFFF。 写多个字节流程是:先给 命令用户接口地址 0x7555里送 0xAAAA,然后给命令用户接口地址 0x7555里送 0x5544,再给要写入字首地址送数据,约 40us即可完成 1个字节写入操作。 在给命令用户接口地址 0x7555里送 0x5544,给写入字节地址数据,等 40us即可,循环操作,即可完成多字的写入。 程序流程图如图 13所示。 14 Flash存储器的顺序写入字的程序: ============================================================ //函数 : F_FlashWrite() //语法 : F_FlashWrite(int sector,int amp。 num,int size) //描述 : 顺序写多个字 //参数 : 被写数据的起始地址 // 被写数据 // 写数据的数量 //返回 : 无 ============================================================ 开始 P_Flash_Ctrl = C_FLASH_MATC P_Flash_Ctrl = C_FLASH_SEQUENT_PGM Data_Adress = Writed_Data 延时 40ms 数据是否全部写入。 写结束控制字 结束 图 13 FLASH 存储器顺序写入多字 N Y 15 .PUBLIC _F_FlashWrite _F_FlashWrite: .proc push bp to [sp] bp = sp+1 r1 = [bp+3] //flash base address r2 = [bp+4] //data r3 = [bp+5] //多个字节 r4 = C_FLASH_MATCH //AAAA [P_Flash_Ctrl] = r4 L_FlashWriteLoop: r4 = C_FLASH_SEQUENT_PGM //5544 [P_Flash_Ctrl] = r4 r4 = [r2++] [r1++] = r4 r3 = 1 jnz L_FlashWriteLoop [P_Flash_Ctrl] = r3 //写结束 pop bp from [sp] retf .ENDP 语音训练模块 当程序检测到训练标志位 uiFlagFirst 为 1时 , 就会要求使用者对它进行训练操作, 训练采用两次训练获取结果的方式,以训练控制器的名称为例:控制器首先会提问 ” 给我取个名字吧 ” ,这是训练者告诉控制器一个名字。 让后就会提示“再说一遍”,这是再次告诉控制器的名字,如果两次输入的差别不大,控制器就能成功的建立模型,此时训练名字成功;如果没有成功建立模型,会提示你错误的原因,平要求重新训练。 一条训练命令成功训练后,会给出下一个要训练名称的提示。 可以根据相关的提示进行训练。 训练系程序流程如图 14 所示: 16 图 14 语音训练程序流程图 训练子程序: unsigned int TrainWord(unsigned int WordID,unsigned int SndIndex) { int Result。 PlaySnd(SndIndex)。 //引导训练,播放指令对应动作 while(1) { Result = BSR_Train(WordID,BSR_TRAIN_TWICE)。 //训练两次,获得训练结果 if(Result==0) break。 switch(Result) { 训练名称 开始训练 第一组 第二组 全亮 全灭 第一组名称 1 号灯亮 1 号灯灭 2 号灯亮 2 号灯灭 结束 第二组名称 3 号灯亮 3 号灯灭 4 号灯亮 4 号灯灭 17 case 1: //没有检测出声音 PlaySnd(S_NOVOICE)。 return 1。 case 2: //需要训练第二次 PlaySnd(S_AGAIN)。 break。 case 3: //环境太吵 PlaySnd(S_NOISY)。 return 3。 case 4: //数据库满 return 4。 case 5: //检测出声音不同 if(WordID == NAME_ID) PlaySnd(S_NAMEDIF)。 //两次输入名称不同 else PlaySnd(S_COMDIF)。 //两次输入命令不同 return 5。 case 6: //序号错误 return 6。 default: break。 } } return 0。 } 18 语音播放模块 在系统正常工作时,会根据语音输入的命令做出相应的应答,并执行相应的操作,去控制其中 一路灯光的打开或关闭,语音播放采用 SACM_480格式的语音自动播放模式,程序流程图,如图 11 所示。 图 11 语音播放程序流程图 语音播放程序操作步骤: 1. 新建一个工程,在工程里建立一个新的 C语言文件。 2. 程序中会用到语音识别的 API函数,先拷贝语音识别库 到工程文件夹。 3. 拷贝语音识别头文件 、。 4. 拷贝语音播放库 和头文件 、。 5. 拷贝支持 的汇编语言文件 和头文件 、 到工程文件夹。 入口 S480 自动放音初始化 获取语音数据 需要等待播放结束。 播放结束了吗。 S480 停止 返回 N N Y Y 19 6. 在 IDE 集 成 开 发 环 境 的 Project/Setting/link 中 链 接 和 库到工程中。 7. 添加 、 、 、 、 文件的 “ Source Files” ,添加 、 、 、 、 、 “ Head Files”。 8. 拷贝语音资源, 并加载到工程当中 ; 9. 按照程序流程图编写程序。 10. Rebuild All。 11. 按照硬件连接图连接硬件。 12. 下载程序,运行。 SACM_480格式自动播放程序如下: void PlaySnd(unsigned int SndIndex) { BSR_StopRecognizer()。 SACM_S480_Initial(1)。 SACM_S480_Play(SndIndex,3,3)。 while((SACM_S480_Status()amp。 0x0001) != 0) {。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。