📄 pmpdatat.c
字号:
/*****************************************/
/* Copyright (c) 2005, 通信工程学院 */
/* All rights reserved. */
/* 作 者:戴 佳 */
/*****************************************/
#include "PMPDataT.h"
/* 延时t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于11.0592M时钟,约延时1ms */
for (i=0;i<125;i++)
{}
}
}
/* 发送数据函数 */
void senddata(uchar *buf)
{
uchar i;
uchar len; // 保存数据长度
uchar ecc; // 保存校验字节
len = strlen(buf); // 计算要发送数据的长度
ecc = len; // 开始进行校验字节计算
/* 发送数据长度 */
TI = 0;
TB8 = 0; // 发送数据帧
SBUF = len; // 发送长度
while(!TI);
TI = 0;
/* 发送数据 */
for (i=0;i<len;i++)
{
ecc = ecc^(*buf);
TB8 = 0; // 发送数据帧
SBUF = *buf;
buf++;
while(!TI);
TI = 0;
}
/* 发送校验字节 */
TB8 = 0; // 发送数据帧
SBUF = ecc;
while(!TI);
TI = 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;
/* 为缓冲区赋初值 */
P0 = 0xff;
while(P1!=0) // 每隔100ms从P0口读取,读取到0表示数据采集结束
{
*(buf+i) = P0;
delay(100); // 延时100ms
P0 = 0xff;
i++;
}
*(buf+i) = 0; // 缓冲区最后一个字节为0表示数据结束
/* 通过P0口读要访问的从机地址 */
P0 = 0xff;
addr = P0;
init_serial(); // 串口初始化
EA = 0; // 关闭所有中断
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
tmp = addr-1;
while(tmp!=addr)
{
/* 发送从机地址 */
TI = 0;
TB8 = 1; // 发送地址帧
SBUF = addr;
while(!TI);
TI = 0;
/* 接收从机应答 */
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
}
/* 发送数据并接收校验信息,如果接收到SUCC,表示从机接收成功,否则将重新发送该组数据 */
tmp = ERR;
while(tmp!=SUCC)
{
senddata(buf); // 发送数据
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -