单片机实现点对点的数据传输-串口通讯
2016-09-07 来源:eefocus
主要器件:
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 } } }
上一篇:单片机实现段距离无线传输