單片機(jī)實現(xiàn)點對點的數(shù)據(jù)傳輸-串口通訊
主要器件:
1、AT89C52單片機(jī)芯片,用于控制串口通信。
2、接口電平轉(zhuǎn)換芯片MAX3232,用于實現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。
試驗流程圖:主機(jī)部分
從機(jī)部分:
試驗電路圖:
試驗程序代碼:
//PPDataR.h程序
#ifndef_PPDATAR_H//防止PPDataT.h被重復(fù)引用
#define_PPDATAR_H
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*握手信號宏定義*/
#define CALL 0x24//主機(jī)呼叫
#define BUSY 0x15//從機(jī)忙
#define OK 0x00//從機(jī)準(zhǔn)備好
#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);//進(jìn)行字節(jié)校驗 RI = 0; buf++; } *buf = 0;//表示數(shù)據(jù)結(jié)束 /*接收校驗字節(jié)*/ while(!RI); tmp = SBUF; RI = 0; /*進(jìn)行數(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口判斷當(dāng)前是否工作忙,若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信號,表示從機(jī)可以接收數(shù)據(jù)*/ TI = 0; SBUF = OK; while(!TI); TI = 0; /*數(shù)據(jù)接收*/ tmp = 0xff; while(tmp==0xff) { tmp = recvdata(buf);//校驗失敗返回0xff,接收成功返回0 } } }
評論