51单片机串口通讯

上传人:woxinch****an2018 文档编号:38637077 上传时间:2018-05-05 格式:DOC 页数:12 大小:650KB
返回 下载 相关 举报
51单片机串口通讯_第1页
第1页 / 共12页
51单片机串口通讯_第2页
第2页 / 共12页
51单片机串口通讯_第3页
第3页 / 共12页
51单片机串口通讯_第4页
第4页 / 共12页
51单片机串口通讯_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《51单片机串口通讯》由会员分享,可在线阅读,更多相关《51单片机串口通讯(12页珍藏版)》请在金锄头文库上搜索。

1、单片机串口通讯一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。以下对串口通信中一些需要同学们注意的地方作一点说明:1、波特率选择波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51 串行端口在四种工作模式下有不同的波特率计算方法。其中,模式 0 和模式 2 波特率计算很简单,请同学们参看教科书;模式 1 和模式 3 的波特率选择相同,故在此仅以工作模式 1 为例来说

2、明串口通信波特率的选择。在串行端口工作于模式 1,其波特率将由计时/计数器 1 来产生,通常设置定时器工作于模式 2(自动再加模式)。在此模式下波特率计算公式为: 波特率=(1+SMOD)*晶振频率/(384*(256-TH1)其中,SMOD寄存器 PCON 的第 7 位,称为波特率倍增位;TH1定时器的重载值。在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。下面举例说明波特率选择过程:假设系统要

3、求的通信频率在 20000bit/s 以下,晶振频率为 12MHz,设置 SMOD=1(即波特率倍增)。则 TH1=256-62500/波特率根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表:因此,在通信中,最好选用波特率为 1200,2400,4800 中的一个。2、通信协议的使用通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在 PC 机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取 P0 端口数据,并将

4、读取数据返回 PC 机; 0xA2:单片机从 PC 机接收一段控制数据; 0xA3:单片机操作成功信息。在系统工作过程中,单片机接收到 PC 机数据信息后,便查找协议,完成相应的操作。当单片机接收到 0xA1 时,读取 P0 端口数据,并将读取数据返回 PC 机;当单片机接收到 0xA2 时,单片机等待从 PC 机接收一段控制数据;当 PC 机接收到 0xA3 时,就表明单片机操作已经成功。3、硬件连接51 单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是 RS232 电平的,而单片机的串口是 TTL 电平的,两者

5、之间必须有一个电平转换电路,我们采用了专用芯片 MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的 9 针串口只连接其中的 3 根线:第 5 脚的 GND、第 2 脚的 RXD、第 3 脚的 TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232 的第 10 脚和单片机的 11 脚连接,第 9 脚和单片机的 10 脚连接,第 15 脚和单片机的 20 脚连接。使用 MAX232 串口通信电路图(9 孔串口接头)串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我

6、们必须借助一个 WINDOWS 软件进行观察,这里利用如下图标的一个免费计算机串口调试软件来观察。串口调试助手窗口SBUFSBUF 数据缓冲寄存器数据缓冲寄存器 这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器 SBUF?而不是收发各用一个寄存器。”实际上 SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址99H。CPU 在读 SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数

7、据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作 SBUF 寄存器的方法则很简单,只要把这个 99H地址用关键字 sfr 定义为一个变量就可以对其进行读写操作了,如 sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或 at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。 SCONSCON 串行口控制寄存器串行口控制寄存器 通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON 就是 51 芯片的串行口控制寄存器。它的寻址地址是 98H,是一个可以位

8、寻址的寄存器,作用就是监视和控制 51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用 SCON 寄存器。它的各个位的具体定义如下:(MSB)(LSB)SM0SM1SM2RENTB8RB8TIRI表 81 串行口控制寄存器 SCONSM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。看表 82 串行口工作模式设置。SM0SM1模 式功 能波特率000同步移位寄存器fosc/120118 位 UART可变1029 位 UARTfosc/32 或 fosc/641139 位 UART可变表 82 串行口工作模式设置在这里只说明

9、最常用的模式 1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的 fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。SM2 在模式 2、模式 3 中为多处理机通信使能位。在模式 0 中要求该位为 0。REM 为允许接收位,REM 置 1 时串口允许接收,置 0 时禁止接收。REM 是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入

10、 REM=0 来禁止接收,在子程序结束处加入 REM=1 再次打开串口接收。大家也可以用上面的实际源码加入 REM=0 来进行实验。TB8 发送数据位 8,在模式 2 和 3 是要发送的第 9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。RB8 接收数据位 8,在模式 2 和 3 是已接收数据的第 9 位。该位可能是奇偶位,地址/数据标识位。在模式 0 中,RB8 为保留位没有被使用。在模式 1 中,当 SM2=0,RB8 是已接收数据的停止位。TI 发送中断标识位。在模式 0,发送完第 8 位数据时,由硬件置位。其它

11、模式中则是在发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。在任何模式下,TI 都必须由软件来清除,也就是说在数据写入到 SBUF 后,硬件发送数据,中断响应(如中断打开),这时 TI=1,表明发送已完成,TI 不会由硬件清除,所以这时必须用软件对其清零。RI 接收中断标识位。在模式 0,接收第 8 位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求 CPU 取走数据。但在模式 1 中,SM2=1 时,当未收到有效的停止位,则不会对 RI 置位。同样 RI 也必须要靠软件清除。常用的串口模式 1 是传输 10

12、个位的,1 位起始位为 0,8 位数据位,低位在先,1 位停止位为 1。它的波特率是可变的,其速率是取决于定时器 1 或定时器 2 的定时值(溢出速率)。AT89C51 和 AT89C2051 等 51 系列芯片只有两个定时器,定时器 0 和定时器 1,而定时器 2 是 89C52 系列芯片才有的。波特率波特率 在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准 9600 会被误认为每秒种可以传送9600 个字节,而实际上它是指每秒可以传送 9600 个

13、二进位,而一个字节要 8 个二进位,如用串口模式 1 来传输那么加上起始位和停止位,每个数据字节就要占用 10 个二进位,9600 波特率用模式 1 传输时,每秒传输的字节数是 960010960 字节。51 芯片的串口工作模式 0 的波特率是固定的,为 fosc/12,以一个 12M 的晶振来计算,那么它的波特率可以达到 1M。模式 2 的波特率是固定在fosc/64 或 fosc/32,具体用那一种就取决于 PCON 寄存器中的 SMOD 位,如 SMOD 为 0,波特率为 focs/64,SMOD 为 1,波特率为focs/32。模式 1 和模式 3 的波特率是可变的,取决于定时器 1

14、或 2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。波特率(2SMOD32)定时器 1 溢出速率上式中如设置了 PCON 寄存器中的 SMOD 位为 1 时就可以把波特率提升 2 倍。通常会使用定时器 1 工作在定时器工作模式 2 下,这时定时值中的 TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到 TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式 2 下定时器 1 溢出速率的计算公式如下:溢出速率(计数速率)/(256TH1)上式中的“计数速率”与所

15、使用的晶体振荡器频率有关,在 51 芯片中定时器启动后会在每一个机器周期使定时寄存器 TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知 51 芯片的计数速率为晶体振荡器频率的 1/12,一个 12M 的晶振用在 51 芯片上,那么 51 的计数速率就为 1M。通常用 11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到 9600 的波特率,晶振为 11.0592M 和 12M,定时器 1 为模式 2,SMOD 设为 1,分别看看那所要求的 TH1 为何值。代入公式:11.0592M9600(232)(11.0592M/12)/(256-

16、TH1)TH1250 /看看是不是和上面实例中的使用的数值一样?12M9600(232)(12M/12)/(256-TH1)TH1249.49上面的计算可以看出使用 12M 晶体的时候计算出来的 TH1 不为整数,而 TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的 9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用 11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。下位机:51 单片机实现 RS232 串口通信上一期,我们已经利用增强型 51 实验板学会了单片机控制步进电机转动的方法,这一期,我们将一起来学习一下单片机如何与 PC 机进行通信,一 起来完成一个简单的 RS232 通信实例,我们不做太多的理论,从实例出发,相信能够给大家一个比较通俗、透彻地认识,掌握了它的原理,那你就可以编出任何

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号