单片机双机点对点通信的从机程序

发布者:星辰小鹿最新更新时间: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 


关键字:单片机  双机  点对点通信 引用地址:单片机双机点对点通信的从机程序

上一篇:单片机产生方波、锯齿波、三角波程序
下一篇:多机通信的从机程序

推荐阅读最新更新时间:2024-03-16 15:52

TNY256型单片机开关电源及其应用
摘要:单片开关电源具有性价比高、外围电路简单、效率高、功耗低等显著特点,文中介绍了TNY256的性能特点、工作原理,并给出了TNY256的典型应用电路。 关键词:单片开关电源 TNY256 自动重启计数器 功率MOSFET 1 TNY256的性能特点 %26;#183;内置自动重启电路,不需外接元件,一旦发生输出短路或控制环开路故障,可将占空比降低以保护芯片。 %26;#183;在输入直流高压电路中,不需要使用瞬态电压抑制器构成的钳位保护电路,仅用简单的RC吸收回路即可衰减视频噪声。 %26;#183;输入欠压检测电路仅需外接1只电阻,目的是在上电时将片内的功率MOSFET关断,直到直流输入电压VI达到欠压保护门限电压
[单片机]
用STc15f104e单片机做了个学习型红外遥控开关程序
用STc15f104e做了个学习型红外遥控开关、 是上电学习的不带按键的,=上电学习指示灯闪烁,按遥控器,指示灯灭了下, 学习开机键成功。 指示灯继续闪,再按遥控器,指示灯灭了,学习关机键成功,进入待机状态。 上电2秒不学习退出,进入待机状态。 电路原理图如下: 这个是上电学习型红外遥控开关,须要学习开,和关,须要学习两只按键, 单片机源程序如下: #include STC15F104E.H #include intrins.h #define uchar unsigned char #define uint unsigned int #define ulong unsigned long #define CPU_Fos
[单片机]
用STc15f104e<font color='red'>单片机</font>做了个学习型红外遥控开关程序
78K0Lx3微控制器智能水表方案
  NEC电子78K0/Lx3微控制器是高性能8位通用微控制器,采用NEC电子 的78K0内核,有48Pin~80Pin的多种封装,内置4Com/8Com模式的LCD驱动,可以驱动的LCD段数高达288段。   Lx3 微控制器内置高精度8MHz振荡电路,并且可以通过寄存器去控制内部振荡电路的快慢。对于不需要实时时钟的水表,可以节约成本,加快软件开发进度。如果需 要使用RTC,则需要外接32.768kHz的振荡器,可以轻松实现阶梯复费率水费。   通讯方面,Lx3内置有3路串行接口,并且内置有曼 彻斯特编码器和遥控接收器两个硬件模块,在远传及无线方面的多种选择让客户轻松应对瞬息万变的市场需求。   功耗方面,Lx3低于1 A的静
[单片机]
78K0Lx3<font color='red'>微控制器</font>智能水表方案
C8051F单片机在远端测控装置中的应用
C8051F单片机是完全集成的混合信号系统芯片(SoC),具有与8051指令集完全兼容的CIP-51内核和高速、高性能、高集成度等特点。在本文设计的一套远端测控装置中取得了较好的效果。 系统简介 远端测控装置是一种现场可编程的控制器,它能完成数据的采集控制,而通过远程通信的方式(如电台、CDMA、拨号等)将数据上传至中心站或接收中心站的遥控指令。它往往被安装在比较分散、环境比较恶劣、无电源保障(经常断电或使用太阳能)且无人值守的地方,因此它运行的可靠性和功耗就显得尤为重要了。C8051F单片机的工业级工作温度(-40℃~+84℃)、低电压、低功耗、自带看门狗和多复位源等特点满足了此系统的要求。 基于此系统的定位,选用C8051F0
[应用]
Microchip发布业界首款集成强大安全子系统和Arm® TrustZone®技术的单片机
Microchip发布业界首款集成强大安全子系统和Arm® TrustZone®技术的单片机 基于Arm Cortex®-M23的新款单片机搭载安全密钥配置解决方案 安全威胁日益复杂,给物联网(IoT)、消费、工业、医疗和其他市场产品开发带来了挑战。这些产品必须具备强大的嵌入式安全性,同时还要求低功耗以延长电池寿命。Microchip Technology Inc.(美国微芯科技公司)今日宣布推出业界首款在单一封装中集成了安全子系统和Arm® TrustZone®技术的PIC32CM LS60单片机(MCU)。新款单片机集成了Microchip的可信平台(Trust Platform)安全子系统,让使用单个单片机而不
[单片机]
Microchip发布业界首款集成强大安全子系统和Arm® TrustZone®技术的<font color='red'>单片机</font>
一种新颖的LED动态显示方法
单片机应用系统中常使用LED作为显示器,在需多位LED显示时,为了简化电路,降低成本,常将所有门的选线并联在一起,由一个8位I/O口控制,而共阴(阳)I/O线受控制,实现各部分时选通。如图1所示为6位LED动态显示接口电路。 表1 控制符号 段选2 段选1 a b c d e f g dp Led1 led2 led3 第1次 0 1 1 1 1 1
[单片机]
一种新颖的LED动态显示方法
51单片机逻辑运算类指令
对累加器A的逻辑操作: CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。 CPL A ;将A中的值按位取反 RL A ;将A中的值逻辑左移 RLC A ;将A中的值加上进位位进行逻辑左移 RR A ;将A中的值进行逻辑右移 RRC A ;将A中的值加上进位位进行逻辑右移 SWAP A ;将A中的值高、低4位交换。 例:(A)=73H,则执行CPL A,这样进行: 73H化为二进制为01110011, 逐位取反即为 10001100,也就是8CH。 RL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。 例:A中的值为68H,执行RL A。68H化为二进制为011
[单片机]
国产MCU的GD32E230串口通信
之前一直使用ST的STM32F031单片机,但是由于疫情还是啥啥原因,ST的芯片价格涨得没法看,因为我们是做产品,而且量比较大,ST的芯片就无法再用了,这个成本真的扛不起。 于是在很多国产MCU里面做了甄选,最终GD的因为新能优越,价格便宜获选。GD32E230对标的STM32F031,实现了PIN TO PIN兼容,寄存器不是完全兼容,但是GD的主频可以实现72M,这就很恐怖,STM32F031才48M,之前还得超频到56M使用。不得不说,GD强! 仅仅对比固件库,GD的库函数封装的比ST的库要好很多,当然,ST现在主推HAL库,这个HAL库确实也很好。 在使用串口之前同样要配置引脚,时钟。 GPIO引脚配置 void
[单片机]
国产<font color='red'>MCU</font>的GD32E230串口通信
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved