單片機實(shí)現點(diǎn)對點(diǎn)的數據傳輸-串口通訊
主要器件:
1、AT89C52單片機芯片,用于控制串口通信。
2、接口電平轉換芯片MAX3232,用于實(shí)現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//緩沖區最大長(cháng)度
uchar buf[MAXLEN];
#endif
//PPDataR.c程序
#include "PPDataR.h"
/*發(fā)送數據函數*/
uchar recvdata(uchar *buf)
{
uchar i,tmp;
uchar len;//保存數據長(cháng)度
uchar ecc;//保存校驗字節
/*接收數據長(cháng)度字節*/
RI = 0;
while(!RI);
len = SBUF;
RI = 0;
/*使用len的值為校驗字節ecc賦初值*/
ecc = len;
/*接收數據*/
for (i=0;i { while(!RI); *buf = SBUF; ecc = ecc^(*buf);//進(jìn)行字節校驗 RI = 0; buf++; } *buf = 0;//表示數據結束 /*接收校驗字節*/ while(!RI); tmp = SBUF; RI = 0; /*進(jìn)行數據校驗*/ ecc = tmp^ecc; if (ecc!=0)//如果校驗錯誤 { *(buf-len) = 0;//清空數據緩沖區 /*發(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;//定時(shí)器T1使用工作方式2 TH1 = 250; TL1 = 250; TR1 = 1;//開(kāi)始計時(shí) PCON = 0x80;// SMOD = 1 SCON = 0x50;//工作方式1,波特率9600kbit/s,允許接收 } /*主程序*/ void main() { uchar tmp = 0; /*串口初始化*/ init_serial(); EA = 0;//關(guān)閉所有中斷 while(1) { /*如果接收到的數據不是CALL,則繼續等待*/ 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信號,表示從機可以接收數據*/ TI = 0; SBUF = OK; while(!TI); TI = 0; /*數據接收*/ tmp = 0xff; while(tmp==0xff) { tmp = recvdata(buf);//校驗失敗返回0xff,接收成功返回0 } } }
評論