历史上的今天
今天是:2025年01月08日(星期三)
2018年01月08日 | 单片机双机点对点通信的从机程序
2018-01-08 来源:eefocus
/* 双机点对点通信的从机部分 */
#ifndef __P2P_S_C__
#define __P2P_S_C__
#include
#include
#define __MAX_LEN_ 64 // 数据最大长度
#define _MHz_ 11 // 设置 单片机 使用的晶振频率(11.0592MHz)
/* 以下为程序协议中使用的握手信号 */
#define __RDY_ 0x06 // 主机开始通信时发送的呼叫信号
#define __BUSY_ 0x15 // 从机忙应答
#define __OK_ 0x00 // 从机准备好
#define __SUCC_ 0x0f // 数据传送成功
#define __ERR_ 0xf0 // 数据传送错误
void init_serial(); // 串口初始化
unsigned char recv_data(unsigned char *buf); // 接收数据
void Beep_ok(); // 蜂鸣表示数据接收ok,该函数代码未给出
void main()
{
char buf[__MAX_LEN_];
unsigned char i = 0;
unsigned char tmp = 0xff;
/* 串口初始化 */
init_serial(); // 初始化串口
EA = 0; // 关闭所有中断
/* 进入设备应答阶段 */
while(1)
{
/* 如果接收到的数据不是握手信号__RDY_,则继续等待 */
while(tmp != __RDY_)
{
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
}
/* 程序通过检测P0口数据判断当前设备状态,若P0=0xab,表示当前设备忙 */
P0 = 0xff;
tmp = P0;
if(tmp == 0xab) // 如果P0口数据为0x,则当前设备忙,发送__BUSY_信号
{
TI = 0;
SBUF = __BUSY_;
while(!TI);
TI = 0;
continue;
}
TI = 0; // 否则发送__OK_信号表示可以接收数据
SBUF = __OK_;
while(!TI);
TI = 0;
/* 数据接收 */
tmp = 0xff;
while(tmp == 0xff)
{
tmp = recv_data(buf); // 校验失败返回0xff,接收成功则返回0
}
Beep_ok(); // 蜂鸣表示数据接收成功
}
}
/* 初始化串口 */
void init_serial()
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 250; // 设置初值
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0x50; //工作方式1,波特率9600bps,允许接收
}
/* 接收数据,注意该函数使用buf指向的缓冲区保存数据,在数据末尾使用’\0’表示数据结束
* 返回值为0,数据校验成功,返回值为0xff,数据校验失败
*/
unsigned char recv_data(unsigned char *buf)
{
unsigned char len; // 该字节用于保存数据长度
unsigned char ecc; // 该字节用于保存校验字节
unsigned char i,tmp;
/* 接收数据长度 */
RI = 0;
while(!RI);
len = SBUF;
RI = 0;
/* 使用len的值为校验字节ecc赋初值 */
ecc = len;
/* 接收数据 */
for(i=0; i
while(!RI);
*buf = SBUF; // 接收数据
ecc = ecc^(*buf); // 进行字节校验
RI = 0;
buf++;
}
*buf = 0; // 表示数据结束
/* 接收校验字节 */
while(!RI);
tmp = SBUF;
RI = 0;
/* 进行数据校验 */
ecc = tmp^ecc;
if(ecc != 0) // 校验失败
{
*(buf-len) = 0; // 清空数据缓冲区
TI = 0; // 发送校验失败信号
SBUF = __ERR_;
while(!TI);
TI = 0;
return 0xff; // 返回0xff表示校验错误
}
TI = 0; // 校验成功
SBUF = __SUCC_;
while(!TI);
TI = 0;
return 0; // 校验成功,返回0
}
#endif
下一篇:多机通信的从机程序
史海拾趣
|
无锡+外资半导体厂商+生产经理、设备经理、资深plating工程师 本人猎头,受某外资半导体厂商委托,招聘以下职位:production manager/equipment manager/senior plating engineer。 投递简历或咨询:hunter.sweet@163.com 职位细节如下: Production Manager 职位描述 Responsibility: 1) ...… 查看全部问答> |
|
这几天正在做一个东西,51和AVR进行串口通信,把51里的东西发送到AVR里用一个240128的液晶 显示出来,51通过按键控制,发现当AVR单片机上连上液晶时(液晶盖在两个单片机上面),通信很差, 几乎不能通信,但把液晶取下后,两个单片机就能很好的 ...… 查看全部问答> |
|
关于蒙特卡洛模拟方法的资料,最著名的 《Monte Carlo: Concepts, Algorithms, and Applications》 Fishman著,1999 722页, 在国内根本就找不到相关的书籍,要不就是都太早了的书。在我现在还没有弄到英文原版的。 这个是中文版的那本书籍。 资 ...… 查看全部问答> |
|
本人有一个usb,有驱动,但是不能加载到系统.我用libusb操作它,但是写的时候和读的时候总是出现Resource temporarily unavailable. write ret =4,Resource temporarily unavailable//写入1234 usb_interrupt_read=-110,Resource temporarily unavai ...… 查看全部问答> |
|
从称重原理可知,称重传感器所测量物料的瞬时流量的大小取决于两个参数,即瞬时流量等于称重传感器测量的承载器上物料负荷值q(kg/m)和测速传感器测量的皮带速度值v(m/s)两个参数相乘所得,由此可见,测速传感器的测量精确度和稳定性与称重传感器的 ...… 查看全部问答> |
|
想把头像修改为自己选择的图片,这样做: 1、先登录,然后在首页的右上方(当然在其他页面有时也能)看到菜单项,点击其中的设置(如下图) 或者是这样的界面 2、进入设置界面后,在左侧的选项栏选择“修改头像”(如下图),在其中点击“选择图 ...… 查看全部问答> |




