关于51单片机上实现modbus协议

关于51单片机上实现modbus协议

你找一个MODBU的协议详细资料好好看看,就是一种通讯约定,你按照它规定的格式通讯就可以了

协议发送给询问方。Modbus协议包括ASCII、RTU TCP等,并没有规定物理层。此协议定

义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的

Modicon控制器使用 RS232C实现串行的 Modbus。

Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用 Maser/Slave 方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读

写。Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC

校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个

面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某 Slave 站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动

接通。因此,Modbus协议的可靠性较好。下面我来简单的给大家介绍一下,对于Modbus

的ASCII、RTU和 TCP协议来说,其中 TCP和RTU协议非常类似,我们只要把RTU协议的两

个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议

发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。下表是ASCII协议

和RTU协议进行的比较:协议开始标记结束标记校验传输效率程序处理

ASCII :(冒号)CR,LF LRC低直观,简单,易调试

RTU无无CRC高不直观,稍复杂

通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符,RTL传输的数据每

一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数 0xF9,ASCII就需要

传输''9'的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,

如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最

好能使用RTU协议。

下面对两种协议的校验进行一下介绍。

1、LRC校验

LRC域是一个包含一个 8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC并将它和接收到消息中 LRC域中的值比较,如果两值

不等,说明有错误。

LRC校验比较简单,它在 ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它的

VC代码:

BYTE GetCheckCode(co nst char * pSe ndBuf, i nt nEn d)〃获得校验码

