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

📄 1.c

📁 一个关于51单片机的双串口转换程序
💻 C
字号:
#include "STC12C5410AD.H"

#define		uint		unsigned int
#define		uchar		unsigned char

sbit MCLK=P1^2;
sbit SCLK=P1^1;
sbit SDA=P1^0;
sbit MCLK_1=P3^3;
sbit SCLK_1=P3^4;
sbit SDA_1=P3^5;
sbit N485=P3^2;
// 发送一个数据
//sfr TL0 = 0x8A;              //TL0 
//sfr TH0 = 0x8C;              //TH0 

uchar bdata DATA;
sbit BIT0=DATA^0;
sbit BIT7=DATA^7;

uchar		idata	RX[6];
uchar		idata	TX[28];
uchar		Rx_Num;
uchar		Rx_F_Num;//数据断开次数
uint        Time2Cnt1=0;
uchar		Numlong;
//sfr16 TL1   = 0xca;                     // Timer2 reload value
//sfr16 TH1   = 0xcc;                     // Timer2 counter

bit		  OneSecondFlag;
uint	  HuifuFlang1;
uint	  HuifuFlang2;
uint      Time2Cnt1;
			  
//unsigned int CRC16 (unsigned char *nData, unsigned char  wLength);

void InitialUart();
void TXD_Int(uchar *TX,uchar Send_Num);
void T0_init(void);

putbytespi_1(uchar ch)
{
    uchar i;
    
    if(!MCLK_1)return; //
//	P3M0=0X00;
//	P3M1=0X28;//P3.3 P3.5 强推挽输出   
    MCLK_1=0;    //申请通讯
    DATA=ch;

    for(i=4;i!=0;i--)
    {
        while(SCLK_1); //检测从机响应
    
        SDA_1=BIT0;   //放一个bit到SDA_1
        MCLK_1=1;        
        DATA=DATA>>1; //准备下一个bit

        while(!SCLK_1); //检测从机响应
    
        SDA_1=BIT0;   //放一个bit到SDA_1
        MCLK_1=0;        
        DATA=DATA>>1; //准备下一个bit
    }
    while(SCLK_1); //检测从机收完
    MCLK_1=1;
    while(!SCLK_1);//等待从机准备好
    SDA_1=1;
//	P1M0=0X00;
//	P1M1=0X00;//取消P3.3 P3.5强推挽输出   
}

//接收一个数据
//调用之前最好检测MCLK_1是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信
uchar getbytespi_1()
{
    uchar i;

    while(MCLK_1);
    SCLK_1=0;    //接受通讯请求

    for(i=4;i!=0;i--)
    {
        DATA=DATA>>1; //准备收下一个bit
        while(!MCLK_1); //检测主机放数据
        BIT7=SDA_1;//收一个bit
        SCLK_1=1;

        DATA=DATA>>1; //准备收下一个bit
        while(MCLK_1); //检测主机放数据
        BIT7=SDA_1;  //收一个bit
        SCLK_1=0;    
    }
    
    while(!MCLK_1); //检测主机发完
    SCLK_1=1;
    return(DATA);    
}
// 发送一个数据
void putbytespi(uchar ch)
{
    uchar i;

    if(!MCLK)return; //  
 //	P1M0=0X00;
//	P1M1=0X05;//P1.2 P1.0 强推挽输出   
  
    MCLK=0;    //申请通讯
    DATA=ch;

    for(i=4;i!=0;i--)
    {
        while(SCLK); //检测从机响应
    
        SDA=BIT0;   //放一个bit到SDA
        MCLK=1;        
        DATA=DATA>>1; //准备下一个bit

        while(!SCLK); //检测从机响应
    
        SDA=BIT0;   //放一个bit到SDA
        MCLK=0;        
        DATA=DATA>>1; //准备下一个bit
    }
    while(SCLK); //检测从机收完
    MCLK=1;
    while(!SCLK);//等待从机准备好
    SDA=1;
//	P1M0=0X00;
//	P1M1=0X05;//取消P1.2 P1.0 强推挽输出   

}

//接收一个数据
//调用之前最好检测MCLK是否为0(对方是否申请数据通讯)再进入,否则里面是死等此信
uchar getbytespi()
{
    uchar i;

    while(MCLK);
 // P1M0=0X00;
//	P1M1=0X02;//P1.1 强推挽输出   

    SCLK=0;    //接受通讯请求

    for(i=4;i!=0;i--)
    {
        DATA=DATA>>1; //准备收下一个bit
        while(!MCLK); //检测主机放数据
        BIT7=SDA;//收一个bit
        SCLK=1;

        DATA=DATA>>1; //准备收下一个bit
        while(MCLK); //检测主机放数据
        BIT7=SDA;  //收一个bit
        SCLK=0;
//		P1M0=0X00;
//	    P1M1=0X00;//取消P1.2 P1.0 强推挽输出   
    
    }
    
    while(!MCLK); //检测主机发完
    SCLK=1;
    return(DATA);    
}


