標(biāo)題:
單片機(jī)控制的自主尋跡電動(dòng)小車的設(shè)計(jì)
[打印本頁(yè)]
作者:
zktly
時(shí)間:
2017-1-2 18:49
標(biāo)題:
單片機(jī)控制的自主尋跡電動(dòng)小車的設(shè)計(jì)
單片機(jī)智能小車
0.png
(90.85 KB, 下載次數(shù): 128)
下載附件
2017-1-2 21:26 上傳
0.png
(67.19 KB, 下載次數(shù): 134)
下載附件
2017-1-2 21:26 上傳
自主尋跡電動(dòng)小車的所有制作資料下載:
單片機(jī)智能小車.rar
(411.11 KB, 下載次數(shù): 13)
2017-1-2 18:49 上傳
點(diǎn)擊文件名下載附件
單片機(jī)智能小車
下載積分: 黑幣 -5
部分源碼預(yù)覽:
//========================================================
// 工程名稱: Car_Demo
// 功能描述: 實(shí)現(xiàn)DIY競(jìng)賽小車的語(yǔ)音控制
// 涉及的庫(kù): CMacro1016.lib
// bsrv222SDL.lib
// sacmv26e.lib
// 組成文件: main.c
// Flash.asm, hardware.asm,ISR.asm
// hardware.h,s480.h, hardware.inc
// 硬件連接: IOA0-----KEY1
// IOA1-----KEY2
// IOA2-----KEY3
// IOB10----MOTOR1A
// IOB11----MOTOR1B
// IOB12----MOTOR2A
// IOB13----MOTOR2B
// 維護(hù)記錄: 2007-06 v1.0
// 本代碼在原凌陽(yáng)小車代碼上修改而成,版權(quán)原作者所有
//========================================================
#include "s480.h"
#include "bsrsd.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_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 //給我取個(gè)名字吧
#define S_ACT1 1 //前進(jìn)
#define S_ACT2 2 //倒車,請(qǐng)注意
#define S_ACT3 3 //左拐
#define S_ACT4 4 //右拐
#define S_RDY 5 //Yeah
#define S_AGAIN 6 //請(qǐng)?jiān)僬f(shuō)一遍
#define S_NOVOICE 7 //沒(méi)有聽(tīng)到任何聲音
#define S_CMDDIFF 8 //說(shuō)什么暗語(yǔ)呀
#define S_NOISY 8 //說(shuō)什么暗語(yǔ)呀
#define S_START 9 //準(zhǔn)備就緒,開(kāi)始辨識(shí)
#define S_GJG 10 //拐就拐
#define S_DCZY 11 //倒車,請(qǐng)注意
extern unsigned int BSR_SDModel[100]; //外部變量BSR_SDModel[100],辨識(shí)器自帶
extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
extern void F_FlashErase(unsigned int sector);
unsigned int uiTimeset = 3; //運(yùn)行時(shí)間定時(shí),調(diào)整該參數(shù)控制運(yùn)行時(shí)間
unsigned int uiTimecont; //運(yùn)行時(shí)間計(jì)時(shí)
//=============================================================
// 語(yǔ)法格式: void Delay();
// 實(shí)現(xiàn)功能: 延時(shí)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void Delay()
{
unsigned int i;
for(i=0;i<0x3Fff;i++)
{
*P_Watchdog_Clear=0x0001;
}
}
//=============================================================
// 語(yǔ)法格式: void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
// 實(shí)現(xiàn)功能: 語(yǔ)音播放函數(shù)
// 參數(shù): SndIndex-播放語(yǔ)音資源索引號(hào)
// DAC_Channel-播放聲道選擇
// 返回值: 無(wú)
//=============================================================
void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
{
BSR_StopRecognizer(); //停止識(shí)別器
SACM_S480_Initial(1); //初始化為自動(dòng)播放
SACM_S480_Play(SndIndex, DAC_Channel, 3); //開(kāi)始播放一段語(yǔ)音
while((SACM_S480_Status()&0x0001)!= 0) //是否播放完畢?
{
SACM_S480_ServiceLoop(); //解碼并填充隊(duì)列
*P_Watchdog_Clear=0x0001; //清看門狗
}
SACM_S480_Stop(); //停止播放
BSR_InitRecognizer(BSR_MIC); //初始化識(shí)別器
}
//=============================================================
// 語(yǔ)法格式: int TrainWord(int WordID,int SndID);
// 實(shí)現(xiàn)功能: 訓(xùn)練一條指令
// 參數(shù): WordID-指令編碼
// SndID-指令提示音索引號(hào)
// 返回值: 無(wú)
//=============================================================
int TrainWord(unsigned int WordID,unsigned int SndID)
{
int Result;
PlaySnd(SndID,3); //引導(dǎo)訓(xùn)練,播放指令對(duì)應(yīng)動(dòng)作
while(1)
{
Result = BSR_Train(WordID,BSR_TRAIN_TWICE); //訓(xùn)練兩次,獲得訓(xùn)練結(jié)果
if(Result==0)break;
switch(Result)
{
case -1: //沒(méi)有檢測(cè)出聲音
PlaySnd(S_NOVOICE,3);
return -1;
case -2: //需要訓(xùn)練第二次
PlaySnd(S_AGAIN,3);
break;
case -3: //環(huán)境太吵
PlaySnd(S_NOISY,3);
return -3;
case -4: //數(shù)據(jù)庫(kù)滿
return -4;
case -5: //檢測(cè)出聲音不同
PlaySnd(S_CMDDIFF,3);
return -5;
case -6: //序號(hào)錯(cuò)誤
return -6;
default:
break;
}
}
return 0;
}
//=============================================================
// 語(yǔ)法格式: void TrainSD();
// 實(shí)現(xiàn)功能: 訓(xùn)練函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void TrainSD()
{
while(TrainWord(NAME_ID,S_NAME) != 0) ; //訓(xùn)練名稱
while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; //訓(xùn)練第1個(gè)動(dòng)作
while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; //訓(xùn)練第2個(gè)動(dòng)作
while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ; //訓(xùn)練第3個(gè)動(dòng)作
while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ; //訓(xùn)練第4個(gè)動(dòng)作
}
//=============================================================
// 語(yǔ)法格式: void StoreSD();
// 實(shí)現(xiàn)功能: 存儲(chǔ)語(yǔ)音模型函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
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) //模型導(dǎo)出成功?
g_Ret=BSR_ExportSDWord(commandID);
for(i=0;i<100;i++) //保存語(yǔ)音模型SD1(0xe000---0xe063)
{
F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
ulAddr+=1;
}
}
}
//=============================================================
// 語(yǔ)法格式: void StoreSD();
// 實(shí)現(xiàn)功能: 裝載語(yǔ)音模型函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
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; //裝載語(yǔ)音模型
p+=1;
}
g_Ret=BSR_ImportSDWord();
while(g_Ret!=0) //模型裝載成功?
g_Ret=BSR_ImportSDWord();
}
}
//=============================================================
// 語(yǔ)法格式: void GoAhead();
// 實(shí)現(xiàn)功能: 前進(jìn)子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void GoAhead() //前進(jìn)
{
PlaySnd(S_ACT1,3); //提示
*P_IOB_Data=0x1400; //前進(jìn)
*P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 語(yǔ)法格式: void BackUp();
// 實(shí)現(xiàn)功能: 后退子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void BackUp() //倒退
{
PlaySnd(S_DCZY,3); //提示
*P_IOB_Data=0x2800; //倒退
*P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 語(yǔ)法格式: void TurnLeft();
// 實(shí)現(xiàn)功能: 左轉(zhuǎn)子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void TurnRight() //右轉(zhuǎn)
{
PlaySnd(S_GJG,3);
*P_IOB_Data=0x1800; //右轉(zhuǎn)
Delay(); //延時(shí)
*P_IOB_Data=0x2400; //左轉(zhuǎn)
*P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 語(yǔ)法格式: void TurnRight();
// 實(shí)現(xiàn)功能: 右轉(zhuǎn)子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void TurnLeft() //左轉(zhuǎn)
{
PlaySnd(S_GJG,3); //語(yǔ)音提示
*P_IOB_Data=0x2400; //左轉(zhuǎn)
Delay(); //延時(shí)
*P_IOB_Data=0x1800; //右轉(zhuǎn)
*P_INT_Mask |= 0x0004; //以下為中斷定時(shí)操作
__asm("int fiq,irq");
uiTimecont = 0;
}
//=============================================================
// 語(yǔ)法格式: void Stop();
// 實(shí)現(xiàn)功能: 停車子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void Stop() //停車
{
*P_IOB_Data=0x0000; //停車
PlaySnd(S_RDY,3); //語(yǔ)音提示
}
//=============================================================
// 語(yǔ)法格式: void BSR(void);
// 實(shí)現(xiàn)功能: 辨識(shí)子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void BSR(void)
{
int Result; //辨識(shí)結(jié)果寄存
Result = BSR_GetResult(); //獲得識(shí)別結(jié)果
if(Result>0) //有語(yǔ)音觸發(fā)?
{
*P_IOB_Data=0x0000; //臨時(shí)停車
switch(Result)
{
case NAME_ID: //識(shí)別出名稱命令
Stop(); //停車待命
break;
case COMMAND_GO_ID: //識(shí)別出第一條命令
GoAhead(); //執(zhí)行動(dòng)作一:直走
break;
case COMMAND_BACK_ID: //識(shí)別出第二條命令
BackUp(); //執(zhí)行動(dòng)作二:倒車
break;
case COMMAND_LEFT_ID: //識(shí)別出第三條命令
TurnLeft(); //執(zhí)行動(dòng)作三:左轉(zhuǎn)
break;
case COMMAND_RIGHT_ID: //識(shí)別出第四條命令
TurnRight(); //執(zhí)行動(dòng)作四:右轉(zhuǎn)
break;
default:
break;
}
}
}
//=============================================================
// 語(yǔ)法格式: void IRQ5(void);
// 實(shí)現(xiàn)功能: 中斷服務(wù)子函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
void IRQ5(void)__attribute__((ISR)); //運(yùn)動(dòng)定時(shí)控制
void IRQ5(void)
{
if(uiTimecont++ == uiTimeset)
{
*P_IOB_Data = 0x0000;
}
*P_INT_Clear = 0x0004;
}
//=============================================================
// 語(yǔ)法格式: int main(void);
// 實(shí)現(xiàn)功能: 主函數(shù)
// 參數(shù): 無(wú)
// 返回值: 無(wú)
//=============================================================
int main(void)
{ unsigned int BS_Flag; //Train標(biāo)志位
*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); //初始化存儲(chǔ)器RAM
BS_Flag=*(unsigned int *)0xe000; //讀存儲(chǔ)單元0xe000
if(BS_Flag==0xffff) //沒(méi)有經(jīng)過(guò)訓(xùn)練(0xe000內(nèi)容為0xffff)
{
TrainSD(); //訓(xùn)練
StoreSD(); //存儲(chǔ)訓(xùn)練結(jié)果(語(yǔ)音模型)
}
else //經(jīng)過(guò)訓(xùn)練(0xe000內(nèi)容為0x0055)
{
LoadSD(); //語(yǔ)音模型載入識(shí)別器
}
PlaySnd(S_START,3); //開(kāi)始識(shí)別提示
BSR_InitRecognizer(BSR_MIC); //初始化識(shí)別器
while(1)
{
BSR();
if((*P_IOA_Data)&0x0004) //是否重新訓(xùn)練
{
F_FlashErase(0xe000);
while(1);
}
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1