?? pmpdatar.c
字號:
/*****************************************/
/* Copyright (c) 2005, 通信工程學院 */
/* All rights reserved. */
/* 作 者:戴 佳 */
/*****************************************/
#include "PMPDataR.h"
/* 延時t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 對于11.0592M時鐘,約延時1ms */
for (i=0;i<125;i++)
{}
}
}
/* 發送數據函數 */
uchar recvdata(uchar *buf)
{
uchar i,tmp;
uchar len; // 保存數據長度
uchar ecc; // 保存校驗字節
/* 接收數據長度字節 */
RI = 0;
while(!RI);
if (RB8==1)
return 0xee; // 若接收的為地址幀,則返回0xee
len = SBUF;
RI = 0;
/* 使用len的值為校驗字節ecc賦初值 */
ecc = len;
/* 接收數據 */
for (i=0;i<len;i++)
{
while(!RI);
if (RB8==1)
return 0xee; // 若接收的為地址幀,則返回0xee
*buf = SBUF;
ecc = ecc^(*buf); // 進行字節校驗
RI = 0;
buf++;
}
*buf = 0; // 表示數據結束
/* 接收校驗字節 */
while(!RI);
if (RB8==1)
return 0xee; // 若接收的為地址幀,則返回0xee
tmp = SBUF;
RI = 0;
/* 進行數據校驗 */
ecc = tmp^ecc;
if (ecc!=0) // 如果校驗錯誤
{
*(buf-len) = 0; // 清空數據緩沖區
/* 發送校驗錯誤信號ERR */
TI = 0;
TB8 = 0;
SBUF = ERR;
while(!TI);
TI = 0;
return 0xff; // 返回0xff表示校驗錯誤
}
/* 發送校驗成功信號SUCC */
TI = 0;
TB8 = 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 = 0xd0; // 工作方式,9位數據位,波特率9600kbit/s,允許接收
}
/* 主程序 */
void main()
{
uchar i = 0;
uchar tmp = 0xff;
addr = P1&0x0f; // 獲取本機地址
P20 = 1; // 發光管不亮
init_serial(); // 串口初始化
EA = 0; // 關閉所有中斷
/* 進入設備應答 */
while(1)
{
SM2 = 1; // 只接收地址幀
/* 如果接收到的地址幀不是本機地址,則繼續等待 */
tmp = addr-1;
while (tmp!=addr)
{
RI = 0;
while(!RI)
tmp = SBUF;
RI = 0;
}
/* 發送本機地址作為應答信號,準備接收數據 */
TI = 0;
TB8 = 0; // 主機不檢測該位
SBUF = addr;
while(!TI);
TI = 0;
SM2 = 0; // 允許接收數據
/* 數據接收 */
tmp = 0xff;
while(tmp==0xff) // 如果校驗失敗則重新接收數據
{
/* 校驗失敗返回0xff,檢測到地址幀則返回0xee,接收成功返回0 */
tmp = recvdata(buf);
}
if (tmp==0x00) // 校驗正確,表示接收成功
{
/* 綠燈亮,持續500ms,表示接收數據成功 */
P20 = 0;
delay(500);
P20 = 1;
}
// 如果接收數據時發現地址幀,則重新開始整個接收過程
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -