单片机NFC点对点通信发送端C语言程序
(单片机原理与应用实验)实验9点对点串行通信
波特率
串行通信接口
单片机上的串行通信接口通常包括发 送数据端(TXD)、接收数据端 (RXD)和地线(GND)。
表示每秒钟传输的位数,是衡量串行 通信速度的参数。
串行通信的分类
同步串行通信与异步串行通信
同步串行通信是指发送方和接收方以相同的时钟频率进行数据传输,而异步串 行通信则没有共同的时钟频率。
02
例如,空调的温度设置、电视的频道切换等操作,都是通过性、易扩展等优点,因此
03
在智能家居领域得到广泛应用。
在工业控制中的应用
在工业控制系统中,各种传感器、执行器等设备需要实时地进行数据传输和控制。 点对点串行通信能够满足工业控制领域对实时性、可靠性和安全性的高要求。
波特率设置
波特率计算
根据通信协议的要求,计算出合 适的波特率。常用的波特率有 9600、19200、4800等。
寄存器配置
根据计算出的波特率,配置单片 机串行通信接口的相关寄存器, 以实现所需的波特率。
测试与调整
在实际通信过程中,可能需要根 据实际情况调整波特率,以确保 数据传输的稳定性和正确性。
(单片机原理与应用实 验)实验9点对点串行 通信
contents
目录
• 单片机串行通信原理 • 点对点串行通信的实现 • 单片机点对点串行通信实验步骤 • 点对点串行通信的应用 • 点对点串行通信的优缺点 • 点对点串行通信的未来发展
01
单片机串行通信原理
串行通信的基本概念
串行通信
指数据在单条线路上一位一位地传输, 具有节省传输线、成本低、远距离传 输可靠等优点。
单工、半双工和全双工串行通信
单工是指数据只能向一个方向传输,半双工是指数据可以在两个方向上传输, 但不能同时进行,全双工则是指数据可以在两个方向上同时传输。
单片机点对点通讯程序(c51)
单片机点对点通讯程序(c51)#include#define uchar unsigned char#define TR 1uchar idata buf[10];uchar pf;void init(void){TMOD=0X20; /*定时方式2*/TH1=0XE8; /*波特率*/TL1=0XE8;PCON=0X00;TR1=1;SCON=0X50;}void send(uchar idata *d){uchar i;do{SBUF=0XAA; /*发送联络信号*/while(TI==0);TI=0; /*等待发送出去*/while(RI==0);RI=0; /*等待B机回答*/}while((SBUF^0xbb)!=0); /*B机未准备好,继续联络*/ do{pf=0; /*清校验和*/for(i=0;i<16;i++){SBUF=d[i];pf+=d[i]; /*求校验和*/while(TI==0);TI=0;}SBUF=pf; /*发送校验和,并等待B机回答*/while(TI==0);TI=0;while(RI==0);RI=0;}while(SBUF!=0); /*回答出错,重发*/}void receive(uchar idata *d){ uchar i;do{while(RI==0);RI=0;}while((SBUF^0xaa)!=0); /*判断A机有无请求*/ SBUF=0xbb; /*发应答信号*/while(TI==0);TI=0;while(1){pf=0; /*清校验和*/for(i=0;i<16;i++){while(RI==0);RI=0;d[i]=SBUF;pf+=d[i]; /*求检验和*/}while(RI==0);RI=0; /*接收A机校验和*/if((SBUF^pf)==0) /*比较校验和*/{SBUF=0x00;break;} /*相同发“00”*/else{SBUF=0xff; /*出错发“FF”,重新接收*/ while(TI==0);TI=0;}}}void main(void){init();if(TR==0){send(buf);}else{receive(buf);}}。
单片机数据传送指令c语言
单片机数据传送指令c语言单片机是一种集成电路,也称为微控制器。
它内部集成了处理器、存储器和各种外围设备接口,并且可以通过程序来控制其工作。
在单片机编程过程中,数据传送指令是常用的指令之一。
数据传送指令用于在单片机中传输数据,可以实现寄存器之间的数据传递、数据移动和数据保存等功能。
下面我将详细介绍单片机数据传送指令的使用方法。
首先,我们需要了解数据传送指令的基本格式。
数据传送指令通常以下面的形式出现:MOV destination, source。
其中,destination表示目标操作数,source表示源操作数。
要执行一条数据传送指令,首先需要确定传输数据的源和目标,然后根据具体需求选择合适的寻址方式来指定源和目标的地址。
下面我将介绍几种常用的寻址方式。
第一种寻址方式是立即寻址(Immediate Addressing)。
在立即寻址中,source指定了一个立即数,表示需要传送的数据。
立即数是在指令中给出的常数值,可以直接传送到目标寄存器或内存地址中。
例如,MOV A, #15表示将立即数15传送到A寄存器中。
第二种寻址方式是直接寻址(Direct Addressing)。
直接寻址中,source 指定了一个源寄存器或内存地址,将该寄存器或内存地址中的内容传送到目标寄存器或内存地址中。
例如,MOV A, B表示将B寄存器中的内容传送到A寄存器中。
第三种寻址方式是寄存器间接寻址(Register Indirect Addressing)。
在寄存器间接寻址中,source指定了一个寄存器的地址,将该寄存器中的内容传送到目标寄存器或内存地址中。
例如,MOVX @DPTR, A表示将A 寄存器中的内容传送到DPTR寄存器指向的内存地址中。
第四种寻址方式是间接偏移寻址(Indirect Offset Addressing)。
在间接偏移寻址中,source指定了一个源寄存器和一个偏移量,将源寄存器地址加上偏移量得到的地址中的内容传送到目标寄存器或内存地址中。
基于单片机的点对点数据传输系统设计精编版
基于单片机的点对点数据传输系统设计精编版 MQS system office room 【MQS16H-TTMS2A-MQSS8Q8-MQSH16898】基于单片机实现点对点对点数据传输摘要C语言进行8051单片机程序设计是单片机开发与应用的必然趋势。
采用C语言可以很容易地进行单片机的程序移植工作,有利于产品中的单片机的重新选型。
其开发速度、软件质量、结构严谨、程序坚固等方面,C语言的完美绝非是汇编语言编程所能比拟的。
文章给出了采用C语言编程实现双机通信的具体实现方法。
双机通信也称点对点的通信,用于单片机和单片机之间交换信息,也用于单片机和通用微机间的信息交流。
在整个系统中,主要采用串行通信方式进行数据传输。
8051单片机自备串行接口,为机间通信提供了极为便利的条件。
利用主机和从机间配备RS-232C、RS-422或RS-485等关键词:单片机串行通信双机通信MAX3232Abstract'sproceduretransplantworkveryeasily,isadvantageousintheproductmono lithicintegratedcircuit',thesoftwarequality,thestructurearerigorous,the procedurefirmandsoonaspects,',,-232C,RS-422orRS-485andsoon.Keywords:MonolithicintegratedcircuitSerialcommunicationCorrespondenceMAX3232目录第一章绪论第二章单片机基础第一节单片机介绍第二节单片机历史第三章设计思路分析第一节串行通信的基本原理一、串行通信的原理二、串行通信的特点?三、串行通信的方式四、串行通信传送方式第二节51单片机的串口是RS-232标准串口一、RS-232标准介绍二、与RS-232C相匹配的连接器第三节接口电平转换第四章硬件电路设计第一节结构框图第二节主要器件第三节电路原理图及说明一、MAX3232实现的接口电平转换电路原理图二、单片机部分电路原理图第五章软件设计第一节协议设计第二节主机程序流程及代码一、主机的程序流程图二、主机的程序第三节从机程序流程及代码一、从机的程序流程图二、从机的程序第六章总结第一章绪论21世纪是全人类进入计算机时代的世纪,许多人不是在制造计算机便是在使用计算机。
基于51单片机的CAN通讯协议C语言程序
// 入口函数 无
// 出口函数 无
// 全局变量 SJA_workmode
// 操作寄存器 控制寄存器(地址00)
// 函数功能 设置SJA工作在复位模式
#define SJA_RIE 0 //接收中断
//-----------------------定义地址指针,指向基址--------------------------------------------------------
bit bdata SJA_workmode=1; //SJA_workmode=1SJA工作在工作模式
//SJA_workmode=0工作在复位模式
#define base_Adr 0x00
//-----------------------定义总线定时寄存器的值--------------------------------------------------------
#define SJA_BTR0 0x00 //该值需要用户根据实际需要的波特率进行计算
//------------------------------------------------------------------------------------------------------
// 函数类别 SJA1000基本操作
// 函数名称 CANREG_write
}BASICCAN_FRAME,receive_BUF,send_BUF;
//BASICCAN_BUFstruct send_BUF;
//------------------------------------------------------------------------------------------------------
nrf24l01发送接收点对点 汇编程序
;延时14s子程序
YANSHI1S MOV R7,#250
YANSHI1S1 MOV R6,#250
YANSHI1S2 NOP
NOP
DJNZ R6,YANSHI1S2
DJNZ R2,DUZT1
SETB P1.7 ;CSN变高,完成一次命令
RET
START MOV P1,#0AFH ;模块待机
DJNZ R6,DL0
DJNZ R7,DL1
RET
;将58开始的单或多字节(字节数在R3中)写入芯片
XIENB MOV R0,#58H
CLR P1.7 ;SCN变低
MOV 58H,#21H ;01寄存器
MOV 59H,#03H ;0,1通道允许自动应答
MOV R3,#02H
LCALL XIENB
MOV P1.5,C ;数据送上MOSI线
SETB P1.4 ;数据移入模块
CLR P1.4
SETB P1.6 ;启动发射
MOV R7,#5
DJNZ R7,$
CLR P1.6
MOV R3,#02H
LCALL XIENB
MOV 58H,#2AH ;0A寄存器(通道0)
MOV 59H,#02H ;配置地址
DJNZ R2,XIE1B1
RET
;读芯片状态字 将芯片状态字读到5FH
DUZT MOV R2,#8
SETB P1.5
MOV R0,#70H
XIEXUN LCALL XIE1B
INC R0
DJNZ R3,XIEXUN
SETB P1.7
MOV 58H,#31H ;11寄存器
单片机双机点对点通信设计
EA=0;//关闭所有中断
/*进入设备应答阶段*/
while(1)
{
/*如果接收到的数据不是握手信号__RDY_,则继续等待*/
while(tmp!=__RDY_)
{
RI=0;
while(!RI);
tmp=SBUF;
RI=0;
}
/*程序通过检测P0口数据判断当前设备状态,若P0=0xab,表示当前设备忙*/
单片机双机点对点通信设计
/*双机点对点通信的从机部分*/
#ifndef__P2P_S_C__
#define__P2P_S_C__
#include
#include
#define__MAX_LEN_64//数据最大长度
#define_MHz_11//设置单片机使用的晶振频率(11.0592MHz)
/*以下为程序协议中使用的握手信号*/
unsignedcharrecv_data(unsignedchar*buf);//接收数据
voidBeep_ok();//蜂鸣表示数据接收ok,该函数代码未给出
voidmain()
{
charbuf[__MAX_LEN_];
unsignedchari=0;
unsignedchartmp=0xff;
/*串口初始化*/
TI=0;
/*数据接收*/
tmp=0xff;
while(tmp==0xff)
{
tmp=recv_data(buf);//校验失败返回0xff,接收成功则返回0
}
Beep_ok();//蜂鸣表示数据接收成功
}
}
/*初始化串口*/
voidinit_serial()
单片机点对点数据传输
减少数据冗余
去除不必要的冗余数据 ,只传输关键信息,以 减少传输的数据量。
优化通信协议
采用适合的单片机通信 协议,如I2C、SPI或 UART等,以减少通信 时间。
传输稳定性优化
抗干扰设计
采取有效的抗干扰措施,如加装 屏蔽、使用双绞线或差分信号线 等,以提高数据传输的稳定性。
错误检测与纠正
采用错误检测和纠正算法,如奇 偶校验、循环冗余校验(CRC) 等,以检测和纠正传输中的错误 。
特点
简单、高效、可靠,适用于距离较近、数据量不大的场合。
传输原理
串口通信
通过单片机的串口进行数据传输,实现点对点通 信。
并口通信
通过单片机的并口进行数据传输,实现点对点通 信。
I2C通信
通过I2C总线协议进行数据传输,实现点对点通信 。
应用场景
01
02
03
智能家居
用于家庭中的设备间通信 ,如智能灯光、智能门锁 等。
实例三:基于SPI的数据传
总结词
SPI通信是一种高速同步串行数据传输协议,具有高速度、高可靠性、低时序等优点。
详细描述
SPI通信通过四根数据线实现数据的全双工同步传输,支持多个设备同时连接在一个总线上。在基于SPI的数据传 输中,需要设置SPI通信参数,如时钟极性和相位、数据传输顺序等,以确保数据传输的正确性和稳定性。
协议应用场景
TCP协议
适用于需要可靠传输的应用场景,如文件传输 、网页浏览等。
UDP协议
适用于实时性要求较高的应用场景,如流媒体 、实时游戏等。
点对点协议
适用于点对点通信的应用场景,如无线通信、局域网通信等。
04
CATALOGUE
单片机点对点数据传输实现
单片机点对点数据传输
单片机点对点数据传输随着嵌入式系统和物联网技术的发展,单片机点对点数据传输已成为许多应用中不可或缺的一部分。
点对点数据传输通常指的是两个设备之间直接进行数据交换,而不需要通过一个中心化的服务器或者网络设备进行中转。
这种传输方式具有高效、实时、安全等优点,被广泛应用于智能家居、工业自动化、远程控制等领域。
一、单片机点对点数据传输的基本原理单片机点对点数据传输的基本原理是,两个设备通过相同的通信协议和数据格式,直接进行数据交换。
这种传输方式需要解决的一个关键问题是如何寻找到达目标设备的路径。
通常,设备之间可以通过广播或者组播的方式寻找到对方,然后建立连接并进行数据传输。
在单片机点对点数据传输中,数据的发送和接收通常由单片机的串口或者SPI接口完成。
在发送数据时,单片机将需要传输的数据通过串口或者SPI接口发送出去;在接收数据时,单片机通过串口或者SPI 接口接收来自目标设备的数据。
二、单片机点对点数据传输的优点1、高效:由于是直接进行数据传输,没有中间环节,因此效率很高。
2、实时:可以做到实时响应,对于一些需要实时反馈的应用非常重要。
3、安全:由于是直接进行数据传输,不容易被窃取或篡改数据。
4、简单:相对于网络传输,单片机点对点数据传输的硬件和软件实现都比较简单,易于开发和维护。
三、单片机点对点数据传输的应用场景1、智能家居:智能家居中的各种设备需要相互通信,实现各种控制功能。
例如,空调和热水器可以通过单片机点对点数据传输实现远程控制。
2、工业自动化:在工业自动化领域,单片机点对点数据传输被广泛应用于各种设备的远程控制和数据采集。
例如,可以通过单片机点对点数据传输实现数控机床和工业机器人的远程控制。
3、远程控制:在一些需要远程控制的应用场景中,单片机点对点数据传输可以实现数据的快速和安全传输。
例如,可以通过单片机点对点数据传输实现无人机的远程控制。
四、总结单片机点对点数据传输是一种高效、实时、安全的通信方式,被广泛应用于智能家居、工业自动化、远程控制等领域。
单片机控制GSM模块TC35i发短信,打电话的C程序
delay_Xms(1000); //延时 }
/***************************短信**********************************/ void GSM_TXT() //发送 AT+cmgf=0 设置短信模式 PDU {
{ delay_Xms(100); //抖动延时 if(SW5==0) { D10LED=0; //打开 led0 while(!SW5);//松手检测 D10LED=1; //关闭 led0 beeper=0;//开蜂鸣器 delay_Xms(1000); beeper=1;//关蜂鸣器 } //delay_Xms(1000); TI=0;
} /********************************************************/
start_TC35i() //启动 TC35i 的函数 {
beeper=0; delay_Xms(500); delay_Xms(500); beeper=1; //蜂鸣器响一次 D10LED=0; J1=0; delay_Xms(2000); D10LED=1; //继电器 1,灯 1 工作一次 J1=1; D11LED=0; J2=0; delay_Xms(2000); D11LED=1; //继电器 2,灯 2 工作一次 J2=1; START_TC=0;//启动 TC35i delay_Xms(1500);// 时间必须大于 100ms START_TC=1;//完成启动 //此后一直保持高电平 } void GSM_AT() //发“AT”的函数 {
使用C#进行点对点通讯和文件传输
使用C#进行点对点通讯和文件传输程序分三部分,包括发送部分、接受部分和一个两者共享的通讯基类,这个基类才是俺心血的结晶:)一、通讯基类using System;using .Sockets;using ;using System.IO ;using System.Windows.Forms;using System.Text;namespace BaseClass{/// 传送信息的格式为给定长度的命令部分+给定长度的命令注释部分+可变长度的长度信息+可变长度的信息部分public class CommunClass{public CommunClass(){// TODO: 在此处添加构造函数逻辑}/// 命令部分的长度private static readonly int CMDLEN = 50 ;/// 命令注释部分的长度private static readonly int DESCLEN = 100 ;/// 可变长度的长度信息部分所占的字节数private static readonly int DYNAMICLENGTHLEN = 10 ;/// 每次处理可变信息部分的长度private static readonly int DEALLEN = 1024 ;/// /应答的最大长度private static readonly int RESPONLEN = 20 ;/// 用于填充命令或注释不足长度部分的字符private static readonly char FILLCHAR = ''^'' ;/// 成功发送一部分数据后的回调方法(也可以认为是触发的事件,但严格来说还不是)public delegate void OnSend(int iTotal,int iSending) ;/// 根据给定的服务器和端口号建立连接/// 服务器名/// 端口号public static Socket ConnectToServer(string strHost,int iPort){try{IPAddress ipAddress = Dns.Resolve(strHost).AddressList[0];IPEndPoint ipPoint = new IPEndPoint(ipAddress,iPort) ;Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp) ;s.Connect(ipPoint) ;return s ;}catch (Exception e){ throw (new Exception("建立到服务器的连接出错" + e.Message)) ; }}/// 将文本写到Socket中/// 要发送信息的Socket/// 要发送的信息/// 是否成功public static bool WriteTextToSocket(Socket s,string strInfo){byte [] buf = Encoding.UTF8.GetBytes(strInfo) ;try { s.Send(buf,0,buf.Length,SocketFlags.None) ; return true ; }catch(Exception err) { MessageBox.Show("发送文本失败!"+err.Message) ; return false ; } }/// 将命令文本写到Socket中/// 要发送命令文本的Socket/// 要发送的命令文本// 是否成功public static bool WriteCommandToSocket(Socket s,string strCmd){if (strCmd == "")strCmd = "NOP" ;strCmd = strCmd.PadRight(CMDLEN,FILLCHAR) ;return WriteTextToSocket(s,strCmd) ;}////// 将命令注释写到Socket中////// 要发送命令注释的Socket/// 要发送的命令注释/// 是否成功public static bool WriteCommandDescToSocket(Socket s,string strDesc){if (strDesc == "")strDesc = "0" ;strDesc = strDesc.PadRight(DESCLEN,FILLCHAR) ;return WriteTextToSocket(s,strDesc) ;}/// 发送可变信息的字节数/// 要发送字节数的Socket/// 字节数/// 是否成功public static bool WriteDynamicLenToSocket(Socket s,int iLen){string strLen = iLen.ToString().PadRight(DYNAMICLENGTHLEN,FILLCHAR) ;return WriteTextToSocket(s,strLen) ;}/// 将缓存的指定部分发送到Socket/// 要发送缓存的Socket/// 要发送的缓存/// 要发送缓存的起始位置/// 要发送缓存的字节数/// 每次发送的字节说/// 每次发送成功后的回调函数/// 是否发送成功public static bool WriteBufToSocket(Socket s,byte [] buf,int iStart,int iCount,int iBlock,OnSend SendSuccess) {int iSended = 0 ;int iSending = 0 ;while(iSended{if (iSended + iBlockiSending = iBlock ;elseiSending = iCount - iSended ;s.Send(buf,iStart+iSended,iSending,SocketFlags.None) ;iSended += iSending ;if (ReadResponsionFromSocket(s)=="OK")if (SendSuccess != null)SendSuccess(iCount,iSended) ;elsereturn false;}return true ;}/// 将长度不固定文本发送到socket/// 要发送文本的Socket/// 要发送的文本/// 成功发送一部分文本后的回调函数/// 得到文本长度的回调函数public static bool WriteDynamicTextToSocket(Socket s,string strText, OnSend OnSendText){byte [] buf = Encoding.UTF8.GetBytes(strText) ;int iLen = buf.Length ;try{WriteDynamicLenToSocket(s,iLen) ;return WriteBufToSocket(s,buf,0,iLen,DEALLEN,OnSendText) ;}catch(Exception err){MessageBox.Show("发送文本失败!"+err.Message) ;return false ;}}/// 将文件写到Socket/// 要发送文件的Socket/// 要发送的文件/// 是否成功public static bool WriteFileToSocket(Socket s,string strFile,OnSend OnSendFile){FileStream fs = new FileStream(strFile,FileMode.Open,FileAccess.Read,FileShare.Read) ; int iLen = (int)fs.Length ;WriteDynamicLenToSocket(s,iLen) ;byte [] buf = new byte[iLen] ;try{fs.Read(buf,0,iLen) ;return WriteBufToSocket(s,buf,0,iLen,DEALLEN,OnSendFile) ;}catch(Exception err){MessageBox.Show("发送文件失败!"+err.Message) ;return false ; }finally { fs.Close() ; }}/// 对方对自己消息的简单回应public static string ReadResponsionFromSocket( Socket s){byte [] bufCmd = new byte[RESPONLEN] ;int iCount = s.Receive(bufCmd) ;string strRespon = Encoding.UTF8.GetString(bufCmd,0,iCount) ;return strRespon ;}/// 从Socket读取命令/// 要读取命令的Socket/// 读取的命令public static string ReadCommandFromSocket( Socket s){byte [] bufCmd = new byte[CMDLEN] ;int iCount = s.Receive(bufCmd,0,CMDLEN,SocketFlags.Partial) ;string strCommand = Encoding.UTF8.GetString(bufCmd,0,CMDLEN) ;return strCommand = strCommand.TrimEnd(FILLCHAR) ;}/// 读取命令注释/// 要读取命令注释的Socket/// 读取的命令注释public static string ReadCommandDescFromSocket( Socket s){byte [] bufCmd = new byte[DESCLEN] ;int iCount = s.Receive(bufCmd,0,DESCLEN,SocketFlags.Partial) ;string strCommand = Encoding.UTF8.GetString(bufCmd,0,DESCLEN) ;return strCommand = strCommand.TrimEnd(FILLCHAR) ;}/// 读取可变部分的长度// 要读取可变部分长度的Socket/// 读取的可变部分的长度public static int ReadDynamicLenFromSocket( Socket s){byte [] bufCmd = new byte[DYNAMICLENGTHLEN] ;int iCount = s.Receive(bufCmd,0,DYNAMICLENGTHLEN,SocketFlags.Partial) ; string strCommand = Encoding.UTF8.GetString(bufCmd,0,DYNAMICLENGTHLEN) ; return int.Parse(strCommand.TrimEnd(FILLCHAR)) ;}/// 读取文本形式的可变信息/// 要读取可变信息的Socket/// 读取的可变信息public static string ReadDynamicTextFromSocket( Socket s){int iLen = ReadDynamicLenFromSocket(s) ;byte [] buf = new byte[iLen] ;string strInfo = "" ;int iReceiveded = 0 ;int iReceiveing = 0 ;while(iReceiveded{if (iReceiveded + DEALLENiReceiveing = DEALLEN ;elseiReceiveing = iLen - iReceiveded ;s.Receive(buf,iReceiveded,iReceiveing,SocketFlags.None) ;CommunClass.WriteTextToSocket(s,"OK") ;iReceiveded+= iReceiveing ;}strInfo = Encoding.UTF8.GetString(buf,0,iLen) ;return strInfo ;}////// 读取文件形式的可变信息////// 要读取可变信息的Socket/// 读出后的文件保存位置/// 是否读取成功public static bool ReadDynamicFileFromSocket( Socket s,string strFile){int iLen = ReadDynamicLenFromSocket(s) ;byte [] buf = new byte[iLen] ;FileStream fs = new FileStream(strFile,FileMode.Create,FileAccess.Write) ;try{int iReceiveded = 0 ;int iReceiveing = 0 ;while(iReceiveded{if (iReceiveded + DEALLENiReceiveing = DEALLEN ;elseiReceiveing = iLen - iReceiveded ;s.Receive(buf,iReceiveded,iReceiveing,SocketFlags.None) ;CommunClass.WriteTextToSocket(s,"OK") ;iReceiveded+= iReceiveing ;}fs.Write(buf,0,iLen) ;return true ;}catch(Exception err) { MessageBox.Show("接收文件失败"+err.Message) ; return false ; }finally { fs.Close() ; }}}//end class}//end namespace上面是俺的通讯基础类,有了这个类,再进行发送接受还不是小菜一碟吗?上面介绍了通讯的基类,下面就是使用那个类进行发送和接收的部分:二、发送部分:发送咱们使用了多线程,可以同时进行多个任务,比如发送文件、发送文本等,互不影响:发送文本方法:private void StartSendText(string strHost,int iPort,string strInfo){SendText stText = new SendText(strHost,iPort,strInfo,new CommunClass.OnSend(OnSendDrawProgress)) ; StartThread(new ThreadStart(stText.Send)) ;}下面是他调用用到的一些方法:开始一个线程private void StartThread(ThreadStart target){Thread doStep = new Thread(target) ;doStep.IsBackground = true ;doStep.Start() ;}发送一部分(本文设置的是1024字节)成功后的回调方法public void OnSendDrawProgress(int iTotal,int iSending){if (iTotal != pbMain.Maximum)pbMain.Maximum = iTotal ;pbMain.V alue = iSending ;}因为使用的是线程,所以发送文本使用的是一个发送文本类的方法,该类如下:public class SendText{private string Host ;private int Port ;private string Info ;private CommunClass.OnSend onsend ;public SendText(string strHost,int iPort,string strInfo, CommunClass.OnSend onSend){Host = strHost ;Port = iPort ;Info = strInfo ;onsend = onSend ;}public void Send(){Socket s = null ;try{s = CommunClass.ConnectToServer(Host,Port) ;CommunClass.WriteCommandToSocket(s,"SENDTEXT") ;CommunClass.WriteCommandDescToSocket(s,"") ;CommunClass.WriteDynamicTextToSocket(s,Info,onsend) ;}catch (Exception e) { MessageBox.Show(e.Message) ; }finally { if (s != null) s.Close() ; } }}//end class这样就可以使用一个线程发送文本了。
(单片机原理与应用实验)实验9点对点串行通信
Keil μVision5集成环境、c51 C语言编译器。
实验工具
虚拟示波器、示波器探头、手机App等。
实验电路图设计
电路图
单片机与串行通信电路、LED等外设的连接示意图。
面包板图
实际硬件连接呈现。
操作流程图
将电路图抽象为具有流程性的操作步骤。
单片机程序设计
程序框架
位移寄存器、数据缓存、波特率设定等模块的初始 化及配置。 循环结构及条件语句的实现。
点对点串行通信应用举例
红外线遥控器
利用红外线的点对点传输方式实现遥控器功能,如电视、空调、音响、洗衣机等。
伺服电机控制
点对点控制伺服电机,实现位置和速度的精确控制,并适用于注塑机、膜伸展机、食品包装 机、自动编织机等。
无线打印机
点对点串行通信协议实现无线打印任务和数据的传输,便捷快速。
串行通信的发展历程
2 实物配套商品管理
从规则定制、金融支付等方面实现物联网的数据传输。
3 工业生产及维护领域
通过大型企业、设备间便捷的数据交换维护制造优势。
串行通信技术在远程监控和数据采集中的 应用
传感器技术
基于串行通信方式的拓展,可以很容易的构建海量 传感器测量点与控制中心间的 (远程) 数据传输通路。
遥测技术
点对点串行通信技术的突破,实现多类传感器数据 信息的及时采集与应用,如农业养殖行业等。
传输速率的检测和优化
速率检测
通过压缩测试、速率检测等方式测量数据传输的速 率。
数据缓存优化
使用FIFO缓存、循环存储等方式提高数据传输效率。
基于串行通信的多个设备之间的通信
1
主从通信模式
通信的双方划分为主设备和从设备,实现多方互通的目的。
C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
C# codenamespace UDPServer{class Program{static void Main(string[] args){int recv;byte[] data = new byte[1024];//构建TCP 服务器//得到本机IP,设置TCP端口号IPEndPoint ipep = new IPEndPoint(IPAddress.Any , 8001);Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram , ProtocolType.Udp);//绑定网络地址newsock.Bind(ipep);Console.WriteLine("This is a Server, host name is {0}",Dns.GetHostName());//等待客户机连接Console.WriteLine("Waiting for a client...");//得到客户机IPIPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)(sender);recv = newsock.ReceiveFrom(data, ref Remote);Console .WriteLine ("Message received from {0}: ", Remote.ToString ()); Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv ));//客户机连接成功后,发送欢迎信息string welcome = "Welcome ! ";//字符串与字节数组相互转换data = Encoding .ASCII .GetBytes (welcome );//发送信息newsock .SendTo (data ,data.Length ,SocketFlags .None ,Remote );while (true ){data =new byte [1024];//发送接受信息recv =newsock.ReceiveFrom(data ,ref Remote);Console .WriteLine (Encoding .ASCII .GetString (data ,0,recv)); newsock .SendTo (data ,recv ,SocketFlags .None ,Remote );}}}}C# codeusing System;using System.Collections.Generic;using System.Linq;using System.Text;using ;using .Sockets;namespace UDPClient{class Program{static void Main(string[] args){byte[] data = new byte[1024];string input ,stringData;//构建TCP 服务器Console.WriteLine("This is a Client, host name is {0}", Dns.GetHostName());//设置服务IP,设置TCP端口号IPEndPoint ipep = new IPEndPoint(IPAddress .Parse ("127.0.0.1") , 8001); //定义网络类型,数据连接类型和网络协议UDPSocket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);string welcome = "Hello! ";data = Encoding.ASCII.GetBytes(welcome);server.SendTo(data, data.Length, SocketFlags.None, ipep);IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;data = new byte[1024];int recv = server.ReceiveFrom(data, ref Remote);Console.WriteLine("Message received from {0}: ", Remote.ToString()); Console.WriteLine(Encoding .ASCII .GetString (data,0,recv));while (true){input = Console .ReadLine ();if (input =="exit")break ;server .SendTo (Encoding .ASCII .GetBytes (input ),Remote );data = new byte [1024];recv = server.ReceiveFrom(data, ref Remote);stringData = Encoding.ASCII.GetString(data, 0, recv);Console.WriteLine(stringData);}Console .WriteLine ("Stopping Client.");server .Close ();}}}C# codeTCPClientTCPClient 类提供了一种使用TCP 协议连接到某个端点的简化方法。
单片机433M无线通信模块c语言代码XYMK5V
单片机433M无线通信模块c语言代码XYMK5V//发送:#include#define uchar unsigned char#define uint unsigned intsbit p30=P3^0;sbit p31=P3^1;sbit p32=P3^2;sbit p10=P1^0;sbit p11=P1^1;sbit p12=P1^7;sbit p13=P1^3;sbit p14=P1^4;void delay(uchar m){uchar i,j;for( i=m;i>0;i--)for(j=210;j>0;j--);}unsigned char key(){uchar k=0;if(p10==0){delay(10);while(p10==0);k=1;}else if(p11==0){delay(10);while(p11==0);k=2;}else if(p12==0){delay(10);while(p12==0);k=3;}else if(p13==0){delay(10);while(p13==0);k=4;}else if(p14==0){delay(10);while(p14==0);k=5;}else ;return k;}void bianma(uchar s){p31=1;delay(12);//给出开始信号延时约6msp31=0;delay(2);if(s==1) //发磅{p31=1;//第8位delay(2);p31=0;//第7位delay(2);p31=1;//第6位delay(2);p31=0;//第5位delay(2);p31=1;//第四位delay(2);p31=0;//第三位delay(2);p31=1;//第二位delay(2);p31=0;//第一位delay(2);p31=0; //清零delay(20);}else if(s==2){p31=0; //第8位p31=1; //第7位delay(2); p31=0; //第6位delay(2); p31=1; //第5位delay(2); p31=0; //第四位delay(2);p31=1; //第三位delay(2); p31=0; //第二位delay(2); p31=1; //第一位delay(2); p31=0;delay(20);}else if(s==3) {p31=0;//第8位delay(2); p31=1;//第7位delay(2); p31=1;//第6位delay(2); p31=0;//第5位delay(2); p31=0;//第四位delay(2); p31=1;//第三位delay(2); p31=1;//第二位delay(2); p31=0;//第一位delay(2); p31=0;delay(20);}else if(s==4) {p31=1;//第8位p31=0;//第7位delay(2); p31=0;//第6位delay(2); p31=1;//第5位delay(2); p31=1;//第四位delay(2); p31=0;//第三位delay(2); p31=0;//第二位delay(2); p31=1;//第一位delay(2); p31=0;delay(20);}else if(s==5) {p31=1;//第8位delay(2); p31=1;//第7位delay(2); p31=0;//第6位delay(2); p31=0;//第5位delay(2); p31=1;//第四位delay(2); p31=1;//第三位delay(2); p31=0;//第二位delay(2); p31=0;//第一位delay(2); p31=0;delay(20);}}{uchar h=0;uchar m=6;P1=0xff;while(1){p30=1;h=key();if(h!=0)while(m--){bianma(h);p30=0;}//h++;m=6;//if(h==6)//h=0;}}//接受:/************************************************************** **************** ** 描述: ** 12864标准字库液晶演示数据p0,控制p2 **************************************************************** **************** */#include#define uchar unsigned char#define uint unsigned intuchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};uchar k=0;uchar i=0,m=0;uchar s=0;sbit p10=P1^0;sbit p11=P1^1;sbit p12=P1^2;bit flag=0;//电平变化标志void delay(uchar m)//1ms{ uchar i,j;for(i=m;i>0;i--)for(j=50;j>0;j--);}void delay1ms(uchar m)//1ms{ uchar i,j;for(i=m;i>0;i--)for(j=100;j>0;j--); }void main(){ char a,b,c=0; TMOD=0x01; TH0=0xFC;TL0=0x18;EA=1;TR0=0;while(1){if(flag==0){if(p10==1){ET0=1;TR0=1;while(p10==1); ET0=0;TR0=0;if(i>2&&i<7) {i=0;flag=1;p12=0;p12=1; //开始标志else{flag=0;i=0;}}}if(flag==1){delay(11); //延时求准while(m<8){k=p10;p11=0;p11=1;s=s+k;if(m!=7)s=s<<1;m++;delay1ms(4);}// s=s>>1;// a=b=s;// a=a&0xf0;// b=b<<4;// if(a==b)// if(s!=0)// P2=0;switch (s)//{case 0xaa : c=1;break; case 0x55 : c=2;break; case 0x66 : c=3;break; case 0x99 : c=4;break;case 0xcc : c=5;break;//default ://c=0;}P2=0;P0=table[c];m=0;s=0;flag=0;}}}void TO1_int(void) interrupt 1 { TH0=0xFC;TL0=0x18;i++;}。
无线模块NRF24L01基于C51单片机-双向通讯C语言程序(中文详解)
#include <reg52.h>#include <intrins.h>/******************************************************************************** *******//* NRF24L01 的管脚定义,以及在本程序中的应用,VCC接3.3V电源,可以通过5V用电压转换芯片/*得到,NC 管脚可以接可以不接,暂时没用途。
本程序应用于51或者52单片机,是两个模块进行通讯/*成功的简单指示,现象是:模块1的 KEY1 对应模块1的LED1 和模块2的LED3 ,模块1的 KEY2 对应模/*块1的LED2 和模块2的LED4,发过来也对应。
/******************************************************************************** *******/typedef unsigned char uchar;typedef unsigned char uint;/************************************NRF24L01端口定义***********************************/sbit NC =P2^0; //没用,不接也可sbit MISO =P2^5; //数字输出(从 SPI 数据输出脚)sbit MOSI =P2^4; //数字输入(从 SPI 数据输入脚)sbit SCK =P1^7; //数字输入(SPI 时钟)sbit CE =P2^1; //数字输入(RX 或 TX 模式选择)sbit CSN =P2^2; //数字输入(SPI片选信号)sbit IRQ =P2^6; //数字输入(可屏蔽中断)/************************************按键***********************************************/sbit KEY1=P3^3;//按键S1sbit KEY2=P3^2;//按键S2/************************************数码管位选******************************************/sbit led1=P1^0; //LED0sbit led2=P1^1; //LED1sbit led3 =P1^2; //LED2sbit led4 =P1^3; //LED3sbit led5 =P1^4; //LED4/*********************************************NRF24L01*************************** ********/#define TX_ADR_WIDTH 5 // 5 uints TX address width 发送地址宽度#define RX_ADR_WIDTH 5 // 5 uints RX address width 接收地址宽度#define TX_PLOAD_WIDTH 20 // 20 uints TX payload 有效载荷装载货物#define RX_PLOAD_WIDTH 20 // 20 uints TX payloaduint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //本地地址uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01}; //接收地址/***************************************NRF24L01寄存器指令*******************************/#define READ_REG 0x00 // 读寄存器指令#define WRITE_REG 0x20 // 写寄存器指令#define RD_RX_PLOAD 0x61 // 读取接收数据指令#define WR_TX_PLOAD 0xA0 // 写待发数据指令#define FLUSH_TX 0xE1 // 冲洗发送 FIFO指令#define FLUSH_RX 0xE2 // 冲洗接收 FIFO指令#define REUSE_TX_PL 0xE3 // 定义重复装载数据指令#define NOP 0xFF // 保留/*************************************SPI(nRF24L01)寄存器地址***********************/#define CONFIG 0x00 // 配置收发状态,CRC校验模式以及收发状态响应方式#define EN_AA 0x01 // 自动应答功能设置#define EN_RXADDR 0x02 // 可用信道设置#define SETUP_AW 0x03 // 收发地址宽度设置#define SETUP_RETR 0x04 // 自动重发功能设置#define RF_CH 0x05 // 工作频率设置#define RF_SETUP 0x06 // 发射速率、功耗功能设置#define STATUS 0x07 // 状态寄存器#define OBSERVE_TX 0x08 // 发送监测功能#define CD 0x09 // 地址检测#define RX_ADDR_P0 0x0A // 频道0接收数据地址#define RX_ADDR_P1 0x0B // 频道1接收数据地址#define RX_ADDR_P2 0x0C // 频道2接收数据地址#define RX_ADDR_P3 0x0D // 频道3接收数据地址#define RX_ADDR_P4 0x0E // 频道4接收数据地址#define RX_ADDR_P5 0x0F // 频道5接收数据地址#define TX_ADDR 0x10 // 发送地址寄存器#define RX_PW_P0 0x11 // 接收频道0接收数据长度#define RX_PW_P1 0x12 // 接收频道0接收数据长度#define RX_PW_P2 0x13 // 接收频道0接收数据长度#define RX_PW_P3 0x14 // 接收频道0接收数据长度#define RX_PW_P4 0x15 // 接收频道0接收数据长度#define RX_PW_P5 0x16 // 接收频道0接收数据长度#define FIFO_STATUS 0x17 // FIFO栈入栈出状态寄存器设置/*************************************函数声明****************************************/void Delay(unsigned int s); //大延时void inerDelay_us(unsigned char n); //小延时void init_NRF24L01(void); //NRF24L01 初始化uint SPI_RW(uint dat); //根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01读出一字节uchar SPI_Read(uchar reg); //从reg寄存器读一字节void SetRX_Mode(void); //数据接收配置uint SPI_RW_Reg(uchar reg, uchar value); //写数据value到reg寄存器uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars); //从reg寄存器读出bytes 个字节,通常用来读取接收通道数据或接收/发送地址uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars); //把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址unsigned char nRF24L01_RxPacket(unsigned char* rx_buf); //数据读取后放入rx_buf接收缓冲区中void nRF24L01_TxPacket(unsigned char * tx_buf); //发送 tx_buf中数据/*****************************************长延时*****************************************/void Delay(unsigned int s){unsigned int i;for(i=0; i<s; i++);for(i=0; i<s; i++);}/******************************************************************************** **********/uint bdata sta; //状态标志sbit RX_DR =sta^6; //RX_DR 为 sta 的第六位sbit TX_DS =sta^5; //TX_DS 为 sta 的第五位sbit MAX_RT =sta^4; //MAX_RT 为 sta 的第四位/******************************************************************************** **********//*延时函数/******************************************************************************** **********/void inerDelay_us(unsigned char n) //延时,us 级{for(;n>0;n--)_nop_();}/******************************************************************************** ********//*NRF24L01初始化/******************************************************************************** *******/void init_NRF24L01(void){inerDelay_us(100);CE=0; // 芯片使能CSN=1; // 禁止 SPISCK=0; // SPI时钟置低SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 写本地地址SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动ACK应答允许SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //设置发射速率为1MHZ,发射功率为最大值0dB}/******************************************************************************** ********************//*函数:uint SPI_RW(uint uchar)/*功能:NRF24L01的SPI写时序-----根据SPI协议,写一字节数据到nRF24L01,同时从nRF24L01 读出一字节/******************************************************************************** ********************/uint SPI_RW(uint dat){uint i;for(i=0;i<8;i++) // 循环8次{MOSI = (dat & 0x80); // dat的最高位输出到MOSI MSB to MOSIdat = (dat << 1); // 从右向左进一位shift next bit into MSB..SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据Set SCK high..dat |= MISO; //读MISO到 dat 最低位 capture current MISO bitSCK = 0; // SCK置低..then set SCK low again}return(dat); //返回读出的一字节 return read dat}/******************************************************************************** ********************/*函数:uchar SPI_Read(uchar reg)/*功能:NRF24L01的SPI时序-----------从reg寄存器读一字节/******************************************************************************** ********************/uchar SPI_Read(uchar reg){uchar reg_val;CSN = 0; //CSN置低,开始传输数据CSN low, initialize SPI communication...SPI_RW(reg); //选择寄存器 Select register to read from..reg_val = SPI_RW(0); //然后从该寄存器读数据 ..then read registervalueCSN = 1; //CSN拉高,结束数据传输CSN high, terminate SPI communicationreturn(reg_val); //返回寄存器数据 return register value}/******************************************************************************** ********************//*功能:NRF24L01读写寄存器函数/*描述:写数据value到reg寄存器/******************************************************************************** ********************/uint SPI_RW_Reg(uchar reg, uchar value){uchar status;CSN = 0; // CSN置低,开始传输数据CSN low, init SPI transactionstatus = SPI_RW(reg); // 选择寄存器,同时返回状态字 select registerSPI_RW(value); // 然后写数据到该寄存器 ..and write value to it..CSN = 1; // CSN拉高,结束数据传输CSN high againreturn(status); // 返回状态寄存器 returnnRF24L01 status uchar}/******************************************************************************** ********************//*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数/*描述: 从reg寄存器读出bytes个字节,通常用来读取接收通道数据或接收/发送地址/******************************************************************************** ********************/uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据 Set CSN low, init SPI tranactionstatus = SPI_RW(reg); //选择寄存器,同时返回状态字 Select register to write to and read status ucharfor(i=0;i<uchars;i++)pBuf[i] = SPI_RW(0); //逐个字节从nRF24L01读出CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器return nRF24L01 status uchar}/******************************************************************************** *************************/*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数/*描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发射通道数据或接收/发送地址/******************************************************************************** *************************/uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars){uint status,i;CSN = 0; //CSN置低,开始传输数据status = SPI_RW(reg); //选择寄存器,同时返回状态字inerDelay_us(10);for(i=0; i<uchars; i++)SPI_RW(*pBuf++); //逐个字节写入nRF24L01CSN = 1; //CSN拉高,结束数据传输return(status); //返回状态寄存器}/******************************************************************************** ********************//*函数:void SetRX_Mode(void)/*功能:数据接收配置/******************************************************************************** ********************/void SetRX_Mode(void){CE=0;SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);//CRC使能,16位CRC校验,上电,接收模式CE = 1; // 拉高CE启动接收设备inerDelay_us(130);}/******************************************************************************** **********************//*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)/*功能:数据读取后放入rx_buf接收缓冲区中/******************************************************************************** **********************/unsigned char nRF24L01_RxPacket(unsigned char* rx_buf){unsigned char revale=0;sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况if(RX_DR) // 判断是否接收到数据{CE = 0; //SPI使能SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO bufferrevale =1; //读取数据完成标志}SPI_RW_Reg(WRITE_REG+STATUS,sta); //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志return revale;}/******************************************************************************** ***************************/*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)/*功能:发送 tx_buf中数据/******************************************************************************** **************************/void nRF24L01_TxPacket(unsigned char * tx_buf){CE=0; //StandBy I模式SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 装载接收端地址SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); // 装载数据SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // IRQ收发完成中断响应,16位CRC,主发送CE=1; //置高CE,激发数据发送inerDelay_us(10);}/************************************主函数************************************************************/void main(void){unsigned char tf =0;unsigned char TxBuf[20]={0}; // 要发送的数组unsigned char RxBuf[20]={0}; // 接收的数据数组init_NRF24L01() ; //模块初始化led1=1;led2=1;led3 =1;led4 =1; //led 灯关闭Delay(1000);while(1){if(KEY1 ==0 ) //按键 1 按下{TxBuf[1] = 1 ; //赋值tf = 1 ;led1=0; //本地led 灯闪烁Delay(200);led1=1;Delay(200);}if(KEY2 ==0 ) //按键 2 按下{TxBuf[2] =1 ; //赋值tf = 1 ;led2=0; //本地led 灯闪烁Delay(200);led2=1;Delay(200);}if (tf==1) //有键按下{nRF24L01_TxPacket(TxBuf); //发送数据 Transmit Tx buffer dataTxBuf[1] = 0x00; //清零TxBuf[2] = 0x00;tf=0;Delay(1000);}SetRX_Mode(); //设置成接受模式RxBuf[1] = 0x00; //接收的数组相应位清零RxBuf[2] = 0x00;Delay(1000);nRF24L01_RxPacket(RxBuf); //接收数据if(RxBuf[1]|RxBuf[2]){if( RxBuf[1]==1){led3=RxBuf[0];}if( RxBuf[2]==1){led4=RxBuf[4];}Delay(3000); //old is '1000'}RxBuf[1] = 0x00; //清零RxBuf[2] = 0x00;led3=1; //关灯led4=1;}}本程序存在的问题:反应不够灵敏,当在按键1和按键2之间切换的时候,对方的灯闪烁会有一定的延时,另外本程序没有消除按键的抖动。
8051单片机间点对点的串行异步通信的C编程
8051单片机间点对点的串行异步通信的C编程
赵润林;岳丽
【期刊名称】《运城学院学报》
【年(卷),期】2003(021)003
【摘要】C语言进行8051单片机程序设计是单片机开发与应用的必然趋势.采用C语言可以很容易地进行单片机的程序移植工作,有利于产品中的单片机的重新选型.其开发速度、软件质量、结构严谨、程序坚固等方面,C语言的完美绝非是汇编语言编程所能比拟的.文章给出了采用C语言编程实现双机通信的具体实现方法.【总页数】2页(P25-26)
【作者】赵润林;岳丽
【作者单位】运城学院,计算机系;运城盐化局,山西,运城,044000
【正文语种】中文
【中图分类】I206.2
【相关文献】
1.PC机与工作站间点对点异步通信 [J], 吴琴娣;黄伟京
2.差分编码实现通用I/O口串行异步通信的方法 [J], 王严;周西峰;郭前岗
3.基于串行口的异种操作系统间点对点通信的实现 [J], 杨吉清
4.基于MT8980D串行总线的处理机间异步通信协议的研究 [J], 张风松;张友鹏
5.IBMPC/XT和8098单片机串行异步通信的应用 [J], 崔玉珍
因版权原因,仅展示原文概要,查看原文内容请购买。