/*
功能:语音采集播放
时钟:11.0592M
采样频率:8K
回放频率:8K
版本:1
2006-9-24
*/
#include <absacc.h>
#include <reg51.h>
#define ADD_0 XBYTE[0x0000]
#define ADD_e XBYTE[0xffff]
#define uc unsigned char
unsigned int RAMADDR=0;
address=&ADD_0;
addend=&ADD_e;
uc keyno=0xFF;//初始化按钮值
//******************
//定义位变量
sbit zlgcs=P1^6;
sbit zlgdio=P1^4;
sbit zlgclk=P1^5;
sbit DAcs=P1^2;
sbit oe=P1^1;
sbit S_convert=P1^0;
sbit ramwe=P1^3;
sbit ramoe=P1^7;
//****************
//**********************
// 延时函数
void delay(uc t)
{
uc j;
for(j=0;j<t;j++);
}
//********************************
// 读键盘函数
uc read_key()
{
uc i;
uc temp=0;
uc cmd=0x15;
zlgclk = 0;
zlgcs =0;
for(i=0;i<8;i++)
{
if((cmd&0X80)==0x80)
zlgdio=1;
else
zlgdio=0;
cmd<<=1;
zlgclk = 1;
delay(10); // 延时
zlgclk = 0;
delay(80);
}
zlgdio=1; //读取数据之前DIO 引脚要置1 以切换到输入状态
for(i=0;i<8;i++)
{
temp=temp<<1;
if(zlgdio==1) // 读数据位,接收的数据位放入temp中
temp=temp+1;
zlgclk=1;
delay(80); // 延时
zlgclk=0;
delay(10);
}
zlgcs = 1;
delay(80);
return(temp); // 返回按键的编号
}
//****************************
//外部中断1
void keydown(void) interrupt 2 //注意管脚
{
keyno=0xff;
keyno=read_key();
//if((keyno==63)||(keyno==53))
//flag=1;
//else
//flag=0;
}
//******************************
//外部中断0
void ADfinish(void)interrupt 0 //注意管脚
{
oe=1;
oe=1;
ramwe=0;
ramwe=0;
ramwe=0;
ramwe=1;
oe=0;
}
//*******************************
//定时器0(应提高优先级)
void timer0(void) interrupt 1
{
// TL0|=0x45;
// TH0=0xfe;
if(RAMADDR!=0XFFFF)
{
RAMADDR ++;
P0=(unsigned char)(RAMADDR&0x00FF);
P2=(unsigned char)(RAMADDR>>8);
}
else
{
ET0=0;
TR0=0;
EX0=0;
}
S_convert=1;
S_convert=1;
S_convert=1;
S_convert=1;
S_convert=0;
}
//*******************************
//定时器1(应提高优先级)
void timer1(void) interrupt 3
{
//TL1|=0X45;
//TH1=0XFE;//E
ramoe=1;
ramoe=1;
RAMADDR ++;
P0=(unsigned char)(RAMADDR&0x00FF);
P2=(unsigned char)(RAMADDR>>8);
ramoe=0;
}
//*****************************
//开始录音
void record()
{
// TMOD=0x01;
// TL0=0x45;
// TH0=0xfe;
// TR0=1;
TMOD=0x02;
TL0=125;
TH0=125;
TR0=1;
ET0=1;
IT0=0;
EX0=1;
DAcs=1;
ramoe=1;
ramwe=0;
}
//****************************
//放音
void plays()
{
ramoe=0;
ramwe=1;
RAMADDR=0;
ET0=0;
TMOD=0x20;
TL1=125;
TH1=125;
TR1=1;
ET1=1;
DAcs=0;
}
main()
{
ramoe=1;
ramwe=1;
PT0=1;
PX0=0;
PX1=0;//优先级
EA=1;
EX1=1;
while(1)
{
PT0=1;
PX0=0;
PX1=0;//优先级
EA=1;
EX1=1;
//step1:录音*/
//等待录音按键
if(keyno==61)
{ RAMADDR=0;
keyno=0xff;
record();
}
//step2:放音
//等待放音按键
if(keyno==62)
{
keyno=0xff;
plays();
}
}
}