單片機實現(xiàn)點對點的數(shù)據(jù)傳輸-串口通訊
主要器件:
1、AT89C52單片機芯片,用于控制串口通信。
2、接口電平轉(zhuǎn)換芯片MAX3232,用于實現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。
試驗流程圖:主機部分

從機部分:

試驗電路圖:

試驗程序代碼:
//PPDataR.h程序
#ifndef_PPDATAR_H//防止PPDataT.h被重復(fù)引用
#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//緩沖區(qū)最大長度
uchar buf[MAXLEN];
#endif
//PPDataR.c程序
#include "PPDataR.h"
/*發(fā)送數(shù)據(jù)函數(shù)*/
uchar recvdata(uchar *buf)
{
uchar i,tmp;
uchar len;//保存數(shù)據(jù)長度
uchar ecc;//保存校驗字節(jié)
/*接收數(shù)據(jù)長度字節(jié)*/
RI = 0;
while(!RI);
len = SBUF;
RI = 0;
/*使用len的值為校驗字節(jié)ecc賦初值*/
ecc = len;
/*接收數(shù)據(jù)*/
for (i=0;i
{
while(!RI);
*buf = SBUF;
ecc = ecc^(*buf);//進行字節(jié)校驗
RI = 0;
buf++;
}
*buf = 0;//表示數(shù)據(jù)結(jié)束
/*接收校驗字節(jié)*/
while(!RI);
tmp = SBUF;
RI = 0;
/*進行數(shù)據(jù)校驗*/
ecc = tmp^ecc;
if (ecc!=0)//如果校驗錯誤
{
*(buf-len) = 0;//清空數(shù)據(jù)緩沖區(qū)
/*發(fā)送校驗錯誤信號ERR */
TI = 0;
SBUF = ERR;
while(!TI);
TI = 0;
return 0xff;//返回0xff表示校驗錯誤
}
/*發(fā)送校驗成功信號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;//關(guān)閉所有中斷
while(1)
{
/*如果接收到的數(shù)據(jù)不是CALL,則繼續(xù)等待*/
while (tmp!=CALL)
{
RI = 0;
while(!RI)
tmp = SBUF;
RI = 0;
}
/*檢測P0口判斷當前是否工作忙,若P0=0xBB,則為忙狀態(tài)*/
P0 = 0xff;
tmp = P0;
if(tmp==0xBB)//如果P0口為0xBB,發(fā)送BUSY信號
{
TI = 0;
SBUF = BUSY;
while(!TI);
TI = 0;
continue;
}
/*否則發(fā)送OK信號,表示從機可以接收數(shù)據(jù)*/
TI = 0;
SBUF = OK;
while(!TI);
TI = 0;
/*數(shù)據(jù)接收*/
tmp = 0xff;
while(tmp==0xff)
{
tmp = recvdata(buf);//校驗失敗返回0xff,接收成功返回0
}
}
}
評論