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

正文內(nèi)容

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

2025-04-03 10:23 本頁面
 

【文章內(nèi)容簡介】 池即 28 可工作 ); LM386 輸出功率 100mW 以下 , SPY0030 約 700mW。圖 為音頻輸出電路圖。 圖 音頻輸出電路圖 SD 卡模組電路 在本系統(tǒng)中, SPCE061A 通過 SPI 總線實現(xiàn)對 SD 卡設備的訪問。 SD 卡模組同時提供卡插入檢測和寫保護檢測接口。圖 為 SD 卡模組電路圖。 29 圖 SD 卡模組電路圖 30 4 系統(tǒng)軟件設計 主程序設計 主程序 采用的是匯編語言和 C 語言混合編程 。主程序 流程圖 如 圖 。 31 圖 主程序流程圖 主程序完成系統(tǒng)初始化后檢測 SD 卡是否插入以及是否有寫保護,并有相應的語音提示,告知用 戶當前的系統(tǒng)狀態(tài)。如果 SD 卡正確插入,則系統(tǒng)根據(jù)用戶的不同按 系統(tǒng)初始化 檢測 SD 卡是否插入? 否 檢查 SD 卡是否寫保護? 置寫保護標志 播放 “SD 卡寫保護 ” 是 否 初始化 SD 卡 按鍵處理 系統(tǒng)狀態(tài)處理 是 播放 “ 注意 SD 卡沒有插入 ” 檢測 SD 卡是否插入? 否 是 播放 “ 就緒 ” 語音 提示 程序 開始 32 鍵進行錄 /放音控制。同時,在循環(huán)中對系統(tǒng)當前的狀態(tài)進行檢測,控制系統(tǒng)在錄制語音時不至于超出存儲器容量限制,或控制系統(tǒng)在放音時播放至文件尾部自動停止播放。 部分程序如下: 33 按鍵處理程序流程 按鍵處理程序中 , 當檢測到有 SD 卡寫保護 時,會播放 “ 卡有寫保護 ” 的提示音,對按鍵不做處理。按鍵處理流程圖如圖 。 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。 else FS_Init()。 // 沒有寫保護,執(zhí)行初始化操作 PlaySnd(VOICE_READY, DAC1 + DAC2)。 // 播放 就緒 // while(1) KeyProcess()。 // 按鍵處理 StatusProcess()。 // 系統(tǒng)狀態(tài)處理 SACM_DVR1600_ServiceLoop()。 // 錄 /放音服務 34 圖 按鍵處理流程圖 部分程序如下 : 當按下錄音鍵時,若為短按鍵且 SD 卡未滿,提示錄音開始并置錄音標志,開始錄音。“錄音”按鍵處理程初始化 判斷是否有寫保護標志 ? 否 判斷按鍵 Key3 錄音鍵 是 Key2 上一曲 鍵 Key1 下一曲 鍵 返回 開始 Key = KeyScan_GetKey(amp。KeyType)。 if(1 == WriteProtect) // 卡有寫保護,拒絕按鍵操作 if((C_SReleaseKeyState == KeyType) || (C_LReleaseKeyState == KeyType)) return。 switch(Key) 35 序的流程圖如圖 所示。圖 錄音鍵流程圖 部分程序如下 : 正在播放? 短按鍵? 是 是 停止播放,關閉讀取 SD 卡 系統(tǒng)狀態(tài)置空閑 SD 卡已 滿 ? 否 是 否 系統(tǒng)空閑? 否 啟動寫入 SD 卡,開始錄音 系統(tǒng)狀態(tài)置錄音 否 是 正在錄音? 結(jié)束錄音,錄音收尾 是 否 開始 返回 36 case C_Record: // Record if(C_SReleaseKeyState == KeyType) // 短按鍵,錄 /放音控制 if(PLAY == Status) SACM_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)。 37 當按下上一曲鍵,短按鍵(小于一秒)播放上一曲,長按鍵清除 SD 卡上所有錄音。 “ 上一曲 ” 按鍵處理程序的流程圖 如 圖 。 38 圖 上一曲鍵流程圖 部分程序如下 : 正在錄音? 正在播放? 是 判斷是否有文件 ? 結(jié)束放音 是 否 短按鍵? 否 否 是 長按鍵? 是 清除 SD 卡內(nèi)所有文件 系統(tǒng)狀態(tài)置空閑 讀取語音段,啟動聲音播放上一曲 系統(tǒng)狀態(tài)置播放 否 是 否 開始 返回 if(PLAY == Status) // 如果正在放音,則先停止播放 39 當按下下一曲鍵,短按鍵(小于一秒)播放下一曲,長按鍵停止放音。 “ 下一曲 ” 按鍵處理程序的流程圖如圖 。 SACM_DVR1600_Stop()。 FS_CloseOpenFile()。 else if(RECORD == Status) // 如果正在錄音則不處理 if(C_LReleaseKeyState == KeyType)//長按鍵,擦除所有語音段 FS_Init()。 Status = IDLE。 else if(C_SReleaseKeyState == KeyType)// 短按鍵播放上一曲 40 圖 下一曲鍵流程圖 部分程序如下 : 正在錄音? 當前有錄音片段? 是 是 停止播放 正在播放? 否 否 短按鍵? 否 長按鍵? 否 系統(tǒng)狀態(tài)置空閑 是 啟動聲音播放下一曲 系 統(tǒng)狀態(tài)置播放 否 是 是 開始 返回 41 系統(tǒng)狀態(tài)處理程序主要完成在錄音時判斷是否超出SD 卡容量限制,或者在放音時當前語音是否播放完畢。系統(tǒng)狀態(tài)流程圖如圖 。 檢查 SD 卡是否已滿? 是否正在錄音? 播放是否結(jié)束? 停止錄音 系統(tǒng)狀態(tài)置空閑 是否正在播放? 停止讀取 系統(tǒng)狀態(tài)置空閑 是 否 否 否 是 是 是 否 返回 開始 case C_Next: // Play Next if((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)// 短按鍵,播放下一曲 42 圖 系統(tǒng)狀態(tài)處理流程圖 部分程序如下: 按鍵掃描程序 系統(tǒng)使用 1024Hz 時基中斷對 IOA 口低八位進行掃描,并進行去抖、長短按鍵判斷等工作。 時基中斷中的按鍵掃描服務程序采用了狀態(tài)機的形式對按鍵狀態(tài)進行判斷。使用變量 KeyScanState 記錄當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。 43 前按鍵的掃描狀態(tài),并對掃描狀態(tài)進行計時,通過判斷計時變量 KeyCount 的值來判斷按鍵的類型 KeyState(短按鍵、長按鍵等)。 通常狀況下,沒有鍵按下, KeyScanState 處于 First狀態(tài)。當有鍵被按下后, KeyScanState 便進入 Debounce去抖狀態(tài),此時 KeyCount 開始每 1/1024 秒計時累加一次。當 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) 44 進入 ReleaseDebounce 狀態(tài),去抖后得到一個抬起的長按鍵( KeyState = LKeyRelease)。 按鍵掃描程序提供如下 API 函數(shù)按鍵功能: void KeyScan_Init()。 功 能:按鍵掃描初始化。調(diào)用該函數(shù)將同時初始化按鍵掃描使用的 I/O 口。 unsigned int KeyScan_GetKey(unsigned int *KeyType)。 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。 endif 45 功 能:該函數(shù)將返回當前按鍵的鍵值,并通過入口參數(shù)KeyType 返回該按鍵的類型。 語音錄 /放在 SD 卡上的實現(xiàn) 在語音錄 /放的過程中,存儲 /讀取語音資源主要是調(diào)用 F_USER_DVR1600_WriteData和F_USER_DVR1600_GetData兩個函數(shù)實現(xiàn)的。通過自行定義這兩個函數(shù),即可將語音庫錄制的語音資料存儲至 SDunsigned int KeyScan_GetKey(unsigned int *KeyType) { unsigned int Key。 if(C_NullKey == ui_KeyState) Key = C_Null。 else Key = ui_KeyID。 *KeyType = ui_KeyState。 if(C_KeyStateFirst == ui_KeyScanState) { ui_KeyID = C_Null。 ui_KeyState = C_NullKey。 } return(Key)。 46 卡,或從 SD卡讀取語音資料給語音庫解碼播放。 F_USER_DVR1600_WriteData函數(shù)主要完成存儲錄音數(shù)據(jù)至用戶存儲器的作用。這里需要調(diào)用 “ 向語音文件寫入多個 word數(shù)據(jù)的函數(shù) ”FS_Writing
點擊復制文檔內(nèi)容
教學課件相關推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1