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

📄 t.c

📁 基于51的RS485的多机发送和接收的通信程序
💻 C
字号:
//proteus仿真论坛:proteus.5d6d.com

#include <reg51.h>

#define uchar unsigned char
#define NODE1_ADDR 1
#define NODE2_ADDR 2

bit flag=0;
bit flag_send=0;
uchar KeyValue=0;		//键值

uchar code str[]="0123456789ABCDEF";
uchar pointer_1=0;
uchar pointer_2=0;

void delay(uchar Time)
{
	uchar i,j;
	for(i=0;i<100;i++)
		for(j=0;j<Time;j++);
}

uchar key_scan()
{
	P1=0xff;
	while(P1==0xff);
    return P1;
}

void proc_key1()
{
	delay(200);
	//初始化串行口和波特率发生器
	SCON=0xc0;
	TMOD=0x20;
	TH1=0xfd;
	TR1=1;		//打开T1		
	ET1=0;		//关闭定时器中断
	ES=1;		//允许串行口中断
	EA=1;		//打开所有中断
	//发送地址帧
	TB8=1;
	SBUF=NODE1_ADDR;
	while(flag_send==0);	//发送完毕
	ES=0;
	EA=0;				//关中断
	flag_send=0;
	KeyValue=0;
}

void proc_key2()
{
	delay(200);
	//初始化串行口和波特率发生器
	SCON=0xc0;
	TMOD=0x20;
	TH1=0xfd;
	TR1=1;		//打开T1		
	ET1=0;		//关闭定时器中断
	ES=1;		//允许串行口中断
	EA=1;		//打开所有中断
	//发送地址帧
	TB8=1;
	SBUF=NODE2_ADDR;
	while(flag_send==0);	//发送完毕
	ES=0;
	EA=0;				//关中断
	flag_send=0;
	KeyValue=0;
}

main()
{
	while(1)
	{
		KeyValue=key_scan();
		switch(KeyValue)
		{
			case 0xfe: proc_key1();break;
			case 0xef: proc_key2();break;
			default: break;
		}
	}
} 

//串行中断服务程序
void send(void) interrupt 4 using 3
{
	TI=0;
	if(flag==1) 
	{
		flag_send=1;
		flag=0;
		return;
	}
	else
	{
		TB8=0;
		switch(KeyValue)
		{
			case 0xfe: 
			{
				SBUF=str[pointer_1];
				pointer_1++;
				if(pointer_1>=16)
					pointer_1=0;
				break;
			}
			case 0xef: 
			{
				SBUF=str[pointer_2];
				pointer_2++;
				if(pointer_2>=16)
					pointer_2=0;
				break;
			}
			default: break;
		}
		flag=1;
	}
}

⌨️ 快捷键说明

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