小白网-奉贤部落-奉贤免费信息发布平台

查看: 19|回复: 0
打印 上一主题 下一主题

2个单片机之间串口通信(2个单片机之间串口通信例题)

[复制链接]

2万

主题

2万

帖子

7万

积分

论坛元老

Rank: 8Rank: 8

积分
78182
跳转到指定楼层
楼主
发表于 2025-7-26 13:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.基于proteus 19的51单片机开发实例-两台单片机之间的串行通信1.1。实验目的在本例中,我们学习了51单片机串行通信RS-232的基本原理、用法和编程实现。
1.2.设计理念
图1两台单片机之间的串行通信
串行通信由两台51单片机实现,其中一台作为串行数据发送器,另一台作为串行数据接收器。为了直观地看到串行数据的发送和接收,在电路中的两个单片机上分别连接了8个发光二极管来指示发送的数据和接收的数据,方便比较发送和接收的数据是否一致。
1.3.基础知识通过这个例子,了解并熟悉串行通信的基础知识、常用术语、实验电路和编程方法。
1.3.1.串行通信的基本概念单片机与外设的数据交互通常有两种方式:并行通信和串行通信。
并行通信是指一组数据的所有位同时传输的通信方式,如下图所示。
图2并行通信
所谓串行通信,是指一组数据按逐位顺序传输的一种通信方式,如下图所示。
图3串行通信
并行通信速度高,但数据线多,结构复杂,成本高,一般用于短距离传输,数据位数少。
串行通信速度慢,但数据线少,布线简单,适合远距离传输。
1.3.2.串行通信的基本术语串行通信有两种基本方式:异步串行通信和同步串行通信。本例中我们使用的是RS-232串行通信,RS-232串行通信方式为异步串行通信。因此,这里我们重点讨论异步串行通信的基本术语。
1.3.2.1 .异步通信是一种基于“位”数据的通信方式。它不要求两个通信发送方(接收方和发送方)具有同步的时钟信号,但要求发送方和接收方具有相同的数据帧结构和波特率,通信过程中的数据发送和接收不需要连续。
在实际应用中,异步串行通信的数据是“一帧一帧”传输的,即传输完一帧数据后,再传输下一帧数据。每帧数据发送后,可以暂停。在暂停期间,数据线保持在高电平。
异步通信的数据格式如下图所示。
图4异步串行通信的数据格式
其中数据可以是5-8比特的数据,奇偶校验位可以设置有或没有奇偶校验位。
我们可以看到,在一帧数据中,必要的元素有:起始位、数据和结束位。其中起始位必须是低电平,结束位必须是高电平。
1.3.2.2 .异步串行通信中的波特率,为了保证通信双方能够正确发送(接收)数据,必须做出约定。协议是什么?一个是数据帧的格式,一个是数据每一位的传输时间,也就是波特率。
波特率是指单位时间内传输的二进制数据的位数。波特率的单位是比特/秒,它是串行通信的一个非常重要的指标和参数。
例如,如果波特率为9600,则意味着每秒可以发送9600位数据。如果一个字节按照8位计算,就是1200字节的数据(但异步串行通信有起始位、停止位、奇偶位等。,所以它不能发送1200字节)。
1.3.2.3 .奇偶校验位奇偶校验位的目的是防止一位或多位数据在通信过程中因干扰而出错。
一般来说,异步串行通信中的奇偶校验位可以通过设置相应的控制寄存器来自动生成和检查。
1.3.3.51单片机串口内部结构下图是51单片机串口内部结构。
51单片机串口内部结构
从图中可以看出,51单片机的串口主要由以下几部分组成
数据缓冲器SBUF有两个数据缓冲器SBUF,一个用于接收数据,另一个用于发送数据。
在接收控制器的控制下,输入移位寄存器将数据逐位放入缓冲器SBUF。
串行控制寄存器设置和控制串行通信的工作模式。
定时器T1用作串行通信的波特率发生器。也就是说,在使用串行通信时,51单片机的定时器T1不能再用于计时或计数,只能作为串口的波特率发生器。
单片机51中串行通信的控制,在进行串行通信时,需要配置相关寄存器,使串口正常工作。有四个相关的寄存器。他们是SCON、PCON、IE和IP。IE寄存器用于控制是否允许中断触发。IP用于设置中断优先级。这两个寄存器我们之前已经知道了,这里就不赘述了。(本例中未使用串行端口中断)
串口控制寄存器SCON串口控制寄存器SCON用于设置串口的工作模式。同时还可以监控串口的工作状态,发送和接收的状态控制等。
SCON位的含义如下图所示。
SCON
操作方式
电源寄存器PCON在这个控制器中,只有第7个SMOD位与串口相关,它是波特率选择位。如果SMOD=0,波特率为设定的波特率;如果SMOD=1,波特率是设定波特率的两倍。
1.4.电路设计图1是这个例子的电路图。电路中使用了两个单片机,一个发送串行数据,另一个接收串行数据。每个单片机连接8个发光二极管,用来指示发送的数据和接收的数据,以便直观地检查数据的正确性。
1.5.编程这个例子有两个单片机,每个单片机都有自己的代码程序。程序代码如下:
呼叫订单
# include///data sentunsigned char code led tab[16]= { 0x 11、0x22、0x33、0x44、0x55、0x66、0x77、0x88、0x99、0xaa、0xbb、0xcc、0x。//串行数据发送函数,使用查询模式void send(unsigned char UC data){sbuf = UC data;//首先将待发送的数据放入发送缓冲区,同时(TI = = 0);//等到发送完毕,TI = 0;//发送后设置为0,方便下次发送数据} /delay函数void delay(void){unsigned int m,n;for(m = 0;m  lt800;m++)for(n = 0;n  lt250;n++);}void main(void){unsigned char I;TMOD = 0x 20;//定时器工作模式2SCON = 0x 40;//串口工作模式1PCON = 0x 00;//波特率不加倍TH1 = 0x FD;//定时器给初始值TL1 = 0x FD;//TR1 = 1;//打开计时器开始工作P1 = 0x ff;//让所有led先熄灭,而(1){for(I = 0;我 lt16;++)//循环发送16个数据{P1 = led tab[I];//发送前让LED指示要发送的数据Send(LED tab[I]);//通过串口和查询方式发送数据delay();//发送后延迟一段时间,观察LED指示是否正确} }
接收程序
#include//串口接收函数,使用查询方法unsigned char receive(void){unsigned char UC data;while(RI = = 0);//等待接收中断标志置位,表示有数据来了RI = 0;//手动清除标志UC data = SBUF;//从接收缓冲区提取数据返回ucData}void main(void){TMOD = 0x 20;//定时器工作模式2SCON = 0x 50;//串口工作模式1,允许接收PCON = 0x 00;//波特率不加倍TH1 = 0x FD;//将定时器初始值设置为波特率9600TL1 = 0x FD;//TR1 = 1;//启动定时器REN = 1;//允许串行数据接收P1 = 0x ff;while①{P1 = Receive();//通过P1 }}端口的8个led显示串口接收到的数据
1.6.示例仿真程序编译完成后,可以加载到仿真电路中,其中send.hex加载到MCU中用于发送数据,receive.hex加载到MCU中用于接收数据。在模拟开始时,观察连接到发送MCU的8个led的光发射,并比较同时连接到接收MCU的8个led的光发射。这两个应该是一致的。
视频加载中...1.7.通过这个例子,我们学习了如何发送和接收单片机的串行数据。至于串行通信,在实际的单片机应用系统中有大量的应用,是我们需要掌握的一个非常重要的功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白网-奉贤部落-奉贤免费信息发布平台  

GMT+8, 2025-8-21 09:57 , Processed in 0.052186 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表