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

📄 main.c

📁 MCS51mcu用IO口线模拟UART收发
💻 C
字号:
#include <common.h>
#include <scom.h>

uint  delay;	//用作延时
uchar RecCount;
uchar T0out=NO;
uchar COMFlag;
uchar RecBuf[15];
uchar extendUARTrecData=0x66;

#ifdef extendUART
void init_T0(void)
{
	/*如果使用T0 Mode2:8-bit with auto-reload from TH0
	则应加入以下2条语句同时去除相应的语句*/
	//TMOD |= 0x02;  //T0 Mode2:8-bit with auto-reload from TH0
	//TH0 = 0xA0;		
	TMOD |= 0x01; 	//T0 is 16-bit timer(mod 1)
	TH0 = 0xFF;		//UART's BaudRate is 9600bps
	TL0 = 0xA5;		//定时约 0.1 ms
	//ET0 = 1;		//enable T0 interrupt
	//TR0 = 1;
}
void int_T0(void) interrupt 1 using 2  //T0 is 16-bit timer(mode 1)
{
	//如果使用T0 Mode 2:8-bit with auto-reload from TH0则应去除以下2条语句
	TH0 = 0xFF;  	//定时约 0.1 ms
	TL0 = 0xA5;
	T0out = YES; 
}
#endif

#ifdef extendUART_SEND
/**********************************************************************
功能: 通过TXD(one MCU's pin)模拟UART发送数据,将TXD接至MAX232的11脚(TXD)
	  即可把数据通过MAX232送给PC的RS232端口
占用: T0(enable T0 interrupt), TXD(one MCU's pin)
特性: 波特率:9600, 接收方的停止位:1个或2个均可, 校验位:无, 流控制:无
条件: MCU运行模式12分频, 其晶振11.0592MHz
***********************************************************************/
void extendUARTsend(uchar DataToSend)
{
	uchar i;

	#ifdef extendUART_REC_INT1
	EX1 = 0;
	#endif
	TR0 = 1;
	TXD = 0;	//start bit
	while(T0out==NO) ;
	T0out = NO;	
	for(i=8;i>0;i--) //8-bit data
	{
		TXD = DataToSend&0x01;	//LSB is sent first		
		DataToSend >>= 1;
		while(T0out==NO) ;
		T0out = NO;
	}
	//如果用TB8/RB8区分地址/数据则应加入这三条语句 
	//TXD = 1 or 0;			
	//while(T0out==NO) ;
	//T0out = NO;
	TXD = 1;	//stop bit
	while(T0out==NO) ;
	T0out = NO;
	TR0 = 0;
	#ifdef extendUART_REC_INT1
	EX1 = 1;
	#endif	
}
#endif

#ifdef extendUART_REC
/**********************************************************************
功能: 通过RXD(one MCU's pin)模拟UART接收数据,将RXD接至MAX232的12脚(RXD)
	  即可通过MAX232接收PC的RS232端口数据
占用: T0(enable T0 interrupt), RXD(one MCU's pin)
特性: 波特率:9600, 发送方的停止位:1个或2个均可, 校验位:无, 流控制:无
条件: MCU运行模式12分频, 其晶振11.0592MHz
***********************************************************************/
uchar extendUARTreceive(void)
{
	uchar i;
	uchar recData=0;
	while(RXD==1) ;		//空闲状态为"1"
	TR0 = 1;
	while(T0out==NO) ;
	T0out = NO;			//detect start bit
	//for(delay=0;delay<1;delay++) ;	//此处可能需要调整采样时机
	for(i=8;i>0;i--)	//8-bit data
	{
		recData >>= 1; 	//LSB is sent first
		if(RXD==1) recData |= 0x80;				
		while(T0out==NO) ;
		T0out = NO;
	}
	//如果用TB8/RB8区分地址/数据则应加入这两条语句 
	//if(RXD==1) {...}	//TB8==1
	//else 		 {...}	//TB8==0  
	//while(T0out==NO) ;
	//T0out = NO;
	TR0 = 0;
	return(recData);
}
#endif

