⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sc69demo.c

📁 这是用C51编写的一个控制语音芯片SC691发音的一个实例
💻 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 + -