//-------------------------------------------------------------------------------//
//初始化串口通讯程序-------------------------------------------------------------//
//Baud---------------------------------------------------------------------------//
//0xFF 28800---------------------------------------------------------------------//
//0xFE 14400---------------------------------------------------------------------//
//0xFD 9600----------------------------------------------------------------------//
//0xFA 4800----------------------------------------------------------------------//
//0xF4 2400----------------------------------------------------------------------//
//0xE8 1200----------------------------------------------------------------------//
//-------------------------------------------------------------------------------//
void InitialUart()
{
	SCON = 0x50;
	TMOD |= 0x20;
	TH1 = 0xFa;
	TL1 = 0xFa;
	TR1 = 1;
	ES  = 1;
}

//-----------------------------------------------------------------------------
//串口发送一个字节
//功能:发送一个字节数据
//入口参数:发送数据
//出口参数:无
//-----------------------------------------------------------------------------
void Send_Data(uchar Serial_data)
{
    TI = 0;
    SBUF = Serial_data;
    while(!TI);
    TI = 0;
}

//-----------------------------------------------------------------------------
//发送一帧数据函数
//原型:void TXD_Int(uchar *TX);
//功能:发送一帧数据
//入口参数:发送数据帧地址指针,Send_Num:发送数据的个数
//出口参数:无
//-----------------------------------------------------------------------------
void TXD_Int(uchar *TX,uchar Send_Num)
{
    uchar i;
    for(i = 0; i < Send_Num; i ++)  	Send_Data(*(TX+i));
	RI = 0;
}

//-----------------------------------------------------------------------------
//UART0_interrupt
//-----------------------------------------------------------------------------
void UART0_ISR (void) interrupt 4
{	uchar i;

	if(RI == 1)
    {
		RI = 0;
		TX[Rx_Num] = SBUF;
		Rx_Num ++;

	   	if(TX[0] != RX[4])	Rx_Num = 0;

		 if(Rx_Num >Numlong)
		 {
			Rx_Num = 0;
		 
		  if(HuifuFlang1==1)

	   	       {
			     for (i=0;i<Numlong;i++) 
			 	
		          {
		           putbytespi(TX[i]);
	  	          }
			    } 
				
		if(HuifuFlang2==1)

	   	       {
			     for (i=0;i<Numlong;i++) 
			 	
		          {
		           putbytespi_1(TX[i]);
	  	          }
			    } 	 
  
            }


		 }
 	}

					 

void T0_init(void)             //定时器0初始化  
{
	TR0=0; 
    TMOD = 0X01;
  
//	TL0 =0X00;
//	TH0 =0XDC;                  //10MS
	TL0 =0X66;
	TH0 =0XFC;                 // 1MS
							  
	TR0=1;
    ET0 = 1;                        //置中断优先级为高  
    PT0 = 1;                        //允许定时器中断    
}

void timer0 (void) interrupt 1 using 3
{
    uchar i;

	TR0=0;
	WDT_CONTR = 0x3E; 	
	TL0 =0X66;
	TH0 =0XFC;

 	 if ((MCLK==0)&&(HuifuFlang2==0))	
	      {
			
		   N485=1;
	    	for (i=0;i<6;i++) 	RX[i]=getbytespi();
			Numlong=RX[5];
		    TXD_Int(RX,Numlong);
			HuifuFlang1=1;
			N485=0;

          }

	  if ((MCLK_1==0)&&(HuifuFlang1==0))	
	      {
	    	N485=1;
			for (i=0;i<5;i++) 	RX[i]=getbytespi_1();
		    TXD_Int(RX,Numlong);
			HuifuFlang2=1;
			N485=0;
          }

 	 	TR0=1; 	
}

void main(void)
{
	unsigned int  ShowNum;  
    for(ShowNum = 0; ShowNum < 0xffff; ShowNum ++);           
	WDT_CONTR &=~0x20;
	WDT_CONTR = 0x3E;                                 //看门狗定时2.2755*2S
	T0_init();
	InitialUart();
//	MCLK=1;
	MCLK_1=1;
	Rx_Num=0;
	N485=0;
	RX[0]=0X2A;
	RX[1]=getbytespi();
	RX[2]=getbytespi();
	RX[3]=getbytespi();

    putbytespi_1(RX[1]);
	putbytespi_1(RX[2]);
	putbytespi_1(RX[3]);

	EA=1;
	ES = 1;
    while (1)
	{

	}  
}

⌨️ 快捷键说明

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