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

正文內(nèi)容

應(yīng)用電子技術(shù)專(zhuān)業(yè)畢業(yè)論文-基于stc12c5a60s2與vs1003音頻播放器的研究-資料下載頁(yè)

2025-01-18 17:00本頁(yè)面
  

【正文】 g—endian:也稱(chēng)作“大頭為序”或“大端模式”,字節(jié)由最高位向最低位依次存放,高位在前。amp。Little—endian:也稱(chēng)作“小頭為序”或“小端模式”,字節(jié)由最低位享最高位依次存放,低位在前,高位在后。在進(jìn)行數(shù)據(jù)操作的時(shí)候一定要注意大小端存放格式,否則會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤。下面是讀數(shù)據(jù)時(shí)的小端轉(zhuǎn)為大端函數(shù)。unsigned long lb2bb(unsigned char *dat,unsigned char len)//小端轉(zhuǎn)為大端{(lán)unsigned long temp=0。unsigned long fact=1。unsigned char i=0。for(i=0。ilen。i++){ temp+=dat[i]*fact。 fact*=256。}return temp。} 尋找BPB所在扇區(qū)SD存儲(chǔ)卡中BPB不一定存放在0扇區(qū),有時(shí)候我們需要通過(guò)MBR來(lái)找到BPB在那個(gè)扇區(qū)。下面是在判定0扇區(qū)是否是BPB,不是BPB就在MBR中找到BPB所在扇區(qū)。unsigned long FAT32_FindBPB() //尋找BPB所在的扇區(qū)號(hào){MMC_Init()。 //SD儲(chǔ)存卡初始化FAT32_ReadSector(0,FAT32_Buffer)。if(FAT32_Buffer[0]!=0xeb)return lb2bb(((((structPartSector *)(FAT32_Buffer))Part[0]).StartLBA),4)。elseReturn 0。}判定讀到的0扇區(qū)數(shù)據(jù)的第一字節(jié)是否為0XEB,如果是就將數(shù)據(jù)強(qiáng)制為MBR結(jié)構(gòu)體數(shù)據(jù)類(lèi)型提取當(dāng)中的第一分區(qū)數(shù)據(jù),通過(guò)大端轉(zhuǎn)小端函數(shù)轉(zhuǎn)換得到DBR的扇區(qū)號(hào)。 FAT32文件系統(tǒng)初始化單片機(jī)在使用FAT32文件系統(tǒng)對(duì)文件進(jìn)行操作前需要將以后每次操作所需要重要的參數(shù)進(jìn)行記錄,這樣可以?xún)?yōu)化程序。void FAT32_Init(struct FAT32_Init_Arg *arg){struct FAT32_BPB *bpb。bpb=(struct FAT32_BPB *)(FAT32_Buffer)。//將數(shù)據(jù)緩沖區(qū)指針轉(zhuǎn)為struct FAT32_BPB型指針argBPB_Sector_No=FAT32_FindBPB()。//FAT32_FindBPB()可以返回BPB所在的扇區(qū)號(hào)argTotal_Size=FAT32_Get_Total_Size()。//FAT32_Get_Total_Size()可以返回磁盤(pán)的總?cè)萘?,單位是兆argFATsectors=lb2bb((bpbBPB_FATSz32),4)。//裝入FAT表占用的扇區(qū)數(shù)到FATsectors中argFirstDirClust=lb2bb((bpbBPB_RootClus),4)。//裝入根目錄簇號(hào)到FirstDirClust中argBytesPerSector=lb2bb((bpbBPB_BytesPerSec),2)。//裝入每扇區(qū)字節(jié)數(shù)到BytesPerSector中argSectorsPerClust=lb2bb((bpbBPB_SecPerClus),1)。//裝入每簇扇區(qū)數(shù)到SectorsPerClust中argFirstFATSector=lb2bb((bpbBPB_RsvdSecCnt),2)+argBPB_Sector_No。//裝入第一個(gè)FAT表扇區(qū)號(hào)到FirstFATSector中argRootDirCount=lb2bb((bpbBPB_RootEntCnt),2)。//裝入根目錄項(xiàng)數(shù)到RootDirCount中argRootDirSectors=(argRootDirCount)*329。//裝入根目錄占用的扇區(qū)數(shù)到RootDirSectors中argFirstDirSector=(argFirstFATSector)+(bpbBPB_NumFATs[0])* (argFATsectors)。//裝入第一個(gè)目錄扇區(qū)到FirstDirSector中argFirstDataSector=(argFirstDirSector)+(argRootDirSectors)。//裝入第一個(gè)數(shù)據(jù)扇區(qū)到FirstDataSector中}將數(shù)據(jù)緩存區(qū)的數(shù)據(jù)依據(jù)對(duì)應(yīng)的功能放置到對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)體中。 FAT32讀文件函數(shù)FAT32文件系統(tǒng)在讀取數(shù)據(jù)時(shí)需要SD存儲(chǔ)卡的操作函數(shù),在本章中主要介紹FAT32文件系統(tǒng)在單片機(jī)中的實(shí)現(xiàn)方式。FAT32文件系統(tǒng)讀文件到緩存區(qū)函數(shù):uchar *FAT32_ReadSector(ulong LBA,uchar *buf)//FAT32中讀取扇區(qū)的函數(shù){ MMC_get_data_LBA(LBA,512,buf)。 return buf。}FAT32讀函數(shù)中MMC_get_data_LBA函數(shù)是SD存儲(chǔ)卡接口函數(shù)中定義的一個(gè)讀取指定扇區(qū)的設(shè)定字節(jié)數(shù)據(jù)到緩存區(qū)函數(shù),這個(gè)函數(shù)在后章詳細(xì)介紹。第5章 主要軟件設(shè)計(jì)整個(gè)系統(tǒng)只要在軟件的支持下才能正常工作,在上章中略簡(jiǎn)的介紹了單片機(jī)中FAT32文件系統(tǒng)的軟件設(shè)計(jì),在此之上還需要其他程序的輔助才能完整的完成MP3文件播放功能,下面將從MP3文件的傳輸過(guò)程依次介紹各部分的軟件實(shí)現(xiàn)。 MP3音頻文件讀取播放相關(guān)軟件設(shè)計(jì)MP3音頻文件存放在SD儲(chǔ)存卡中,通過(guò)單片機(jī)讀取音樂(lè)數(shù)據(jù)再發(fā)送到VS1003中解碼播放。MP3音頻數(shù)據(jù)大致流向是SD到單片機(jī)緩存區(qū)在到VS1003中,下面按照數(shù)據(jù)傳輸順序依次介紹所需函數(shù)。 SD儲(chǔ)存卡寫(xiě)命令對(duì)SD存儲(chǔ)卡進(jìn)行任何操作時(shí)都需要其寫(xiě)入一定的命令,相應(yīng)的命令決定不同功能,本系統(tǒng)中SD存儲(chǔ)卡使用SPI數(shù)據(jù)傳送方式,下面是單片機(jī)對(duì)SD存儲(chǔ)卡寫(xiě)命令所需的函數(shù)進(jìn)行介紹。SD存儲(chǔ)卡命令長(zhǎng)度為6個(gè)字節(jié),SPI模式下數(shù)據(jù)是以位傳輸?shù)?,在?xiě)命令時(shí)需要發(fā)送48位數(shù)據(jù),數(shù)據(jù)發(fā)送量、發(fā)送次數(shù)都比較多。在本設(shè)計(jì)中采用一個(gè)字節(jié)為一個(gè)單位發(fā)送數(shù)據(jù),增加程序的靈活性。寫(xiě)一個(gè)字節(jié)數(shù)據(jù)到SD存儲(chǔ)卡:void Write_Byte_MMC(unsigned char value){unsigned char i。for (i=0。i8。i++){if (((value(7i))amp。0x01)==0x01) //對(duì)數(shù)據(jù)進(jìn)行低位寫(xiě)入SPI_DI=1。else SPI_DI=0。SPI_SCL=0。if(Init_Flag)delay(8)。SPI_SCL=1。if(Init_Flag)delay(8)。}}將要發(fā)送的數(shù)據(jù)最低位發(fā)送到SD存儲(chǔ)卡,然后依次將高位向低位一個(gè)位,再次發(fā)送最低位。如此發(fā)送8次,完成一個(gè)字節(jié)的發(fā)送。寫(xiě)命令就是將需要被寫(xiě)入的6字節(jié)命令發(fā)送給SD存儲(chǔ)卡,上面完成了一個(gè)字節(jié)的寫(xiě)入,在下面寫(xiě)命令函數(shù)中調(diào)用6次寫(xiě)字節(jié)函數(shù)就完成了SD存儲(chǔ)卡的命令寫(xiě)入。unsigned char Write_Command_MMC(unsigned char *CMD){unsigned char tmp。unsigned char retry=0。unsigned char i。SPI_CS=1。Write_Byte_MMC(0xFF)。SPI_CS=0。for (i=0。i0x06。i++){Write_Byte_MMC(*CMD++)。 //發(fā)送6字節(jié)命令到SD存儲(chǔ)卡}Read_Byte_MMC()。do{ tmp = Read_Byte_MMC()。 //SD存儲(chǔ)卡應(yīng)答 retry++。}while((tmp==0xff)amp。amp。(retry100))。 //如果為0XFF重新寫(xiě)return(tmp)。} SD儲(chǔ)存卡初始化上電后,SD存儲(chǔ)卡自動(dòng)進(jìn)入SD模式。STC12C5A60S2單片機(jī)首先要發(fā)送延時(shí)序列。這個(gè)序列是一個(gè)連續(xù)的邏輯“1”流,序列的長(zhǎng)度最大為1ms,序列等于74個(gè)時(shí)鐘長(zhǎng)度或電源斜率上升時(shí)間,本來(lái)在64個(gè)時(shí)鐘之后,卡就應(yīng)該進(jìn)入通訊就緒,增加的10個(gè)時(shí)鐘以消除上電同步問(wèn)題。SD存儲(chǔ)卡上電延時(shí)74個(gè)時(shí)鐘周期后,在CS片選線為低電平的條件下,單片機(jī)向SD存儲(chǔ)卡發(fā)送復(fù)位命令CMD0,就可以SD存儲(chǔ)卡進(jìn)入SPI接口模式下的ldle狀態(tài)。接著STC12C5A60S2單片機(jī)向SD存儲(chǔ)卡發(fā)送CMD1命令,當(dāng)接收到SD存儲(chǔ)卡的響應(yīng)為0X00時(shí),說(shuō)明SD存儲(chǔ)卡已經(jīng)準(zhǔn)備好接收讀寫(xiě)操作。SD存儲(chǔ)卡的初始化流程如圖51。圖51 SD存儲(chǔ)卡的初始化流程初始化函數(shù)如下:unsigned char MMC_Init() //SD卡初始化{ unsigned char retry,temp。 unsigned char i。 unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95}。 MMC_Port_Init()。 delay(200)。 Init_Flag=1。 for (i=0。i0x0f。i++) { Write_Byte_MMC(0xff)。 //發(fā)送至少74個(gè)時(shí)鐘信號(hào) }//向SD存儲(chǔ)卡發(fā)送CMD0 retry=0。 do { temp=Write_Command_MMC(CMD)。 retry++。 if(retry==200) { return(INIT_CMD0_ERROR)。 } } while(temp!=1)。 //應(yīng)答1,停止寫(xiě)入 CMD[0] = 0x41。 CMD[5] = 0xFF。 retry=0。 Do //為了能成功寫(xiě)CMD1,寫(xiě)100次 { temp=Write_Command_MMC(CMD)。 retry++。 if(retry==100) { return(INIT_CMD1_ERROR)。 } } while(temp!=0)。 //應(yīng)答0停止寫(xiě)入 Init_Flag=0。 SPI_CS=1。 //片選無(wú)效 return(0x55)。} 讀SD儲(chǔ)存卡單塊數(shù)據(jù)在需要讀取SD存儲(chǔ)卡中數(shù)據(jù)時(shí)候,讀SD存儲(chǔ)卡的命令為CMD17,讀數(shù)據(jù)塊命令有四個(gè)地址字節(jié),是要讀取的數(shù)據(jù)塊的地址,也就是扇區(qū)號(hào),在讀數(shù)據(jù)塊函數(shù)中要將扇區(qū)號(hào)轉(zhuǎn)換為四位字節(jié)地址。發(fā)送帶地址的讀命令,若SD存儲(chǔ)卡接收正確則有應(yīng)答00H,然后會(huì)送出所讀扇區(qū)的512字節(jié)數(shù)據(jù),圖52是讀單塊數(shù)據(jù)流程圖。圖52 讀單塊數(shù)據(jù)流程圖讀取SD存儲(chǔ)卡一個(gè)扇區(qū)的文件需要通過(guò)寫(xiě)命令的格式寫(xiě)入需要讀的扇區(qū)地址,寫(xiě)入讀取單塊命令與地址:unsigned char MMC_Start_Read_Sector(unsigned long sector){unsigned char retry。unsigned char CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}。unsigned char temp。EA=0。//邏輯塊地址轉(zhuǎn)為字節(jié)地址sector = sector 9。CMD[1] = ((sector amp。 0xFF000000) 24 )。CMD[2] = ((sector amp。 0x00FF0000) 16 )。CMD[3] = ((sector amp。 0x0000FF00) 8 )。retry=0。do{temp=Write_Command_MMC(CMD)。 //寫(xiě)入讀寫(xiě)地址retry++。if(retry==100){ return(READ_BLOCK_ERROR)。}}while(temp!=0)。while (Read_Byte_MMC() != 0xfe)。return 0。}從SD存儲(chǔ)卡中接收一個(gè)數(shù)據(jù),由于本設(shè)計(jì)中使用的SPI接口,所以在接收數(shù)據(jù)是需要一位一位的接收,在接收中需要將這些數(shù)據(jù)進(jìn)行還原,這里利用移位指令實(shí)現(xiàn)。下面為從SD存儲(chǔ)卡接收一字節(jié)函數(shù):unsigned char Read_Byte_MMC() //讀8位數(shù)據(jù){unsigned char temp=0。unsigned char i。for (i=0。i8。i++){SPI_DO=1。SPI_SCL=0。temp=(temp1)+(unsigned char )SPI_DO。 //按順序?qū)?位數(shù)據(jù)放入tempSPI_SCL=1。}return (temp)。}單片機(jī)通過(guò)FAT32機(jī)制對(duì)SD存儲(chǔ)卡讀取數(shù)據(jù)基本都是一個(gè)扇區(qū)的讀,為了函數(shù)的通用型,定義下面函數(shù)用于SD存儲(chǔ)卡中讀取設(shè)定長(zhǎng)度數(shù)據(jù)讀到緩存區(qū)。讀數(shù)據(jù)函數(shù):void MMC_get_data(unsigned int Bytes,unsigned char *buffer)//讀設(shè)定長(zhǎng)度的數(shù)據(jù)到緩存區(qū){unsigned int j。EA=0。for (j=0。((jBytes) amp。amp。 (readPos512))。j++){*buffer++ = Read_Byte_MMC()。readPos++。}if (readPos==512){Read_Byte_MMC()。 //讀取16位數(shù)據(jù)到緩存Read_Byte_MMC()。readPos=0。sectorPos++。LBA_Opened=0。SPI_CS=1。}}為了單片機(jī)能依據(jù)FAT32文件系統(tǒng)進(jìn)行數(shù)據(jù)的讀寫(xiě)所以在SD存儲(chǔ)卡函數(shù)設(shè)計(jì)中定義一個(gè)函數(shù)用
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1