📄 main.c
字号:
#include <reg52.h>
#define INTERRUPT_EXT0 0
#define INTERRUPT_EXT1 2
#define INTERRUPT_TIME0 1
#define INTERRUPT_TIME1 3
#define INTERRUPT_COMM 4
#define INTERRUPT_TIME2 5
/*定义为移植而进行的目标系统无关数据类型*/
typedef unsigned char UINT8;
typedef signed char INT8;
typedef unsigned int UINT16;
typedef signed int INT16;
typedef unsigned long UINT32;
typedef signed long INT32;
code UINT8 ChgTbl[16]={0,8,4,0x0c,2,0x0a,6,0x0e,1,9,5,0x0d,3,0x0b,0x07,0x0f};
#define port_init() do{\
TMOD = 0x21;\
/*TR0 = 1*/;/*定时器0打开*/\
ET0 = 1;/*定时器0中断允许*/\
PCON = 0x80; /* SMOD = 1, double baud */\
SCON = 0x50; /* serial mode 1, 8 bit uart, enable receive */\
TH1 = 0xfd;\
TL1 = 0xfd;\
TR1 = 1;\
ES = 1;\
}while(0)
#define AddrPort P2
sbit KeyRecord = P0^4; /*录音开始SW0*/
sbit KeyPlay = P0^5; /*放音 SW1*/
sbit KeyAgain = P0^6; /*重新录音*/
sbit RecordBgn = P1^7; /*起动录间*/
sbit PlayBgn = P1^5; /*放音起动*/
sbit PlayEnd = P1^6; /*放音完成*/
volatile UINT8 RecordAddr=0x0; /*当前录音地址*/
volatile UINT8 PlayAddr=0x0;
volatile UINT8 RecordAddrPre=0x0; /*前一次的录音地址*/
volatile UINT8 cnt=5;
void DelayMs(UINT8 dly)
{
do{
UINT8 i;
for(i=0;i<153;i++)
{
;
}
}while(--dly);
}
void Timer0Int(void) interrupt INTERRUPT_TIME0
{
TH0=0xa5;
TL0=0xff;
cnt--;
if(cnt==0)
{
RecordAddr++;
SBUF=RecordAddr;
cnt=5;
}else
{
if(RecordBgn)
{
RecordAddr++;
SBUF=RecordAddr;
TR0=0;
}
}
}
void SerialInt(void) interrupt INTERRUPT_COMM
{
if(TI)
{
TI=0;
}else
{
PlayAddr=SBUF;
RecordAddr=PlayAddr;
AddrPort=ChgTbl[PlayAddr&0x0f]*16+ChgTbl[PlayAddr/16];
SBUF=PlayAddr;
RI=0;
}
}
void main(void)
{
port_init();
P2=0xff; /*地址线拉高*/
P1=0xff; /*控制线*/
EA=1;
RecordAddr=0x0;
PlayAddr=0x0;
RecordAddrPre=0x0;
AddrPort=0x00;
cnt=5;
do{
KeyRecord=1;
if(!KeyRecord) /*如果录音键按下*/
{
DelayMs(20);
if(!KeyRecord)
{
AddrPort=ChgTbl[RecordAddr&0x0f]*16+ChgTbl[RecordAddr/16];
PlayAddr=RecordAddr;
RecordAddrPre=RecordAddr;
SBUF=0xa5;
TH0=0xa5;
TL0=0xff;
cnt=5;
TR0=1;
RecordBgn=0; /*起动录间*/
do{
if( (RecordAddr&0xc0)==0xc0) break;
}while(KeyRecord==0);
RecordBgn=1; /*停止录音*/
//TR0=0; /*停止计数*/
}
}
KeyPlay=1;
if(!KeyPlay)
{
DelayMs(20);
if(!KeyPlay)
{
SBUF=PlayAddr;
PlayBgn=0x01;
RecordBgn=0x01;
PlayEnd=0x01;
AddrPort=ChgTbl[PlayAddr&0x0f]*16+ChgTbl[PlayAddr/16];
PlayBgn=0x0;
DelayMs(60);
SBUF='P';
//while(PlayEnd);
PlayBgn=1;
}
}
KeyAgain=1;
if(!KeyAgain)
{
DelayMs(20);
if(!KeyAgain)
{
PlayAddr=RecordAddrPre;
RecordAddr=RecordAddrPre;
SBUF=RecordAddr;
}
}
}while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -