單片機(jī)實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸-串口通訊
主要器件:
1、AT89C52單片機(jī)芯片,用于控制串口通信。
2、接口電平轉(zhuǎn)換芯片MAX3232,用于實(shí)現(xiàn)TTL電平和RS-232電平的轉(zhuǎn)換。
試驗(yàn)流程圖:主機(jī)部分
從機(jī)部分:
試驗(yàn)電路圖:
試驗(yàn)程序代碼:
//PPDataR.h程序
#ifndef_PPDATAR_H//防止PPDataT.h被重復(fù)引用
#define_PPDATAR_H
#include
#include
#define uchar unsigned char
#define uint unsigned int
/*握手信號(hào)宏定義*/
#define CALL 0x24//主機(jī)呼叫
#define BUSY 0x15//從機(jī)忙
#define OK 0x00//從機(jī)準(zhǔn)備好
#define SUCC 0x2A//接收成功
#define ERR 0xF0//接收錯(cuò)誤
#define MAXLEN 64//緩沖區(qū)最大長(zhǎng)度
uchar buf[MAXLEN];
#endif
//PPDataR.c程序
#include "PPDataR.h"
/*發(fā)送數(shù)據(jù)函數(shù)*/
uchar recvdata(uchar *buf)
{
uchar i,tmp;
uchar len;//保存數(shù)據(jù)長(zhǎng)度
uchar ecc;//保存校驗(yàn)字節(jié)
/*接收數(shù)據(jù)長(zhǎng)度字節(jié)*/
RI = 0;
while(!RI);
len = SBUF;
RI = 0;
/*使用len的值為校驗(yàn)字節(jié)ecc賦初值*/
ecc = len;
/*接收數(shù)據(jù)*/
for (i=0;i { while(!RI); *buf = SBUF; ecc = ecc^(*buf);//進(jìn)行字節(jié)校驗(yàn) RI = 0; buf++; } *buf = 0;//表示數(shù)據(jù)結(jié)束 /*接收校驗(yàn)字節(jié)*/ while(!RI); tmp = SBUF; RI = 0; /*進(jìn)行數(shù)據(jù)校驗(yàn)*/ ecc = tmp^ecc; if (ecc!=0)//如果校驗(yàn)錯(cuò)誤 { *(buf-len) = 0;//清空數(shù)據(jù)緩沖區(qū) /*發(fā)送校驗(yàn)錯(cuò)誤信號(hào)ERR */ TI = 0; SBUF = ERR; while(!TI); TI = 0; return 0xff;//返回0xff表示校驗(yàn)錯(cuò)誤 } /*發(fā)送校驗(yàn)成功信號(hào)SUCC */ TI = 0; SBUF = SUCC; while(!TI); TI = 0; return 0;//校驗(yàn)成功,返回0 } void init_serial() { TMOD = 0x20;//定時(shí)器T1使用工作方式2 TH1 = 250; TL1 = 250; TR1 = 1;//開始計(jì)時(shí) 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; } /*檢測(cè)P0口判斷當(dāng)前是否工作忙,若P0=0xBB,則為忙狀態(tài)*/ P0 = 0xff; tmp = P0; if(tmp==0xBB)//如果P0口為0xBB,發(fā)送BUSY信號(hào) { TI = 0; SBUF = BUSY; while(!TI); TI = 0; continue; } /*否則發(fā)送OK信號(hào),表示從機(jī)可以接收數(shù)據(jù)*/ TI = 0; SBUF = OK; while(!TI); TI = 0; /*數(shù)據(jù)接收*/ tmp = 0xff; while(tmp==0xff) { tmp = recvdata(buf);//校驗(yàn)失敗返回0xff,接收成功返回0 } } }
評(píng)論