历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2021年12月21日 | 单片机双机通讯 非常详细的UART串口异步通讯

2021-12-21 来源:eefocus

一、总体设计

1.设计要求:

两片单片机之间进行串行通信,发送端将0~f循环发送到接收端,并在接收端显示。


2.设计方案:

本次设计,对于两片89C51,采用RS232进行双机通信。发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。接受方接收后,在数码管上显示接收的信息。为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。


软件部分,通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。主机收到BBH后就把数码表TAB[16]中的10个数据送给从机,并发送检验和。从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。从机收到16个正确数据后送到一个数码管显示。


二、硬件设计

1.51单片机串行通信功能

在这里插入图片描述

计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。


51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:

(1)数据缓冲器(SBUF)

接受或发送的数据都要先送到SBUF缓存。有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。

(2)串行控制寄存器(PCON)

在这里插入图片描述

SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:


SM0,SM1:串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。串行接口工作方式特点见下表

在这里插入图片描述

SM2:多机通信控制位。

REN:接收允许控制位。软件置1允许接收;软件置0禁止接收。

TB8:方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。

RB9:在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。

TI:发送中断标志。发送完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续发送。

RI:接收中断标志。接收完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续接收。

(3)输入移位寄存器

接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。

(4)波特率发生器

波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。

(5)电源控制寄存器PCON

其最高位为SMOD。

(6)波特率计算

当定时器T1工作在定时方式的时候,定时器T1溢出率=(T1计数率)/(产生溢出所需机器周期)。由于是定时方式,T1计数率= fORC/12。产生溢出所需机器周期数=模M-计数初值X。


2.MAX232芯片

用8051串行接口通信,如果两台8051单片机之间的距离很近(不超过1.5m),可以采用直接将两台8051单片机的串行接口直接相连,利用其自身的TTL电平(0-5V)直接传输数据信息。如果传输距离较远(超过1.5m),由于传输线的阻抗与分布电容,会产生电平损耗和波形畸变,以至于检测不出数据或数据出错。此时可利用 RS232标准总线接口,将单片机输出的TTL电平转换为RS232标准电平(逻辑1为-15—-5V;逻辑0为+5-—+15V)。用RS232可将传输距离提高到15m,如果想远距离传输,可以采用RS422或者RS485。


电平转换芯片MAX232是美信公司(MAXIM)生产,专用于进行将TTL电平转换为RS232电平的芯片,MAX232内部有泵电源,能将+5V电源电压在芯片内提高到RS232电平所需的+10V或者-10V电平。

在这里插入图片描述

图2.电平转换芯片MAX232


3.整体电路设计

最终设计电路如下图3所示,发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。接受方接收后,通过P1口在数码管上显示接收的信息。

在这里插入图片描述

图3.串行通信电路


三、软件设计

通过通信协议进行发送接收,主机先送AAH给从机,当从机接收到AAH后,向主机回答BBH。主机收到BBH后就把数码表TAB[16]中的10个数据送给从机,并发送检验和。从机收到16个数据并计算接收到数据的检验和,与主机发送来的检验和进行比较,若检验和相同则发送00H给主机;否则发送FFH给主机,重新接受。从机收到16个正确数据后送到一个数码管显示。


1.串行通信软件实现

(1)串行口工作于方式1;用定时器1产生9600bit/s的波特率,工作于方式2。

(2)功能:将本机ROM中数码表TAB[16]中的16个数发送到从机,并保存在从机内部ROM中,从机收到这16个数据后送到一个数码管循环显示。

(3)通信协议:主机首先发送连络信号(AAH),从机接收到之后返回一个连络信号(BBH)表示从机已准备好接收。

(4)通信过程使用第九位发送奇偶校验位。

(5)从机接收到一个数据后,立即进行奇偶校验,若数据没有错误,则返回00H,否则返回FFH。

(6)主机发送一个数据后,等待从机返回数据;若为00H,则继续发送下一个数据,若为FFH,则重新发送数据。


2.程序流程图

(1)发送端程序流程图

在这里插入图片描述

(2)接收方程序流程图


在这里插入图片描述

四、联合调试

在protues上进行仿真实验。首先使用KeilC将编写完成的程序编译生成HEX文件,将HEX文件烧录到两片单片机中,进行仿真实验,结果如下图所示,可以看到,接收端已将接受到的数据完整的显示了出来。

在这里插入图片描述

图4.仿真图


五、设计小结

经过繁忙而又紧张的课程设计,终于顺利的完成了设计任务。虽然在这段时间里每天都那么繁忙,但是在这忙碌的过程中却得到了许多的收获。


