[單片機課程設計]MCS51與SPI串行接口語音芯片連接
MCS-51與SPI串行接口語音芯片連接一、實驗目的(1) 進一步理解SPI串行總線傳輸協(xié)議。(2) 理解ISD4000系列語音芯片工作原理,放音、錄音控制過程。(3) 理解MCS-51與SPI總線外設(如ISD4000系列語音芯片)的硬件連接、讀寫方式。二、實驗設備與器材仿真器及附件、圖0-1所示實驗電路板各一套。三、實驗電路本實驗涉僅僅涉及實驗板上的U101、U103、U104、U401(ISD4002語音芯片)、U404(集成功率放大器),而與其他元器件無關。接通電源前,將JP103的1-2引腳短路,使ISD4002語音芯片的中斷輸出端引腳與MCS-51外中斷(P3.2)引腳相連。由于多數(shù)MCS-51芯片沒有內(nèi)置SPI串行總線接口部件,因此只能用軟件模擬SPI總線時序方式讀寫SPI總線接口器件。四、實驗原理(ISD4000系列語音芯片簡介)ISD4000系列語音芯片包括ISD4002、ISD4003、ISD4004三個子系列芯片,電源電壓為3V,單片錄音時間在216分鐘之間,音質(zhì)中上,廣泛用于公共汽車語音報站系統(tǒng)、移動及自動應答電話設備、語音復讀機等電子產(chǎn)品中。該系列語音芯片采用CMOS工藝,內(nèi)含振蕩器、防混淆濾波器、平滑濾波器、音頻放大器、自動靜噪及高密度多電平Flash ROM存貯器陣列。通過串行通信接口(SPI或Microwire總線協(xié)議)與微控制器(如MCS-51芯片)相連,所有操作均由微控制器控制。內(nèi)部采用多電平直接模擬量存儲技術, 每個采樣值直接存貯在片內(nèi)Flash ROM存貯器中,因此能逼真、自然地再現(xiàn)語音、音樂、音調(diào)等聲響效果,避免了一般固體錄音電路因量化和壓縮造成的量化噪聲和"金屬聲"??蛇x4.0,5.3,6.4,8.0kHz等多個采樣頻率,采樣頻率越低,錄放時間就越長(但音質(zhì)會略有下降),片內(nèi)信息存放在Flash ROM存貯器中,在斷電狀態(tài)下可保存100年(典型值),能反復錄音10萬次以上。(一) 主要參數(shù)ISD4000系列語音芯片主要參數(shù)如表13-1所示。表13-1 主要參數(shù)型號存儲時間(秒)最大段數(shù)信息分辯率(毫秒)采樣頻率(HZ)濾波器帶寬(HZ)控制碼+地址位長度ISD4002-1201206002008.0K3.4K5+11ISD4002-1801806003005.3k2.3k5+11ISD4002-2402406004004.0k1.7k5+11ISD4003-0424012002008.0K3.4K5+11ISD4003-0636012003005.3K2.3K5+11ISD4003-0848012004004.0K1.7K5+11ISD4004-0848024002008.0K3.4K8+16ISD4004-1696024004004.0K1.7K8+16(二) 封裝及引腳排列ISD4000系列語音芯片采用28引腳TSOP、PDIP或SOIC封裝方式,其中PDIP或SOIC封裝方式引腳排列如圖13-1所示。圖13-1 PDIP或SOIC封裝引腳排列引腳功能:VCCD芯片內(nèi)部數(shù)字電路電源引腳,VSSD芯片內(nèi)部數(shù)字電路地線引腳;VCCA芯片內(nèi)部模擬電路電源引腳,VSSA芯片內(nèi)部模擬電路地線引腳。為減小噪聲,芯片內(nèi)部模擬、數(shù)字電路具有各自的電源、地線總線,以方便在印制板上實現(xiàn)數(shù)字、模擬電路電源和地線分開走線,形成單點接地的布線規(guī)則。ANA IN+、ANA IN-分別是錄音輸入放大器的同相輸入端和反相輸入端。輸入放大器可用單端或差分方式之一驅(qū)動。采用單端驅(qū)動時,信號由耦合電容輸入,最大為32mV(峰峰值)。耦合電容與本端內(nèi)部的3K串聯(lián)電阻構(gòu)成的輸入阻抗決定了芯片頻帶的低端截止頻率。采用差分驅(qū)動時,最大為16mV(峰峰值)。XCLK外部采樣時鐘輸入端,可選的采樣頻率如表10所示。一般使用芯片內(nèi)部采樣頻率(在出廠前已調(diào)校,誤差在+1%以內(nèi)),除非對采樣精度要求很高。當不用外部采樣時鐘信號時, XCLK引腳必須接地。AM CAP自動靜噪輸入端。當錄音信號電平下降到內(nèi)部設定的某一閾值以下時,自動靜噪功能使信號衰弱,這樣有助于養(yǎng)活無信號(靜音)時的噪聲。一般情況系情況下,改引腳對地接1F電容,構(gòu)成內(nèi)部信號電平峰值檢測電路的一部分。檢出的峰值電平與內(nèi)部設定的閾值作比較,決定自動靜噪功能的翻轉(zhuǎn)點。大信號時,自動靜噪電路不衰減,靜音時衰減6dB。1F電容也影響自動靜噪電路對信號幅度的響應速度。當AM CAP引腳接VCCA時,則禁止自動靜噪。AUD OUT音頻輸出,可驅(qū)動5K的負載。MOSI命令及數(shù)據(jù)信息的串行輸入端。MIS0狀態(tài)信息的串行輸出端。SCLK串行時鐘輸入端,由SPI總線主設備(一般為MCU)提供。片選信號輸入端,輸入,低電平有效。當片選信號無效時,芯片處于待用狀態(tài),靜態(tài)電流典型值為1uA。中斷輸出端,漏極開路(OD)輸出,低電平有效。在放音(包括快進)、錄音操作過程中,遇到到段結(jié)束(EOM)、存儲器末尾(OVF)時,引腳輸出低電平并保持,直到SPI總線主設備向ISD芯片寫入新的命令。RAC行地址時鐘輸出端,漏極開路(OD)。每個RAC周期表示ISD存儲器的操作進行了一行(ISD4003系列中的存貯器有1200行)。該信號高電平時間為200ms,低電平為25ms??爝M模式下,RAC的218.75s是高電平,31.25s為低電平。該端可用于存儲管理技術。(三) 控制命令及SPI端口控制寄存器位ISD4000系列語音芯片控制命令如表13-2所示,SPI端口控制寄存器位含義如圖13-2所示。表13-2 控制命令指令5位控制碼<11位地址>操作摘要POWERUP00100<XXXXXXXXXXX>上電:等待TPUD后器件可以工作SET PLAY11100< A10-A0>從指定地址開始放音。必須后跟PLAY指令使放音繼續(xù)PLAY11110<XXXXXXXXXXX>從當前地址開始放音(直至EOM或OVF)SET REC10100<A10 -A0>從指定地址開始錄音。必須后跟REC指令錄音繼續(xù)REC10110<XXXXXXXXXXX>從當前地址開始錄音(直至OVF或停止)SET MC11101<A10 -A0>從指定地址開始快進。必須后跟MC指令快進繼續(xù)MC11111<XXXXXXXXXXX>執(zhí)行快進,直到EOM.若再無信息,則進入OVF狀態(tài)STOP 0X110<XXXXXXXXXXX>停止當前操作(C3沒有定義)STOP WRDN0X01X<XXXXXXXXXXX>停止當前操作并掉電(C3、C0沒有定義)RINT0X110<XXXXXXXXXXX>讀OVF和EOM標志(C3沒有定義)圖13-2 SPI端口控制寄存器位及含義1. 放音過程(1) 執(zhí)行上電命令(POWER UP)。(2) 延遲等待上電結(jié)束(當采樣頻率為8KHz時,上電延遲時間約為25mS)。(3) 執(zhí)行“SET PLAY”命令,設置放音段起始地址。錄音、放音段起始地址與每段最短時間及放音長度有關。例如,對ISD4002-120芯片來說,最多有600段(段地址編號為000599),每段最短錄音時間為200mS。如果每段記錄一個單音,長度為400mS(即每個單音占用兩段),則第n個單音對應的段地址為(n2)。(4) 執(zhí)行“PLAY”命令,從當前地址開始放音,遇到段結(jié)束標志EOM或存儲器末尾標志OVF時停止放音,同時引腳輸出低電平,指示當前段播放結(jié)束。當需要播放兩段或兩段以上時,如果段與段之間間隔很小時,可在上一段播放結(jié)束后,延遲一段時間(需通過試聽確定延遲時間的長短,一般為數(shù)十mS)后再播放下一段。放音過程如圖13-3(a)所示。在放音操作過程中,執(zhí)行“STOP”或“STOP WRDN”命令時,將終止當前放音操作。2. 錄音過程(1) 執(zhí)行上電命令(POWER UP)。(2) 延遲等待上電結(jié)束(當采樣頻率為8KHz時,上電延遲時間TPUD約為25mS)。(3) 再執(zhí)行上電命令(POWER UP)。(4) 延遲兩倍上電等待時間(即延遲2TPUD時間)。(5) 執(zhí)行“SET REC”命令,設置錄音段的起始地址。(6) 執(zhí)行“REC”命令,從當前地址開始錄音,直到出現(xiàn)存儲器末尾標志OVF信號。在錄音過程中,未錄到存儲器末尾時,就執(zhí)行“STOP”或“STOP WRDN”命令,將終止當前錄音操作,并產(chǎn)生EOM標志。因此,可利用這一特性在芯片上錄制多段語音信息??梢?,錄音過程與放音過程相似,只是每次錄音操作操作只能錄一段,如圖13-3(b)所示。圖13-3 放音、錄音流程(四) SPI總線接口時序及命令格式芯片支持8位、16位命令格式,傳輸時序如圖13-4所示,ISD4000系列語音芯片SPI總線參數(shù)如表13-3所示。從ISD4000系列語音芯片SPI總線時序可以看出:其SPI總線時序與SPI總線接口存儲器EEPROM 25C01/02/04兼容。在接收控制命令時,先接收LSB(這要求SPI總線控制器先輸出LSB);空閑時,SCLK為低電平,在SCLK上升沿鎖存器MOSI引腳上的信息。表13-3 ISD4000系列語音芯片SPI總線參數(shù)符號參數(shù)最小典型最大單位TSSS片選信號建立時間500nsecTSSH片選信號保持時間500nsecTDIS串行輸入數(shù)據(jù)DI建立時間200nsecTDIH串行輸入數(shù)據(jù)DI保持時間200nsecTPD輸出延遲500nsecTDF輸出延遲到高阻態(tài)500nsecTSSmin片選信號高電平時間1secTSCKhiSCLK 高電平時間400nsecTSCKlowSCLK低電平時間400nsecF0SCLK頻率1000kHz(a) 傳輸時序(b) 8位命令格式(c) 16位命令格式圖13-4 命令格式(五) 典型應用電路及與MCS-51的連接MCS-51芯片一般沒有內(nèi)置SPI總線部件,可通過軟件方式模擬SPI總線操作時序控制ISD4000系列語音芯片的操作,典型連接線路如圖13-5所示。圖13-5 與MCS-51芯片的典型連接(六) 參考驅(qū)動程序根據(jù)圖13-5連接方式,下面給出了與SPI模擬總線驅(qū)動程序、組合播放、從指定段連續(xù)播放、單段錄音有關的參考程序段,完整程序參閱磁盤文件實驗十三(ISDN4000系列語音驅(qū)動程序).ASM。MOSI BIT P1.5MISO BIT P1.6SCLK BIT P1.7ISDSS BIT P1.4;片選信號MIC_C BIT P1.3 ;功放電源控制,同時也作放音/錄音標志(0-放音、1-錄音)ISDBUF DATA 50H ;ISD語音芯片命令緩沖區(qū) ;50H單元存放命令碼(C4-C0)及段高3位地址(A10-A8) ;51H單元存放段低8位地址(A7-A0)ISDBUFSP DATA 52H ;播放指針TASK3 DATA 53H ;語音播放狀態(tài),b2-b0記錄放音或錄音狀態(tài)ISDTIME DATA 54H ;語音播放延遲時間XmtDat DATA 60H ;段緩沖區(qū)RECNO EQU 0F0H ;可錄音的最小段號;初始化外中斷INT0SETB IT0 ;下降沿觸發(fā)(采用查詢方式檢測);-從指定段連續(xù)播放初始化 CLR MIC_C ;設置放音標志 MOV ISDBUFSP, #0 ;設置播放的起始段號 MOV TASK3, #05H ;啟動標志(未上電標志)HERE1: LCALL ISD_RD_A ;調(diào)用逐段播放過程 MOV A, TASK3CJNE A, #0, HERE1SJMP $ ;虛擬等待;-段組合播放初始化 ;把待播放的段編號(一次最多可播放16段)裝入播放緩沖區(qū)內(nèi) ;當待播放的段號不足16時,在播放段后放0FFH,作為結(jié)束標志 MOV R0, #XmtDat MOV R0, #02h ;初始化語音段緩沖區(qū) INC R0 MOV R0, #01H INC R0 MOV R0, #22hINC R0 CLR MIC_C ;設置放音標志 MOV ISDBUFSP, #0 ;初始化播放指針 ;-段組合播放啟動 MOV TASK3, #05H ;啟動標志(未上電標志)HERE2: LCALL ISD_RD ;調(diào)用段組合播放過程 MOV A, TASK3 CJNE A, #0, HERE2SJMP $ ;虛擬等待 ;-單段錄音初始化 MOV R0, #XmtDat MOV R0, #xxh ;段地址送緩沖區(qū)首字節(jié) INC R0 MOV R0, #xx ;錄音時間送緩沖區(qū)第二字節(jié) SETB MIC_C ;設置錄音標志 ;-單段錄音過程啟動 MOV TASK3, #05H ;啟動標志(未上電標志)HERE3: LCALL ISD_WR ;調(diào)用單段錄音過程 MOV A, TASK3 CJNE A, #0, HERE3SJMP $ ;虛擬等待;把語音緩沖區(qū)語音段送IDS4000芯片播放子程序PROC ISD_RD;入口參數(shù):TASK3置為05H ;b2-b0記錄放音或錄音狀態(tài) ;000-空閑 ;001-執(zhí)行上電延遲(25ms) ;010-段播放延遲 ;011-段間延遲 ;101-未上電標志ISD_RD: JNB MIC_C, RUN ;錄音狀態(tài),不執(zhí)行! JMP EXIT ;退出RUN: MOV A, TASK3 ANL A, #07H ;保留標志位b2b0 CJNE A, #000B, NEXT1 ;b2b0為000,空閑 JMP EXIT ;退出NEXT1: CJNE A, #101B, NEXT2 ;b2b0為101,未上電,先執(zhí)行上電操作 ;執(zhí)行“POWER UP” (上電)命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #20H ;00100XXX,執(zhí)行上電操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 MOV ISDTIME, #5 ;延遲時間為5*5ms(即25ms) MOV TASK3, #1 ;進入上電延遲狀態(tài) JMP EXITNEXT2: CJNE A, #001B, NEXT3 ;b2b0為001,處于上電延遲期間,檢查延遲時間NEXT30: MOV A, ISDTIME JZ NEXT31 ;不是0,上電延遲時間未到,等待 SJMP EXITNEXT31: MOV A, #XmtDat ADD A, ISDBUFSP MOV R0, A MOV A, R0 ;取出待放音段編號 MOV B, #2 ;假設每一單音占用兩個最小段 MUL AB ;計算段首地址 MOV R0, #ISDBUF+1;語音命令緩沖首地址送R0 MOV R0, A ;段地址低8位送命令緩沖 DEC R0 MOV A, B ;段地址高位送A ORL A, #11100000B;形成地址控制碼11100(SET PLAY) MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;執(zhí)行PLAY命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV A, #0F0H ;11110XXX,執(zhí)行PLAY/REC命令 MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;開始放音 MOV TASK3, #02H ;b2b0置為010態(tài)(修改作業(yè)號) CLR IE0 ;清除INT0中斷標志(采用查詢方式確定段 ;播放是否已結(jié)束) SJMP EXITNEXT3: CJNE A, #2, NEXT4 ;b2b0置為010 ;屬于段播放期間延遲 JB IE0, NEXT41 ;INT0中斷無效,即未遇到EOF或VOF標志 SJMP EXIT ;等待NEXT41: CLR IE0 ;清除INT0中斷標志 INC ISDBUFSP ;指針加+1 MOV A, ISDBUFSP CJNE A, #16, NEXT42NEXT42: JC NEXT43 ;指針大于或等于16,緩沖區(qū)所有段已播放結(jié)束 SJMP NEXT441NEXT43: MOV A, #XmtDat ADD A, ISDBUFSP MOV R0, A MOV A, R0 ;取出將要播放的段編號 CJNE A, #0FFH, NEXT44 ;盡管指針<16,但緩沖區(qū)內(nèi)已經(jīng)沒有需要播放的段號NEXT441: MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #10H ;0001X XXX,執(zhí)行STOP WRDN命令,停止當前操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 SETB MIC_C ;關閉功率放大器電源 MOV TASK3, #0 ;將b2b0置為000,結(jié)束播放 SJMP EXITNEXT44: MOV TASK3, #3 ;進入段間延遲狀態(tài) MOV ISDTIME, #8 ;延遲時間為8*5ms(即40ms) SJMP EXITNEXT4: CJNE A, #3, EXIT ;b2b0處于011態(tài),屬于段間延遲 JMP NEXT30 ;處理方式與上電延遲相同EXIT: RETEND;把IDSN4000語音芯片內(nèi)的語音段逐一播放出來PROC ISD_RD_A;入口參數(shù):TASK3置為05H ;b2-b0記錄放音或錄音狀態(tài) ;000-空閑 ;001-執(zhí)行上電延遲(25ms) ;010-段播放延遲 ;011-段間延遲 ;101-未上電標志ISD_RD_A: JNB MIC_C, RUN ;錄音狀態(tài),不執(zhí)行! JMP EXIT ;退出RUN: MOV A, TASK3 ANL A, #07H ;保留標志位b2b0 CJNE A, #000B, NEXT1 ;b2b0為000,空閑 JMP EXIT ;退出NEXT1: CJNE A, #101B, NEXT2 ;b2b0為101,未上電,先執(zhí)行上電操作 ;執(zhí)行“POWER UP” (上電)命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #20H ;00100XXX,執(zhí)行上電操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 MOV ISDTIME, #5 ;延遲時間為5*50ms(即25ms) MOV TASK3, #1 ;進入上電延遲狀態(tài) JMP EXITNEXT2: CJNE A, #001B, NEXT3 ;b2b0為001,處于上電延遲期間NEXT30: MOV A, ISDTIME JZ NEXT31 ;不是0,上電延遲時間未到 SJMP EXIT ;退出,繼續(xù)等待NEXT31: MOV A, ISDBUFSP MOV B, #2 ;假設每一單音占兩個最小段 MUL AB ;計算段首地址 MOV R0, #ISDBUF+1;語音命令緩沖首地址送R0 MOV R0, A ;段地址低8位送命令緩沖 DEC R0 MOV A, B ;段地址高位送A ORL A, #11100000B;形成地址控制碼11100(SET PLAY) MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;執(zhí)行PLAY命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV A, #0F0H ;11110XXX,執(zhí)行PLAY命令 MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;開始放音 MOV TASK3, #02H ;b2b0置為010態(tài)(修改作業(yè)號) CLR IE0 ;清除INT0中斷 SJMP EXITNEXT3: CJNE A, #2, NEXT4 ;b2b0處于010態(tài),屬于段播放期間延遲 JB IE0, NEXT41 ;INT0中斷無效,即未遇到EOF或VOF SJMP EXIT ;等待NEXT41: CLR IE0 ;清除INT0中斷 INC ISDBUFSP ;指針加+1 MOV A, ISDBUFSP CJNE A, #0F0H, NEXT42NEXT42: JC NEXT43 ;指針>=F0H,退出 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #10H ;0001X XXX,執(zhí)行STOP WRDN命令,停止當前操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 SETB MIC_C ;關閉功率放大器電源 MOV TASK3, #0 ;將b2b0置為000,結(jié)束播放 SJMP EXITNEXT43: MOV TASK3, #3 ;進入段間延遲狀態(tài) MOV ISDTIME, #10 ;延遲時間為10*5ms(即50ms) SJMP EXITNEXT4: CJNE A, #3, EXIT ;b2b0置為011 ;屬于段間延遲 JMP NEXT30 ;處理方式與上電延遲相同EXIT: RETEND;從指定地址開始錄音(單段錄音)PROC ISD_WR ;從指定地址開始錄音(單段錄音);入口參數(shù):TASK3置為05H ;b2-b0記錄放音或錄音狀態(tài) ;000-空閑 ;001-執(zhí)行上電延遲(25ms) ;010-錄音過程的再上電延遲 ;011-錄音延遲 ;101-未上電標志ISD_WR: JB MIC_C, RUN ;非錄音狀態(tài),不執(zhí)行! JMP EXITRUN: MOV A, TASK3 ANL A, #07H ;保留標志位b2b0 CJNE A, #00H, NEXT1 ;b2b0為000,空閑 JMP EXITNEXT1: CJNE A, #101B, NEXT2 ;b2b0為101,未上電,先執(zhí)行上電操作 ;執(zhí)行“POWER UP” (上電)命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #20H ;00100XXX,執(zhí)行上電操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 MOV ISDTIME, #5 ;延遲時間為5*5ms(即25ms) MOV TASK3, #1 ;進入上電延遲狀態(tài) JMP EXITNEXT2: CJNE A, #001B, NEXT3 ;b2b0為001,處于上電延遲期間 MOV A, ISDTIME JZ NEXT31 ;不是0,上電延遲時間未到 SJMP EXIT ;退出,繼續(xù)等待NEXT31: ;再執(zhí)行“POWER UP” (上電)命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #20H ;00100XXX,執(zhí)行上電操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 MOV ISDTIME, #10 ;延遲時間為10*5ms(即50ms) MOV TASK3, #2 ;進入再上電延遲狀態(tài)(時間50ms) SJMP EXIT ;退出NEXT3: CJNE A, #010B, NEXT4 ;b2b0為010,處于再上電延遲期間 MOV A, ISDTIME JZ NEXT41 ;不是0,再上電延遲時間未到 SJMP EXIT ;退出,繼續(xù)等待NEXT41: MOV R0, #XmtDat MOV A, R0 CJNE A, #RECNO, NEXT42NEXT42: JNC NEXT43 ;小于允許錄音段地址,關閉電源退出 SJMP NEXT51NEXT43: MOV B, #2 ;假設前面每一單音占用兩個最小段 MUL AB ;計算段首地址 MOV R0, #ISDBUF+1;語音命令緩沖首地址送R0 MOV R0, A ;段地址低8位送命令緩沖 DEC R0 MOV A, B ;段地址高位送A ORL A, #10100000B;形成地址控制碼10100(SET REC) MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;執(zhí)行REC命令 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV A, #0B0H ;10110XXX,執(zhí)行REC命令 MOV R0, A ;命令碼送命令緩沖區(qū) LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 ;從地址開始開始錄音 MOV TASK3, #03H ;b2b0置為011態(tài)(修改作業(yè)號) MOV R0, #XmtDat+1;取錄音時間 MOV ISDTIME, R0 ;錄音時間送計時單元 CLR IE0 ;清除INT0中斷 SJMP EXITNEXT4: CJNE A, #3, EXIT ;b2b0為011,處于錄音等待期間 JB IE0, NEXT51 ;INT0中斷效,即遇到VOF ;檢查延遲時間是否為0? MOV A, ISDTIME JZ NEXT51 ;錄音已經(jīng)結(jié)束 SJMP EXIT ;錄音尚未結(jié)束,退出!NEXT51: CLR IE0 ;清除中斷 MOV R0, #ISDBUF ;語音命令緩沖首地址送R0 MOV R0, #10H ;0001X XXX,執(zhí)行STOP WRDN命令,停止當前操作 LCALL SPIBW ;調(diào)用SPI總線控制命令寫入子程序 SETB MIC_C ;關閉功率放大器電源 MOV TASK3, #00 ;將b7、b6置為00,結(jié)束播放EXIT: RETEND;控制命令送ISD4000語音芯片(16位命令格式)PROC SPIBW ;SPI總線控制命令寫入子程序;入口參數(shù):16位命令碼(兩字節(jié))存放在ISDBUF緩沖區(qū)內(nèi);出口參數(shù):無;使用資源:R0、R6、R7及Acc、PSW、DPTR(使用進位標志C)SPIBW: CLR EA CLR SCLK ;空閑時SCLK處于高電平,以減小功耗。而,ISD采用 ;正極性SCLK脈沖頭。因此,在片選信號SS為低電平前 ; 先將SCLK置為低電平 CLR ISDSS ;片選信號為低 MOV R0, #ISDBUF+1 ;取命令碼低位字節(jié) MOV R6, #2 ;傳送兩字節(jié)LOOP2: MOV A, R0 MOV R7, #08H ;移動次數(shù)LOOP1: RRC A ;帶Cy右移。 MOV MOSI, C ;CPU輸出數(shù)據(jù)。 SETB SCLK ;利用SCLK上升沿鎖存輸入的數(shù)據(jù)。 NOP ;由于SCLK信號時鐘頻率最高為1MHz,即高低 ;電平時間必須大于400uS,可根據(jù)晶振頻率插入 ;0-2條NOP指令(對于晶振頻率在12MHz以內(nèi)時,不用) CLR SCLK ;時鐘信號為低電平 DJNZ R7,LOOP1 DEC R0 ;指針減1,指向下一字節(jié) DJNZ R6, LOOP2 SETB ISDSS ;執(zhí)行結(jié)束后將SS引腳置為高電平。 SETB SCLK ;空閑時SCLK處于高電平,以減小功耗。 SETB EA RETEND五、實驗內(nèi)容1. 寫出ISD4002語音芯片的讀寫控制程序,逐段播放實驗板上ISD4002語音芯片內(nèi)已錄好的語音信息。2. 在空白處錄制5S左右的語音信息。3. 在實驗九(1)基礎上,實現(xiàn)每按下一個按鍵時,通過語音芯片報出鍵名。實驗15 無線解碼接收一、實驗目的(1) 理解無線收發(fā)系統(tǒng)組成、工作原理。(2) 理解PT2262或與之兼容的固定編碼芯片信息幀格式;理解軟件解碼原理、實現(xiàn)方法以及軟件解碼程序編寫要領。(3) 初步掌握自適應軟件解碼程序設計規(guī)則。(4) 理解MCS-51芯片內(nèi)PCA模塊的功能和使用方法。二、實驗設備與器材仿真器及附件、圖0-1所示實驗電路板各一套(需帶ASK無線接收模塊),PT2262編碼遙控器或門磁一只、導線一批。三、實驗原理與電路1. 無線收發(fā)系統(tǒng)典型無線收發(fā)系統(tǒng)如圖15-1所示,由ASM無線接收/解調(diào)模塊、一個或多個PT2262編碼遙控器(或無線探頭)組成。圖15-1 典型無線收發(fā)系統(tǒng)2. PT2262編碼芯片信息幀格式PT2262或與之兼容的固定編碼芯片性能穩(wěn)定,價格低廉,是無線探頭、廉價遙控器的首選編碼芯片。這類芯片編碼長度為24位,一信息幀由同步頭、地址碼、數(shù)據(jù)碼三部分組成,如圖15-2所示。同步頭高電平持續(xù)時間為4(是編碼芯片振蕩周期,在25s120s之間,由振蕩電阻決定),間歇期為124;編碼位采用PWM調(diào)制,脈寬比為1:3,“0”碼高電平持續(xù)時間為4,低電平持續(xù)時間為12;而“1”碼高電平持續(xù)時間為12,低電平持續(xù)時間為4。一信息幀總長為,即512。發(fā)送時,先輸出編碼的最低位。圖15-2 PT2262編碼芯片信息幀格式3. 自適應軟件解碼方法為降低成本、提高靈活性,在含有MCU的無線接收系統(tǒng)中,一般不用硬件解碼芯片PT2272實現(xiàn)PT2262編碼信息的解碼,而采用軟件解碼方式。本實驗借助MCS-51RX系列MCU芯片內(nèi)置的可編程計數(shù)器陣列(PCA)上下沿捕獲功能測量脈沖信號高、低電平持續(xù)時間;用脈沖間隔時間比作為脈沖寬度測量依據(jù)實現(xiàn)可適應不同脈沖頭寬度的自適應軟件解碼方式。根據(jù)編碼芯片信息幀特點,當取25s120s時,信息幀內(nèi)高電平最長時間為12(300s1.44ms之間);低電平時間最長為同步頭低電平持續(xù)時間124(3.1ms14.88ms)。因此,當系統(tǒng)時鐘頻率為11.092MHz時,在6時鐘/機器周期模式下,PCA計數(shù)器溢出時間為,即35.55ms,即信息幀內(nèi)相鄰兩次捕獲時間間隔小于定時器溢出時間。(1) 資源及狀態(tài)分配為簡化軟件解碼判別過程,縮短PCA中斷執(zhí)行時間,使用字節(jié)變量STU記錄解碼狀態(tài),各位定義如下:b2b0記錄信息幀狀態(tài),如圖15-3所示。000為起始狀態(tài),下降沿時刻,如果相鄰兩次捕獲間隔不在100us1.44ms20%范圍內(nèi),則返回000態(tài);上升沿后,如果時間間隔不在允許范圍內(nèi),則置為001態(tài);而101、110分別表示編碼位高、低電平狀態(tài)。圖15-3b3位作信息幀連續(xù)有效標志。b4位是解碼成功標志。以PT2262作編碼芯片的編碼器會連續(xù)發(fā)送4幀以上信息,為提高可靠性,采用雙循環(huán)校驗,即只有接收到兩相鄰的信息幀編碼相同時,b4位置1。因此b4b3描述的解碼狀態(tài)含義為:00表示尚未接收到完整信息幀;01表示已收到了一完整信息幀;11表示已連續(xù)接收了兩個相同的信息幀,解碼有效標志置1;10表示接收緩沖區(qū)數(shù)據(jù)有效,但未處理。用字變量TIME記錄相鄰兩次捕獲時間間隔,字變量TIMEB記錄基本時間(4)。(2) 自適應軟件解碼過程自適應軟件解碼過程如圖15-4(a)(d)所示。為保證能夠接收基本時間只有100us左右的高速編碼信息,主控程序中除了將PCA中斷優(yōu)先級置為最高外,還必須保證PCA中斷服務程序執(zhí)行時間盡可能短,即最好用匯編語言指令編寫PCA中斷服務程序。由于MCS-51指令系統(tǒng)沒有雙字節(jié)除法指令,解碼過程中涉及到的除法運算,可采用減法或多項式除法完成。圖15-4 自適應解碼軟件過程四、實驗內(nèi)容、過程及要求本實驗主要涉及實驗板上的U101、U103、U402等芯片。接通電源前,板上各跳線狀態(tài)如表15-1所示。表15-1 跳線設置JP103JP104JP107JP201JP202JP203JP204JP205JP402JP403SWDIP1-2開路2-3開路1-2開路2-3開路短路1-2 短路2-3 開路1-2 短路2-3 開路1-2 短路2-3 開路1-2 短路2-3 開路1-2 短路2-3 開路1-2 開路2-3短路1-2 開路2-3短路OFF與自適應軟件解碼有關程序段如下,完成程序可參閱實驗十五.ASM。;*定義軟件解碼變量*WUSTU DATA 2EH;b2-b0作無線接收狀態(tài)標志 ;000-開始;001-同步頭高電平;010-同步頭低電平 ;101-數(shù)據(jù)位高電平;110-數(shù)據(jù)位低電平LXJIE BIT WUSTU.3 ;信息幀連續(xù)標志JIEMA BIT WUSTU.4 ;接收數(shù)據(jù)有效標志(可以利用數(shù)據(jù)有效標志作為;數(shù)據(jù)處理標志) ;數(shù)據(jù)有效,而信息幀連續(xù)標志無效時,即認為接收無效HDATAB BIT 01H ;高電平時間,碼長標志(4a為0,12a為1)OVERT DATA 2FH;相鄰居兩次捕獲之間定時器溢出次數(shù)BUFF0 DATA 30H;解碼接收緩沖區(qū)(30-3F)TIMEL DATA 5AH;相鄰兩次捕獲間隔時間低8位TIMEH DATA 5BH;相鄰兩次捕獲間隔時間高8位CNTB DATA 5CH;信息幀長度(單位為bit)TIMEBCL DATA 7DH;同步頭高電平時間(即4a)的低8位TIMEBCH DATA 7EH;同步頭高電平時間(即4a)的高8位ORG 0000HLJMP MAINORG 0033HLJMP PCA ;PCA中斷服務程序入口地址(用于解碼接收)ORG 0050HPROC MAIN ;主程序開始MAIN: ;-PCA模塊初始化 ;模塊0工作在16位上下沿捕獲方式,作解碼定時器。 MOV CMOD, #00000001B ;計數(shù)脈沖為內(nèi)部時鐘信號/6,允許CH、CL溢出中斷 MOV CH, #0 ;從0開始計數(shù) MOV CL, #0 MOV CCON, #40H ;啟動CH、CL計數(shù) MOV CCAPM0, #00100001B ;模塊0工作在16位上沿捕獲方式,允許模塊0中斷 ;開始時先用上沿捕獲,中斷后上下交替捕獲 SETB PPC ;PCA中斷優(yōu)先級置為高 SETB EC ;允許PCA中斷 SETB EA ;開中斷NEXT1: JNB JIEMA, NEXT1 NOP ;虛擬等待解碼有效 SJMP NEXT1END;PCA中斷服務程序PROC PCAPCA: PUSH PSW PUSH ACC PUSH B ORL PSW, #18H; SETB RS1; SETB RS0 ;使用工作寄存器區(qū)3 JBC CF, TNEXT1 ;不是定時器溢出引起 SJMP CANEXTTNEXT1: ;定時器T溢出引起中斷 INC OVERT MOV A, WUSTU JB ACC.0, TNEXT2 ;低電平,檢查溢出次數(shù) MOV A, OVERT CJNE A, #2, TNEXT21TNEXT21: JC TOEXIT ;小于2,退出! ;溢出次數(shù)大于2,肯定是錯誤! MOV OVERT, #2 ANL WUSTU, #0D0H ;解碼狀態(tài)清0,清除連續(xù)有效標志 SJMP TOEXITTNEXT2: ;在高電平期間,發(fā)現(xiàn)溢出次數(shù)大于指定值 MOV A, OVERT CJNE A, #2, TNEXT22TNEXT22: JC TOEXIT ;小于2,退出! ;大于2 MOV OVERT, #2 ANL WUSTU, #0F0H ;清除連續(xù)有效標志,解碼狀態(tài)置為011(即等幅干擾狀態(tài)) ORL WUSTU, #03H ;置為011態(tài)!TOEXIT: JMP RETURNCANEXT: ;捕獲中斷引起 MOV R3, CCAP0L MOV R4, CCAP0H ;取捕獲發(fā)生的時刻 CLR C MOV A, R3 SUBB A, TIMEL MOV TIMEL, A MOV A, R4 SUBB A, TIMEH MOV TIMEH, A ;計算并保存相鄰兩次捕獲時間間隔到TIMEH、TIMEL中 MOV A, CCAPM0 MOV C, ACC.5 ;上升沿觸發(fā)捕獲標志送C XRL CCAPM0, #30H ;與30異或,強迫CAPP、CAPN取反 ANL CCON, #0FEH ;清除CCF0中斷標志 MOV OVERT, #0 ;捕獲時清除溢出次數(shù) ;判別捕獲原因 JC HNEXT ;下沿觸發(fā)引起; CLR C MOV A, TIMEL SUBB A, #140 ;PCA模塊計數(shù)脈沖為系統(tǒng)時鐘信號的6分頻(晶振頻率為11.0592MHz) MOV A, TIMEH ;140對應的時間為(1/11.0592)*6*140,約76us SUBB A, #0 JNC LNEXT0 ;高電平時間太短, ANL WUSTU, #0F0H ;重置為000態(tài),清除連續(xù)標志 JMP RETURN ;沒有必要記錄LNEXT0: LJMP LNEXT;上邊沿觸發(fā)HNEXT: MOV A, WUSTU ANL A, #07H CJNE A, #0, HNEXT1 ;000態(tài), 說明尚未開始 ORL WUSTU, #21H ;置為001態(tài) JMP CAEND ;記錄捕獲時間后退出HNEXT1: CJNE A, #2, HNEXT2 ;原來處于010態(tài),計算同步頭時間,計算同步頭脈沖相對寬度; CLR C MOV A, TIMEL SUBB A, #51H MOV A, TIMEH ;假設a在25us120us(允許存在25%的誤差)之間 SUBB A, #16H ;124a對應計數(shù)器讀數(shù)為571334174,即1651H857EH JNC HNEXT20 ;小于最小值,錯誤 JMP HERROR ;上升沿出錯處理HNEXT20: ;CLR C MOV A, TIMEL SUBB A, #7EH MOV A, TIMEH SUBB A, #85H JC HNEXT201 ;大于124a的上限(即最大值),錯誤 JMP HERROR ;上升沿出錯處理HNEXT201: ;在同步頭間歇期時間最小值與最大值之間 LCALL CAL1 ;當被除數(shù)較大時,用多項式除法可有效縮短運算時間 CJNE R6, #29, HNEXT21HNEXT21: JNC HNEXT22 ;小于29,同步頭高、低電平時間比太??!錯!