两个单片机之间的串口通信实例

利用单片机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>

unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};           //流水灯控制码

void send(unsigned char dat)            //数据发送程序

{

    SBUF=dat;                           //将要发送的数据存入发送缓冲器中

 while(TI==0);                       //若发送中断标志位没有置1(正在发送数据),就等待

 TI=0;                               //若发送完成,TI自动置1,这里把它清零

}

void delay(void)                        //延时函数

{

 unsigned char m,n;

 for(m=0;m<200;m++)                  //延时约50ms

 for(n=0;n<250;n++);

}

void main(void)

{

 unsigned char i;

 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>

unsigned char receive(void)         //数据接收函数

{

 unsigned char dat;

 

 while(RI==0);                   //数据没有接收完毕时等待接收

 RI=0;                           //接收完毕时清零

 dat=SBUF;                       //将接收缓冲器中的数据存入dat

 return dat;                     //将接收到的数据返回

}

void main(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口显示 

 }

}把这两个程序分别烧写到两块板子上,然后用连接线分别连接两个板子的发送引脚和接收引脚,然后效果就出来了。这只是一个发送一个接受的情况。