📄 main.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
////////定义放音命令,定义常量//////
#define ISDPOWERUP 0X20 //ISD4004上电
#define ISDSTOP 0X10 //ISD4004下电
#define OPERSTOP 0X30 //ISD4004停止当前操作
#define PLAYSET 0XE0 //ISD4004从指定地址开始放音
#define PLAYCUR 0XF0 //ISD4004从当前地址开始放音
#define RECSET 0XA0 //ISD4004从指定地址开始录音
#define RECCUR 0XB0 //ISD4004从当前地址开始录音
#define NOP {_nop_();_nop_();_nop_();}
sbit SS=P1^3; //LOW IS ACTIVELY
sbit MOSI=P1^2;
sbit MISO=P1^7;
sbit SCLK=P1^4;
sbit K1=P2^7; //REC
sbit K2=P2^6; //PLAY
sbit K3=P2^5; //STOP
sbit LED1=P1^0; //REC_LED
sbit LED2=P1^1; //PLAY_LED
uint code mat_s[]={0,2,4,6,8,10,12,14,16,18}; //分9段,800ms
uint code mat_10s[]={135,165,225,315,435,585,785,995,1235,1505}; //分9段,10s——90s
uint counter,addre=0; //RAC计数参量,地址
void delayms(uchar ms);
extern uchar kbscan(void) ; //扫描子程序
/******************放音子程序******************************/
void play(uint addr) //addr录放起始地址
{
uchar n_bit,con_char; //con_char操作码
LED1=0;
LED2=1;
SS=1;
SCLK=0;
SS=0;
//发送地址
for(n_bit=0;n_bit<16;n_bit++)
{
SCLK=0;
addr>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
//发送操作
con_char=PLAYSET;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
con_char=PLAYCUR;
SS=0;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
P1|=0x9C;
}
/*************************录音子程序********************************************/
void rec(uint addr)
{
uchar n_bit,con_char; //con_char操作码
LED2=0;
LED1=1;
SS=1;
SCLK=0;
SS=0;
//发送地址
for(n_bit=0;n_bit<16;n_bit++)
{
SCLK=0;
addr>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
//发送操作
con_char=RECSET;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
con_char=RECCUR;
SS=0;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
P1|=0x9C;
}
/*****************************上电*****************************************/
void power_up()
{
uchar n_bit, con_char=ISDPOWERUP;
SS=1;
SS=0;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
P1|=0x9C;
delayms(25);
}
void stop()
{
uchar n_bit,con_char=OPERSTOP;
LED1=0;
LED2=0;
EX0=0;
SS=1;
SS=0;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
P1|=0x9C;
}
void power_down()
{
uchar n_bit,con_char=ISDSTOP;
LED1=0;
LED2=0;
EX0=0;
SS=1;
SS=0;
for(n_bit=0;n_bit<8;n_bit++)
{
SCLK=0;
con_char>>=1;
MOSI=CY;
NOP;
SCLK=1;
NOP;
}
SCLK=0;
SS=1;
P1|=0x9C;
}
//**************延时子程序***************************
void delayms(uchar ms)
{
uchar j;
while(ms--)
{
for(j = 0; j < 120; j++);
}
}
/*********************键盘按键说明****************************
* 功能设定 * 上电 * 录音/ * 放音/ *
* /确定 * * 数组0 * 数组1 *
**************************************************************
* 按键8 * 按键9 * 掉电 * 停止 *
* * * * *
**************************************************************
* 按键4 * 按键5 * 按键6 * 按键7 *
* * * * *
**************************************************************
* 按键0 * 按键1 * 按键2 * 按键3 *
* * * * *
*************************************************************/
void main()
{
uchar key,flag=0,labal=1,keys; //2表示不用数组
uchar i=100;
P1=0xff;
P2=0XFF;
P3=0XFF;
power_up();
EA=1;
EX0=0;
IT0=1;
while(1)
{
key=kbscan();
if(key!=255)
switch(key)
{
case 15:LED2=0;delayms(10);LED2=1;
if(!flag)
{
if(labal==1)
counter=(keys+1)*30;
else counter=(keys+1)*3;
EX0=1;
play(addre);
}
else labal=1;
break;
case 14:LED2=0;delayms(10);LED2=1; //录音
if(!flag)
{
if(labal==1)
counter=(keys+1)*30;
else counter=(keys+1)*3;
EX0=1;
rec(addre);
}
else labal=0;
break;
case 13:LED2=0;delayms(10);LED2=1;
if(!flag)
power_up();
break;
case 12:LED2=0;delayms(10);LED2=1;LED1=1;
flag=!flag;
if(!flag)
{
if(labal==0)
addre=mat_s[keys];
if(labal==1)
addre=mat_10s[keys];
}
break;
case 11:LED2=0;delayms(10);LED2=1;
if(!flag)
stop();
;
break;
case 10:LED2=0;delayms(10);LED2=1;
if(!flag)
power_down();
;
break;
case 9:LED2=0;delayms(10);LED2=1;keys=9;break;
case 8:LED2=0;delayms(10);LED2=1;keys=8;break;
case 7:LED2=0;delayms(10);LED2=1;keys=7;break;
case 6:LED2=0;delayms(10);LED2=1;keys=6;break;
case 5:LED2=0;delayms(10);LED2=1;keys=5;break;
case 4:LED2=0;delayms(10);LED2=1;keys=4;break;
case 3:LED2=0;delayms(10);LED2=1;keys=3;break;
case 2:LED2=0;delayms(10);LED2=1;keys=2;break;
case 1:LED2=0;delayms(10);LED2=1;keys=1;break;
case 0:LED2=0;delayms(10);LED2=1;keys=0;break;
}
}
}
//中断
void int_0() interrupt 0
{
counter--;
if(counter==0)
stop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -