求凌阳单片机语音控制程序

求凌阳单片机语音控制程序,第1张

// 工程名称: Car_Demo

// 功能描述: 实现小车的语音控制

// 涉及的库: CMacro1016lib

// bsrv222SDLlib

// sacmv26elib

// 组成文件: mainc

// Flashasm, hardwareasm,ISRasm

// hardwareh,s480h, hardwareinc

// 硬件连接: IOA0-----KEY1

// IOA1-----KEY2

// IOA2-----KEY3

// IOB8-----前进

// IOB9-----倒车

// IOB10----左拐

// IOB11----右拐

// 维护记录: 2005-12-12 v10

//========================================================

#include "s480h"

#include "bsrsdh"

#define P_IOA_Data (volatile unsigned int )0x7000

#define P_IOA_Dir (volatile unsigned int )0x7002

#define P_IOA_Attrib (volatile unsigned int )0x7003

#define P_IOB_Data (volatile unsigned int )0x7005

#define P_IOB_Dir (volatile unsigned int )0x7007

#define P_IOB_Attrib (volatile unsigned int )0x7008

#define P_TimerA_Data (volatile unsigned int )0x700A

#define P_TimerA_Ctrl (volatile unsigned int )0x700B

#define P_TimerB_Data (volatile unsigned int )0x700C

#define P_TimerB_Ctrl (volatile unsigned int )0x700D

#define P_Watchdog_Clear (volatile unsigned int )0x7012

#define P_INT_Mask (volatile unsigned int )0x702D

#define P_INT_Clear (volatile unsigned int )0x7011

#define NAME_ID 0x100

#define COMMAND_GO_ID 0x101

#define COMMAND_BACK_ID 0x102

#define COMMAND_LEFT_ID 0x103

#define COMMAND_RIGHT_ID 0x104

#define S_NAME 0 //给我取个名字吧

#define S_ACT1 1 //前进

#define S_ACT2 2 //倒车,请注意

#define S_ACT3 3 //左拐

#define S_ACT4 4 //右拐

#define S_RDY 5 //Yeah

#define S_AGAIN 6 //请再说一遍

#define S_NOVOICE 7 //没有听到任何声音

#define S_CMDDIFF 8 //说什么暗语呀

#define S_NOISY 8 //说什么暗语呀

#define S_START 9 //准备就绪,开始辨识

#define S_GJG 10 //拐就拐

#define S_DCZY 11 //倒车,请注意

extern unsigned int BSR_SDModel[100]; //外部变量BSR_SDModel[100],辨识器自带

extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);

extern void F_FlashErase(unsigned int sector);

unsigned int uiTimeset = 3; //运行时间定时,调整该参数控制运行时间

unsigned int uiTimecont; //运行时间计时

//=============================================================

// 语法格式: void Delay();

// 实现功能: 延时

// 参数: 无

// 返回值: 无

//=============================================================

void Delay()

{

unsigned int i;

for(i=0;i<0x3Fff;i++)

{

P_Watchdog_Clear=0x0001;

}

}

//=============================================================

// 语法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);

// 实现功能: 语音播放函数

// 参数: SndIndex-播放语音资源索引号

// DAC_Channel-播放声道选择

// 返回值: 无

//=============================================================

void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)

{

BSR_StopRecognizer(); //停止识别器

SACM_S480_Initial(1); //初始化为自动播放

SACM_S480_Play(SndIndex, DAC_Channel, 3); //开始播放一段语音

while((SACM_S480_Status()&0x0001)!= 0) //是否播放完毕?

{

SACM_S480_ServiceLoop(); //解码并填充队列

P_Watchdog_Clear=0x0001; //清看门狗

}

SACM_S480_Stop(); //停止播放

BSR_InitRecognizer(BSR_MIC); //初始化识别器

}

//=============================================================

// 语法格式: int TrainWord(int WordID,int SndID);

// 实现功能: 训练一条指令

// 参数: WordID-指令编码

// SndID-指令提示音索引号

// 返回值: 无

//=============================================================

int TrainWord(unsigned int WordID,unsigned int SndID)

{

int Result;

PlaySnd(SndID,3); //引导训练,播放指令对应动作

while(1)

{

Result = BSR_Train(WordID,BSR_TRAIN_TWICE); //训练两次,获得训练结果

if(Result==0)break;

switch(Result)

{

case -1: //没有检测出声音

PlaySnd(S_NOVOICE,3);

return -1;

case -2: //需要训练第二次

PlaySnd(S_AGAIN,3);

break;

case -3: //环境太吵

PlaySnd(S_NOISY,3);

return -3;

case -4: //数据库满

return -4;

case -5: //检测出声音不同

PlaySnd(S_CMDDIFF,3);

return -5;

case -6: //序号错误

return -6;

default:

break;

}

}

return 0;

}

//=============================================================

// 语法格式: void TrainSD();

// 实现功能: 训练函数

// 参数: 无

// 返回值: 无

//=============================================================

void TrainSD()

{

while(TrainWord(NAME_ID,S_NAME) != 0) ; //训练名称

while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; //训练第1个动作

while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; //训练第2个动作

while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ; //训练第3个动作

while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ; //训练第4个动作

}

//=============================================================

// 语法格式: void StoreSD();

// 实现功能: 存储语音模型函数

// 参数: 无

// 返回值: 无

//=============================================================

void StoreSD()

{ unsigned int ulAddr,i,commandID,g_Ret;

F_FlashWrite1Word(0xef00,0xaaaa);

F_FlashErase(0xe000);

F_FlashErase(0xe100);

F_FlashErase(0xe200);

ulAddr=0xe000;//

for(commandID=0x100;commandID<0x105;commandID++)

{

g_Ret=BSR_ExportSDWord(commandID);

while(g_Ret!=0) //模型导出成功?

g_Ret=BSR_ExportSDWord(commandID);

for(i=0;i<100;i++) //保存语音模型SD1(0xe000---0xe063)

{

F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);

ulAddr+=1;

}

}

}

//=============================================================

// 语法格式: void StoreSD();

// 实现功能: 装载语音模型函数

// 参数: 无

// 返回值: 无

//=============================================================

void LoadSD()

{ unsigned int p,k,jk,Ret,g_Ret;

p=(int )0xe000;

for(jk=0;jk<5;jk++)

{

for(k=0;k<100;k++)

{

Ret=p;

BSR_SDModel[k]=Ret; //装载语音模型

p+=1;

}

g_Ret=BSR_ImportSDWord();

while(g_Ret!=0) //模型装载成功?

g_Ret=BSR_ImportSDWord();

}

}

//=============================================================

// 语法格式: void GoAhead();

// 实现功能: 前进子函数

// 参数: 无

// 返回值: 无

//=============================================================

void GoAhead() //前进

{

PlaySnd(S_ACT1,3); //提示

P_IOB_Data=0x0100; //前进

P_INT_Mask |= 0x0004; //以下为中断定时 *** 作

__asm("int fiq,irq");

uiTimecont = 0;

}

//=============================================================

// 语法格式: void BackUp();

// 实现功能: 后退子函数

// 参数: 无

// 返回值: 无

//=============================================================

void BackUp() //倒退

{

PlaySnd(S_DCZY,3); //提示

P_IOB_Data=0x0200; //倒退

P_INT_Mask |= 0x0004; //以下为中断定时 *** 作

__asm("int fiq,irq");

uiTimecont = 0;

}

//=============================================================

// 语法格式: void TurnLeft();

// 实现功能: 左转子函数

// 参数: 无

// 返回值: 无

//=============================================================

void TurnLeft() //左转

{

PlaySnd(S_GJG,3);

P_IOB_Data=0x0900; //右转

Delay(); //延时

P_IOB_Data=0x0500; //左转

P_INT_Mask |= 0x0004; //以下为中断定时 *** 作

__asm("int fiq,irq");

uiTimecont = 0;

}

//=============================================================

// 语法格式: void TurnRight();

// 实现功能: 右转子函数

// 参数: 无

// 返回值: 无

//=============================================================

void TurnRight() //右转

{

PlaySnd(S_GJG,3); //语音提示

P_IOB_Data=0x0500; //左转

Delay(); //延时

P_IOB_Data=0x0900; //右转

P_INT_Mask |= 0x0004; //以下为中断定时 *** 作

__asm("int fiq,irq");

uiTimecont = 0;

}

//=============================================================

// 语法格式: void Stop();

// 实现功能: 停车子函数

// 参数: 无

// 返回值: 无

//=============================================================

void Stop() //停车

{

P_IOB_Data=0x0000; //停车

PlaySnd(S_RDY,3); //语音提示

}

//=============================================================

// 语法格式: void BSR(void);

// 实现功能: 辨识子函数

// 参数: 无

// 返回值: 无

//=============================================================

void BSR(void)

{

int Result; //辨识结果寄存

Result = BSR_GetResult(); //获得识别结果

if(Result>0) //有语音触发?

{

P_IOB_Data=0x0000; //临时停车

switch(Result)

{

case NAME_ID: //识别出名称命令

Stop(); //停车待命

break;

case COMMAND_GO_ID: //识别出第一条命令

GoAhead(); //执行动作一:直走

break;

case COMMAND_BACK_ID: //识别出第二条命令

BackUp(); //执行动作二:倒车

break;

case COMMAND_LEFT_ID: //识别出第三条命令

TurnLeft(); //执行动作三:左转

break;

case COMMAND_RIGHT_ID: //识别出第四条命令

TurnRight(); //执行动作四:右转

break;

default:

break;

}

}

}

//=============================================================

// 语法格式: void IRQ5(void);

// 实现功能: 中断服务子函数

// 参数: 无

// 返回值: 无

//=============================================================

void IRQ5(void)__attribute__((ISR)); //运动定时控制

void IRQ5(void)

{

if(uiTimecont++ == uiTimeset)

{

P_IOB_Data = 0x0000;

}

P_INT_Clear = 0x0004;

}

//=============================================================

// 语法格式: int main(void);

// 实现功能: 主函数

// 参数: 无

// 返回值: 无

//=============================================================

int main(void)

{ unsigned int BS_Flag; //Train标志位

P_IOA_Dir=0xff00; //初始化IOA,IOA0~7下拉输入

P_IOA_Attrib=0xff00;

P_IOA_Data=0x0000;

P_IOB_Dir=0x0f00; //初始化IOB,IOB8~11同向输出

P_IOB_Attrib=0x0f00;

P_IOB_Data=0x0000;

BSR_DeleteSDGroup(0); //初始化存储器RAM

BS_Flag=(unsigned int )0xe000; //读存储单元0xe000

if(BS_Flag==0xffff) //没有经过训练(0xe000内容为0xffff)

{

TrainSD(); //训练

StoreSD(); //存储训练结果(语音模型)

}

else //经过训练(0xe000内容为0x0055)

{

LoadSD(); //语音模型载入识别器

}

PlaySnd(S_START,3); //开始识别提示

BSR_InitRecognizer(BSR_MIC); //初始化识别器

while(1)

{

BSR();

if((P_IOA_Data)&0x0004) //是否重新训练

{

F_FlashErase(0xe000);

while(1);

}

}

}

//============================================================

// 文件名称:flashasm

// 实现功能: SPCE061 32K flash 的读写

// 维护记录: 2003-6-9 V10

//============================================================

INCLUDE hardwareinc

DEFINE C_FLASH_SIZE 0x8000

DEFINE C_FLASH_BLOCK_SIZE 0x100

DEFINE C_FLASH_MATCH 0xAAAA

DEFINE C_FLASH_PAGE_ERASE 0x5511 //擦除一页

DEFINE C_FLASH_MASS_ERASE 0x5522 //

DEFINE C_FLASH_1WORD_PGM 0x5533 //写一个字

DEFINE C_FLASH_SEQUENT_PGM 0x5544 //写多个字

DEFINE C_FLASH_MAIN_BLOCK 0x5555

DEFINE C_FLASH_INFORM_BLOCK 0x5566

CODE

//============================================================================================

//语法:void F_FlashWrite1Word(int addr,int Value )

//描述:写一个字到FLASH中

//参数:addr-被写数据的存储地址 Value-被写数据

//返回:无

//===============================================================================================

PUBLIC _F_FlashWrite1Word

DEFINE P_Flash_Ctrl 0x7555

_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

//=============================================================================================

//语法:F_FlashWrite(int sector,int &num, int size)

//描述:顺序写多个字

//参数:sector-被写数据的起始地址 &num-被写数据 size-写数据的数量

//返回:无

//=============================================================================================

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

// ============================================================================================

//语法:void F_FlashErase(sector)

//描述:擦除256字节

//参数: sector-擦除页的起始地址

//返回:无

// ============================================================================================

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

END

//============================================================

// 文件名称:ISRasm

// 实现功能: 语音播放/识别中断服务

// 维护记录: 2003-9-9 V10

//============================================================

include hardwareinc

public _FIQ;

external _BSR_FIQ_Routine

external F_FIQ_Service_SACM_S480

text

_FIQ:

push R1,R5 to [sp]; // 寄存器压栈保护

R1 = C_FIQ_TMA;

[P_INT_Clear] = R1;

call _BSR_FIQ_Routine //语音识别中断服务

call F_FIQ_Service_SACM_S480; //语音播放中断服务

pop R1,R5 from [sp];

reti;

SP是用于复杂程序(空格)。

三菱PLC英文名又称:Mitsubish Programmable Logic Controller,是三菱电机在大连生产的主力产品。 它采用一类可编程的存储器,用于其内部存储程序,执行逻辑运算、顺序控制、定时、计数与算术 *** 作等面向用户的指令,并通过数字或模拟式输入/输出控制各种类型的机械或生产过程。三菱PLC在中国市场常见的有以下型号: FR-FX1N FR-FX1S FR-FX2N FR-FX3U FR-FX2NC FR-A FR-Q)。

如果是51单片机的话上电后SP默认的是07h,寄存器组默认的是第一组就是00h-07h这8个单元,写程序的时候将自定义变量区设定在堆栈深度以外就可以了。

一般是将4个寄存器组单元地址预留出来。

以上就是关于求凌阳单片机语音控制程序全部的内容,包括:求凌阳单片机语音控制程序、三菱plc中的SP指令什么意思、单片机中的SP设置问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10039681.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存