/*AMBE-1000 AMBE-1000 Serial Interrupt Programming (C语言)
Author: tsp语音芯片
The openning date: 2006.10.20日
The closing date: 2006.11.16日
Function: 没有串口传输握手协议,串口中断接收,编码好之后马上串口发送,串口发送波特率19200
*/
//****************************************************************************//
// the Area of Header //
//********************************************************//
#include <at89x51.h> /*关于寄存器、位的定义*/
#include <absacc.h> /*绝对地址访问,如XBYTE[0x0fff0]*/
#include <intrins.h> /*内部函数调用,如_nop_() 、_crol_()、cror();*/
#include <defnum.h> /*自定义的数据类型,如uchar 、uint */
//******************************************//
// the Definition of Constant //
//***************************************************************//
//帧格式ID号
#define VOICE_DATA 0x00 //语音帧
#define RATE_CONFIG 0x01 //码率设置帧
#define VOLUME_CONFIG 0x02 //音量设置帧
#define SPECIAL_CONFIG 0x03 //特殊功能设置帧
#define POWER_CONFIG 0x04 //电源模式设置帧
#define DUAL_TONE 0x06 //双音频信号产生帧
#define WAKE_UP 0xFE //唤醒帧
//帧头位置定义
#define HEADER_H 0 //第零字节帧头标志
#define HEADER_L 1 //第一字节
#define ID 2 //帧ID号
#define CONTROL_0 3 //控制字0
#define CONTROL_1H 4 //控制字1低位
#define CONTROL_1L 5 //控制字1高位
#define CONTROL_2H 6 //控制字2低位
#define CONTROL_2L 7 //控制字2高位
#define CONTROL_3H 8 //控制字3低位
#define CONTROL_3L 9 //控制字3高位
#define OFF 0 //LED灯熄灭
sbit AMBE_BPSSEL0 = P0^0; //码率选择BPS_SEL
sbit AMBE_BPSSEL1 = P0^1;
sbit AMBE_BPSSEL2 = P0^2;
sbit AMBE_BPSSEL3 = P0^3;
sbit AMBE_H_STOPN = P0^4;
sbit AMBE_CSEL2 = P0^5; //AD/DA选择 CSEL
sbit AMBE_SLEEP_EN = P0^6;
sbit AMBE_SLIP_EN = P0^7;
sbit AMBE_READ_STRB = P2^0; //输出选通信号-- 下降沿可以输出第一个数据
sbit AMBE_WRITE_STRB = P2^1; //输入选通信号-- 下降沿可以输入第一个数据
sbit AMBE_DPE = P2^2; //解码包空指示-- 单片机可以开始发送数据!
sbit AMBE_EPR = P2^3; //编码包准备好指示-- 单片机可以开始取数据!
sbit MC5480_UASEL = P2^5; //5480uA选择,1为u律,0为A律
sbit AMBE_VAD_EN = P2^6;
sbit AMBE_ECHO_EN = P2^7; //特殊功能选择
sbit AMBE_RESET = P3^7; //AMBE复位端
sbit LED1 = P3^3; //指示灯
sbit LED2 = P3^4;
sbit LED3 = P3^5;
sfr ALE=0x8e; //关闭ALE端口
//*************************************************************//
// the Definition of Globality //
//*******************************************************************//
uchar bdata flag2=0;
sbit serial_ok=flag2^0;
sbit sync=flag2^1;
uchar data count;
uchar data data_send_buffer[34]; //串口数据发送缓冲区
uchar data data_rec_buffer[34]; //串口数据接收缓冲区
//*********************************************************************//
// the Program of Delay //
//********************************************//
void delay(uchar i) //延时子程序
{
uchar j;
while(i--)
{
for(j=0;j<2;j++)
{;
}//4us*2=8us
}
}
// the Initializtion of System //
//***************************************//
void MCU_Serial_Init(void)//MCU串口初始化
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD = 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON = SMOD_; //SMOD=1;波特率翻倍
TH1 = 0xfd; //Baud:19200 fosc=11.0592MHz
TL1 = 0xfd;
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
}
/********************************************************************/
/* 系统初始化程序 函数原型:void system_ini(void) */
/* 功能:完成中断、定时器、外设等硬软件的初始化 */
/********************************************************************/
void System_Init(void)
{
/*--------开机自检------*/
delay(10);
P0 = 0x0FF;
P1 = 0x0FF;
P2 = 0x0FF;
P3 = 0x0FF;
ALE = 0x0FF;
LED1 = LED2 = LED3 = OFF;
count=0;
serial_ok=0;
MCU_Serial_Init();
}
void AMBE_1000_Init(void)
{
/* ===== A/D D/A 选择配置表 ======
u律 A律 16位线性
C_SEL2 0 1 1
C_SEL1 0 0 1
C_SEL0 0 0 1
*/
AMBE_CSEL2 = 0; //AMBE_CSEL1,0硬件电路固定为0
MC5480_UASEL = 1; //MC5480 u/A律选择
delay(10);
/* ===== 信道接口配置表 ========
帧格式: 并行被动 并行主动 串行主动 串行被动
CH_SEL2 0 0 0 0
CH_SEL1 0 0 1 1
CH_SEL0 0 1 0 1
非帧格式:串行被动1 串行被动2 串行被动3 串行被动4
CH_SEL2 1 1 1 1
CH_SEL1 0 0 1 1
CH_SEL0 0 1 0 1
硬件电路固定设为:并行被动 帧模式 */
/* ====== 码率设置配置表 (单位bps) ========
2400bps | 3600bps | 4000bps | 4800bps
2400(0) 2350(50)|3600(0) 3350(250)|3750(250)|4800(0) 4550(250) 3600(1200) 2550(2250)
BP_SEL3 0 0 | 0 1 | 1 | 0 0 0 1
BP_SEL2 0 1 | 0 0 | 1 | 0 1 0 0
BP_SEL1 0 0 | 0 0 | 1 | 1 1 1 0
BP_SEL0 0 1 | 1 1 | 0 | 1 1 0 0 6400bps | 7200bps | 8000bps | 9600bps
4150(2250)| 4400(2800)|7750(250) 4650(3350) | 9600(0) 4850(4750)
BP_SEL3 1 | 1 | 1 1 | 0 0
BP_SEL2 0 | 0 | 1 1 | 1 1
BP_SEL1 1 | 0 | 0 0 | 0 1
BP_SEL0 0 | 1 | 0 1 | 0 0
*/
AMBE_BPSSEL0 = 0; //码率选择为2400bps
AMBE_BPSSEL1 = 0;
AMBE_BPSSEL2 = 0;
AMBE_BPSSEL3 = 0;
/* ====== 特殊功能配置表 ========
功能 使能 禁止
SLEEP_EN 标准睡眠 1 0
SLIP_EN 时钟滑动控制 1 0
VAD_EN 语音活动检测 1 0
ECHO_EN 回波消除 1 0
*/
AMBE_SLEEP_EN = 0;
AMBE_SLIP_EN = 0;
AMBE_VAD_EN = 0;
AMBE_ECHO_EN = 0;
AMBE_H_STOPN = 1;//硬件睡眠关
delay(5);
AMBE_RESET = 1; //AMBE复位
delay(100);
AMBE_RESET = 0;
delay(255); delay(255); delay(255);
AMBE_RESET = 1;
AMBE_READ_STRB = 1; //读写选通复位
AMBE_WRITE_STRB = 1;
}
//******************************************//
// the T1 Interruption Handle Programming //
//*******************************************//
void SerialInterruptHandle(void) interrupt 4 using 3
{
if(RI)
{
uchar ch;
RI = 0;
ch=SBUF;
switch(count)
{
case 0:
if(ch==0x13)
{
data_rec_buffer[count]=ch;
count++;
}
else count=0;
break;
case 1:
if(ch==0xec)
{
data_rec_buffer[count]=ch;
count++;
}
else count=0;
break;
default:
data_rec_buffer[count+8]=ch;
count++;
break;
}
if(count>=8)
{
count=0;
}
}
}
//**************************************************************//
// the Program of Parallel Input and Output //
//**********************************************************//
void parellel_read(uchar input_data[])
{
uchar i;
for(i=0;i<34;i++)
{
AMBE_READ_STRB = 0; //开始读入数据
input_data[i] = P1; //从AMBE1000读入数据到缓冲区
AMBE_READ_STRB = 1;
}
delay(10);
}
void parellel_write(uchar output_data[])
{
uchar i;
for(i=0;i<34;i++)
{
AMBE_WRITE_STRB = 0; //开始写入数据
P1 = output_data[i]; //从缓冲区写数据到AMBE1000
AMBE_WRITE_STRB = 1;
}
delay(10);
}
//**********************************************************//
// the Program of MAIN //
//********************************************//
void main(void) /*--- main函数 ---- */
{
uchar data i=0;
System_Init(); // 调用系统初始化程序
AMBE_1000_Init(); //AMBE1000初始化程序
while(1)
{
if(AMBE_EPR==1) //编码包准备好,AMBE可以向外发送数据
{
parellel_read( data_send_buffer );
for(i=0; i<2; i++ ) //=======发送帧头数据到另一单片机====
{
SBUF = data_send_buffer[i]; //发送一个数据
while(TI == 0 );
TI = 0;
}
for(i=10; i<16; i++ ) //=======发送语音数据到另一单片机====
{//2.4Kbps码率时,编码后只有2400bps/50帧=6个字节的有效数据
SBUF = data_send_buffer[i]; //发送一个数据
while(TI == 0 );
TI = 0;
}
LED1 =~LED1; //指示编码,传输成功
}
if(AMBE_DPE==1)
{
parellel_write( data_rec_buffer );
LED2 =~LED2; //指示解码成功
}
}//while end
}//main end
ame初始化
最新推荐文章于 2021-11-22 17:18:22 发布