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

📄 3.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 N485=P3^2;

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

uchar		idata RX[10],TX[28];
uchar		Rx_Num;
uchar		Rs485_Flag;
uchar		Numlong;

//unsigned int CRC16 (unsigned char *nData, unsigned char  wLength);
void InitialUart();
void TXD_Int(uchar *TX,uchar Send_Num);
void T0_init(void);
 
 // 发送一个数据
void putbytespi(uchar ch)
{
    uchar i;

    if(!MCLK)return; //    
    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;
}

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

    while(MCLK);
    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;    
    }
    
    while(!MCLK); //检测主机发完
    SCLK=1;
    return(DATA);    
}

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;
	EA=1;
	ES = 1;
	N485=0;
	Rx_Num=0;
   	RX[5]=getbytespi();
	RX[6]=getbytespi();
	RX[7]=getbytespi();
	while (1)
	{

	}  
}

//-------------------------------------------------------------------------------//
//初始化串口通讯程序-------------------------------------------------------------//
//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;
		RX[Rx_Num] = SBUF;
		Rx_Num ++;
	   	if(RX[0] != 0x2A)	Rx_Num = 0;

		if(Rx_Num >= 5)
		{
			Rx_Num = 0;

       	if((RX[0]==0X2A)&&(RX[1]==RX[5])&&(RX[2]==RX[6])&&(RX[3]==RX[7]))
       	   {      
		     switch(RX[4])
			 {
			  case 0x30:
					    Numlong=24; 
						RX[5] = Numlong;
						N485=1;
  				        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
 			  case 0x31:	   
			           	Numlong=23; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			  case 0x32:
			           	Numlong=28; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			  case 0x33:
			           	Numlong=12; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			  case 0x34:
			           	Numlong=8; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			  case 0x35:
			           	Numlong=20; 
						RX[5] = Numlong;
  				        for (i=0;i<6;i++) 	putbytespi(RX[i]);
				        N485=1;
					    break;
			  case 0x36:
			           	Numlong=4; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			  case 0x37:
			           	Numlong=24; 
						RX[5] = Numlong;
				        N485=1;
			  	        for (i=0;i<6;i++) 	putbytespi(RX[i]);
						break;
			
				default:
				        break;
			   			  
			   }


			}
		  }
	}
}



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

void timer0 (void) interrupt 1 using 3
{
	//uchar SPI_GetByte[12];
	uchar i;

	TR0=0;
	WDT_CONTR = 0x3E; 	
	TL0 =0X66;
	TH0 =0XFC;
	 	if (MCLK==0) 	
	      {
		    N485=1;
		    for (i=0;i<Numlong;i++) 	TX[i]=getbytespi();
			TXD_Int(TX,Numlong);
			N485=0;
          }

	TR0=1; 	
}


⌨️ 快捷键说明

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