基于51单片机之间的双向通信(Proteus仿真)

2023-01-31  

具体功能实现:

甲单片机通过按键可以控制乙单片机的LED灯,而乙单片机通过按键可以让连接甲单片机的数码管数字自增加一。

使用器件:

AT89C51、按键、排阻、4只LED灯、2片MAX232芯片、COM口(CONN-D9F)、数码管、若干电阻

Proteus仿真原理图:

仿真:

乙机控制甲机的数码管显示:

甲机控制乙机的LED灯:

知识介绍:

Proteus布线

为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。

定时中断系统简图

定时器资源

定时器个数:3个(T0,T1,T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。

(T0和T1的操作方式是所有51单片机共有的)

中断系统

执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序

中断号:

外部中断0 interrupt 0

定时器0 interrupt 1

外部中断1 interrupt 2

定时器中断1 interrupt 3

串口中断 interrupt 4

细节注意

通信双方必须要有相同的波特率,通过发送中断标志和接受中断标志控制发送和接受的进行。

主要代码(C语言)KEIL5实现:

甲单片机:


#include


#define uint unsigned int


#define uchar unsigned char


sbit LED1 = P1^0;


sbit LED2 = P1^3;


sbit K1 = P1^7;


uchar Operation_NO = 0;


uchar code DSY_CODE[]=


{


0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f


};


void Delay(uint x)


{


uchar i;


while(x--)


{


for(i=0;i<120;i++);


}


}


void putc_to_SerialPort(uchar c)


{


SBUF = c;


while(TI == 0);


TI = 0;


}


void main()


{


LED1=LED2=1;


P0 = 0x00;


SCON = 0x50;


TMOD = 0x20;


PCON = 0x00;


TH1  = 0xfd;


TL1  = 0xfd;


TI   = 0;


RI   = 0;


TR1  = 1;


IE   = 0x90;


while(1)


{


Delay(100);


if(K1 == 0)


{


while(K1==0);


Operation_NO=(Operation_NO+1)%4;


switch(Operation_NO)


{


case 0:


putc_to_SerialPort('X');


LED1=LED2=1; break;


case 1:


putc_to_SerialPort('A');


LED1=0;LED2=1;break;


case 2:


putc_to_SerialPort('B');


LED2=0;LED1=1;break;


case 3:


putc_to_SerialPort('C');


LED1=0;LED2=0;break;


}


}


}


}


void Serial_INT() interrupt 4


{


if(RI)


{


RI = 0;


if(SBUF>=0&&SBUF<=9)


P0 = DSY_CODE[SBUF];


else


P0 = 0x00;


}


}




乙单片机:


#include


#define uint unsigned int


#define uchar unsigned char


sbit LED1 = P1^0;


sbit LED2 = P1^3;


sbit K1 = P1^7;


uchar NumX = 0xff;


void Delay(uint x)


{


uchar i;


while(x--)


{


for(i=0;i<120;i++);


}


}


void main()


{


LED1=LED2=1;


SCON = 0x50;


TMOD = 0x20;


PCON = 0x00;


TH1  = 0xfd;


TL1  = 0xfd;


TI   = 0;


RI   = 0;


TR1  = 1;


IE   = 0x90;


while(1)


{


Delay(100);


if(K1==0);


{


while(K1==0);


NumX = (NumX+1)%11;


SBUF = NumX;


while(TI == 0);


TI = 0;


}


}


}


void Serial_INT() interrupt 4


{


if(RI)


{


RI = 0;


switch(SBUF)


{


case 'X': LED1=1;LED2=1;break;


case 'A': LED1=0;LED2=1;break;


case 'B': LED2=0;LED1=1;break;


case 'C': LED1=0;LED2=0;


}


}


}


问题解答:

Q: COM口(CONN-D9N)接线图,如下图所示:


A:

OM口(CONN-D9F和CONN-D9M)该如何接线?

A:

CONN-D9F和CONN-D9M的连接必须交叉,.这样连的结果是一个的发送接另一个的接收,一个的接收接另一个的发送

Q:

单片机串口和MAX232、MAX232之间是如何连接的?

A:

单片机与MAX232的连接都是T接T,R接R;

各自的MAX232与对方连接是交叉的。

Q:

单片机SBUF总线协议图:


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。