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

📄 serial.c

📁 一种语音芯片XF-S3011的51IO口模拟放音程序。
💻 C
字号:
//初值 = 256-(2SMOD * fosc) / (fx*32*12) 
// 初值 = (2097152*波特率-Fosc)/(波特率*32)
//		   11.0592 	22.1184
// 1200    FEE0   	fdc0
// 9600    FFDC   	ffb8
// 19200   ffee   	ffdc
#define T2BAUDH	0xff
#define T2BAUDL	0xdc

#define SerialSMaxlen	20
#define SerialRMaxlen	30

uchar idata SerialRBuf[SerialRMaxlen] ;
uchar *inSerialRBuf,*outSerialRBuf ;		//
uchar idata SerialSBuf[SerialSMaxlen] ;
uchar *inSerialSBuf,*outSerialSBuf ;		//
bit TIflag ;	//Note:It must be 1

void Serial_Init()
{
	EA = 0 ;
	T2CON = 0x30 ;
	RCAP2H = T2BAUDH ;
	RCAP2L = T2BAUDL ;
	TH2 = T2BAUDH ;
	TL2 = T2BAUDL ;
	SCON = 0x50 ;
	TR2 = 1 ;
	ET2 = 0 ;
	ES = 1 ;
	PS = 1 ;
	TIflag = 1 ;
	inSerialRBuf = SerialRBuf ;
	outSerialRBuf = SerialRBuf ;
	inSerialSBuf = SerialSBuf ;
	outSerialSBuf = SerialSBuf ;
	EA = 1 ;
}

void  Serial_RP_Interrupt() interrupt 4 using 3
{
	uchar temp ;
	uchar *t ;
	
	if(TI ==1) 
	{
		TI = 0 ;
        if(inSerialSBuf == outSerialSBuf)	//SerialSBuf Empty
        {
        	TIflag = 1 ;
        	return ;
        }
        SBUF = *outSerialSBuf ;
        outSerialSBuf++ ;
        if(outSerialSBuf==SerialSBuf+SerialSMaxlen)
        	outSerialSBuf = SerialSBuf ;
	}
	if(RI ==1) 
	{
		RI = 0 ;
		temp = SBUF ;
		t = inSerialRBuf ;
		t++ ;
        if(t==SerialRBuf+SerialRMaxlen) t = SerialRBuf ;
        *inSerialRBuf = temp ;
        if(t==outSerialRBuf) return ;                 //SerialRBuf Full
        inSerialRBuf = t ;
	}
}

void Serial_Send_Byte(uchar ch)
{
	uchar *t ;
	
    t = inSerialSBuf ;
    t++ ;
    if(t == SerialSBuf+SerialSMaxlen)
    	t = SerialSBuf ;
    if(t == outSerialSBuf)
    	return ;                  //SerialSBuf Full
    *inSerialSBuf = ch ;
    inSerialSBuf = t ;
	if(TIflag)
	{
       TIflag = 0 ;
       TI = 1 ;
    }
}

void Serial_SendCommand(uchar len,uchar *in) 
{
	uchar i ;
//	if(len == 0)	return ;
	EA = 0 ;
	for(i=0;i<len;i++)
		Serial_Send_Byte(*(in+i)) ;
	EA = 1 ;
}

uchar GetSerialData(uchar *in)
{
	if(inSerialRBuf == outSerialRBuf) return 0 ;           //SerialRBuf Empty
    *in = *outSerialRBuf ;  outSerialRBuf ++ ;
    if(outSerialRBuf == (SerialRBuf+SerialRMaxlen)) outSerialRBuf = SerialRBuf ;
    return 1 ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -