新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機控制ISD1420實現(xiàn)選段播放功能的實現(xiàn)

51單片機控制ISD1420實現(xiàn)選段播放功能的實現(xiàn)

作者: 時間:2016-11-21 來源:網(wǎng)絡 收藏

本文引用地址:http://butianyuan.cn/article/201611/319371.htm

程序原文:


#i nclude
#i nclude
#i nclude
#i nclude

//硬件端口的定義
#definePOWP3_7//此引腳為單片機控制一個三極管ISD1420供電

#definePLP3_5//接ISD1420PLAYL
#definePEP3_4//接ISD1420PLAYE
#defineRECP3_3//接ISD1420REC

#defineREC_LEDP3_2//ISD1420RECLED

//操作模式的定義
#definemode10xC8//循環(huán)放音操作,按一下PE鍵可循環(huán)放音,按PL鍵停止;或按PL鍵放音,松開即停止

#definemode20xD0//按順序連續(xù)分段錄放音,每段語音長度不限
#definemode30xC0//地址指針復位,開始錄放第一段
#definemode40xD1//按PE鍵可快速選段放音

//0xC1//也為地址指針復位

unsignedcharRX_index=0;//
bitFLAG_rev=0;//
unsignedcharPC_COMMAND;
unsignedcharRX_BUFFER[10];//串行接收緩存

voidio_init(void);
voidinit_serialcomm(void);
voidserial_out(unsignedchard);
voiddelay5ms(void);
voiddelay(unsignedintx);
voidnop(unsignedchari);

voidpaly(unsignedchari);//選擇播放當前段操作


voidmain(void)
{
io_init();
init_serialcomm();
delay(1000);

serial_out(0xaa);//發(fā)送到PC機,看看PC端是否收到正確數(shù)據(jù)
serial_out(0x55);
serial_out(0x33);

POW=0;//開啟電源

//P1=mode4;
//P1=0X00;
while(1)
{

}
}

//-----端口初始化
voidio_init(void)
{
P1M0=0x00;//設置STC的IO為標準51IO模式
P1M1=0x00;
P3M0=0x00;
P3M1=0x00;
P1=0XFF;
P3=0XFF;
}

//串行口初始化
voidinit_serialcomm(void)
{
SCON=0x50;//SCON:serailmode1,8-bitUART,enableucvr

TMOD=0x20;//TMOD:timer1,mode2,8-bitreload

TH1=0xf3;//12MHz,2400bps
TL1=0xf3;
//IE|=0x90;//EnableSerialInterrupt

TR1=1;//timer1run

ES=1;
EA=1;
}

//串行數(shù)據(jù)發(fā)送,查詢模式
voidserial_out(unsignedchard)
{
ES=0;
SBUF=d;while(TI==0){;}TI=0;
ES=1;
}

//串行中斷接收
voidreceive()interrupt4
{
if(RI)
{
RI=0;
ES=0;
PC_COMMAND=SBUF;

//RX_BUFFER[RX_index]=PC_COMMAND;//保存數(shù)據(jù)到數(shù)組里面
//RX_index++;
switch(PC_COMMAND)
{


case0xa0:

serial_out(0xa0);
P1=mode2;//按順序連續(xù)分段錄放音,每段語音長度不限0xD0連續(xù)尋址,A4

PE=0;
nop(10);
PE=1;

P1=0XFF;

break;

case0xb0:
serial_out(0xb0);
P1=mode3;//地址指針復位0xC0

nop(10);
P1=0XFF;

break;

case0xc0://選段播放控制
serial_out(0xc0);


P1=0xD1;//第二步:快速選段放音


P1_0=0;
nop(10);
P1_0=1;
nop(10);


PE=0;
nop(10);
PE=1;

break;

case0xd0:
serial_out(0xd0);//播放任意段的組合
paly(3);
paly(1);
paly(5);
paly(5);
paly(6);
paly(4);
paly(3);
paly(6);
paly(1);

break;

case0x30:
serial_out(0x30);
//此操作循環(huán)放音操作,按一下PE鍵可循環(huán)放音,按PL鍵停止;或按PL鍵放音,松開即停止
//此操作沒什么用
P1=mode1;

PE=0;
nop(10);
PE=1;
//
break;

default:break;
}

ES=1;
}
}


voidpaly(unsignedchari)
{
i--;

P1=mode3;//第一步:地址指針復位0xC0A7--A0:11000000(A2、A5在應用中可直接接地)
nop(10);
//P1=0XFF;

delay(30);//必要的延時

if(i>0)
{
P1=0xD1;//第二步:快速選段放音0xD1A7--A0:11010001(A2、A5在應用中可直接接地)
do
{
P1_0=0;//給A0低電平脈沖
nop(10);
P1_0=1;
nop(10);

PE=0;
nop(10);
PE=1;

delay(50);//這個延時是非常必要的!
i--;
}
while(i!=0);

delay(30);//必要的延時
}


P1=mode2;//第三步:播放當前段0xD0A7--A0:11010000(A2、A5在應用中可直接接地)

PE=0;
nop(10);
PE=1;
//P1=0XFF;

while(REC_LED==1){;}//等待播放
while(REC_LED==0){;}//等待播放結(jié)束

}

//----------------------------軟件延時函數(shù)----------------------------
//50ms延時
voiddelay5ms(void)
{
unsignedcharTempCyc=250;
while(TempCyc--);
}

voiddelay(unsignedintx)
{
do
{
delay5ms();delay5ms();delay5ms();x--;
}
while(x!=0);
}

voidnop(unsignedchari)
{
do
{
_nop_();
i--;
}
while(i!=0);
}



評論


技術(shù)專區(qū)

關閉