




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【实例60】 数字化语音存储与回放主程序程序代码如下:#include reg52.htypedef unsigned char uchar;typedef unsigned int uint;/*语音芯片的指令*/#define POWERUP 0x20 /上电指令#define SETPLAY 0xE0 /从指定地址开始放音指令#define SETREC 0xA0 /从指定地址开始录音指令#define PLAY 0xF0 /从当前地址开始放音指令#define REC 0xB0 /从当前地址开始录音指令#define STOPPLAY 0x70 /停止放音指令#define STOPREC 0x30 /停止录音指令/*定时器的时间常数及相关定义*/#define BAUDH 0xFD /用于产生波特率的定时器的计数初值高8位#define BAUDL 0xFD /用于产生波特率的定时器的计数初值低8位#define TIMEMS50H 0x4C /16位定时器:高8位:50ms#define TIMEMS50L 0x00 /16位定时器:低8位:50ms#define TIMEMS5H 0xEE /16位定时器:高8位:5ms#define TIMEMS5L 0x00 /16位定时器:低8位:5ms#define TIMER0NULL 0 /定时器0分时复用:闲置模式#define TIMER0SER 1 /定时器0分时复用:串口超时#define TIMEROTHERS 2 /定时器0分时复用:其他类型超时/*时间延时常数*/#define DELAYPLAY 6 /播放语音前的延时#define DELAYPLAY1 8 /摘机后,播放语音前的延时#define TIMEDELAY1MS 115 /延时1ms#define TIMEDELAY50MS 9200 /延时50ms#define TIMEDELAY50US 30 /延时50us#define MAX_BELLCALL 120 /等待下一个振铃的最大时间间隔20*6#define SPEAKER_ON 1#define MIC_ON 1#define SPEAKER_OFF 0#define MIC_OFF 0/*语音地址和时间间隔*/#define ADDR3 0 /长度为3分钟的语音的首地址#define ADDR4 500 /长度为4分钟的语音的首地址#define ADDR5 550 /长度为5分钟的语音的首地址#define ADDR8 650 /长度为8分钟的语音的首地址#define ADDR10 750 /长度为10分钟的语音的首地址#define ADDR20 1050 /长度为20分钟的语音的首地址#define ADDREX 2150 /扩展区的语音的首地址#define SECONDS3 18 /两条3分钟语音的地址间隔#define SECONDS4 25 /两条4分钟语音的地址间隔#define SECONDS5 33 /两条5分钟语音的地址间隔#define SECONDS8 50 /两条8分钟语音的地址间隔#define SECONDS10 60 /两条10分钟语音的地址间隔#define SECONDS20 110 /两条20分钟语音的地址间隔#define SECONDSEX 15 /两条扩展区的语音的地址间隔/*其他*/#define LOW 0 /低电平#define HIGH 1 /高电平#define MAXWORDS 10 /录音的最大条数sbit ISD_CS=P05; /ISD芯片的片选sbit ISD_SCK=P04; /ISD芯片的时钟信号管脚sbit ISD_SI=P06; /ISD芯片的输入sbit ISD_SO=P07; /ISD芯片的输出sbit ISD_INT=P03; /ISD芯片的中断/*其他IO*/sbit LINE_INT0=P32; /外部中断0的输入sbit LED_Mic=P01; /指示录音的发光二极管sbit LED_Speaker=P00; /指示放音的发光二极管bit Finish_Recv; /串口接收完毕标志uchar Rec_Ser18; /串口接收数据缓存区uchar Tra_Ser10; /串口发送数据缓存区uchar Flag_Test; /串口接收数据校验标志位uchar Num_RecSer,Num_TraSer;uchar Len_RecSer,Len_TraSer;uchar Count_Bellin,Count_Bell;uchar Type_Timer0;uchar idata New_Words,Now_RecWords;uchar idata Number_Device;uint Addr_Rec,Addr_Play;uint Count_Timer0;uint Numi;void Service_Timer0(void);void Service_Serial(void);void Service_Rec(void);void Ini_ISD(void);void Delay50ms(void); /延时50MSvoid Delay1ms(void); /延时1MSvoid Delay50us(void); /延时50USvoid Play_Voice(uint); /放语音的函数void Record_Voice(uint); /录语音的函数void ISD_WriteSpi(uchar); /ISD语音芯片的SPI口写函数void ISD_OneCode(uchar); /ISD语音芯片写一个字节指令的函数void ISD_MultiCode(uint,uchar); /ISD语音芯片写多个字节指令的函数/*-*/void main() bit Flag_Play=0; uchar Delayi; uint Time; Delay50ms(); Ini_ISD();/初始化ISD TMOD=0x21; /定时器1方式2,定时器0方式1 SCON=0x50; /方式1,串口接收允许 PCON=0x00; IT0=1; IE=0x93; IP=0x12; TH1=0xFD; TL1=0xFD; TR1=1; LED_Speaker=SPEAKER_OFF; /使speaker指示灯熄灭 LED_Mic=MIC_OFF; /熄灭MIC指示灯 Now_RecWords=MAXWORDS-1; while(1) if(Finish_Recv=1) /串口数据接收完成 Service_Rec(); /校验串口接收的数据 if(Flag_Test=1) /串口信息校验正确,数据有效 /执行语音的录制和播放 Flag_Play=0; Flag_Test=0; LED_Mic=MIC_OFF; LED_Speaker=SPEAKER_OFF; /根据协议发送串口信息 Tra_Ser0=0x04; Tra_Ser1=0x01; Len_TraSer=Tra_Ser2=0x04; Tra_Ser3=0x09; SBUF=Tra_Ser0; Delay50ms(); if (Rec_Ser2=CMDRECORD) mrecordvoice(); else mplayvoice(); 程序mrecordvoice()为录音子程序。程序代码如下:void mrecordvoice()switch(Rec_Ser1) case 1: Addr_Rec=Rec_Ser3*SECONDS3+ADDR3; /录音3秒,获得起始地址 Time=3000; break; case 2: /录音5秒 Addr_Rec=Rec_Ser3*SECONDS5+ADDR5; Time=5000; break; case 3: /录音8秒 Addr_Rec=Rec_Ser3*SECONDS8+ADDR8; Time=8000; break; case 4: /录音10秒 Addr_Rec=Rec_Ser3*SECONDS10+ADDR10; Time=10000; break; case 5: Addr_Rec=Rec_Ser3*SECONDS20+ADDR20; Time=20000; break; LED_Mic=MIC_ON;/录音指示灯亮 LED_Speaker=SPEAKER_OFF; /放音指示灯灭 Record_Voice(Addr_Rec);/开始录音 for(Numi=0;NumiTime;Numi+) Delay1ms(); ISD_OneCode(STOPREC);/结束录音 LED_Mic=MIC_OFF;/录音指示灯亮 for(Numi=0;Numi6;Numi+) Delay50ms(); LED_Mic=MIC_OFF; LED_Speaker=SPEAKER_OFF; 程序mplayvoice()为放音子程序。程序代码如下:void mplayvoice() switch(Rec_Ser1) case 6: Addr_Play=Rec_Ser3*SECONDS3+ADDR3; /放音3秒,获取放音起始地址 Flag_Play=1; /设置放音标志位 break; case 7: Addr_Play=Rec_Ser3*SECONDS5+ADDR5; /放音5秒 Flag_Play=1; break; case 8: Addr_Play=Rec_Ser3*SECONDS8+ADDR8; /放音8秒 Flag_Play=1; break; case 9: Addr_Play=Rec_Ser3*SECONDS10+ADDR10; /放音10秒 Flag_Play=1; break; case 0: Addr_Play=Rec_Ser3*SECONDS20+ADDR20; /放音20秒 Flag_Play=1; break; default:break; if(Flag_Play=1) /放音 LED_Speaker=SPEAKER_ON; Play_Voice(Addr_Play); while(ISD_INT=1); /播放完毕 Delay50ms(); ISD_OneCode(STOPPLAY); /停止放音 Delay50ms(); LED_Speaker=SPEAKER_OFF; for(Numi=0;Numi6;Numi+) Delay50ms(); LED_Mic=MIC_OFF; LED_Speaker=SPEAKER_OFF;在通信过程中,为了保证数据传输的准确性,通常需要遵循一定的协议。子函数Service_Rec是对串口接受到的数据进行校验并处理。代码如下:void Service_Rec(void) uchar i; uint Datasum=0; Finish_Recv=0; Flag_Test=0; Len_RecSer= Len_RecSer; for(i=0;iLen_RecSer-1;i+) Datasum=Datasum+Rec_Seri; Datasum=Datasum%256; if(Datasum=Rec_SerLen_RecSer-1) /IF:串口信息接收校验 if(Rec_Ser0=4) Flag_Test=1; 子函数Service_Timer0的功能是串口数据传输的超时控制,具体函数代码如下:void Service_Timer0() interrupt 1 using 1 if(Type_Timer0=TIMER0SER) /串口传输超时 Type_Timer0=0; Num_RecSer=0; else /不是串口任务 if(Type_Timer0=TIMEROTHERS) /其它超时控制,读者可自定义 if(Count_Timer0MAX_BELLCALL) Count_Timer0+; TH0=TIMEMS50H; TL0=TIMEMS50L; else Count_Bellin=0; Type_Timer0=0; /end if /end else子函数Service_Serial()的功能是串口收发中断的处理。具体函数代码如下:void Service_Serial() interrupt 4 using 2 if(RI=1) /接收中断 RI=0; Rec_SerNum_RecSer=SBUF; /存储接收数据 Num_RecSer+; if(Num_RecSer= Len_RecSer) /接收完成 Rec_Ser2为本次串口接收字节数 Finish_Recv=1; Num_RecSer=0; else Type_Timer0=TIMER0SER; /启动定时器,串口传输超时控制 TH0=TIMEMS5H; /5MS TL0=TIMEMS5L; TR0=1; else if(TI=1) /发送中断 TI=0; Num_TraSer+; if(Num_TraSer=Len_TraSer) Num_TraSer=0; else SBUF=Tra_SerNum_TraSer; /end if(TI=1) /end else/*-*/程序设计中使用了很多延时程序,以下为不同长度的延时子函数,便于在程序中调用。具体代码如下:void Delay50ms(void) uint num; for(num=0;numTIMEDELAY50MS;num+);void Delay1ms(void) uint num; for(num=0;numTIMEDELAY1MS;num+);void Delay50us(void) uchar num; for(num=0;numTIMEDELAY50US;num+);程序设计的关键是对ISD4004的操作。ISD4004有许多操作命令如表5.x所示,这些命令通过SPI接口传给ISD4004。MCS-51单片机没有SPI接口,因此需要程序模拟SPI接口。子函数ISD_WriteSpi的功能是程序模拟SPI接口向ISD4004发送一字节数据。具体代码如下:void ISD_WriteSpi(uchar WData) uchar num; ISD_SCK=1; for(num=0;num1; ISD_SCK=1; /*-*/子函数ISD_OneCode的功能是向ISD4004发送单字节指令。代码如下:void ISD_OneCode(uchar CCode) ISD_CS=0; /单字节指令 ISD_WriteSpi(CCode); /适用于:POWERUP,STOPPLAY,STOPREC,PLAY,REC ISD_CS=1;/*-*/子函数ISD_MultiCode的功能是向ISD4004发送多字节指令。代码如下:void ISD_MultiCode(uint Addr,uchar CCode) uchar Addrl,Addrh; Addrl=(uchar)(Addr&0x00ff); Addrh=(uchar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国膨化食品行业竞争态势及盈利战略研究报告(2025-2026)
- 国际贸易风险管控-洞察及研究
- 2024年度海南省二级建造师之二建矿业工程实务题库附答案(典型题)
- 延安大学西安创新学院《工程力学(二)》2023-2024学年第一学期期末试卷
- 北京中医药大学《语言与文化》2023-2024学年第一学期期末试卷
- 河南机电职业学院《精细化工产品概论》2023-2024学年第一学期期末试卷
- 江苏农牧科技职业学院《光影材质表现》2023-2024学年第一学期期末试卷
- 车辆抵押贷款合同范本(含贷款合同续签)
- 机器人ODM设计与制造及市场推广合同
- 汽车出口保险合同范本
- 高校资产管理十五五规划方案
- 会计电算化基础知识2025年考试试卷及答案
- 2024年威宁自治县在职在编教师考调真题
- 小学生反洗钱课件
- 酒店前厅部管理制度
- 会计转正考试试题及答案
- 2022~2023学年广东广州天河区初一下学期期末语文试卷(标准版)
- 广东省深圳市光明区2025年八年级下学期期末数学试题及答案
- 黔西南州工业投资(集团)有限公司招聘笔试题库2025
- 建设工程总包合同EPC课件
- 初中英语跨学科项目设计心得体会
评论
0/150
提交评论