📄 1420.c
字号:
#include<reg51.h>
#include<intrins.h>
sbit key_REC=P1^0;
sbit key_PLAYE=P1^1;
sbit key_PLAYL=P1^2;
sbit key_function=P1^6;
sbit REC=P1^3;
sbit PLAYE=P1^4;
sbit PLAYL=P1^5;
sbit key0=P2^7;
unsigned char key;
bit flag_rec=0,flag_playl=0,flag_playe=0,flag=0;
bit f0=0,f1=0;
//地址是0x00~0x9F 共160个 8个为一秒
unsigned char voice_addr[]= // 录音的各地址
{0x00,0x08,0x10,0x18,0x20,
0x28,0x30,0x38,0x40,0x48,
0x50,0x58,0x60,0x68,0x70,
};
//
void delay_10us(unsigned char n)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
//
void delay_ms(unsigned int n)
{
do
{
delay_10us(230);
}while(--n);
}
//键控录音
void Record()
{
while(flag_rec==1)
{
key=P2;
if(key==0xff)continue;//当key_REC按下过一次之后,则程序一直在这里执行直到有命令才开始录音
//这是因为有continue与while的结果
delay_ms(10);
key=P2;
if(key==0xff)continue;
switch(key)
{
case 0xfe:
{
P0=voice_addr[0];
//录音时因控制延时时间
//应让延时时间小于录音时间
REC=0;
delay_ms(500);
REC=1;
break;
}
case 0xfd:
{
P0=voice_addr[1];
REC=0;
delay_ms(500);
REC=1;
break;
}
case 0xfb:
{
P0=voice_addr[2];
REC=0;
delay_ms(500);
REC=1;
break;
}
default:
{
break;
}
}
flag_rec=0;
}
}
//电平放音子程序中的子程序
Playl1()
{
switch(key)
{
case 0xfe:
{
P0=0X00;
P0=voice_addr[0];
PLAYL=0;
delay_ms(600);
PLAYL=1;
break;
}
case 0xfd:
{
P0=0X00;
P0=voice_addr[1];
PLAYL=0;
//可以不延时,因为它碰到末尾的EOM就会结束
//如果延时就可以自由的播放我想要的录音长度
//在我的录音范围之内
delay_ms(300);
PLAYL=1;
break;
}
case 0xfb:
{
P0=0X00;
P0=voice_addr[2];
PLAYL=0;
delay_ms(600);
PLAYL=1;
break;
}
default:
{
break;
}
}
flag_playl=0;
}
//电平触发播放函数
//变为低电平并保持直到变高或遇到结束标志
void Playl()
{
while(flag_playl==1)
{
if(f0==1) //循环
{
while(f0==1)
{
P0=0xc8;
PLAYL=0;
while(key_PLAYL==0);
PLAYL=1;
f0=0;
flag_playl=0;
}
}
else
{
key=P2;
if(key==0xff)continue;
delay_ms(10);
key=P2;
if(key==0xff)continue;
Playl1();//把下面的程序写成了一个函数 在上面
}
}
}
//脉冲放音
Playe()
{
while(flag_playe==1)
{///////////此功能未实现
if(f0==1) //循环
{
while(f0==1)
{
PLAYE=1;
P0=0xc8;
PLAYE=0;
if(key_PLAYL==1)continue;
delay_ms(10);
if(key_PLAYL==1)continue;
PLAYL=0;
key_PLAYL=1;
// PLAYE=1;
// PLAYL=0;////////////////???????????????????
//
//
// PLAYL=1;
f0=0;
flag_playe=0;
}
}
///////////此功能未实现
if(f1==1) //快进
{
PLAYE=1;
P0=0xd1;//
PLAYE=0;
f1=0;
flag_playe=0;
PLAYE=1;
PLAYE=0;
}
if((f0==0)&&(f1==0)) //在无操作模式下
{
key=P2;
if(key==0xff)continue;
delay_ms(10);
key=P2;
if(key==0xff)continue;
switch(key)
{
case 0xfe:
{
P0=0X00;
P0=voice_addr[0];
PLAYE=1;
PLAYE=0;//播放
break;
}
case 0xfd:
{
P0=0X00;
P0=voice_addr[1];
PLAYE=1;
PLAYE=0;
break;
}
case 0xfb:
{
P0=0X00;
P0=voice_addr[2];
PLAYE=1;
PLAYE=0;
break;
}
default:
{
break;
}
}
flag_playe=0;
}
}
}
//操作模式
void work()
{
while(flag==1)
{
key=P2;
if(key==0xff)continue;
delay_ms(10);
key=P2;
if(key==0xff)continue;
switch(key)
{
case 0xfe:
{
// P0=0Xff;
// P0=0xc8;
f0=1;//循环
break;
}
case 0xfd:
{
// P0=0Xff;
// P0=0xd1;//
f1=1;//快进
break;
}
default:
{
break;
}
}
flag=0;
}
}
/**************************/
//主函数
main()
{
P0=0x00;
while(1)
{
//录音
if( key_REC==0)
{
delay_ms(10);
if( key_REC==0)
{
flag_rec=1;
while(key_REC==0);
delay_ms(8);
// Record();
}
}
//电平放音
if( key_PLAYL==0)
{
delay_ms(10);
if( key_PLAYL==0)
{
flag_playl=1;
// while(key_PLAYL==0);
// delay_ms(8);
// Playl();
}
}
//脉冲放音
if( key_PLAYE==0)
{
delay_ms(10);
if( key_PLAYE==0)
{
flag_playe=1;
while(key_PLAYE==0);
delay_ms(8);
// P0=0xc8;
// PLAYE=1;
// PLAYE=0;
// while(key_PLAYL==1);
//// if(key_PLAYL==1)continue;
//// delay_ms(10);
//// if(key_PLAYL==1)continue;
// PLAYL=0;
// delay_ms(1000);
// PLAYL=1;
// // key_PLAYL=1;
// // Playe();
}
}
//操作模式
if(key_function==0)
{
delay_ms(10);
if( key_function==0)
{
flag=1;
while(key_function==0);
delay_ms(8);
}
}
//各函数
Record();//
Playl();
work();
Playe();
///测试各录音
if(key0==0)
{
delay_ms(10);
if(key0==0)
{
//while(key0==0);
//delay_ms(10);
key=0xfe;
flag_playl=1;
Playl1();
key=0xfb;
flag_playl=1;
Playl1();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -