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

📄 串口link.c

📁 51单片机虚拟串口,解决只有P3.0/P3.1单串口的不足
💻 C
字号:
#include  <reg51.h>
#include  <intrins.h>
typedef	unsigned char	INT8U;
typedef	unsigned int	INT16U;
typedef unsigned long   INT32U;

///////////////定义////////////////////////////
sfr TCON2 = 0xc8;
sfr TMOD2 = 0xc9;

sfr RCAP2L = 0xca;
sfr RCAP2H = 0xcb;
sfr TL2 = 0xcc;
sfr TH2 = 0xcd;

sbit TF2 = TCON2^7;
sbit EXF2 = TCON2^6;
sbit RCLK = TCON2^5;
sbit TCLK = TCON2^4;
sbit EXEN2 = TCON2^3;
sbit TR2 = TCON2^2;
sbit CT2 = TCON2^1;
sbit CPRL2 = TCON2^0;


sbit rs_rev = P3^0;
sbit rs_sent = P3^1;

INT8U bdata rsbuf;   //定义虚拟串口寄存器
sbit rs0 = rsbuf^0;
sbit rs1 = rsbuf^1;
sbit rs2 = rsbuf^2;
sbit rs3 = rsbuf^3;
sbit rs4 = rsbuf^4;
sbit rs5 = rsbuf^5;
sbit rs6 = rsbuf^6;
sbit rs7 = rsbuf^7;

//////////////虚拟串口初始化子函数///////////
void rs_com_start(void)
{
        RCAP2H = 0xff;
		TH2 = RCAP2H;
 	    RCAP2L = 160;    //9600波特率
		TL2= RCAP2L;
        TCON2 = 0x00;    //使用定时器2为波特率发生器
      //  TMOD2 = 0x00;
}
//////////////虚拟串口发送函数/////////////////////
void rs_sen(INT8U T_TXD)
{
        rsbuf=T_TXD;
        TR2 = 1;
        rs_sent = 0;         //发出开始位
        while(TF2 != 1);
		TF2=0;
		rs_sent=rs0;       
        while(TF2 != 1);
		TF2=0;
		rs_sent=rs1;
        while(TF2 != 1);
		TF2=0;
		rs_sent=rs2;
		while(TF2 != 1);
		TF2=0;
		rs_sent=rs3;
		while(TF2 != 1);
		TF2=0;
		rs_sent=rs4;
		while(TF2 != 1);
		TF2=0;
		rs_sent=rs5;
		while(TF2 != 1);
		TF2=0;
		rs_sent=rs6;
		while(TF2 != 1);
		TF2=0;
		rs_sent=rs7;
		while(TF2 != 1);
        TF2=0;
		rs_sent=1;           //发出停止位,数据位为8,结构为10位,无校验
        while(TF2 != 1);
        TF2=0;
		TR2=0;
}
///////////////虚拟串口接收子函数//////////////////
unsigned char rs_in(void)
{
        INT8U i;
        for(i=0;i<2;i++ )
		{
        i = 1;
        while( rs_rev != 0 ) ;
        TR2=1;            //收到开始位,开定时器2,
		while(TF2 != 1);
		TF2 = 0 ;
		rs0 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs1 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs2 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs3 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs4 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs5 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs6 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		rs7 = rs_rev ;
		while(TF2 != 1);
		TF2 = 0 ;
		if (rs_rev != 1)
		{
		        i = 0;
        }
        while(TF2 != 1);
		TR2 = 0;
		TF2 = 0;
		}
		return(rsbuf);
}



void main(void)
{
     INT8U i;
	 while(1)
	 {
     rs_com_start();
     rs_sen(0xdd);
     i=rs_in();
     rs_sen(i);
     }
}

⌨️ 快捷键说明

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