案例介绍:
利用单片机a将一段流水灯控制程序发送到单片机b,来控制单片机b的P1口,点亮8位LED灯。
案例分析:
a完成发送,b完成接收。编写程序设置a,令SM0=0,SM1=1(串行口工作方式1)。设置b,令SM0=0,SM1=1,REN=1,使接收允许。
源程序
1)数据发送程序
#include<reg51.h>
unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//流水灯控制码
voidsend(unsignedchardat)//数据发送程序
{
SBUF=dat;//将要发送的数据存入发送缓冲器中
while(TI==0);//若发送中断标志位没有置1(正在发送数据),就等待
TI=0;//若发送完成,TI自动置1,这里把它清零
}
voiddelay(void)//延时函数
{
unsignedcharm,n;
for(m=0;m<200;m++)//延时约150ms
for(n=0;n<250;n++);
}
voidmain(void)
{
unsignedchari;
TMOD=0x20;//定时器T1工作于方式2(可自动重装的8位定时器)
SCON=0x40;//串口工作方式1,不允许接收
PCON=0x00;//波特率不倍增
TH1=0xf4;//波特率为2400b/s
TL1=0xf4;
TR1=1;//启动定时器T1(T1作波特率的发生器)
while(1)
{
for(i=0;i<8;i++)//一共8位的流水灯控制码
{
send(tab[i]);//发送数据
delay();//每50ms发送一次数据
}
}
}
2)数据接收程序
#include<reg51.h>
unsignedcharreceive(void)//数据接收函数
{
unsignedchardat;
while(RI==0);//数据没有接收完毕时等待接收
RI=0;//接收完毕时清零
dat=SBUF;//将接收缓冲器中的数据存入dat
returndat;//将接收到的数据返回
}
voidmain(void)
{
TMOD=0x20;//设置定时器T1工作于方式2
SCON=0x50;//串口工作方式1,允许接收数据
PCON=0x00;//波特率不倍增
TH1=0xf4;//波特率为2400b/s
TL1=0xf4;
TR1=1;//启动定时器T1
REN=1;//允许接收数据
while(1)
{
P1=receive();//将接收到的数据送到P1口显示
}
}
把这两个程序分别烧写到两块板子上,然后用连接线分别连接两个板子的发送引脚和接收引脚,然后效果就出来了。这只是一个发送一个接受的情况。