AT89C51单片机实现单片机串口互动(中断方式,单片机–单片机,应答)

  • Post author:
  • Post category:其他


51b4b684bd5544229bd1c0f48c63d2cb.png

说一下功能:客户机发送0x01到服务机

2服务单片机应答0xf2到客户机

3客户机接收到0xf2,发送信息153432这6个数字到服务机

4client发送完信息后发送0xaa结束通信

5server接收到0xaa后回复0xaa结束通信,从此老死不相往来

看代码:

//发送端代码

#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
long int sleep_i=0;
long int main_i=0;
int bufferc[6]={0};
uchar tag=0;
void test()
{
	P17=0;
}
void main()
{
	uchar sendx[6]={1,5,3,4,3,2};
	sleep(1000);
	TMOD=0x20;//采用初值自动重载的方式
	TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/S
	TL1=0XF4;
	TR1=1;//启动定时器开始计时
	SCON=0X40;
	REN=1;
	EA=1;
	ES=1;
	SBUF=0x01; //发送01
	while(TI==0);
//	test();
	for(;;)
	{
			if(tag==1)break;
	}
	if(tag==1)
		{
		EA=0;
		for(main_i=0;main_i<6;main_i++)
		{
			SBUF=sendx[main_i];
			while(TI==0);
			TI=0;
		}
		EA=1;
		tag=0;
	}
	SBUF=0XAA;
	while(1);
}

void int_4() interrupt 4
{
	EA=0;
	if(SBUF==0X01) 
	{
		;//while(RI==0);
	}
	else if(SBUF==0XF2)  
	{
		tag=1;
	}
	else if(SBUF==0Xaa)
	{
		
		if(TI==1)
		{
			;
		}
		else if(RI==1)  
		{
			REN=0;
		}
	}
	else
	{
		;
	}
	RI=0;TI=0;
	EA=1;
}


void sleep(long int a)
{
	for(sleep_i=0;sleep_i<a;sleep_i++)
	{
		;
	}
}

服务端代码:

#include "reg51.h"
#include "myheader.h"
#define uchar unsigned char
int szc[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int bufferc[6]={0};
int sza[6]={0x01,0x02,0x04,0x08,0x10,0x20};
int t=0;
int i=0;
void display()   //显示设备没有问题,因为可以忠实的显示出012345  如果是显示异常比如是数据出问题:bufferc[6]数据出了问题
{									//设备全部显示0,说明bufferc[6]没有被赋值  ,找到赋值bufferc语句
	uchar i=0;
	uchar num=0;
	for(i=0;i<6;i++)  //显示异常,只能显示一个数字P1角有问题
	{
		num=bufferc[i];  //bufferc【】数据异常,0位置:3  1位:4  2位:5  3位置:6    4位置:后面都是0 也就是说1,2都被另外那个东西给截住了
		P2=szc[num];
		P1=sza[i];
		sleep(1);
		P2=0xff;
	}
}

void test()
{
	P17=0;
}

void main()
{
	TMOD=0x20;
	TH1=0XF4;//根据波特率计算公式这里需要设置为这么多才能够在串行数据传输模式1的状况下实现波特率2400B/S
	TL1=0XF4;
	TR1=1;
	SCON=0x40;//串口工作与方式1,定义了传送数据的格式
	EA=1;
	ES=1;   //串口中断开关打开
	REN=1;
	while(1)
	{
		display();
	}
}

void int_4() interrupt 4
{
	static uchar first=0;
	EA=0;
	t=SBUF;
	if(t==0x01&&first==0)
	{
		first++;
		SBUF=0xF2;
		while(TI==0);
		TI=0;
	}
	else if(SBUF==0XF2)
	{
		first++;
	}
	else if(SBUF==0Xaa)
	{
		//需要判断是接收的0XAA,还是发送的0xaa
		if(RI==1)//接收的0xaa
		{
			SBUF=0XAA;
			while(TI==0);
		}
		else if(TI==1)
		{
			REN=0;		
		}
	}
	else if(RI==1)
		{
			bufferc[i]=SBUF;
			i++;
	}
	if(RI==1&&TI==0)RI=0;
	if(TI==1&&RI==0)TI=0;
	EA=1;
}

void sleep(long int a)
{
	uchar i=0;
	for(i=0;i<a;i++)
	{
		;
	}
}



版权声明:本文为geniusChinaHN原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。