📄 luyin_330.c
字号:
#include <C8051F330.h>
#define uchar unsigned char
#define uint unsigned int
sbit SS = P1^0;
sbit MOSI = P1^1;
sbit MISO = P1^2;
sbit SCLK = P1^3;
sbit AN = P1^5;
void Oscillator_Init (void) //时钟初始化
{
PCA0MD = 0x00;
OSCICN = 0X83; //系统时钟24.5Mz
CLKSEL = 0x00;
}
void PORT_Init (void)
{
P0MDOUT = 0x00; // P0为漏极开路方式
P0MDIN = 0xFF; // P0.0 数字输入
P0SKIP = 0xCF; //除了 P0.4,P0.5,交叉开关跳过其他P0口
P1MDOUT = 0x0B; //P1.0,P1.1,P1.3,为推挽,其他P1口 开漏
P1MDIN = 0XFF; //P1口为数字输入
P1SKIP = 0XFF; //交叉开关跳过P1口
XBR0 = 0x01; //UART0的TX,RX连到I/O引脚
XBR1 = 0x40;
}
void delay()
{
uchar i;
for(i=0;i<10;i++);
}
void delay_ms() //24.5M系统时钟下
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<20;j++);
}
void delay_25ms() //24.5M系统时钟下
{
uchar i,j;
for(i=0;i<255;i++)
for(j=0;j<255;j++);
}
void SPI_Send(unsigned char dat) //发送一个字节
{
unsigned char i;
SCLK=0;
for(i=0;i<8;i++) //先发低位再发高位,依次发送
{
dat=dat>>1;
MOSI=CY; //输出1位
delay();
SCLK=1;
delay();
SCLK=0;
delay();
}
}
void ISD_UpPwr(void) //上电指令
{
delay();
SS=0;
SPI_Send(0x00);
SPI_Send(0x20);
SS=1;
}
void ISD_Stop(void) //停止指令
{
delay();
SS=0;
SPI_Send(0x00);
SPI_Send(0x10);
SS=1;
}
void ISD_SetREC(uchar addr) //设置录音地址
{
delay();
SS=0;
SPI_Send(addr); //地址
SPI_Send(0xA0);
SS=1;
}
void ISD_REC() //从当前地址开始录音
{
delay();
SS=0;
SPI_Send(0x00);
SPI_Send(0xB0);
SS=1;
}
void ISD_SetPlay(uchar addr) //设置放音地址
{
delay();
SS=0;
SPI_Send(addr); //地址
SPI_Send(0xE0);
SS=1;
}
void ISD_Play() //从当前地址开始放音
{
delay();
SS=0;
SPI_Send(0x00);
SPI_Send(0xF0);
SS=1;
}
void LuYin() //录音
{
ISD_UpPwr(); //上电
delay_25ms(); //等待上电延时
ISD_UpPwr(); //上电
delay_25ms(); //等待上电延时
delay_25ms(); //等待上电延时(资料上说两倍延时)
ISD_SetREC(0x10);
ISD_REC();
}
void FaYin() //发音
{
ISD_UpPwr(); //上电
delay_25ms(); //等待上电延时
delay_25ms(); //等待上电延时
ISD_SetPlay(0x10); //发地址为10的SetPlay命令
ISD_Play(); //发Play命令,开始发音
}
main()
{
Oscillator_Init(); //时钟初始化
PORT_Init ();
//LuYin();
FaYin();
while(AN==1);
ISD_Stop();
while(1)
{
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -