📄 main.c
字号:
//======================================================
// The information contained herein is the exclusive property of
// Sunnnorth Technology Co. And shall not be distributed, reproduced,
// or disclosed in whole in part without prior written permission.
// (C) COPYRIGHT 2003 SUNNORTH TECHNOLOGY CO.
// ALL RIGHTS RESERVED
// The entire notice above must be reproduced on all authorized copies.
//========================================================
// 2006四川省电子设计大赛
//========================================================
// 工程名称: Car_Demo
// 功能描述: 实现小车的语音控制
// 涉及的库: CMacro1016.lib
// bsrv222SDL.lib
// sacmv26e.lib
// clib100.lib
// 组成文件: main.c
// Flash.asm, hardware.asm,ISR.asm
// hardware.h,s480.h,math.h, hardware.inc
// 硬件连接: IOA0-----KEY1
// IOA1-----KEY2
// IOA2-----KEY3
// IOB8-----前进
// IOB9-----倒车
// IOB10----左拐
// IOB11----右拐
// 维护记录: 2006-12-9 v1.0
//========================================================
#include "s480.h"
#include "bsrsd.h"
#include "math.h"
#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_Feedback (volatile unsigned int *)0x7009
#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_ACT1_ID 0x101
#define COMMAND_ACT2_ID 0x102
#define COMMAND_ACT3_ID 0x103
#define COMMAND_ACT4_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 //OK
#define S_AGAIN 6 //请再说一遍
#define S_NOVOICE 7 //没有听到任何声音
#define S_CMDDIFF 8 //说什么暗语呀
#define S_NOISY 8 //说什么暗语呀
#define S_START 9 //准备就绪,开始辨识
#define S_OX 10 //目标点X坐标
#define S_OY 11 //目标点Y坐标
#define S_FINISHED 12 //任务完成,行驶总时间为:
#define S_WANBI 13 //完毕
#define S_Twenty 14 //20
#define S_THREEty 15 //30
#define S_FOURty 16 //40
#define S_Sixty 17 //60
#define S_Sevty 18 //70
#define S_NINEty 19 //90
#define S_DaoChe 20 //倒车请注意
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 = 20; //运行时间定时,调整该参数控制运行时间
unsigned int uiTimecont; //运行时间计时
unsigned int nowstate,stated; //路面传感器状态存储单元
float speed = 1.0; //运行速度
//float OneTime = 0.1; //转固定角度时间
int g_flag = 0;
//int g_SetFlag = 0;
//=============================================================
// 语法格式: void Delay();
// 实现功能: 延时
// 参数: 无
// 返回值: 无
//=============================================================
int Delay()
{
unsigned int i;
for(i=0;i<0x00ff;i++)
{
*P_Watchdog_Clear=0x0001;
}
return 1;
}
//=============================================================
// 语法格式: void PWMOut();
// 实现功能: PWM输出子函数
// 参数: unsigned int pa,unsigned int pb
// 返回值: 无
//=============================================================
void PWMOut(unsigned int pa,unsigned int pb)
{
*P_Feedback = 0x0000; //设置IOB8,IOB9口为APWMO端口
*P_TimerA_Data = pa; //设定TA
*P_TimerB_Data = pb;
*P_TimerA_Ctrl = 0x0132; //*P_TimerA_Ctrl = 0x0132;
*P_TimerB_Ctrl = 0x00f2; //*P_TimerB_Ctrl = 0x00b2;
}
//=============================================================
// 语法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 实现功能: 语音播放函数
// 参数: SndIndex-播放语音资源索引号
// DAC_Channel-播放声道选择
// 返回值: 无
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
BSR_StopRecognizer(); //停止识别器
SACM_S480_Initial(1); //初始化为自动播放
//*P_TimerA_Ctrl = 0x0a00;
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); //初始化识别器
}
//=============================================================
// 语法格式: void FormatFlash(void);
// 实现功能: 存储命令的Flash空间函数
// 参数: 无
// 返回值: 无
//=============================================================
void FormatFlash(void)
{
F_FlashErase(0xF700); //存储命令的Flash空间
F_FlashErase(0xF700+100); //每条命令占用96个字,用函数导出占用100个字
F_FlashErase(0xF700+200);
F_FlashErase(0xF700+300);
F_FlashErase(0xF700+400);
}
//=============================================================
// 语法格式: 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_ACT1_ID,S_ACT1) != 0) ; //训练第1个动作
while(TrainWord(COMMAND_ACT2_ID,S_ACT2) != 0) ; //训练第2个动作
while(TrainWord(COMMAND_ACT3_ID,S_ACT3) != 0) ; //训练第3个动作
while(TrainWord(COMMAND_ACT4_ID,S_ACT4) != 0) ; //训练第4个动作
}
//=============================================================
// 语法格式: void StoreSD();
// 实现功能: 存储语音模型函数
// 参数: unsigned int Addr
// 返回值: 无
//=============================================================
void StoreSD()
{ unsigned int ulAddr,i,commandID,g_Ret;
//F_FlashWrite1Word(0xef00,0xaaaa);
//F_FlashErase(0xf700);
//F_FlashErase(0xe100);
//F_FlashErase(0xe200);
ulAddr=0xf700;//********
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]);
*(unsigned int *)0x7012 = 1;
ulAddr+=1;
}
}
}
//=============================================================
// 语法格式: void LoadSD();
// 实现功能: 装载语音模型函数
// 参数: 无
// 返回值: 无
//=============================================================
void LoadSD()
{ unsigned int *p,k,jk,Ret,g_Ret;
p=(int *)0xf700;
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() //前进
{
unsigned int i,j;
for(j=0;j<20;j++)
{
*P_IOB_Data=0x0300;
Delay(); //延时
*P_IOB_Data=0x0000;
for(i=0;i<4;i++)
{
Delay();
}
}
*P_IOB_Data=0x0000;
}
//=============================================================
// 语法格式: void GoAhead();
// 实现功能: 前进子函数
// 参数: 无
// 返回值: 无
//=============================================================
void GoAheadzd() //前进
{
unsigned int i,j;
for(j=0;j<20;j++)
{
*P_IOB_Data=0x0300;
Delay(); //延时
*P_IOB_Data=0x0000;
for(i=0;i<3;i++)
{
Delay();
}
}
*P_IOB_Data=0x0000;
}
//=============================================================
// 语法格式: void BackUp();
// 实现功能: 后退子函数
// 参数: 无
// 返回值: 无
//=============================================================
void BackUp() //倒退
{
unsigned int i,j;
///PlaySnd(S_DaoChe,3); //提示
for(j=0;j<20;j++)
{
*P_IOB_Data=0x0c00;
Delay(); //延时
*P_IOB_Data=0x0000;
for(i=0;i<4;i++)
{
Delay(); //延时
}
}
*P_IOB_Data=0x0000; //停车
}
//=============================================================
// 语法格式: void TurnLeft();
// 实现功能: 左转子函数
// 参数: 无
// 返回值: 无
//=============================================================
void TurnLeft() //左转
{
unsigned int i, j;
for(j=0;j<20;j++)
{
*P_IOB_Data=0x0600;
Delay();
*P_IOB_Data=0x0000;
for(i=0;i<4;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -