基于51單片機控制的ISD4004語音模塊引腳電平觸發(fā)發(fā)音程序_第1頁
基于51單片機控制的ISD4004語音模塊引腳電平觸發(fā)發(fā)音程序_第2頁
基于51單片機控制的ISD4004語音模塊引腳電平觸發(fā)發(fā)音程序_第3頁
基于51單片機控制的ISD4004語音模塊引腳電平觸發(fā)發(fā)音程序_第4頁
基于51單片機控制的ISD4004語音模塊引腳電平觸發(fā)發(fā)音程序_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/錄音和放音鍵IO口定義:sbit AN=P26;/放音鍵控制接口sbit set_key=P27;/錄音鍵控制口/ ISD4004控制口定義:sbit SS =P10; /4004片選sbit MOSI=P11; /4004數(shù)據(jù)輸入sbit MISO=P12; /4004數(shù)據(jù)輸出sbit SCLK=P13; /ISD4004時鐘sbit INT =P14; /4004中斷sbit STOP=

2、P34;/4004復位sbit LED1 =P16;/錄音指示燈/=LCD1602接口定義=/*注意,P2.2到P2.4需要接上拉電阻 -=*/#define LCM_Data P0 /LCD1602數(shù)據(jù)接口sbit LCM_RW = P23; /讀寫控制輸入端,LCD1602的第五腳sbit LCM_RS = P24; /寄存器選擇輸入端,LCD1602的第四腳sbit LCM_E = P22; /使能信號輸入端,LCD1602的第6腳/*函數(shù)聲明*void WriteDataLCM(uchar WDLCM);/LCD模塊寫數(shù)據(jù)void WriteCommandLCM(uchar WCLCM

3、,BuysC); /LCD模塊寫指令uchar ReadStatusLCM(void);/讀LCD模塊的忙標void DisplayOneChar(uchar X,uchar Y,uchar ASCII);/在第X+1行的第Y+1位置顯示一個字符void LCMInit(void);void DelayUs(uint us); /微妙延時程序void DelayMs(uint Ms);/毫秒延時程序void init_t0();/定時器0初始化函數(shù)void setkey_treat(void);/錄音鍵處理程序void upkey_treat(void);/播放鍵處理程序void displa

4、y();/顯示處理程序void isd_setrec(uchar adl,uchar adh);/發(fā)送setrec指令void isd_rec();/發(fā)送rec指令void isd_stop();/stop指令(停止當前操作)void isd_powerup();/發(fā)送上電指令void isd_stopwrdn();/發(fā)送掉電指令void isd_send(uchar isdx);/spi串行發(fā)送子程序,8位數(shù)據(jù)void isd_setplay(uchar adl,uchar adh);void isd_play();/程序中的一些常量定義uint time_total,st_add,end_

5、add=0;uint adds25;/25段語音的起始地址暫存uint adde25;/25段語音的結(jié)束地址暫時uchar t0_crycle,count,count_flag,flag2,flag3,flag4;uchar second_count=170,msecond_count=0;/second_count為芯片錄音的起始地址,起始地址本來是A0,也就是160,/我們從170開始錄音吧。#define Busy 0x80 /用于檢測LCM狀態(tài)字中的Busy標識/*= 主程序=*/sbit K0 = P20; /sbit K1 = P21; /sbit K2 = P25; / sbit

6、 K3 = P30; /sbit K4 = P31; /sbit K5 = P32; /sbit K6 = P33; /sbit K7 = P35; /sbit K8 = P36; /sbit K9 = P37; / void main(void) LED1=0;/滅錄音指示燈 flag3=0; flag4=0; time_total=340;/錄音地址從170開始,對應的單片機開始計時的時間就是340*0.1秒 adds0=170; count=0; LCMInit(); /1602初始化 init_t0();/定時器初始化 DisplayOneChar( 0,5,'I');

7、 /開機時顯示000 ISD4004-X DisplayOneChar( 0,6,'S'); DisplayOneChar( 0,7,'D'); DisplayOneChar( 0,8,'4'); DisplayOneChar( 0,9,'0'); DisplayOneChar( 0,10,'0'); DisplayOneChar( 0,11,'4'); DisplayOneChar( 0,12,'-'); DisplayOneChar( 0,13,'X');/ K0

8、 = P20; / K1 = P21; / K2 = P25; / K3 = P30; / K4 = P31; / K5 = P32; / K6 = P33; / K7 = P35; / K8 = P36; / K9 = P37; /while(1) display();/顯示處理/ if(K0=0) /你 st_add=0x0170; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號

9、INT =P14isd_stop(); /放音完畢,發(fā)送stop指令 if(K1=0) /好 st_add=0x0181; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令 if(K2=0) /對不起 st_add=0x0194; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送s

10、etplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令 if(K3=0) /謝謝 st_add=0x0211; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令 if(K4=0) /

11、沒關(guān)系 st_add=0x0225; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令 if(K5=0) /什么 st_add=0x0240; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs

12、(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令 if(K6=0) /真 st_add=0x0254; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號INT =P14isd_stop(); /放音完畢,發(fā)送stop指令 if(K7=0) /克服 st_add=0x0267; isd_setplay(st_add&

13、amp;0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號INT =P14isd_stop(); /放音完畢,發(fā)送stop指令 if(K8=0) /叫 st_add=0x0281; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中

14、斷信號INT =P14isd_stop(); /放音完畢,發(fā)送stop指令 if(K9=0) /早上 st_add=0x0293; isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號INT =P14isd_stop(); /放音完畢,發(fā)送stop指令 / /upkey_treat();/放音鍵處理 / setkey_treat();/錄音鍵處理 /*/錄音鍵處理程序/從指定地址開始錄音的

15、程序就是在這段里面void setkey_treat(void) set_key=1;/置IO口為1,準備讀入數(shù)據(jù) DelayUs(1); if(set_key=0) if(flag3=0)/錄音鍵和放音鍵互鎖,錄音好后,禁止再次錄音。如果要再次錄音,那就要復位單片機,重新開始錄音 if(count=0)/判斷是否為上電或復位以來第一次按錄音鍵 st_add=170; else st_add=end_add+3; /每段語言間隔3個地址 addscount=st_add;/每段語音的起始地址暫時 if(count>=25)/判斷語音段數(shù)時候超過25段,因為單片機內(nèi)存的關(guān)系? /本程序只錄

16、音25段,如果要錄更多的語音,改為不可查詢的即可 /如果超過25段,則覆蓋之前的語音,從新開始錄音 count=0; st_add=170; time_total=340; isd_powerup(); /AN鍵按下,ISD上電并延遲50msisd_stopwrdn();isd_powerup(); LED1=1;/錄音指示燈亮,表示錄音模式 isd_setrec(st_add&0x00ff,st_add>>8); /從指定的地址 if(INT=1)/ 判定芯片有沒有溢出 isd_rec(); /發(fā)送錄音指令 time_total=st_add*2;/計時初始值計算 TR0

17、=1;/開計時器 while(set_key=0);/等待本次錄音結(jié)束 TR0=0;/錄音結(jié)束后停止計時 isd_stop(); /發(fā)送4004停止命令 end_add=time_total/2+2;/計算語音的結(jié)束地址 addecount=end_add;/本段語音結(jié)束地址暫存 LED1=0; /錄音完畢,LED熄滅 count+;/錄音段數(shù)自加 count_flag=count;/錄音段數(shù)寄存 flag2=1; flag4=1;/解鎖放音鍵 /=/放音機處理程序/從指定地址開始放本段語音就是這段程序void upkey_treat(void) /uchar ovflog; AN=1;/準備

18、讀入數(shù)據(jù) DelayUs(1); if(AN=0)/判斷放音鍵是否動作 if(flag4=1)/互鎖錄音鍵 /if(flag2=1)/判斷是否為錄音好后的第一次放音 / count=0;/從第0段開始播放 / / count=0;/從第0段開始播放/ isd_powerup(); /AN鍵按下,ISD上電并延遲50msisd_stopwrdn();isd_powerup(); /count=0;/ st_add=addscount;/送當前語音的起始地址 isd_setplay(st_add&0x00ff,st_add>>8); /發(fā)送setplay指令,從指定地址開始放音

19、isd_play(); /發(fā)送放音指令DelayUs(20);while(INT=1); /等待放音完畢的EOM中斷信號isd_stop(); /放音完畢,發(fā)送stop指令while(AN=0); / isd_stop(); count+;/語音段數(shù)自加 flag2=0; flag3=1; if(count>=count_flag)/如果播放到最后一段后還按加鍵,則從第一段重新播放 count=0; /*?/發(fā)送rec指令void isd_rec()isd_send(0xb0);SS=1;/*/發(fā)送setrec指令void isd_setrec(unsigned char adl,uns

20、igned char adh)DelayMs(1);isd_send(adl); /發(fā)送放音起始地址低位DelayUs(2);isd_send(adh); /發(fā)送放音起始地址高位DelayUs(2);isd_send(0xa0); /發(fā)送setplay指令字節(jié)SS=1;/=/*/定時器0中斷程序void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;t0_crycle+;if(t0_crycle=2)/ 0.1秒 t0_crycle=0; time_total+; msecond_count+; if(mseco

21、nd_count=10)/1秒 msecond_count=0; second_count+; if(second_count=60) second_count=0; if(time_total=4800)time_total=0; /*/定時器0初始化函數(shù)void init_t0() TMOD=0x01;/設定定時器工作方式1,定時器定時50毫秒TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;/開總中斷ET0=1;/允許定時器0中斷t0_crycle=0;/定時器中斷次數(shù)計數(shù)單元/*/顯示處理程序void display() uchar x;

22、 if(flag3=1|flag4=1)/判斷是否有錄音過或者放音過 x=count-1; if(x=255)x=count_flag-1; DisplayOneChar( 0,0,x/100+0x30); /顯示當前語音是第幾段 DisplayOneChar( 0,1,x/10%10+0x30); DisplayOneChar( 0,2,x%10+0x30); if(flag3=0)/錄音時顯示本段語音的起始和結(jié)束地址 DisplayOneChar( 1,0,st_add/1000+0x30);/計算并顯示千位 DisplayOneChar( 1,1,st_add/100%10+0x30);

23、 DisplayOneChar( 1,2,st_add/10%10+0x30); DisplayOneChar( 1,3,st_add%10+0x30); DisplayOneChar( 1,4,'-'); DisplayOneChar( 1,5,'-'); DisplayOneChar( 1,6,end_add/1000+0x30); DisplayOneChar( 1,7,end_add/100%10+0x30); DisplayOneChar( 1,8,end_add/10%10+0x30); DisplayOneChar( 1,9,end_add%10+

24、0x30); if(flag4=1)/放音時顯示本段語音的起始和結(jié)束地址 DisplayOneChar( 1,0,addsx/1000+0x30); DisplayOneChar( 1,1,addsx/100%10+0x30); DisplayOneChar( 1,2,addsx/10%10+0x30); DisplayOneChar( 1,3,addsx%10+0x30); DisplayOneChar( 1,4,'-'); DisplayOneChar( 1,5,'-'); DisplayOneChar( 1,6,addex/1000+0x30); Disp

25、layOneChar( 1,7,addex/100%10+0x30); DisplayOneChar( 1,8,addex/10%10+0x30); DisplayOneChar( 1,9,addex%10+0x30); /=/ LCM初始化/=void LCMInit(void) LCM_Data = 0; WriteCommandLCM(0x38,0); /三次顯示模式設置,不檢測忙信號 DelayMs(5); WriteCommandLCM(0x38,0); DelayMs(5); WriteCommandLCM(0x38,0); DelayMs(5); WriteCommandLCM(

26、0x38,1); /顯示模式設置,開始要求每次檢測忙信號 WriteCommandLCM(0x08,1); /關(guān)閉顯示 WriteCommandLCM(0x01,1); /顯示清屏 WriteCommandLCM(0x06,1); / 顯示光標移動設置 WriteCommandLCM(0x0C,1); / 顯示開及光標設置 DelayMs(100);/*=/ 寫數(shù)據(jù)函數(shù): E =高脈沖 RS=1 RW=0/=void WriteDataLCM(uchar WDLCM) ReadStatusLCM(); /檢測忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0;

27、 LCM_E = 0; /若晶振速度太高可以在這后加小的延時 LCM_E = 0; /延時 LCM_E = 1;/*= / 寫指令函數(shù): E=高脈沖 RS=0 RW=0/=void WriteCommandLCM(unsigned char WCLCM,BuysC) /BuysC為0時忽略忙檢測 if (BuysC) ReadStatusLCM(); /根據(jù)需要檢測忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1;/*=/ 正常讀寫操作之前必須檢測LCD控制器狀態(tài):E=1 RS=0 RW=1;

28、/ DB7: 0 LCD控制器空閑,1 LCD控制器忙。 / 讀狀態(tài)/=unsigned char ReadStatusLCM(void) LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & Busy); /檢測忙信號 return(LCM_Data);/=/功 能: 在1602 指定位置顯示一個字符:第一行位置015,第二行1631/說 明: 第 X 行,第 y 列 注意:字符串不能長于16個字符/=void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char ASCII) X &= 0x1; Y &= 0xF; /限制Y不能大于15,X不能大

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論