📄 sc69demo.c
字号:
#include <.\atmel\AT89X51.H>
// I/O define
sbit rw = P1^0;
sbit strobe = P1^1;
sbit inrdy = P1^3;
sbit outrdy = P3^2;
sbit rst = P1^2;
sbit btna = P3^3;
sbit btnb = P3^4;
sbit btnc = P3^5;
#define dataport P0
// variable
data data1, data2, data3;
data result;
// constant
/* command */
#define setregister 0x01 //write to internal registers for configuration
#define startplay 0x04 //start playing
#define stopplay 0x05 //stop playing
#define adjustvolume 0x06 //adjust volume
#define returnbyteval 0x07 //return status of data buffer
#define powerdown 0x08 //initiate sleep mode
#define receivefm 0x09 //receive FM data
#define pith 0x0A //perform speed pith shift
#define setosc 0x0B //oscillator control
/* parameter */
#define mode_4bit 0x01
#define mode_8bit 0x02
#define stopall 0x01
#define lightsleep 0x01
#define midsleep 0x02
#define deepsleep 0x03
#define resistor 0x01
#define crystal 0x02
#define stopall 0x01
#define stopmxcx 0x02
#define stopfm 0x03
void delay10us(void)
{
int t1;
t1++;
t1++;
t1++;
}
void delay1ms(void)
{
int t2;
t2=100;
while(t2>=0)
{
delay10us();
t2=t2-1;
}
}
void delayxms(int ms)
{
int t3;
t3=ms;
while(t3>=0)
{
delay1ms();
t3=t3-1;
}
}
void writedata(int data0)
{
while(inrdy==1) //wait inready low
{
}
delay10us();
rw=0; //write operation
dataport=data0; //set data
delay10us();
strobe=0; //data valid
delay10us();
strobe=1; //data invalid
while(inrdy==0)
{
}
}
int readdata(void)
{
int data0;
while(outrdy==1) //wait outready low
{
}
delay10us();
rw=1; //read operation
delay10us();
strobe=0; //data valid
delay10us();
data0=dataport; //read data
strobe=1; //data invalid
while(outrdy==0)
{
}
return(data0);
}
void sendcommand(int datalength)
{
writedata(data1);
datalength=datalength-1;
if (datalength!=0)
{
writedata(data2);
datalength=datalength-1;
if (datalength!=0)
writedata(data3);
}
}
void resetsc691(void)
{
rst=0; //set reset pin low
delayxms(20);
rst=1; //set reset pin high
}
void CrystalMode(void)
{
data1=setosc;
data2=crystal;
sendcommand(2);
}
void ResistorMode(void)
{
data1=setosc;
data2=resistor;
sendcommand(2);
}
void sc691testmode(void)
{
}
void set4bitmode(void)
{
data1=startplay;
data2=mode_4bit;
sendcommand(2);
}
void set8bitmode(void)
{
data1=startplay;
data2=mode_8bit;
sendcommand(2);
}
void playstop(void)
{
data1=playstop;
data2=stopall;
sendcommand(2);
}
int getplayresult(void)
{
int state;
state=readdata();
if(state!=0)
return(1);
else
{
ACC=readdata();
if(state!=0)
return(1);
else
{
state=readdata();
if(state!=5)
return(1);
else
{
state=readdata();
if(state!=5)
return(1);
else
return(0);
}
}
}
}
code unsigned char speechdata[138] =
{
0x08,0x29,0x08,0x1E,0x4A,0x20,0x59,0xA0,0x21,0xAD,0x55,0x32,0x1D,0xCB,0xEA,0xE7,
0x4C,0xA8,0x73,0x7B,0x1B,0x54,0xBB,0xA4,0x56,0xDE,0xB3,0xF6,0x55,0xC1,0xA5,0xBB,
0xFC,0x94,0x93,0xE4,0x6F,0x3F,0x64,0x91,0x38,0x5C,0x4E,0x23,0xD2,0xE1,0xEF,0x15,
0x89,0x60,0xCF,0x77,0xCD,0x0B,0xF7,0x5A,0x9C,0x71,0x62,0xBA,0x20,0x46,0xDB,0xD8,
0xAE,0xD8,0xE1,0xA6,0xD6,0x2B,0xBB,0x97,0x6B,0xAB,0xDD,0x2C,0x74,0x9C,0x6C,0xD6,
0x6E,0x11,0xC7,0x7A,0x30,0xD7,0xA9,0x82,0x0E,0x11,0x86,0xBE,0xF0,0x8F,0x9D,0x30,
0x75,0xB7,0x6D,0x6D,0x4C,0x53,0xFF,0x9B,0xDA,0x57,0xFF,0x6E,0x73,0x1E,0x56,0x7D,
0xF9,0xF0,0xD9,0x7D,0x9F,0x91,0x81,0x39,0xDB,0x67,0xFD,0x8F,0x0F,0x15,0x29,0xFD,
0x6B,0x2F,0xF5,0x87,0x79,0x74,0xD1,0xEF,0xF8,0xFF
};
void playin8bitmode()
{
int x;
set8bitmode();
x=0;
while(x<=138-1)
{
writedata(speechdata[x]);
x++;
}
}
void playin4bitmode()
{
int x;
set4bitmode();
x=0;
while(x<=138-1)
{
ACC=speechdata[x];
ACC=ACC>>4;
ACC=ACC&0x0F;
ACC=ACC|0x10;
writedata(ACC);
ACC=speechdata[x];
ACC=ACC&0x0F;
ACC=ACC|0x10;
writedata(ACC);
x++;
}
}
main()
{
rst=1;
strobe=1;
resetsc691();
delayxms(20);
CrystalMode();
delayxms(20);
result=0;
while(result==0)
{
playin4bitmode();
result=getplayresult();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -