首先需要了解的是,单片机的P3.1/TXD引脚可以实现发送数据的功能,P3.0/RXD可以实现接收数据的功能。
工作原理大致就是将一组引脚的通过开关控制高低电平,利用TXD引脚将数据发送给另一块芯片,芯片通过接收到的数据来控制led的状态。
发送方电路:
接收方电路:
两块芯片分别用TXD引脚/RXD引脚进行发送数据和接收数据。发送方只需要编写一个发送函数,通过while(1)循环,不断更新发送并更新缓存区的数据,达到实时发送数据的目的。
发送方代码:
#include <reg51.h>
void init(unsigned int bps)//初始化,设置不同波特率下计数器的初始值
{
unsigned char t;
SCON=0x50; //设置寄存器工作方式
PCON=0x00;//smod=0,波特率不倍增
TI=0;//软件清零
EA=1;//总中断开启
ET1=1;//计数器中断开启
ES=1;//串口中断开启
TMOD=0x20;//设置中断模式
switch(bps)//设置不同波特率下计数器初值
{
case 1200:t=0xe8;break;
case 2400:t=0xf4;break;
case 4800:t=0xfa;break;
case 9600:t=0xfd;break;
}
TH1=t;
TL1=t;//设置计数初值
TR1=1;//开启计数器
}
void send(unsigned char ch)
{
ES=0;//关闭串口中断
SBUF=ch;//发送数据到缓存区(ch可以看成是一个指向需要发送数据的指针)
while(TI==0);//等待数据发送完成
TI=0;//清除中断标记
ES=1;//开启串口中断
}
void main()
{
init(9600);//初始化,设置波特率
while(1)
{
send(P0);//循环发送P0口的数据
}
}
接收方所需要做的就是不断接收并读取缓存区的数据,并更新P0引脚的状态。
#include <reg51.h>
void init(unsigned int bps)
{
unsigned char t;
SCON=0x50;//设置寄存器工作方式
PCON=0x00;//smod=0,波特率不倍增
TI=0;//软件清零
EA=1;//总中断开启
ET1=1;//计数器中断开启
ES=1; //串口中断开启
TMOD=0x20;//设置中断模式
switch(bps)//设置不同波特率下计数器初值
{ case 1200:t=0xe8;break;
case 2400:t=0xf4;break;
case 4800:t=0xfa;break;
case 9600:t=0xfd;break;
}
TH1=t;
TL1=t;//设置计数初值
TR1=1;//开启计数器
}
void main()
{
init(9600);//初始化,设置波特率
while(1)
{
while(RI= =0);//等待接受完成 }
}
void receive() interrupt 4
{
if(RI= =1)
{
RI=0;
P0=SBUF;//接收到的数据赋值给P0
}
}
效果图:
使用开关控制U1的P0引脚的电平的高低来改变P0引脚的值。通过TXD发送数据到U2,将U2接收到的数据发送赋值给P0引脚控制小灯的开关。