经过课程设计,在查阅资料的过程中,学习了基于单片机的C语言程序设计,了解了单片机串行通信的基本知识,对于以后的学习和工作都有很大的益处。


在学习的过程中,也遇到了一些困难,比如开始的时候,由于发送端和接收端的通信协议没有做好,导致数据不能正确的传输,在解决问题的过程中,对于通信协议的实现有了深刻的认识。


通过这次课程设计,锻炼了自己独立思考的能力。


1.主机发送程序

#include // 51单片机预处理程序

#define uchar unsigned char // 宏定义无符号字符型变量

void init(); // 定义初始化函数

void send(); // 定义发送函数

ucharTAB[16] ={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 定义数组函数 0~F显示段位值

uchar i,sum; // 定义无符字符变量 I,sum 其中i表示数据个数,sum表示校验和

int j; // 定义整形变量 j 等待数据发送时的延时

main() // 主函数开始执行

{ init(); // 初始化

send(); // 准备发送数据

}

void init(void) 调用初始化函数(无返回值)

{ EA=1; // 打开全局中断允许

ES=1; // 打开串口中断允许

TMOD=0x20; // 定义工作方式寄存器的方式和功能

TH1=0xfd; // 配置定时器初值

TL1=0xfd; // 配置定时器初值

PCON=0x00; // 配置电源管理寄存器 主要SMOD位=0

SCON=0x50; // 设定串行口的工作方式,REN允许串行接收

TR1=1; // 定时器1启动控制位

}


void send(void) // 调用发送函数(数据准备发送)

{do

{ SBUF=0xaa; // 把0xaa装入SBUF缓存

while(!TI); // 发送中断标志位(如果!TI=0即TI=1时,,跳出循环)

TI=0; // 因为TI为硬件置1,所以要软件清0

while(!RI); // 接收中断标志位(如果!RI=0即RI=1时,,跳出循环)

RI=0; // 因为RI为硬件置1,所以要软件清0

}

while((SBUF^0xbb)!=0); // sbuf 的值不等0,为0xBB就会执行下一条语句

// DO while 循环

do

{ sum=0; // 首先把0赋值给sum即清0 ,sum为校验和

for(i=0;i<=15;i++) // i为数组中数据的位个数,等待有16个数据后

{ SBUF=TAB[i]; // 把数装入缓存器发送一个数据

sum+=TAB[i]; // 即 sum=sum+ TAB[i](求校验和,为两个十六进制数的和)

while(!TI); // 在TI=1的时候,跳出循环

TI=0; // TI要软件清零

}

SBUF=sum; // 发送校验和

while(!RI); //在RI=1的时候,跳出循环

RI=0; // RI要软件清零

}

while(SBUF!=0); // 在SBUF为0时跳出循环

}


从机发送程序和主机差不多,你可以自己想一下看看能不能写出来。

推荐阅读

史海拾趣

Computer Conversions Corp公司的发展小趣事

Computer Conversions Corp非常重视人才的培养和团队建设。公司定期组织内部培训和技术交流活动,鼓励员工分享经验和创新想法。同时,公司还建立了完善的激励机制,为员工提供广阔的发展空间。这种以人为本的管理理念,不仅增强了团队的凝聚力和创新力,也为公司的持续发展注入了强大的动力。通过这些举措,Computer Conversions Corp打造出了一支高素质、高效率的技术团队,为公司的长远发展奠定了坚实的基础。

Good Will Instrument Co., Ltd.公司的发展小趣事

Computer Conversions Corp非常重视人才的培养和团队建设。公司定期组织内部培训和技术交流活动,鼓励员工分享经验和创新想法。同时,公司还建立了完善的激励机制,为员工提供广阔的发展空间。这种以人为本的管理理念,不仅增强了团队的凝聚力和创新力,也为公司的持续发展注入了强大的动力。通过这些举措,Computer Conversions Corp打造出了一支高素质、高效率的技术团队,为公司的长远发展奠定了坚实的基础。

风华邦科(FH-BK)公司的发展小趣事

在电子科技领域,FlyWin集团不断投入研发资源,致力于新技术的开发与应用。公司成立了专门的研发团队,专注于人工智能、物联网等前沿技术的探索。通过不断的技术创新,FlyWin成功推出了一系列具有自主知识产权的电子产品,如智能传感器、物联网解决方案等。这些产品不仅提升了公司的市场竞争力,也为公司的长远发展提供了强大的技术支撑。

Clever Little Box公司的发展小趣事

Clever Little Box公司成立于1964年,当时正值电子行业的蓬勃发展时期。创始人凭借对音频和电子技术的深厚理解,以及对市场的敏锐洞察,决定成立这家公司,专注于音频和电子组件的分销。创业初期,公司面临着资金短缺、市场竞争激烈等诸多挑战,但创始人凭借坚定的信念和不懈的努力,逐渐在市场中站稳了脚跟。

Comax Industrial Co Ltd公司的发展小趣事

随着公司的不断发展壮大,Comax Industrial Co Ltd公司开始积极拓展市场。公司不仅在国内市场取得了显著的成绩,还积极进军国际市场,与多个国家和地区的客户建立了稳定的合作关系。通过参加国际展会、建立海外分支机构等方式,公司的业务范围逐渐扩大,市场份额也持续提升。这种市场拓展的策略,使得Comax实现了跨越式的发展。

FDI [Future Designs , Inc.]公司的发展小趣事

作为一家有社会责任感的企业,FDI公司始终关注社会公益事业。公司积极参与扶贫、教育、环保等领域的公益活动,为社会做出了积极贡献。同时,FDI还设立了奖学金和助学金,鼓励和支持年轻人投身电子科技事业。这些举措不仅提升了公司的社会形象,也为其赢得了广泛的赞誉。

问答坊 | AI 解惑

电力行业的发展与商机(电气安装公司寻求合作)

在网站上逛了好几天,感叹大家智慧的同时,我发现论坛上对电力市场的关注却很少。电力市场是个大的概念,所涉及的面太广,电力体制改革的深化,到底能给我们普通人带来什么样的商机?本人通过对电力产业链中配电电气设备安装这个环节进行分析,把这几年的 ...…

查看全部问答>

为什么ccs调试时单步运功会调到汇编程序?

为什么ccs调试时单步运功会调到汇编程序?源代码都是用c写的,编译通过并装载后开始运行,为什么有的程序只能在汇编中单步运行,却不能在c中单步运行,连那个单步运行的按钮都是灰色的…

查看全部问答>

关于交流电量的测量的问题

各位好,我现在刚接触电力测量方面的东西,很多都要一点点学习,还需要各位大侠多指点,呵呵~     现在我做的是使用微型互感器测量电压和电流,互感器二次侧的电流是交流量,通过取样电阻来将电流转换为电压送至ADC。但是我使用的单片 ...…

查看全部问答>

彻底摆脱nxp p89lpc936单片机isp烦恼

用过nxp lpc900系列单片机的同志都知道,其出厂自带的isp程序极其难用,一旦烧写失败,即使神仙下凡,想再进isp几乎都不大可能。按其所说的三种方法,不论是三个脉冲还是帧间隔的方法都无济于事。我已经被它折磨了不止一次了,于是打算要找到一个方 ...…

查看全部问答>

基于凌阳单片机的语音控制小车

文摘  本文主要介绍了凌阳单片机SPCE061A的性能、硬件结构及其各个部分的功能和它的应用领域。针对凌阳公司的语音小车,进行了改进,自行设计了控制电路,详细介绍了小车外围电路各部分的功能。我们根据自己录制的语音命令通过程序来远程 ...…

查看全部问答>

ListCtrl如何禁用滚动条并且支持滚动,或者隐藏滚动条不让重绘后出现滚动条

禁用滚动条我知道是LVS_NOSCROLL 我禁用了后就没有滚动的功能了。。 我现在要做的是不显示滚动条,并且要有滚动的功能。。望高手能帮忙。。 只有20分了。有高手回答的好我再追加分…

查看全部问答>

485通讯最多能有多少站?

最近碰上一个叫“倍捻机”的纺机,总共有96或154锭,每一锭都需要计算产量在人机上显示,请问这样的话通过485通讯怎样进行处理?我看过直捻机上是通过传感器给一个电子板信号,然后电子板通过485传给PLC的一个通讯模块,最后传给PLC进行处理。请问 ...…

查看全部问答>

看LaunchPad大学堂作品之有感

看LaunchPad大学堂作品之有感早就看到过关于Msp430的介绍和赞美之词,一直没机会接触,也没开发工具呀,要银子呀。当初看到LaunchPad,这么价廉物美,立刻毫不犹豫地决定要买,好在论坛我好像很早就注册过了,立刻在淘宝下了订单。又看到大学堂还有 ...…

查看全部问答>

哪里有CCS5.3的下载?申请下载没回复呀

哪里有最新的CCS5.3的下载?申请下载没回复呀…

查看全部问答>

eMMC的前世今生

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 讨论到eMMC的发展历程,必须要从介绍Flash的历史开始 Flash分为两种规格:NOR Flash和NAND Flash,两者均为非易失性闪存模块。 1988年,Intel首次发出NOR flash技术,彻底改变了原先由EPROM和 ...…

查看全部问答>