日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 單片機 > 單片機
[導讀]單片機在控制本地的外圍期間時,信息的交互是通過8位并行數(shù)據(jù)總線進行的,但是在較大規(guī)模的現(xiàn)代控制系統(tǒng)中,單片機還需要控制遠端的設備,可以利用單片機的串行通信模塊,在學習了RS-232串口通信的原理和時序后,學習了利用RS-232接口實現(xiàn)串口數(shù)據(jù)傳輸?shù)狞c對點通信。

單片機在控制本地的外圍期間時,信息的交互是通過8位并行數(shù)據(jù)總線進行的,但是在較大規(guī)模的現(xiàn)代控制系統(tǒng)中,單片機還需要控制遠端的設備,可以利用單片機的串行通信模塊,在學習了RS-232串口通信的原理和時序后,學習了利用RS-232接口實現(xiàn)串口數(shù)據(jù)傳輸?shù)狞c對點通信。

主要器件:

1、 AT89C52單片機芯片,用于控制串口通信。

2、 接口電平轉換芯片MAX3232,用于實現(xiàn)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 // 緩沖區(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é) */

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; // 關閉所有中斷

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

}

}

}

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關閉