📄 语音芯片isd4004.txt
字号:
//语音芯片ISD4004
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS=P0^0; //端口定义
sbit MOSI=P0^1;
sbit MISO=P0^2;
sbit SCLK=P0^3;
sbit INT=P0^4;
void delay_ms(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
{
j=108;
while(j--);
}
}
void send_data(uint addr,uchar adata) //发送24位命令格式
{
unsigned char i=16,j=8;
SCLK=1;
SS=0;
while(i--) //发送16位地址
{
if(addr&0x0001)
MOSI=1;
else
MOSI=0;
SCLK=0;
addr>>=1;
_nop_();
SCLK=1;
}
while(j--) //发送8位控制格式
{
if(adata&0x01)
MOSI=1;
else
MOSI=0;
SCLK=0;
adata>>=1;
_nop_();
SCLK=1;
}
SS=1; //启动录放音
}
void fangyin(uint addr)
{
send_data(0x0000,0x20); //POWER UP
delay_ms(25); //8KHz时延时 25ms
send_data(addr,0xe0); //SET PLAY
send_data(0x0000,0xf0) ; //PLAY
while(INT); //等待EOM段放音结束 暂未考虑录满情况(VOF)
//也可以监控 RAC口 8.0KHz 行输出
//也可以监控 MISO口标志位(EOM、VOF)
}
void luyin(uint addr)
{
send_data(0x0000,0x20); //POWER UP
delay_ms(25); //8KHz时延时 25ms
send_data(0x0000,0x20); //POWER UP
delay_ms(50); //延时 2倍
send_data(addr,0xa0); //SET REC
send_data(0x0000,0xf0); //REC
while(INT); //等待EOM段录音结束 暂未考虑录满情况(VOF)
}
void main()
{
SS=1;
SCLK=1;
EA=0; //设置系统不接受所有的中断
EX0=1; //设置接受INT0的中断
IT0=1; //设置外部中断0为边沿触发方式
while(1)
{
/*********************应用程序举例************************************/
luyin(0x0123); //设置录音起始地址,并开始录音
fangyin(0x0123); //设置放音起始地址,并开始放音
//不停的调用放音地址可以实现连续播放
/********************* 边录边放 ************************************/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -