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

正文內(nèi)容

基于mega128的mp3播放系統(tǒng)(編輯修改稿)

2025-07-16 18:43 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 Void mp3_port_init(){ spi_init()。 MP3_DDR|=MP3_DATA_CS|MP3_CMD_CS|MP3_DATA_REST。 MP3_DDRamp。=~MP3_DATA_REQ。 MP3_PORT|= MP3_DATA_CS|MP3_CMD_CS|MP3_DATA_REST| MP3_DATA_REQ。}Void spi_init(){ DDRB=0XBF。 SPCR=0X53。 SPSR=0X01。}第二步,對(duì) VS1003 進(jìn)行復(fù)位和寄存器的設(shè)置,這幾個(gè)步驟在系統(tǒng)啟動(dòng)的時(shí)候會(huì)執(zhí)行一遍,在音樂開始播放的時(shí)候,也要執(zhí)行這個(gè)步驟,來清除上次的設(shè)置,并初始化相關(guān)寄存器。define MP3Reset(){MP3_PORTamp。=~MP3_DATA_REST。delay_ms(10)。MP3_PORT=0XFF。}硬復(fù)位很簡(jiǎn)單,只要把 VS1003 的 RST 引腳拉低一定時(shí)間(,),然后再置高電平就實(shí)現(xiàn)了硬復(fù)位。這里采用宏定義的形式來實(shí)現(xiàn): Void vs1003_Reset(){ while(1){ if(PINBamp。MP3_DATA_REQ){ vs1003_data_write(0x00)。 break。}} ResetDecodeTime()。 vs1003_cmd_write(0x00,0x0804)/delay_us(15000。 }軟復(fù)位先等待 VS1003空閑,然后設(shè)置 SCI_MODE(0X00)寄存器的 bit2 為 1,實(shí)現(xiàn) VS1003的軟復(fù)位。這里在軟復(fù)位之前,還對(duì) VS1003的解碼時(shí)間進(jìn)行了清空操作,以確保上次解碼的時(shí)間被清除掉。 void vs1003_init(){ uchar t。 if(vs1003epm[0]15) { for(t=0。t5。t++) { vs1003epm[t]=vs1003ram[t]。}}vs1003_cmd_write(0x00,0x0800)。set1003()。vs1003_cmd_write(0x03,0x6000)。}在硬復(fù)位和軟復(fù)位之后,就開始對(duì) VS1003 的內(nèi)部寄存器進(jìn)行設(shè)置:包括對(duì)模式(0x00)、音量(0x0b)、音調(diào)(0x03)、時(shí)鐘(0x03)的設(shè)置。此函數(shù)中的 vs1003 epm和 vs1003 ram數(shù)組是保存音效的寄存器數(shù)組。前者保存在 eeprom,使得用戶設(shè)置的音效再掉電后可以保存;后者保存在 SRAM 中,使得用戶可以反復(fù)操作,兩者之間是相互映射的。音效和音量的設(shè)置通過函數(shù) set1003 來實(shí)現(xiàn)。以上介紹了 VS1003 的初始化過程,在完成以上的操作后,就可以向 VS1003 中直接放入音頻數(shù)據(jù)了,然后 VS1003 就會(huì)開始音頻解碼,并且播放音樂了。 存儲(chǔ)部分驅(qū)動(dòng)程序設(shè)計(jì)上電延時(shí)等待上電完成發(fā)送74個(gè)脈沖發(fā)送復(fù)位命令CMD 0發(fā)送激活命令 CMD 1關(guān)CRC,設(shè)置扇區(qū)字節(jié)數(shù)結(jié)束SD 卡存儲(chǔ)了系統(tǒng)文件非常重要的信息,如果 SD 卡驅(qū)動(dòng)出現(xiàn)問題,將直接導(dǎo)致系統(tǒng)崩潰(無法開機(jī)),所以,SD 卡的驅(qū)動(dòng)對(duì)系統(tǒng)來說是至關(guān)重要的,只要 SD 卡成功地初始化了,后面的處理就相對(duì)簡(jiǎn)單,所以關(guān)鍵在于初始化。SD 卡有兩個(gè)可選的通信協(xié)議:SD 模式和 SPI 模式。 SD 模式是 SD 卡標(biāo)準(zhǔn)的讀/寫方式,選擇 SPI 模式讀取 SD 卡。因?yàn)?SD 卡在上電初期自動(dòng)進(jìn)入 SD 總線模式,在此模式下向 SD 卡發(fā)送復(fù)位命令 CMD 0。如果 SD 卡在接收復(fù)位命令過程中 CS 低電平有效,則進(jìn)入 SPI 模式,否則工作在 SD 總線模式。如圖:在 SD 卡初始化時(shí)注意 SPI 時(shí)鐘頻率一定不要超過 400 kHz,在初始化之后則可以提高到25MHz。具體的 SD 卡初始化函數(shù)如下:void SD_init(void){ uchar retry,temp。 uchar i。 MMC_PORTamp。=~MMC_CS_PIN。SPI_SetSpeed(0)。 delay_us(250)。 for(i=0。i0x0f。i++) { Write_Byte_SPI(0XFF)。} retry = 0。do{ temp=SD_Write_Command(0,0)。retry++。if(retry ==100) return 0xff。}while(temp!=1)。retry = 0。do{ temp=SD_Write_Command(1,0)。retry++。if(retry ==100)。}while(temp!=0)。retry = 0。SD_Write_Command(59,0)。SD_Write_Command(16,512)。MMC_PORT|=MMC_CS_PIN。SPI_SetSpeed(1)。return(0)。} 紅外遙控接收程序設(shè)計(jì)紅外接收模塊初始化等待紅外信號(hào)(INIT0)記錄紅外信號(hào)數(shù)據(jù)解碼數(shù)據(jù)利用串口將單片機(jī)從一體化紅外接收器接收到的紅外遙控鍵值發(fā)送到計(jì)算機(jī)上,通過計(jì)算機(jī)的串口助手觀察接收到的數(shù)據(jù)。編程過程中,我們利用單片機(jī)的外部中斷0口進(jìn)行檢測(cè),一旦檢測(cè)到有紅外遙控信號(hào)出現(xiàn),則程序進(jìn)入外部中斷處理程序,在處理數(shù)據(jù)過程中關(guān)閉外部中斷,直到接收完數(shù)據(jù),再將外部中斷打開。紅外遙控的數(shù)據(jù)接收主要在外部中斷函數(shù)中進(jìn)行處理:處理過程為:當(dāng)有遙控鍵值發(fā)送的時(shí)候,紅外一體化接收器的脈沖信號(hào)輸出腳發(fā)生一個(gè)下降沿的電平變化,外部中斷采用下降沿出發(fā)的方式接收到由外部中斷事件發(fā)生,程序進(jìn)入外部中斷處理函數(shù),首先關(guān)閉外部中斷,然后根據(jù)一體化接收器脈沖信號(hào)輸出引腳的高低電平變化時(shí)間判斷紅外遙控發(fā)送的數(shù)據(jù),共有4個(gè)字節(jié)的數(shù)據(jù),處理完這4個(gè)字節(jié)數(shù)據(jù)后,利用單片機(jī)的串口將數(shù)據(jù)發(fā)送到計(jì)算機(jī)。如圖:具體程序代碼如下:Void INT_Init(void){ MCUCR |= (1 ISC01)。 //選擇外部中斷0,下降沿觸發(fā)中斷 GICR |= (1 INT0)。 //使能外部中斷0 GIFR |= (1 INTF0)。 //清除INT0中斷標(biāo)志位} ISR(INT0_vect){ unsigned char i,j,k = 0,addr[4] = {0}。 GICR = 0x00。 //禁止外部中? 關(guān)閉外部中斷,開始接受數(shù)據(jù) for(i = 0。i 14。i++) { Delayus(400)。 if(PIND amp。 (1 PD2)) //9MS內(nèi)有高電平,則判斷為干擾,退出處理程序 { GICR |= (1 INT0)。 //使能外部中斷4return。}} while(!(PIND amp。 (1 PD2)))。 //等待9ms低電平過去 for(i = 0。i 4。i++) { for(j = 0。j 8。j++) { while(PIND amp。 (1 PD2))。 // while(!(PIND amp。 (1 PD2)))。 //等待變高電平 while(PIND amp。 (1 PD2)) //計(jì)算高電平時(shí)間 { Delayus(100)。 k++。 if(k = 30) //高電平時(shí)間過長(zhǎng),則退出處理程序 { GICR |= (1 INT0)。 //使能外部中斷 return。 } } addr[i] = addr[i] 1。 //接受一位數(shù)據(jù) if(k = 8) { addr[i] = addr[i] | 0x80。 //,則為數(shù)據(jù)1 } k = 0。 //計(jì)時(shí)清零 } } LCD 顯示接口驅(qū)動(dòng)程序設(shè)計(jì) 如圖:。是 LCD 顯示程序的本分框圖。 LCD 模塊初始化字符顯示函數(shù)漢字顯示函數(shù)圖片顯示函數(shù)清屏函數(shù)外部程序調(diào)用LCD 顯示是本系統(tǒng)人機(jī)交互界面的核心部分,本系統(tǒng)絕大部分信息都是通過 LCD 來實(shí)現(xiàn)與用戶交互的,而且在系統(tǒng)調(diào)試的時(shí)候,LCD 顯示的實(shí)現(xiàn)也能該系統(tǒng)調(diào)試帶來很大的方便。在系統(tǒng)開機(jī)之后,將會(huì) LCD 模塊初始化,在初始化之后,LCD 模塊的各種高層應(yīng)用函數(shù)就都可以調(diào)用了。通過外部程序調(diào)用這些高層應(yīng)用函數(shù),就輸出所要顯示的各種信息了。該 LCD 通過5根線與單片機(jī)通信,控制簡(jiǎn)單。第一步實(shí)現(xiàn)的就是對(duì) LCD 的初始化,否則其他高層應(yīng)用函數(shù)都無法實(shí)現(xiàn)。LCD 初始化代碼如下:void LCD_init(){ DDRC|=0XFC。 LCD_SDA=0。LCD_SCK=0。 LCD_RS=0。LCD_RST=1。LCD_CS=1。 LCD_LED=0。LCD_RST=0。 delay_ms(10)。 Wirte_d(0xae)。 Wirte_d(0xa1)。 Wirte_d(0xc8)。 Wirte_d(0xa2)。 Wirte_d(0x2f)。 Wirte_d(0x22)。 Wirte_d(0x81)。 Wirte_d(0x18)。 delay_ms(10)。 Cleardisplay(4)。} 從上面的程序可以看出:第一步,現(xiàn)對(duì) LCD 與單片機(jī)相連的接口初始化,把這些接口全部設(shè)置成輸出;第二步,對(duì) LCD 進(jìn)行硬件復(fù)位(拉低 RST 線),在硬復(fù)位之后,開始對(duì) LCD 模塊內(nèi)部的寄存器進(jìn)行操作,完成 LCD 的一系列初始化過程;第三步,開啟 LCD 的顯示,然后執(zhí)行清屏操作,這樣就完成了 LCD 的初始化。在完成 LCD 的初始化之后,關(guān)于 LCD的各種高層應(yīng)用函數(shù)就都可以操作了。關(guān)于字符顯示函數(shù),函數(shù)先設(shè)置字符顯示地址,然后寫入點(diǎn)陣數(shù)據(jù),從而實(shí)現(xiàn)字符的顯示。Asc2 為 ASCII 字符的點(diǎn)陣數(shù)據(jù)存儲(chǔ)數(shù)組。該數(shù)組被定義在 中。參數(shù) chr 要減去 32 ,因?yàn)?32 是第一個(gè) ASCII 字符“空格”的 ASCII 編碼,對(duì)輸入的字符必須減去這個(gè)偏移量,得到在Asc2 數(shù)組中的絕對(duì)地址,從而去得所需要的點(diǎn)陣數(shù)據(jù)。在取得點(diǎn)陣數(shù)據(jù)之后,就把這些數(shù)據(jù)按順序?qū)懭?LCD 的 GRAM 中,從而實(shí)現(xiàn)字符的顯示。 字符顯示函數(shù)的實(shí)現(xiàn)代碼: void Show_char(unsigned char x,unsigned char y,unsigned char chr){ unsigned char t。 Set_page(2*x)。 Set_column(y)。 for(t=0。t12。t++) { if(t6) { Set_page(2*x+1)。 Set_column(y)。}Write_data(asc2[chr32][t])。}}外部程序可以很方便的調(diào)用這些 LCD顯示高層應(yīng)用函數(shù),從而實(shí)現(xiàn)系統(tǒng)信息的輸出,實(shí)現(xiàn)人機(jī)交互。 FM收音模塊程序設(shè)計(jì) TEA 5767 模塊的驅(qū)動(dòng)程序框圖所示,如圖:。因?yàn)檫@里使用的是 AVR 的硬件 I2C 總線和 TEA5767 模塊通信,所以,第一步要做的是對(duì) I2C 總線初始化。在完成初始化之后,在對(duì) TEA5767 的相關(guān)寄存器(包括鎖相環(huán)、頻段、搜索模式、靜音等)進(jìn)行設(shè)置。完成這部之后,TEA5767 就開始正常工作了。外部程序通用模塊提供的幾個(gè)高層應(yīng)用函數(shù),實(shí)現(xiàn)對(duì) TEA5767 模塊的控制。 硬件I2C總線初始化初始化TEA5767手動(dòng)調(diào)臺(tái)前臺(tái)搜索自動(dòng)調(diào)臺(tái)外部程序調(diào)用 根據(jù)程序流程圖,把硬件 I2C 的初始化和 TEA5767 的初始化和在一起,通過函數(shù) radio_init實(shí)現(xiàn)。代碼如下:void radio_init(){ DDRCamp。=0XFC。 PORTC|=0X03。 TEA5767_INIT()。 read5767()。 iF(Ch_Value[sCh_Cho]=76000amp。amp。Ch_Value[sCh_Cho]18000) set_frequency(Ch_Value[sCh_Cho])。 else{ set_freq= Ch_Value[sCh_Cho]。 set_frequency(set_freq)。} }radio_init 函數(shù)先對(duì) I/O 口初始化,接著調(diào)用 TEA5767_INIT 函數(shù),實(shí)現(xiàn)硬件 I2C 的初始化和對(duì) TEA5767 寄存器的設(shè)置。代碼如下:unsigned char TEA5767_INIT(void){ TWBR=0X5C。 TWCR=(1TWEN)。 senddata[0]=0x29。 senddata[1]=0xff。 senddata[2]=0x60。 if(Adc_Level4)Adc_Level=0。if(Ch_Num30) Ch_Num=0。if(Ch_Cho 30) Ch_Cho =0sCh_Num=Ch_Num。sCh_Cho=Ch_Cho。if(JPUS!=JPSamp。amp。JPUS!=USA)JPUSUSA。senddata[3]=JPUS。senddata[4]=0x00。return(set5767())。
點(diǎn)擊復(fù)制文檔內(nèi)容
外語(yǔ)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1