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

📄 rs232.c

📁 基于KEIL51的一款高性能的数字功放的完整代码
💻 C
字号:
#include <config.h>


#define IN_UART

#define  RECEBUFFER_COUNT  8
#define  SENDBUFFER_COUNT  16

unsigned char idata rs232_recedata=0x00;  //从接收缓冲中取得的数据

unsigned char idata rs232_recerece=0x00;   // 发送位置的标志
unsigned char idata rs232_recesend=0x00;   // 已经处理的位置标志
unsigned char idata rs232_recebytes=0x00;  // 缓冲区还存在的字节数
#if   XDATA_USING
unsigned char xdata rs232_recebuff[RECEBUFFER_COUNT];
#else
unsigned char idata rs232_recebuff[RECEBUFFER_COUNT];
#endif

unsigned char idata rs232_sendrece=0x00;   // 发送位置的标志
unsigned char idata rs232_sendsend=0x00;   // 已经处理的位置标志
unsigned char idata rs232_sendbytes=0x00;  // 缓冲区还存在的字节数
#if   XDATA_USING
unsigned char xdata rs232_sendbuff[SENDBUFFER_COUNT];
#else
unsigned char idata rs232_sendbuff[SENDBUFFER_COUNT];
#endif

void rs232_initialize(void)
{  	AUXR &=0x3f;    //设定定时器0,1为普通的12时钟速度  T0x12=0,T1x12=0
	SCON = 0x50;
	PCON = 0x80;
	TMOD &=0x0f;
	TMOD |=0x20;

//	TH1  = 0xf8;  /* 11.0592MHz晶振, 38400bps */
//	TL1  = 0xf8;  /* 11.0592MHz晶振, 38400bps */

	TH1  = 0xfe;  /* 22.1184MHz晶振, 57600bps */
	TL1  = 0xfe;  /* 22.1184MHz晶振, 57600bps */
//	TH1  = 0xfc;  /* 22.1184MHz晶振, 57600bps */
//	TL1  = 0xfc;  /* 22.1184MHz晶振, 57600bps */
//	TH1  = 0xfa;  /* 22.1184MHz晶振, 38400bps */
//	TL1  = 0xfa;  /* 22.1184MHz晶振, 38400bps */
//	TH1  = 0xf4;  /* 22.1184MHz晶振, 19200bps */
//	TL1  = 0xf4;  /* 22.1184MHz晶振, 19200bps */
//	TH1  = 0xe8;  /* 22.1184MHz晶振, 9600bps */
//	TL1  = 0xe8;  /* 22.1184MHz晶振, 9600bps */


    TF1 = 0X00;     // 定时器1的溢出标志
	TR1 = 0x01;
    TI  = 0x00;
    RI  = 0x00;
    ET1 = 0x01;     // 定时器1的中断使能
    ES  = 0x01;   // 开放串口
  //  PS  = 0x01;   // 将串口的优先级设定为最高
 }



// rs232 sendbuffer 的自动处理和安排
void rs232_senddata(unsigned char ch)
{
#if  RS232_USING      
 if(rs232_sendbytes==0x00)	 //如果缓冲区已经发送完毕,则要启动发送
    {rs232_sendbytes++;
	 SBUF=ch;	 
	 } 
 else  // 如果缓冲区还有其他数据等待发送
    {if(rs232_sendrece>=SENDBUFFER_COUNT)
	    rs232_sendrece=0x00;
	 rs232_sendbuff[rs232_sendrece]=ch;
	 rs232_sendbytes++;
	 rs232_sendrece++; 
	 } 
#endif
}
#if  RS232_USING
#if RS232GET_USING
bit rs232_getdata(void)
{
 bit returan_val=0x00;
 if(rs232_recebytes==0x00)
    returan_val=0;  // 如果没有数据则反馈为空
 else
    {rs232_recedata=rs232_recebuff[rs232_recesend];
	 rs232_recesend++;
	 if(rs232_recesend>=RECEBUFFER_COUNT)
	    rs232_recesend=0x00;
	 if(rs232_recebytes>0x00)
	    rs232_recebytes--;
	  returan_val=0x01;
	 }

 return  returan_val;
}

#endif
#endif

// 串行的中断处理程序
void rs232r_isr(void)  interrupt 4
{
#if  RS232_USING
 if(TI!=0x00)
   { TI = 0x00;
     TB8 =0x00;
     if(rs232_sendbytes>0x00)  //本次发送完毕的处理
	    rs232_sendbytes--;
	 if(rs232_sendbytes>0x00)  //如果还需要发送
	   {if(rs232_sendsend>=SENDBUFFER_COUNT)
		   rs232_sendsend=0x00;
	    SBUF=rs232_sendbuff[rs232_sendsend];
	    rs232_sendsend++; 		
	    }
	 else   //全部归位,以防止错误一直发生
	   {rs232_sendsend=0x00;
	    rs232_sendrece=0x00;
	    }
    } 
 if(RI!=0x00)
   { RI = 0x00;  //清除接收标志
     RB8 =0x00;
     if(rs232_recerece>=RECEBUFFER_COUNT)
	    rs232_recerece=0x00;
     rs232_recebuff[rs232_recerece++] = SBUF; 
	 rs232_recebytes++;
	}
#else
     TI = 0x00;
	 RI = 0x00;  //清除接收标志
     RB8 =0x00;
#endif
 }

⌨️ 快捷键说明

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