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

📄 rs232.c

📁 stc-isp开发板驱动程序
💻 C
字号:
#include <config.h>

#define IN_UART

#define  RECEBUFFER_COUNT  8
#define  SENDBUFFER_COUNT  36

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

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


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

void rs232_initialize(void)
{  	
    AUXR &=0x3f;    //设定定时器0,1为普通的12时钟速度  T0x12=0,T1x12=0
	SCON = 0x50;
	PCON = 0x80;
	TMOD &=0x0f;
	TMOD |=0x20;
	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_sendbytes==0x00)	 //如果缓冲区已经发送完毕,则要启动发送
    {rs232_sendbytes++;
	 SBUF=ch; 
	 }

 else  // 如果缓冲区还有其他数据等待发送
    {if(rs232_sendrece>=SENDBUFFER_COUNT)
	    rs232_sendrece=0x00;
		
	 rs232_sendbuff[rs232_sendrece]=ch;
	 rs232_sendbytes++;
	 rs232_sendrece++; 
	 } 
}

unsigned char rs232_getdata(unsigned char access_mode)  //取得receive buffer时需要查询是否有串行数据
{unsigned char idata return_value = 0;
 if(access_mode == 0x00)  //  查询receive buffer缓冲区中有多少个数据
    return_value= rs232_recebytes;  //返回缓冲区剩余数据的个数
 else if(access_mode == 0x01)  // 读取数据并将数据清除
   {if(rs232_recebytes!=0x00)  // 如果系统中有接收的串行数据
       {return_value=rs232_recebuff[rs232_recesend];
	    rs232_recebuff[rs232_recesend]=0x00;
		rs232_recesend++;
        if(rs232_recesend>=RECEBUFFER_COUNT)  //如果越界,则跳转
                rs232_recesend=0x00;
		rs232_recebytes--;
        }
	else
	   return_value = 0x00;  //如果系统出错了,则返回0X00;
    }

 return return_value;
 }

// 串行的中断处理程序
void rs232r_isr(void)  interrupt 4
{
 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++; 		
	    }
    } 
 if(RI!=0x00)
   { RI = 0x00;  //清除接收标志
     RB8 =0x00;
     if(rs232_recerece>=RECEBUFFER_COUNT)
	    rs232_recerece=0x00;
     rs232_recebuff[rs232_recerece++] = SBUF; 
	 rs232_recebytes++;
	}

 }

⌨️ 快捷键说明

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