#ifdef extendUART_REC_INT0
void int_INT0(void) interrupt 0 using 1
{
	uchar i;
	uchar recData=0;

	EX0 = 0;
	TR0 = 1;
	while(T0out==NO) ;
	T0out = NO;			//detect start bit
	//for(delay=0;delay<1;delay++) ;	//此处可能需要调整采样时机
	for(i=8;i>0;i--)	//8-bit data
	{
		recData >>= 1; 	//LSB is sent first
		if(RXD==1) recData |= 0x80;				
		while(T0out==NO) ;
		T0out = NO;
	}
	TR0 = 0;
	//extendUARTrecData = recData;
	RecBuf[RecCount] = recData;
	RecCount++;
	if(RecCount>12) RecCount = 0;
	EX0 = 1;
}
#endif

#ifdef extendUART_REC_INT1
void int_INT1(void) interrupt 2 using 1
{
	uchar i;
	uchar recData=0;

	EX1 = 0;
	TR0 = 1;
	while(T0out==NO) ;
	T0out = NO;			//detect start bit
	//for(delay=0;delay<1;delay++) ;	//此处可能需要调整采样时机
	for(i=8;i>0;i--)	//8-bit data
	{
		recData >>= 1; 	//LSB is sent first
		if(RXD==1) recData |= 0x80;				
		while(T0out==NO) ;
		T0out = NO;
	}
	TR0 = 0;
	//extendUARTrecData = recData;
	RecBuf[RecCount] = recData;
	RecCount++;
	if(RecCount>=15) RecCount = 0;
	EX1 = 1;
}
#endif

void main(void)
{
	uchar i;
	uchar temp[3];
	uchar CheckSum1=0;

	#ifdef extendUART
	init_T0( );
	#endif	

	PORT2_5 = 1;
	PORT2_6 = 1;	//TXD
	PORT2_7 = 1;	//RXD

	//TXD = 1;
	//RXD = 1;

	#ifdef T1AsBaudGN
	InitUART_T1( );
	#endif
	#ifdef T2AsBaudGN
	InitUART_T2( );
	#endif

	#ifdef extendUART_REC_INT0
	IT0 = 0;	//INT0 is triggered by LOW level,而且只能用低电平触发方式
	EX0 = 1;
	PX0 = 0;
	#endif
	#ifdef extendUART_REC_INT1
	IT1 = 0;	//INT1 is triggered by LOW edge,而且只能用低电平触发方式
	EX1 = 1;
	PX1 = 0;
	#endif
	PT0 = 1;
	ET0 = 1;
	EA = 1;	

	while( 1 )
	{
/*		#ifdef extendUART_SEND
		extendUARTsend(0xaa);
		extendUARTsend(0x01);
		extendUARTsend(0x55);
		for(delay=0;delay<30000;delay++) ; //delay 5ms
		for(delay=0;delay<30000;delay++) ; //delay 5ms
		extendUARTsend(0xaa);
		extendUARTsend(0x02);
		extendUARTsend(0x54);
		for(delay=0;delay<30000;delay++) ; //delay 5ms
		for(delay=0;delay<30000;delay++) ; //delay 5ms
		#endif
*/
		#ifdef extendUART_REC
		temp[0]=extendUARTreceive( );
		if(temp[0]==0xAA)
		{
			temp[1]=extendUARTreceive( );
			temp[2]=extendUARTreceive( );
			CheckSum1 += temp[0];
			CheckSum1 += temp[1];
			CheckSum1 += temp[2];
			if(CheckSum1 == 0) //check correct
			{
				SendUART(temp[0]);
				SendUART(temp[1]);
				SendUART(temp[2]);
			}
		}
		#endif

		//#ifdef extendUART_REC_INT0
		#ifdef extendUART_REC_INT1
		if(extendUARTrecData!=0x66)
		{	
			SendUART(extendUARTrecData);
			extendUARTrecData=0x66;
		}
		if(RecCount==12)
		{
			for(i=0;i<RecCount;i++)
			{	
				//SendUART(RecBuf[i]);	
				extendUARTsend(RecBuf[i]);
			}
			RecCount=0;
		}
		#endif 
		LED = !LED;
		for(delay=0;delay<35000;delay++) ;
	}
}

⌨️ 快捷键说明

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