单片机实现点对点的数据传输-串口通讯
主要器件:
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 } } }
单片机点对点的数据传输串口通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)