freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于單片機(jī)的sd卡錄音筆設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文(編輯修改稿)

2024-07-24 19:06 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 ( RESET)等。18SPCE061A 的主控芯片,負(fù)責(zé)構(gòu)建語(yǔ)音錄放的數(shù)據(jù)結(jié)構(gòu),并在單片機(jī)內(nèi)部 Flash 中保存有語(yǔ)音內(nèi)容和相關(guān)語(yǔ)音信息。SPCE061A 控制端口輸出控制信息,并控制喇叭輸出聲音信息。實(shí)現(xiàn)對(duì)整個(gè)系統(tǒng)的控制。通過本系統(tǒng)中的音頻輸入電路和 MIC,可以采集語(yǔ)音信號(hào)并處理。圖 為 SPCE061A 最小系統(tǒng)圖。圖 SPCE061A 最小系統(tǒng)圖19 按鍵電路 本系統(tǒng)使用三個(gè)按鍵完成錄放音控制。圖 為按鍵電路圖。Key1 為“下一曲”鍵,Key2 為“上一曲” 鍵,Key3 為“錄音鍵” 。圖 按鍵電路圖 音頻輸出電路 SPCE061A 內(nèi)置 2 路 10 位精度的 DAC,只需要外接功放電路即可完成語(yǔ)音的播放。電路中 SPY0030 是凌陽(yáng)公司一款音頻放大芯片。它和 LM386相比,LM386 工作電壓需在 4V 以上, SPY0030 僅需 即可工作(兩顆電池即可工作);LM386 輸出功率 100mW 以下, SPY0030 約 700mW。圖 為音頻輸出電路圖。圖 音頻輸出電路圖20 SD 卡模組電路在本系統(tǒng)中,SPCE061A 通過 SPI 總線實(shí)現(xiàn)對(duì) SD 卡設(shè)備的訪問。SD 卡模組同時(shí)提供卡插入檢測(cè)和寫保護(hù)檢測(cè)接口。圖 為 SD 卡模組電路圖。圖 SD 卡模組電路圖214 系統(tǒng)軟件設(shè)計(jì) 主程序設(shè)計(jì)主程序采用的是匯編語(yǔ)言和 C 語(yǔ)言混合編程。主程序流程圖如圖 。 系統(tǒng)初始化 檢測(cè) SD 卡是否插入?否 檢查 SD 卡是否寫保護(hù)?置寫保護(hù)標(biāo)志播放“SD 卡寫保護(hù)”是否初始化 SD 卡按鍵處理系統(tǒng)狀態(tài)處理是播放“注意 SD 卡沒有插入” 檢測(cè) SD 卡是否插入?否是播放“就緒”語(yǔ)音提示程序開始圖 主程序流程圖22 主程序完成系統(tǒng)初始化后檢測(cè) SD 卡是否插入以及是否有寫保護(hù),并有相應(yīng)的語(yǔ)音提示,告知用戶當(dāng)前的系統(tǒng)狀態(tài)。如果 SD 卡正確插入,則系統(tǒng)根據(jù)用戶的不同按鍵進(jìn)行錄/放音控制。同時(shí),在循環(huán)中對(duì)系統(tǒng)當(dāng)前的狀態(tài)進(jìn)行檢測(cè),控制系統(tǒng)在錄制語(yǔ)音時(shí)不至于超出存儲(chǔ)器容量限制,或控制系統(tǒng)在放音時(shí)播放至文件尾部自動(dòng)停止播放。部分程序如下:SACM_DVR1600_Initial()。 // 語(yǔ)音初始化if(0 == SD_ChkCard()) // 檢測(cè)卡是否插入PlaySnd(VOICE_ATTENTION, DAC1 + DAC2)。PlaySnd(VOICE_SDCARDNOTINSERT, DAC1 + DAC2)。while(0 == SD_ChkCard())。 // 等待卡插入if(1 == SD_ChkCardWP()) // 檢測(cè)卡是否有寫保護(hù)WriteProtect = 1。elseFS_Init()。 // 沒有寫保護(hù),執(zhí)行初始化操作PlaySnd(VOICE_READY, DAC1 + DAC2)。 // 播放就緒//while(1)KeyProcess()。 // 按鍵處理StatusProcess()。 // 系統(tǒng)狀態(tài)處理SACM_DVR1600_ServiceLoop()。 // 錄/放音服務(wù)23 按鍵處理程序流程 按鍵處理程序中,當(dāng)檢測(cè)到有 SD 卡寫保護(hù)時(shí),會(huì)播放“卡有寫保護(hù)” 的提示音,對(duì)按鍵不做處理。按鍵處理流程圖如圖 。初始化 判斷是否有寫保護(hù)標(biāo)志?否 判斷按鍵Key3 錄音鍵是Key2 上一曲鍵 Key1 下一曲鍵返回開始圖 按鍵處理流程圖部分程序如下:Key = KeyScan_GetKey(amp。KeyType)。if(1 == WriteProtect) // 卡有寫保護(hù),拒絕按鍵操作if((C_SReleaseKeyState == KeyType) || (C_LReleaseKeyState == KeyType))return。 switch(Key)24 當(dāng)按下錄音鍵時(shí),若為短按鍵且 SD 卡未滿,提示錄音開始并置錄音標(biāo)志,開始錄音?!颁浺簟卑存I處理程序的流程圖如圖 所示。圖 正在播放? 短按鍵?是是停止播放,關(guān)閉讀取 SD 卡系統(tǒng)狀態(tài)置空閑 SD 卡已滿?否是否 系統(tǒng)空閑?否啟動(dòng)寫入 SD 卡,開始錄音系統(tǒng)狀態(tài)置錄音否是 正在錄音?結(jié)束錄音,錄音收尾是否開始返回錄音鍵流程圖部分程序如下:case C_Record: // Recordif(C_SReleaseKeyState == KeyType) // 短按鍵,錄/ 放音控制if(PLAY == Status)25SACM_DVR1600_Stop()。 // 如果正在放音,則先停止播放FS_CloseOpenFile()。Status = IDLE。if(IDLE == Status)if((g_FileNum = FS_MAX_FILENUM) || (FS_GetUnusedSecNum() = 0)) // 文件已滿,退出PlaySnd(VOICE_DANG, DAC1 + DAC2)。Status = RECORD。else if(RECORD == Status)SACM_DVR1600_Stop()。while(RECORD == Status) // 等待完成錄音收尾工作SACM_DVR1600_ServiceLoop()。PlaySnd(VOICE_OVER, DAC1 + DAC2)。 26 當(dāng)按下上一曲鍵,短按鍵(小于一秒)播放上一曲,長(zhǎng)按鍵清除 SD 卡上所有錄音?!?上一曲” 按鍵處理程序的流程圖如圖 。 正在錄音? 正在播放?是 判斷是否有文件?結(jié)束放音是否 短按鍵?否否是 長(zhǎng)按鍵?是 清除 SD 卡內(nèi)所有文件系統(tǒng)狀態(tài)置空閑讀取語(yǔ)音段,啟動(dòng)聲音播放上一曲系統(tǒng)狀態(tài)置播放否是否開始返回圖 上一曲鍵流程圖部分程序如下: if(PLAY == Status) // 如果正在放音,則先停止播放27SACM_DVR1600_Stop()。FS_CloseOpenFile()。else if(RECORD == Status) // 如果正在錄音則不處理if(C_LReleaseKeyState == KeyType)//長(zhǎng)按鍵,擦除所有語(yǔ)音段FS_Init()。Status = IDLE。else if(C_SReleaseKeyState == KeyType)//短按鍵播放上一曲當(dāng)按下下一曲鍵,短按鍵(小于一秒)播放下一曲,長(zhǎng)按鍵停止放音?!跋乱磺卑存I處理程序的流程圖如圖 。 正在錄音?當(dāng)前有錄音片段?是是停止播放 正在播放?否否 短按鍵?否 長(zhǎng)按鍵?否系統(tǒng)狀態(tài)置空閑是啟動(dòng)聲音播放下一曲系統(tǒng)狀態(tài)置播放否是是開始返回圖 下一曲鍵流程圖28部分程序如下:case C_Next: // Play Nextif((C_SReleaseKeyState != KeyType) amp。amp。 (C_LReleaseKeyState != KeyType))if(g_FileNum 0)if(PLAY == Status) //如果正在放音,則先停止播放SACM_DVR1600_Stop()。FS_CloseOpenFile()。else if(RECORD == Status) // 如果正在錄音則不處理if(C_LReleaseKeyState == KeyType)//長(zhǎng)按鍵,停止當(dāng)前播放Status = IDLE。else if(C_SReleaseKeyState == KeyType)// 短按鍵,播放下一曲系統(tǒng)狀態(tài)處理程序主要完成在錄音時(shí)判斷是否超出 SD 卡容量限制,或者在放音時(shí)當(dāng)前語(yǔ)音是否播放完畢。系統(tǒng)狀態(tài)流程圖如圖 。 檢查 SD 卡是否已滿? 是否正在錄音? 播放是否結(jié)束?停止錄音系統(tǒng)狀態(tài)置空閑 是否正在播放?停止讀取系統(tǒng)狀態(tài)置空閑是否 否否是是是否返回開始圖 系統(tǒng)狀態(tài)處理流程圖29部分程序如下:switch(Status)case RECORD:if(FS_GetUnusedSecNum() 1) // 檢測(cè)是否超出 SD 卡容量范圍SACM_DVR1600_Stop()。 Status = IDLE。case PLAY:if(FS_CheckFileEnd()) // 檢測(cè)當(dāng)前語(yǔ)音是否播放完畢SACM_DVR1600_Stop()。FS_CloseOpenFile()。Status = IDLE。 按鍵掃描程序系統(tǒng)使用 1024Hz 時(shí)基中斷對(duì) IOA 口低八位進(jìn)行掃描,并進(jìn)行去抖、長(zhǎng)短按鍵判斷等工作。時(shí)基中斷中的按鍵掃描服務(wù)程序采用了狀態(tài)機(jī)的形式對(duì)按鍵狀態(tài)進(jìn)行判斷。使用變量 KeyScanState 記錄當(dāng)前按鍵的掃描狀態(tài),并對(duì)掃描狀態(tài)進(jìn)行計(jì)時(shí),通過判斷計(jì)時(shí)變量 KeyCount 的值來判斷按鍵的類型 KeyState(短按鍵、長(zhǎng)按鍵等)。 通常狀況下,沒有鍵按下,KeyScanState 處于 First 狀態(tài)。當(dāng)有鍵被按下后,KeyScanState 便進(jìn)入 Debounce 去抖狀態(tài),此時(shí) KeyCount 開始每 1/102430秒計(jì)時(shí)累加一次。當(dāng) KeyCount 超過去抖規(guī)定的時(shí)間后(通常為幾十毫秒),便進(jìn)入 Repeat 狀態(tài),這時(shí)候可以認(rèn)為一個(gè)短按鍵被按下(KeyState = SKey )。此時(shí)如果檢測(cè)到鍵抬起,則進(jìn)入 ReleaseDebounce 狀態(tài),對(duì)按鍵抬起進(jìn)行去抖,去抖成功后則可以認(rèn)為形成了一個(gè)抬起的短按鍵(KeyState = SKeyRelease)。相反,如果在 Repeat 狀態(tài)下超過了一個(gè)長(zhǎng)按鍵規(guī)定的時(shí)間(1 秒)后按鍵仍未抬起,則認(rèn)為一個(gè)長(zhǎng)按鍵被按下(KeyState = LKey),此時(shí)進(jìn)入 AfterLKey 狀態(tài),無需再進(jìn)行計(jì)時(shí)操作,只需等待按鍵抬起即可。當(dāng)按鍵抬起時(shí),則從 AfterLKey 狀態(tài)進(jìn)入 ReleaseDebounce 狀態(tài),去抖后得到一個(gè)抬起的長(zhǎng)按鍵(KeyState = LKeyRelease)。按鍵掃描程序提供如下 API 函數(shù)按鍵功能:void KeyScan_Init()。功 能:按鍵掃描初始化。調(diào)用該函數(shù)將同時(shí)初始化按鍵掃描使用的 I/O 口。void DrvKeyInit(void)*P_KEY_Dir amp。= ~KEY_PORT_MASK。*P_KEY_Attrib amp。= ~KEY_PORT_MASK。if KEY_COM*P_KEY_Buffer amp。= ~KEY_PORT_MASK。else*P_KEY_Buffer |= KEY_PORT_MASK。endifunsigned int KeyScan_GetKey(unsigned int *KeyType)。31功 能:該函數(shù)將返回當(dāng)前按鍵的鍵值,并通過入口參數(shù) KeyType 返回該按鍵的類型。unsigned int KeyScan_GetKey(unsigned int *KeyType){unsigned int Key。if(C_NullKey == ui_KeyState)Key = C_Null。elseKey = ui_KeyID。*KeyType = ui_KeyState。if(C_KeyStateFirst == ui_KeyScanState){ui_KeyID = C_Null。ui_KeyState = C_NullKey。}return(Key)。 語(yǔ)音錄 /放在 SD 卡上的實(shí)現(xiàn) 在語(yǔ)音錄/放的過程中,存儲(chǔ)/讀取語(yǔ)音資源主要是調(diào)用F_USER_DVR1600_WriteData和F_USER_DVR1600_GetData兩個(gè)函數(shù)實(shí)現(xiàn)的。通過自行定義這兩個(gè)函數(shù),即可將語(yǔ)音庫(kù)錄制的語(yǔ)音資料存儲(chǔ)至SD卡,或從SD卡讀取語(yǔ)音資料給語(yǔ)音庫(kù)解碼播放。 F_USER_DVR1600_WriteData函數(shù)主要完成存儲(chǔ)錄音數(shù)據(jù)至用戶存儲(chǔ)器的作用。這里需要調(diào)用“ 向語(yǔ)音文件寫入多個(gè) word數(shù)據(jù)的函數(shù)”FS_WritingFile()以完成此功能。32F_USER_DVR1600_GetData 函數(shù)主要完成從用戶存儲(chǔ)器讀取語(yǔ)音資料至緩沖區(qū)的作用。這里,需要調(diào)用“從語(yǔ)音文件中讀取多個(gè) word 數(shù)據(jù)的函數(shù)”FS_ ReadingFile ()以完成從 SD 卡中讀取數(shù)據(jù)。部分程序如下:F_USER_DVR1600_GetData: Adr:R1。 Length:R2push r1, r5 to [sp]push r2 to [sp]push r1 to [sp]call _FS_ReadingFilesp += 2pop r1, r5 from [sp]RETF。F_USER_DVR1600_WriteData: Adr:R1。 Length:R2pus
點(diǎn)擊復(fù)制文檔內(nèi)容
規(guī)章制度相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1