在声学领域,单片机技术与各种语音芯片结合,即可完成语音的合成技术,使得单片机语音系统的实现成为可能。所谓语音芯片,就是在人工或者控制器的控制下可以录音和放音的芯片,语音信号是模拟量,语音芯片存储播放声音的基本工作方式为:声音——模拟量——A/D——存储——D/A——模拟量——播放。采用此种方式的语音芯片外围电路比较复杂,声音质量也有一定的失真。而另一类语音芯片采用EEPROM存储方法,将模拟语音数据直接写入半导体存储单元中,不需要另加A/D和D/A变换电路,使用方便,且语音音质自然。
单片机控制主意语音芯片实现对声音的存储和播放硬件电路,主要由51单片机芯片和语音芯片ISD2560及它们的接口电路构成。
程序
*******************************************************************************
程序功能为验证ISD2560的录音和放音功能,如果有按键按下,就开始录音,直到按键松开,停止录音,由于1SD2560录音时间不能超过60s,因此按键时间最好不要超过60s。
整个程序需要实现的功能子程序为:录音,按键识别、按键释放识别,播放录音等子程序 *******************************************************************************
#include <reg51.h> // 引用标准库的头文件
#include <absacc.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int
uchar count; // 重复播放次数计数器
uchar StartFlag; // 开始键按下标志
uchar IdleFlag; // 系统是否处于空闲状态标志
//定义语音芯片ISD2560的控制引脚
sbit START = P1^0;
sbit EOM = P1^4;
sbit PR = P1^5;
sbit PD = P1^6;
sbit CE = P1^7;
//延时t毫秒子程序
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于12M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
//外部中断0服务子程序
void out_int0() interrupt 0 using 1
{
EX0 = 0; // 关外部中断0
PD = 1; // 进入节电状态
if(count<2) // 再重播2次,共3次放音
{
count++;
delay(500); // 延时500ms
P2 = P2&0xFC; // A8=A9=0
P0 = P0&0x00; // 起始地址为0
playback(); // 从地址0处播放
EX0 = 1; // 开外部中断0
}
else
{
IdleFlag = 1; // 变为空闲状态,可以再次按开始键
count = 0;
}
}
//主程序
void main()
{
EA = 1; // 开CPU中断
count = 0; //计数单元
StartFlag = 0; //初始化标志位设定
IdleFlag = 1;
while(IdleFlag==1)
{
if (START)
{
delay(10); // 延时去抖动
if (START)
StartFlag = 1; // 开始键按下标志
}
if (StartFlag == 1) //开始标志为1
{
do
{
P2 = P2&0xFC; // A8=A9=0
P0 = P0&0x00; // 起始地址为0
record(); // 录音开始,存放在地址0处
}
while (START); // 开始键松开
StartFlag = 0;
PR = 1; // 结束录音
PD = 1; // 进入节电状态
delay(500); // 延时500ms再播放录音
EX0 = 1; // 开外部中断0
P2 = P2&0xFC; // A8=A9=0
P0 = P0&0x00; // 起始地址为0
playback(); // 从地址0处进行第一次播放
IdleFlag = 0; // 当前不空闲,按开始键无效
}
}
}
//录音子程序
void record(void)
{
CE = 0; //片选有效
PD = 0;
PR = 0; //录音开始
}
//放音子程序
void playback(void)
{
CE = 0; 片选有效
PD = 0;
PR = 1; //放音开始
}
一周热门 更多>