基于凌阳单片机的多路语音灯光控制内容摘要:
写 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) {。基于凌阳单片机的多路语音灯光控制
相关推荐
用 了一款专门的电平转换芯片,即 MAX485 接口 芯片。 它 是 Maxim公司的一种 RS- 485 芯片。 采用单一电源 +5V工作,额定电流为 300μ A,采用半双工通讯方式。 它完成将 TTL 电平转换为 RS- 485 电平的功能。 其引脚结构图如图 8 所示。 R 2 1 3 4 8 7 6 5 D R O RE DE DI V c c B A GND 图 3 1 M A X
r polynomial coefficients % a = denominator polynomial coefficients % N = order of the elliptic filter % Rp = passband ropple in dB。 Rp 0 % Omegac = cutoff frequency in radians/sec % [z, p, k] =
EQU。 左转调整口 TR EQU。 右转调整口 ZS EQU。 停止指示灯 CLK BIT DAT BIT PWMH DATA 30H PWML DATA 31H。 脉宽调制设置 JS DATA 32H。 计数 YS DATA 33H。 延时外层嵌套 TIMER DATA 34H。 延时用寄存器 TIMER1 DATA 35H TEMP DATA 36H TH1_D EQU 0FEH。
使用,它在每个中断信号的通道中设置了一个中断屏 蔽触发器,只有该触发器无效,它所对应的中断请求信号才能进入 CPU,即此类型中断开放。 否则即使其对应的中断请求标志位置“ 1”, CPU也不会响应中断,即此类型的中断被屏蔽。 同时 CPU内还设置了一个中断允许触发器,它控制 CPU能否响应中断。 中断控制寄存器。 SPCE061A对中断源的开放和屏蔽,以及每个中断源是否被允许中断
业、医疗、科学研究等众多领域都有广阔的应用前景。 在光通信系统中,光纤被用作远距离传输光波信号的媒质。 很明显,在这类应用中,光纤易受外界环境因素影响,如温度、压力、电磁场等外界条件的变化,将引起光纤光波参数发生变化,如引起光强、相位、频率、偏振、波长等的变化。 因此,人们发现如果能够测出光波参数的变化,就可以得到导致光波参数变化的各种物理量的大小,于是产生了光纤传感技术。 图 12
果 TEMP EQU 32H。 存放中间结果 TEMP1 EQU 33H。 存放中间结果 TEMP2 EQU 34H。 存放中间结果 ORG 0000H LJMP MAIN ORG 1000H MAIN:MOV SP,60H SETB CLR MOV SET_VH,05H MOV SET_VL,00H MOV SET_VL1,00H MOV SET_VL2,00H LCALL INIT_8155