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

正文內(nèi)容

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

2025-07-24 19:06 本頁面
 

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