实验四 单片机串口通信实验

  

《单片机原理与应用》课程

课程实验报告

实验四  单片机串口通信实验

  • 实验目的

1.学习单片机串行口的使用方法;

2.熟悉基于串行口的双机通信方案的设计与实现方法;

3.熟悉基于串行口的多机通信方案的设计与实现方法。

  • 实验内容与步骤
  • 基于串口的方式1,以仿真方式实现单片机的双机通信实验
  1. 实验目标:
  1. 单片机甲、乙双机串行通信,双机RXD和TXD相互交叉相连,甲机P1口接8个开关,乙机P1口接8个发光二极管;双方晶振均采用11.0592MHz。
  2. 甲机设置为只能发送不能接收的单工方式。
  3. 要求甲机读入P1口的8个开关的状态后,通过串行口发送到乙机,乙机将接收到的甲机的8个开关的状态数据送入P1口,由P1口的8个发光二极管来显示8个开关的状态。双方晶振均采用11.0592MHz。

2.主要实验内容:

1) 画双机连接仿真图。

2) 编程实现1端8个开关对另一端8个灯的一对一控制。

  • 基于串口方式3的双机通信实验

1.实验目标:

  1. 甲、乙两单片机进行方式3串行通信。甲机把控制8个流水灯点亮的数据发送给乙机并点亮其P1口的8个LED。
  2. 要进行校验:乙机接收到的8位二进制数据有可能出错,需进行奇偶校验,其方法是将乙机的RB8和PSW的奇偶校验位P进行比较,如果相同,接收数据;否则拒绝接收。

3)观察:虚拟终端来观察甲机串口发出的数据。

2.主要实验内容:

1)画双机连接仿真图。

2)编程实现1端程序输出数据实现对另一端8个灯的循环亮灯控制。

(三)基于仿真的方式实现单片机的多机通信实验(扩展,选)

1)画双机连接仿真图。

2)编程实现其基于按键的选择控制功能。

三、实验步骤:

(一)基于方式1的双机通信实验

1.画仿真原理图,连接参考图如下。

画图过程的注意事项:

  1. 在进行总线画法的连线时,要注意支线与总线的连接不要是垂直连接,可采用45度连接,连接总线的支线都要加标号,并要将有连接关系的支线加上相同的标号。
  2.  通信双方不同单片机连接不同外部电路的支线,其标号不能相同。
  3. 串口连接关系一定要是交叉连接,即收连发、发连收。

        调试过程注意事项:

        1)甲方、乙方的程序不同,要分别生成其各自的HEX文件,可放在相同目录中。

        2)生成方法有二:一种是在同一工程中分别加入程序,生成各自的HEX文件,这时需要在选项的output对话框中改文件名。第二种是建立两个不同的工程,分别生成甲方、乙方的HEX文件。

(现场验收点1:基于Proteus仿真及工作方式1实现双机通信。)

(二)基于串口方式3的双机通信实验

1.画仿真原理图,连接参考图如下。

2. 编程、调试实现功能。

四、扩展实验:多机通信

     

三、 实验环境

PC机一台、keil 4/5、 proteus 7/8。

  • 实验系统的总体设计

1)双机串口通信(单工通信)

2)双机串口通信(双工校验通信)

            

  1.  实验系统的详细设计与实验过程

1. 仿真部分:

(1)基于串口的方式1,以仿真方式实现单片机的双机通信实验

(2)基于串口方式3的双机通信实验

(3)基于仿真的方式实现单片机的多机通信实验

  • 程序代码

(1)

/*主机

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

void main()

{

uchar temp=0 ;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

SCON=0x40;

PCON=0x00 ;

TR1=1;

P1=0xff;

while(1){

temp=P1;

SBUF=temp;

while(TI==0);

TI=0;

}

}

*/

乙机

#include <reg51.h>

#define uchar unsigned char

#define uint unsigned int

void main( )

{

uchar temp=0;

TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

SCON=0x50;

PCON=0x00;

TR1=1 ;

while(1)

{

while (RI==0);

RI=0;

temp=SBUF;

P1=temp;

}

}

(2)

/甲机

//#include <reg51.h>            

//unsigned char Tab[8]= {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};

//void Send(unsigned char dat)        

//{            

//            TB8=PSW^0;

//              SBUF=dat;

//              while(TI==0);                     

//             ;                                               

//            TI=0;                                                  

//}

//void Delay (void)                        

//{     unsigned char m,n;

//            for(m=0;m<250;m++)

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

//}

//void main(void)                                  

