单片机在操控本地的外围期间时,信息的交互是经过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
}
}
}