#include"iom16v.h"
#include"macros.h"
char address[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};//语音地址
void delay_us(unsigned char time)
{//微秒级延时程序
do
{
time--;
}
while (time>1);
}
void delay_ms(unsigned int time)
{//毫秒级延时程序
while(time!=0)
{
delay_us(1000);
time--;
}
}
void play_voice_init(void)//boyin程序初始化
{
DDRA|=0x60; //设置PA5,6为输出口.PA6发送地址,PA5为时钟信号,
DDRA&=0x7f; //设置PA7为输入口.表示忙音信号,拉低时表示PM50播放完毕.
PORTA&=0xdf; //将时钟信号PA5拉低
PORTA|=0x80; //将忙音信号PA7拉高
}
void play_voice(unsigned int num)
//控制语音芯片pm50放音程序,
//输入连续播放录音段的数目和地址数组address[n]播放对应录音
{
char i,add; //add为替代地址
unsigned int j=0;
j=num;
while(PINA&0x80) //检查是否播放完毕,是则送播放地址,否则延时等待
{
delay_us(10);
}
PORTA&=0xbf;
delay_ms(100);
add=address[j];delay_us(10);
for(i=0;i<8;i++) //发送八位地址
{
PORTA&=0xbf;delay_us(10); //先将PA6拉低使之不影响下一步取位
PORTA|=((add&0x01)<<6);delay_us(10);//将低位取给PA6
PORTA|=0x20; delay_us(10); //将PA5拉高,上升沿PM50取走一个地址位
PORTA&=0xdf; delay_us(10); //将PA5拉低,一高一低相当于一个时钟周期
add=(add>>1); delay_us(10); //地址右移一位,准备取下一个地址位
}
}
void main(void)
{
unsigned char i;
play_voice_init();
while(1)
{
for(i=0;i<8;i++)
play_voice(i);}
}