//{     unsigned char i;

//            TMOD=0x20;                                        

//            SCON=0xc0;                                 

//            PCON=0x00;                                        

//            TH1=0xfd;                                   

//            TL1=0xfd;

//            TR1=1;                                                

//     while(1)

//            {       for(i=0;i<8;i++)

//                    {

//                               Send(Tab[i]);

//                             Delay( );                     

//                    }

//            }

//}

//乙机

#include <reg51.h>

sbit p=0xd0;                                 

unsigned char Receive(void)            

{      

        unsigned char dat;

     while(RI==0);             

              ;

     RI=0;                                          

     ACC=SBUF;                                  

     if(RB8==P)                                  

     {       dat=ACC;                            

              return dat;                           

     }

                         return 0;

}

void main(void)                                     

{                       

                         TMOD=0x20;                                

     SCON=0xd0;                                

     PCON=0x00;                                 

     TH1=0xfd;                           

     TL1=0xfd;

     TR1=1;                                       

     REN=1;                                       

     while(1)

     {       P1= Receive( );                    

     }

}

(3)

/*主机

#include <reg51.h>

#include <math.h>

sbit switch1=P0^0;

sbit switch2=P0^1;

sbit switch3=P0^2;

void delay_ms(unsigned int i)

{

      unsigned char j;

      for(;i>0;i--);

      for(j=0;j<125;j++)

      ;

}

void main()

{

      EA=1;

      TMOD=0x20;

      TL1=0xfd;

      TH1=0xfd;

      PCON=0x00;

      SCON=0xd0;

      TR1=1;

      ES=1;

      SBUF=0xff;

      while(TI==0);

      TI=0;

      while(1)

      {

            delay_ms(100);

            if(switch1==0)

            {

                  TB8=1;

                  SBUF=0x01;

                  while(TI==0);

                  TI=0;

                  TB8=0;

                  SBUF=0x00;

                  while(TI==0);

                  TI=0;

            }

            if(switch2==0)

            {

                  TB8=1;

                  SBUF=0x02;

                  while(TI==0);

                  TI=0;

                  TB8=0;

                  SBUF=0x00;

                  while(TI==0);

                  TI=0;

            }

            if(switch3==0)

            {

                  TB8=1;

                  SBUF=0x03;

                  while(TI==0);

                  TI=0;

                  TB8=0;

                  SBUF=0x00;

                  while(TI==0);

                  TI=0;

            }

      }

}

*/

/*1

#include <reg51.h>

#include <math.h>

sbit led=P2^0;

bit rrdy=0;

bit trdy=0;

bit err=0;

void delay_ms(unsigned int i)

{

      unsigned char j;

      for(;i>0;i--);

      for(j=0;j<125;j++)

      ;

}

void main()

{

      EA=1;

      TMOD=0x20;

      TL1=0xfd;

      TH1=0xfd;

      PCON=0x00;

      SCON=0xd0;

      TR1=1;

      P1=0xff;

      ES=1;

      while(RI==0);

      if(SBUF==0xff)   err=0;

      else err=1;

      RI=0;

      SM2=1;

      while(1);

     

}

void int1() interrupt 4

{

      if(RI)

      {

            if(RB8)

            {

                  RB8=0;

                  if(SBUF==0x01)

                  {

                        SM2=0;

                        led=0;

                  }

            }

            else

            {

                  rrdy=1;

                  P1=SBUF;

                  SM2=1;

                  led=1;

            }

            RI=0;

      }

      delay_ms(50);

      P1=0xff;

}

*/

/*2

#include <reg51.h>

#include <math.h>

sbit led=P2^0;

bit rrdy=0;

bit trdy=0;

bit err=0;

void delay_ms(unsigned int i)

{

      unsigned char j;

      for(;i>0;i--);

      for(j=0;j<125;j++)

      ;

}

void main()

{

      EA=1;

      TMOD=0x20;

      TL1=0xfd;

      TH1=0xfd;

      PCON=0x00;

      SCON=0xf0;

      TR1=1;

      P1=0xff;

      ES=1;

      while(RI==0);

      if(SBUF==0xff)   err=0;

      else err=1;

      RI=0;

      SM2=1;

      while(1);

     

}

void int1() interrupt 4

{

      if(RI)

      {

            if(RB8)

            {

                  RB8=0;

                  if(SBUF==0x02)

                  {

                        SM2=0;

                        led=0;

                  }

            }

            else

            {

                  rrdy=1;

                  P1=SBUF;

                  SM2=1;

                  led=1;

            }

            RI=0;

      }

      delay_ms(50);

      P1=0xff;

}

*/

//3

#include <reg51.h>

#include <math.h>

sbit led=P2^0;

bit rrdy=0;

bit trdy=0;

bit err=0;

void delay_ms(unsigned int i)

{

      unsigned char j;

      for(;i>0;i--);

      for(j=0;j<125;j++)

      ;

}

void main()

{

      EA=1;

      TMOD=0x20;

      TL1=0xfd;

      TH1=0xfd;

      PCON=0x00;

      SCON=0xf0;

      TR1=1;

      P1=0xff;

      ES=1;

      while(RI==0);

      if(SBUF==0xff)   err=0;

      else err=1;

      RI=0;

      SM2=1;

      while(1);

     

}

void int1() interrupt 4

{

      if(RI)

      {

            if(RB8)

            {

                  RB8=0;

                  if(SBUF==0x03)

                  {

                        SM2=0;

                        led=0;

                  }

            }

            else

            {

                  rrdy=1;

                  P1=SBUF;

                  SM2=1;

                  led=1;

            }

            RI=0;

      }

      delay_ms(50);

      P1=0xff;

}

  • 实验结果

(1)1端8个开关对另一端8个灯的一对一控制。

(2)1端程序输出数据实现对另一端8个灯的循环亮灯控制,并在虚拟端出现发送数据。

(3)K1控制机1亮灯;K2控制机2亮灯;K3控制机3亮灯;3个开关控制的亮灯效果不同

  •  实验分析与总结
  1. 实验1中刚开始开关只能控制开始的串口数据,然后停止不动,重写代码,重新生成HEX文件得以解决。
  2. 实验2中,Led灯不亮,数据闪烁,经过检查发现是电源的原因,其中检验函数是成功的关键。
  3. 实验3中,刚开始K1控制分机,HEX文件导入错误,经过改正,K2控制不了机2,经过检查,线路接口引脚标错,改正后重新导入HEX文件,可以成功控制。

总结:实验中,代码正确,步骤正确,可能也会出现错误,只有不断地检查,完善,改正才是实验的最终目的。

如有不完善,评论指出。

  • 45
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,这是一个常见的单片机串行通信应用,可以通过以下步骤来实现: 1. 硬件连接: 甲机的P1口接8个开关,乙机的P1口接8个发光二极管。双机的RXD和TXD相互交叉相连。 2. 甲机程序: 甲机需要读取P1口的8个开关状态,并将其通过串行口发送到乙机。由于甲机只能发送不能接收,所以乙机需要在接收到8个开关状态数据后,发送一个确认信号给甲机,以告诉甲机可以继续发送下一组数据。 以下是甲机的程序示例: ```C++ #include <reg52.h> // 甲机串口发送函数 void SendData(unsigned char dat); // 甲机主函数 void main() { unsigned char sw_status = 0; // 配置P1口为输入 P1 = 0xFF; // 配置串口 TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; while (1) { // 读取P1口的开关状态 sw_status = P1; // 发送开关状态数据 SendData(sw_status); // 等待乙机的确认信号 while (RI == 0); RI = 0; } } // 甲机串口发送函数 void SendData(unsigned char dat) { SBUF = dat; while (TI == 0); TI = 0; } ``` 3. 乙机程序: 乙机需要接收甲机发送的8个开关状态数据,并将其送入P1口控制8个发光二极管的亮灭状态。在接收完8个开关状态数据后,乙机需要发送一个确认信号给甲机,以告诉甲机可以继续发送下一组数据。 以下是乙机的程序示例: ```C++ #include <reg52.h> // 乙机串口接收函数 unsigned char ReceiveData(); // 乙机主函数 void main() { unsigned char sw_status = 0; // 配置P1口为输出 P1 = 0x00; // 配置串口 TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; while (1) { // 等待甲机发送数据 while (RI == 0); sw_status = ReceiveData(); RI = 0; // 将开关状态数据送入P1口控制发光二极管 P1 = sw_status; // 发送确认信号给甲机 SBUF = 0xAA; while (TI == 0); TI = 0; } } // 乙机串口接收函数 unsigned char ReceiveData() { while (RI == 0); RI = 0; return SBUF; } ``` 这样,当甲机读取P1口的8个开关状态时,就可以通过串行口发送给乙机,乙机接收到数据后,将8个开关状态送入P1口控制8个发光二极管的亮灭状态。当乙机完成数据处理后,会发送一个确认信号给甲机,以告诉甲机可以继续发送下一组数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TvT<

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值