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

📄 main.c

📁 RS-485双机通信 RS-485双机通信-
💻 C
字号:
/*******************************************************************************
程序名称:RS-485接收测试
*******************************************************************************/


#include <reg51.h>
#include <absacc.h>
#include <intrins.h>


//定义I/O接口
sbit LE_DIG = P1^2;
sbit LE_SEG = P1^3;
sbit LE_LED = P1^4;
sbit RS485_RE = P1^5;


//宏函数:向数码管位选寄存器(74HC573)加载数据
#define DIGLD(dat)\
{\
	P0 = (dat);\
	LE_DIG = 1;\
	_nop_();\
	LE_DIG = 0;\
}


//宏函数:向数码管段选寄存器(74HC573)加载数据
#define SEGLD(dat)\
{\
	P0 = (dat);\
	LE_SEG = 1;\
	_nop_();\
	LE_SEG = 0;\
}


//定义显示缓冲区(由定时中断程序自动扫描)
unsigned char DispBuf[8];


/*******************************************************************************
函数:DispClear()
功能:清除显示
*******************************************************************************/
void DispClear()
{
	unsigned char i;
	for ( i=0; i<8; i++ )
	{
		DispBuf[i] = 0x00;
	}
	DIGLD(0x00);
	SEGLD(0x00);
}


/*******************************************************************************
函数:T0_ISR()
功能:定时器T0中断服务程序,定时扫描显示数码管
*******************************************************************************/
void T0_ISR() interrupt 1
{
	code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
	static unsigned char n = 0;
	TR0 = 0;		//暂停T0(重新定时前应当暂停)
	TH0 = 0xFC;		//重新定时1ms
	TL0 = 0x66;
	TR0 = 1;		//重启T0
	SEGLD(0xFF);	//暂停显示(重要操作)
	DIGLD(com[n]);	//更新位选信号
	SEGLD(~DispBuf[n]);	//更新段选数据
	n++;
	n &= 0x07;
}


/*
函数:DispChar()
功能:在数码管上显示字符
参数:
	x:数码管的坐标位置(0~7)
	c:要显示的字符(仅限十进制数字和减号)
*/
void DispChar(unsigned char x, unsigned char c)
{
	//0123456789的数码管字型数据
	code unsigned char Tab[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
	x &= 0x07;
	x = 7 - x;
	if ( c == '-' )
	{
		DispBuf[x] = 0x40;
	}
	else if ( ( c >= '0' ) && ( c <= '9' ) )
	{
		DispBuf[x] = Tab[c-'0'];
	}
}


/*
函数:DispStr()
功能:在数码管上显示字符串
参数:
	x:数码管的坐标位置(0~7)
	*s:要显示的字符串(字符仅限十进制数字和减号)
*/
void DispStr(unsigned char x, unsigned char *s)
{
	unsigned char c;
	for (;;)
	{
		c = *s;
		if ( c == '\0' ) break;
		s++;
		DispChar(x,c);
		x++;
	}
}


//定义波特率(取值1200、2400、4800、9600、19200等)
#define BaudRate	9600L


/*******************************************************************************
函数:UartInit()
功能:串行口初始化
*******************************************************************************/
void UartInit()
{
	SCON = 0x50;	//串口方式1(8位UART),允许接收
	PCON |= 0x80;	//波特率加倍
	TMOD &= 0x0F;	//设置T1为8位自动重装定时器,用于产生波特率
	TMOD |= 0x20;
	TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate);	//设置T1初值
	TR1 = 1;		//启动T1
	ES = 1;
}


//定义接收标志
bit ReceiveFlag = 0;

//定义接收缓冲区
unsigned char UartBuf[4];


/*******************************************************************************
函数:Uart_ISR()
功能:串行口中断服务函数
*******************************************************************************/
void Uart_ISR() interrupt 4
{
	static unsigned char p = 0;
	unsigned char c;
	if ( RI )		//如果收到数据
	{
		RI = 0;		//清除接收标志
		c = SBUF;	//读取收到的数据
		if ( (c >= '0') && (c <= '9') )		//如果是数字
		{
			if ( p < 4 ) UartBuf[p++] = c;	//保存到缓冲区
		}
		else if ( c == '\n' )	//如果接收完一行
		{
			UartBuf[p] = '\0';
			p = 0;
			ReceiveFlag = 1;
		}
		else
		{
			//对其它字符不予理睬
		}
	}
	if ( TI )
	{
		TI = 0;
	}
}


/*******************************************************************************
函数:SysInit()
功能:系统初始化
*******************************************************************************/
void SysInit()
{
	LE_DIG = 0;
	LE_SEG = 0;
	LE_LED = 0;
	DispClear();	//清除显示
	UartInit();
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TH0 = 0xFC;		//定时1ms
	TL0 = 0x66;
	ET0 = 1;		//使能T0定时中断
	TR0 = 1;		//启动定时器T0
	EA = 1;			//使能总中断
}


//主函数
void main()
{
	SysInit();
	DispStr(0,"--------");
	RS485_RE = 0;
	for (;;)
	{
		PCON |= 0x01;
		if ( ReceiveFlag )
		{
			ReceiveFlag = 0;
			DispClear();
			DispStr(0,UartBuf);
		}
	}
}

⌨️ 快捷键说明

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