{

BYTE byLrc = 0;

char pBuf[4];

int n Data = 0;

for(i=1; i

{

//每两个需要发送的ASCII码转化为一个十六进制数

pBuf [0] = pSe ndBuf [i];

pBuf [1] = pSen dBuf [i+1];

pBuf [2] = '\0:

ssca nf(pBuf,"%x",& nData);

byLrc += n Data;

}

byLrc =?byLrc;

byLrc ++;

return byLrc;

}

2、CRC校验

CRC域是两个字节,包含一 16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算

(完整版)51单片机实现双机通信(自己整理的)

1号机程序 #in clude #defi ne uint un sig ned int #defi ne uchar un sig ned char sbit p10=P1 A 0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y__) for(i=0;i<120;i++) 5 } void put(uchar x) // 发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while (TI==0); 〃等待发送结束 TI=0; } P £j £fA>l3 旳 4阳 1370 丘阳 H 鮎口 PDLWAJil- PDSA>f POfiAME PQ TiJT FZ^KS 畑 阳pz- A A-m FZW11 PZ.AtZ FZj9jAl4 PZ.TW? P3£VR : iD paimcc P3.sii nrn pjjfflrn F3.WTI] M*Tl pgtjgQIH F3.7/IF 1E 11 左边1号机,右边2号机, ,功能实现 帕叶DO ■ 口 IJApi FDJ H [I Z — 观旧 IP 口 .hQKD* *QAADf H ^ 弓 H.Lta RQfMM FZJWS pz. iwe F2JKA-IDI P2JTA11I F2.HW1Z P2JSM13 F2W.14 F2JM1S F3Ji nHX& gj.im:& riaiWTO rjjfWTT F3.1/W f3AT1 P3JillW F3JMF ■T2 1E

多机通信协议规范

通信协议 来自中国工控网 所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、 检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它属于ISO'S OSI七层参考模型中的数据链路层。 目前,采用的通信协议有两类:异步协议和同步协议。同步协议又有面向字符和面向比特以及面向 字节计数三种。其中,面向字节计数的同步协议主要用于DEC公司的网络体系结构中。 串行通讯简单认识 串行通讯的基本概念:与外界的信息交换称为通讯。基本的通讯方式有并行通讯和串行通讯两种。 一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距 数米)的通讯。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几 千米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为 单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式。 MCS_51单片机有一个全双工串行口。全双工的串行通讯只需要一根输出线和一根输入线。数据的输 出又称发送数据(TXD),数据的输入又称接收数据(RXD)。串行通讯中主要有两个技术问题,一个是数 据传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指 数据的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的 串行数据转换为并行数据。 单工、半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。 --------> <--------> --------> A---------B A----------B A---------B <-------- 单工半双工全双工

基于51单片机蜂鸣器发声的-C语言程序

说明:按下不同的按键会是SOUNDER发出不同频率的声音。本例使用延时函数实现不同频率的声音输出,以后也可使用定时器 */ #include #define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; sbit K1=P1^4; sbit K2=P1^5; sbit K3=P1^6; sbit K4=P1^7; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } //按周期t发音 void Play(uchar t) { uchar i; for(i=0;i<100;i++) { BEEP=~BEEP; DelayMS(t); } BEEP=0; } void main() { P1=0xff; BEEP=0; while(1) { if(K1==0) Play(1); if(K2==0) Play(2); if(K3==0) Play(3); if(K4==0) Play(4); } }

说明:程序运行时播放生日快乐歌,未使用定时器中断,所有频率完全用延时实现 */ #include #define uchar unsigned char #define uint unsigned int sbit BEEP=P3^7; //生日快乐歌的音符频率表,不同频率由不同的延时来决定 uchar code SONG_TONE[]= {212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,1 19,119,126,159,142,159,0}; //生日快乐歌节拍表,节拍决定每个音符的演奏长短 uchar code SONG_LONG[]= {9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } //播放函数 void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG为拍子长度 for(j=0;j

设计单片机通讯协议论文(非常经典)

如何设计单片机常用通信 协议论文

目录 1.自定义数据通信协议 (3) 2.上位机和下位机中的数据发送 (3) 3.下位机中的数据接收和协议解析 (4) 4.上位机中的数据接收和命令处理 (8) 5.总结 (9)

单片机通信协议现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上, 底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CR C运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据 包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方

51单片机实现双机通信(自己整理的)

左边1号机,右边2号机,,功能实现 1号机程序 #include #define uint unsigned int #define uchar unsigned char sbit p10=P1^0; uchar a,b,kk; //uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y) { uchar i; while(y--) for(i=0;i<120;i++) ; } void put(uchar x) //发送函数 { SBUF=x; //SBUF:串行口数据缓冲器 while(TI==0); //等待发送结束 TI=0; } void main() { uchar j; SCON=0x40; //串行口工作方式1,8位通用异步发送器

— TMOD=0x20; //定时器1工作方式2 PCON=0x00; //波特率不倍增 TH1=0xf4; TL1=0xf4; //波特率2400 TR1=1; //定时器1开始计时 P2=0xc0; while(1) { if(p10==0&&j==0) { delay_ms(15); while(p10==0); kk=1; P2=0xf9; j=1; } if(p10==0&&j==1) { delay_ms(15); while(p10==0); kk=2; P2=0xa4; j=2; } if(p10==0&&j==2) { delay_ms(15); while(p10==0); kk=3; P2=0xb0; j=0; } if(kk==1) put('A'); if(kk==2) put('B'); if(kk==3) put('C'); delay_ms(10); } }

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

状态机思路在单片机程序设计中的应用

状态机思路在单片机程序设计中的应用 状态机的概念 状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。 比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。 进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。 同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。 显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。 当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。 程序其实就是状态机。 也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”和“1”两个基本状态的地基之上么? 状态机的要素 状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下: ①现态:是指当前所处的状态。 ②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。 ③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。 ④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

51单片机通信协议

单片机通信协议 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。 1.自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。 数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。 校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。 2.上位机和下位机中的数据发送 物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。 在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。 v oid SendBy te(unsigned char ch) { SBUF = ch; while(TI == 0); TI = 0; }

51单片机蜂鸣器播放音乐代码(生日快乐 两只蝴蝶 祝你平安)

/*生日快乐歌曲*/ #include #define uint unsigned int #define uchar unsigned char sbit beep = P1^5; uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159, 212,212,106,126,159,169,190,119,119,126,159,142,159,0}; uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0}; //延时 void DelayMS(uint x) { uchar t; while(x--) for(t=0;t<120;t++); } void PlayMusic() { uint i=0,j,k; while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { //播放各个音符,SONG_LONG 为拍子长度 for(j=0;j

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

51串口通信协议(新型篇)

51串口通信协议(新型篇) C51编程:这是网友牛毅编的一个C51串口通讯程序! //PC读MCU指令结构:(中断方式,ASCII码表示) //帧:帧头标志|帧类型|器件地址|启始地址|长度n|效验和|帧尾标志 //值: 'n' 'y'| 'r' | 0x01 | x | x | x |0x13 0x10 //字节数: 2 | 1 | 1 | 1 | 1 | 1 | 2 //求和: ///////////////////////////////////////////////////////////////////// //公司名称:*** //模块名:protocol.c //创建者:牛毅 //修改者: //功能描述:中断方式:本程序为mcu的串口通讯提供(贞结构)函数接口,包括具体协议部分 //其他说明:只提供对A T89c51具体硬件的可靠访问接口 //版本:1.0 //信息:QQ 75011221 ///////////////////////////////////////////////////////////////////// #include #include //预定义 //帧 #define F_ST1 0x6e //帧头标志n #define F_ST2 0x79 //帧头标志y #define F_R 0x72 //帧类型读r #define F_W 0x77 //帧类型写w #define F_D 0x64 //帧类型数据帧d #define F_B 0x62 //帧类型写回应帧b #define F_C 0x63 //帧类型重发命令帧c #define F_Q 0x71 //帧类型放弃帧q #define F_ADDR 0x31 //器件地址0-9 #define F_END 0x7a //帧尾标志z #define F_SPACE 0x30 //空标志0 #define F_ERR1 0x31 //错误标志1,flagerr 1 #define F_ERR2 0x32 //错误标志2 2 //常数 #define S_MAXBUF 16 //接收/发送数据的最大缓存量 #define FIELD_MAXBUF 48 //最小场缓存,可以大于48字节,因为协议是以20字节为

单片机通信协议处理解析

单片机通信协议处理 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等 1. 自定义数据通信协议 这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的 RS232、 RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。 通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的 TCPIP 协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。 帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。 地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。

51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序

51单片机四路抢答器(LED灯,数码管显示,蜂鸣器提示音)C语言源程序2009-10-31 10:53 其实就是在原有的基础上,加入数码管显示及蜂鸣器,当然根据自己的要求,适当使用单片机I/O口 接线为: P0 P2 来控制数码管显示,其中P0为数码管显字控制,P2用来选择位(第几个数码管) P1用来控制8个LED灯 P3,独立按键(可以根据需要修改) P3^5(找了一个没有用到的I/O口,当然,可以用键盘扫描的方式来实现,这样的话,可以实现4*4=16路的抢答器,了解原理,做相应修改即可。 #include sbit key1=P3^0; //这里采用独立按键(4路) sbit key2=P3^1; sbit key3=P3^2; sbit key4=P3^3; sbit SPK=P3^5; //蜂鸣器,最好在ISP编程时先不接入,(我用的是杜邦线,可以设置跳线控制) void delay(unsigned int cnt) { while(--cnt); } void speak(unsigned int j) { unsigned int i; for(i=0;i

{ bit Flag; while(!Flag) { if(!key1){P1=0xFE;Flag=1;speak(300);P2=0;P0=0x06;} //LED1,数码管1显示1,蜂鸣器叫 else if(!key2){P1=0xFD;Flag=1;speak(300);P2=1;P0=0x5b;}//LED2,数码管2显示2,蜂鸣器叫 else if(!key3){P1=0xFB;Flag=1;speak(300);P2=2;P0=0x4f;}//LED3,数码管3显示3,蜂鸣器叫 else if(!key4){P1=0xF7;Flag=1;speak(300);P2=3;P0=0x66;}LED4,数码管4显示4,蜂鸣器叫 } while(Flag); } 测试完,手动复位即可,当然可设置相应的按键来控制标志:Flag,进行继续抢答。。

单片机控制蜂鸣器概要

单片机控制蜂鸣器20年月日

目录 绪论 (1) 1、硬件设计 (2) 1.1 总体设计图 (2) 1.2 简易结构框图 (2) 1.3各部分硬件设计及功能 (3) 1.3.1 蜂鸣器发声电路:(如图1.3.1) (3) 1.3.2 电源稳压电路: (4) 1.4 元件清单 (4) 2、软件设计 (5) 2.1设计思想 (5) 2.2 程序流程图 (5) 2.3 音调、节拍以及编码的确定方法 (6) 2.3.1音调的确定 (6) 2.3.2 节拍的确定 (8) 2.3.3 编码 (9) 3、电路仿真与分析 (10) 4、电路板焊接、调试 (11) 4.1 焊接 (11) 4.2 调试 (12) 5、讨论及进一步研究建议 (12) 6、心得 (12) 7、单片机音乐播放器程序实例(卡农) (13)

绪论 蜂鸣器播放音乐电路设计对于单片机初学者来说是一个简单易实现的课题。通过编写程序使单片机产生一定频率的方波信号,方波信号进入蜂鸣器便产生我们熟知的音调。 我们用定时/计数器使单片机产生方波,利用定时/计数器使输出管脚在一定周期内反复翻转,达到所需频率,而我们给定时/计数器的初始值就是我们的音符—半周期数据表,通过我们播放的音乐的乐谱,来对数据表进行调用。 我们用延时子程序来表示节拍,不同的节拍代表不同的延时。 完成此次设计之后完全可以进行扩展,例如增加按键以及LED灯光效果,制成一个简易的音乐盒,给人以视觉听觉等全方位的享受。

1、硬件设计1.1 总体设计图 1.2 简易结构框图

1.3各部分硬件设计及功能 1.3.1 蜂鸣器发声电路:(如图1.3.1) 图1.3.1 如图所示,蜂鸣器发声电路是播放音乐电路的主要执行电路,它由一个蜂鸣器,一个三极管和一个电位器组成。蜂鸣器负责发声,三极管将电流放大,而电位器则控制流过蜂鸣器电流的大小,来达到控制音量的目的。

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

51单片机实现蜂鸣器警车、救护车、消防车声

1. /*----------------------------------------------- 名称:喇叭 论坛:www.dofl https://www.360docs.net/doc/9b18592477.html, 编写:shifang 日期:2009.5 修改:无 内容:模拟警车发声 ------------------------------------------------*/ #i nclude //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 sbi t SPK=P1^2; //定义喇叭端口 unsi gned char fr q; voi d DelayUs2x(un si gned char t);//函数声明 voi d DelayMs(un si gned char t); /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ voi d Init_Ti mer0(voi d) { TM OD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响

//TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 } /*------------------------------------------------ 主函数 ------------------------------------------------*/ mai n() { Ini t_Timer0(); //初始化定时器 while(1) { DelayMs(1); //延时1m s,累加频率值 fr q++; } } /*------------------------------------------------ uS延时函数,含有输入参数 un si gned ch ar t,无返回值 unsigne d char是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

相关文档
最新文档