单片机
返回首页

单片机实现点对点的数据传输-串口通讯

2016-09-07 来源:eefocus

单片机在控制本地的外围期间时,信息的交互是通过8位并行数据总线进行的,但是在较大规模的现代控制系统中,单片机还需要控制远端的设备,可以利用单片机的串行通信模块,在学习了RS-232串口通信的原理和时序后,学习了利用RS-232接口实现串口数据传输的点对点通信。

 

主要器件:

1、  AT89C52单片机芯片,用于控制串口通信。

2、  接口电平转换芯片MAX3232,用于实现TTL电平和RS-232电平的转换。

 

试验流程图:主机部分                             


 

 从机部分:


 

试验电路图:
 

试验程序代码:

//PPDataR.h程序

#ifndef       _PPDATAR_H         // 防止PPDataT.h被重复引用

 

#define       _PPDATAR_H

 

#include

#include

 

#define uchar unsigned char

#define uint unsigned int

 

/* 握手信号宏定义 */

#define CALL 0x24              // 主机呼叫

#define BUSY 0x15              // 从机忙

#define OK 0x00                     // 从机准备好

#define SUCC 0x2A              // 接收成功

#define ERR 0xF0              // 接收错误

 

#define MAXLEN 64           // 缓冲区最大长度

 

uchar buf[MAXLEN];

 

#endif

 

//PPDataR.c程序

#include 'PPDataR.h'

 

/* 发送数据函数 */

uchar recvdata(uchar *buf)

{

       uchar i,tmp;

       uchar len;                                   // 保存数据长度

       uchar ecc;                                   // 保存校验字节

      

       /* 接收数据长度字节 */

       RI = 0;

       while(!RI);

       len = SBUF;

       RI = 0;

      

       /* 使用len的值为校验字节ecc赋初值 */

       ecc = len;                                  

 

       /* 接收数据 */

       for (i=0;i

       {

              while(!RI);

              *buf = SBUF;    

              ecc = ecc^(*buf);            // 进行字节校验

              RI = 0;      

              buf++;             

       }

       *buf = 0;                             // 表示数据结束

      

       /* 接收校验字节 */

       while(!RI);

       tmp = SBUF;

       RI = 0;

 

       /* 进行数据校验 */

       ecc = tmp^ecc;

       if (ecc!=0)                                   // 如果校验错误

       {

              *(buf-len) = 0;                  // 清空数据缓冲区

             

              /* 发送校验错误信号ERR */

              TI = 0;      

              SBUF = ERR;

              while(!TI);

              TI = 0;

 

              return 0xff;                     // 返回0xff表示校验错误

       }

 

       /* 发送校验成功信号SUCC */

       TI = 0;

       SBUF = SUCC;

       while(!TI);

       TI = 0;

 

       return 0;                              // 校验成功,返回0

}

 

void init_serial()

{

       TMOD = 0x20;                           // 定时器T1使用工作方式2

       TH1 = 250;

       TL1 = 250;

       TR1 = 1;                             // 开始计时

       PCON = 0x80;                           // SMOD = 1

       SCON = 0x50;                           // 工作方式1,波特率9600kbit/s,允许接收

}

 

/* 主程序 */

void main()

{

       uchar tmp = 0;

       /* 串口初始化 */

       init_serial();

 

       EA = 0;                               // 关闭所有中断

 

       while(1)

       {

              /* 如果接收到的数据不是CALL,则继续等待 */

              while (tmp!=CALL)

              {

                     RI = 0;

                     while(!RI)

                     tmp = SBUF;

                     RI = 0;

              }

      

              /* 检测P0口判断当前是否工作忙,若P0=0xBB,则为忙状态 */

              P0 = 0xff;

              tmp = P0;

              if(tmp==0xBB)         // 如果P0口为0xBB,发送BUSY信号

              {

                     TI = 0;

                     SBUF = BUSY;

                     while(!TI);

                     TI = 0;

                     continue;

              }

 

              /* 否则发送OK信号,表示从机可以接收数据 */

              TI = 0;                           

              SBUF = OK;

              while(!TI);

              TI = 0;

 

              /* 数据接收 */

              tmp = 0xff;

              while(tmp==0xff)

              {

                     tmp = recvdata(buf); // 校验失败返回0xff,接收成功返回0

              }

       }

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • PIC单片机控制的遥控防盗报警器电路

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 如何构建一个触摸传感器电路

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章