51单片机串口通信及波特率设置
- 格式:pdf
- 大小:23.01 KB
- 文档页数:3
1单片机异步通信口的特点及波特率的选定MSC51系列单片机有一个全双工的异步通信口,他利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。
异步串行通信发送和接收数据的速率与移位脉冲同步。
一般用51系列的T1定时器作为波特率发生器,T1的溢出率经二分频(或不分频)后又经十六分频作为串行发送或接收的移位脉冲,移位脉冲的速率即波特率。
单片机的异步通信波特率与串行口的工作方式、主振频率Fosc及定时器T1的工作方式有关。
一般通信中使T1工作于方式2(可重装时间常数方式),若Fosc取6 MHz,则波特率的计算公式如下:。
其中:。
SMOD是可编程的(即PCON的第8位),由此公式计算出的波特率是不标准的波特率。
?2PC机异步通信口及其波特率的设置由于UART(通用异步接收/发送器)的产品型号很多,PC机和XT机都采用的是INS8250芯片,AT机采用的是NSI16450芯片,他们二者是兼容的。
因此这里以8250芯片为例来说明PC机异步通信波特率的设定方法。
PC机中有2个异步通信口,一个是COM1,其端口地址范围是3F8H~3FFH,另一个是COM2,其端口地址是2F8H~2FFH。
其与MODEM配合可以实现远距离通信。
其波特率是标准波特率50~9600b/s。
8250内部有10个寄存器端口,其中有一个除数锁存器,可以通过编程除数的大小来确定异步通信的波特率。
8250使用的频率是1843 2 MHz的基准时钟输入信号,所以必须用分频的方法产生所需要的波特率(移位脉冲)。
除数锁存器的值必须在8250初始化时设置,即把通信线路控制器的最高位(DLAB)置1,然后分两次把除数锁存器的高8位和低8位分别写入端口地址3F8H和3F9H(COM1),8250传送或接收串行数据时使用的时钟信号的频率是数据传输波特率的16倍,即波特率=16×除数/1 843 200。
MCS-51单片机串行通信波特率设置的探讨吴迪【摘要】在MCS-51单片机串行通信中,正确设置波特率,将对串行通信的成功起很大的作用,而波特率的设置需要掌握正确设置技术和方法.对MCS-51单片机串行通信波特率设置的特点,误差的产生与影响,以及如何减小误差作出分析与论述,以保证串行通信正常进行.【期刊名称】《辽宁师专学报(自然科学版)》【年(卷),期】2014(016)004【总页数】3页(P11-12,49)【关键词】MCS-51单片机;波特率;误差分析【作者】吴迪【作者单位】朝阳师专,辽宁朝阳122000【正文语种】中文【中图分类】TP368串行通信是MCS-51系列单片机的一个重要功能.MCS-51系列单片机有一个全双工串行通信接口(UART)P3.0和P3.1,能方便地实现单片机系统之间点对点的单机和多机通信,既具有较强的数据处理能力,同时又具有强大的实时控制功能.但在串行通信过程中,为了确保数据传输的正确,一个重要条件是通信双方应该采用相同的波特率.本文就波特率的设置问题作一些研究与探讨[1].1 MCS-51单片机串行通信波特率的确定MCS-51单片机的串行口根据不同的设计要求,可以有4种不同的工作方式.波特率在这4种工作方式中有所不同:其中方式0是固定的,与系统的振荡频率(fOSC)有关;方式2基本上也是固定的,与系统的振荡频率(fOSC)和PCON的SMOD 位(D7)位有关;方式1和方式3的波特率可变,除了与系统的振荡频率(fOSC)、PCON的SMOD 有关外,还与定时器T1的设置有关.具体表述公式如下[2]:式中k为定时器T1的位数,它和T1的设定方式有关,即:若定时器T1为方式0,则k=13;若定时器T1为方式1,则k=16;若定时器T1为方式2或3,则k=8.2 串行接收原理与波特率相对误差的影响MCS-51 单片机串行通信允许接收数据时REN=1,且RXD 输入端始终检测着线路的状态,CPU 不断对RXD 进行采样,当发现线路上出现从1到0的跳变,并经CPU 采样判断,确认收到一帧信息的起始位时,便开始一帧数据的接收过程. 在接收中,CPU 以数据传输速率的16倍频率对RXD 采样,当检测到一个跳变时,立即复位16分频计数器,使它与输入位时间同步,事实上每位数据的检测脉冲有16个,在每位时间的第7、8、9个计数状态,位检测器分别对RXD 采样,在三个采样值中,至少有两个值是一致的,这样的值才被确认接收,以此排除干扰.如果在第一位时间接收的值不是0,将复位接收电路,并重新寻找另一个1到0的跳变,这样可以排除错误的起始位,如果接收到有效起始位,便开始接收本帧的其余部分.在此接收过程当中,每位时间的第7、8、9个计数状态,应该位于每一位的中间段,如果发送端与接收端的波特率有相对误差,即传输速率不一致,就会发生采样的偏移.如果这种偏移误差在允许的范围内,则不会产生错误的数据传输,但如果超过允许范围时就会产生接收数据的错误,从而导致某数据位的重复接收或漏码. 在收发双方进行通信时,由于这种波特率误差的存在,使每一位传输都会产生采样偏移.如果这种偏移误差累积到半位间隔时,就会出现对某位数据采样两次的情况,从而形成传输错码.若用N 表示发生错码或漏码发生的位数时,则第N 位后面的数据将出错[3],即波特率相对误差×第N 位>0.5.例如,MCS-51单片机间进行串行通信,要求通信双方波特率为9600bps,当单片机的fOSC采用传统的12 MHz,SMOD=1,定时器T1工作于自动装填方式2模式时,可计算得到X=250或249(FAH 或F9H),此时将FAH 写入TH1和TL1,经计算可得:经过实践验证,此时MCS-51单片机间在这种情况下不能正常接收和发送数据.同理将F9写入TH1和TL1,得到的波特率为8928.57bps,其相对误差为+7%,也不能正常进行通信.实践证明,当fOSC=12 MHz,串行异步通信的帧格式为11位时,8.5%×11=0.935>0.5,将出现采样错误,且出错位为N=0.5/8.5%≈6,即在第6位时将发生两次采样错码现象.3 波特率的影响因素3.1 晶振的选择在实际串行通信过程中,为了减小波特率误差,在选择晶振时往往选择11.0592 MHz这个时钟振荡频率,而不是12 MHz[4].因为用MCS-51 单片机的定时器做波特率发生器时,如果用11.0592 MHz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12MHz晶振,则波特率都是有偏差的.就上面的具体事例来分析,当单片机的fOSC=11.0592 MHz,SMOD=1,要求通信双方波特率为9 600bps时,可计算得X=250=FAH.根据串行通信要求,一帧信息数据为11位时,波特率相对误差要小于4.5%,则数据传输是正确的,而0.00177%完全可以满足可靠通信要求.3.2 SMOD 位对波特率的影响SMOD 位是影响波特率设置的另一个重要因素,不可忽视.现举例说明:设波特率为2400bps,fOSC=6 MHz,当选择SMOD=0时,可计算X≈249=F9H,将F9H 写入定时器1中,可得到实际的波特率及相对误差为:选择SMOD=1时,可计算X≈243=F3H,将F3H 写入定时器1中,可得到实际的波特率及相对误差为:上面的分析说明SMOD 值的选择原则上是任意的,但在某种情况下它将影响着波特率误差范围,因此在波特率设置时,对SMOD 的选择也不可忽视.以上对波特率的设置进行了适当分析,在MCS-51单片机串行通信中,为了保证数据传输的准确,一定要正确设置和选择波特率.【相关文献】[1]唐俊杰.微型计算机原理及应用[M].北京:高等教育出版社,2001.[2]高秦生.微型计算机原理及应用[M].北京:高等教育出版社,2005.[3]张毅刚,彭喜元,彭宇.单片机原理及应用[M].北京:高等教育出版社,2010.[4]王艳玲.利用USB接口实现不同条件下的数据采集[J].辽宁师专学报:自然科学版,2005,(1):85.。
MCS-51单片机串行口工作方式与波特率计算举例1)方式0方式0是外接串行移位寄存器方式。
工作时,数据从RXD串行地输入/输出,TXD 输出移位脉冲,使外部的移位寄存器移位。
波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。
每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。
实际应用在串行I/O口与并行I/O口之间的转换。
2)方式1方式1是点对点的通信方式。
8位异步串行通信口,TXD为发送端,RXD为接收端。
一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。
波特率由T1或T2的溢出率确定。
在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。
(1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。
发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。
(2)接收:REN=1后,允许接收。
接收器以所选波特率的16倍速率采样RXD端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。
由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。
接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。
此后:A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。
B、若RI=0、SM2=1,则只有停止位为1时,才有上述结果。
C、若RI=0、SM2=1,且停止位为0,则所接数据丢失。
51单片机串口设置及应用单片机的串口设置及应用是指通过单片机的串口功能来进行通信的一种方式。
串口通信是一种全双工通信方式,可以实现双向数据传输。
单片机通过串口可以与其他设备进行通信,如计算机、传感器、LCD显示屏等。
1. 串口设置:单片机的串口通信一般需要进行以下设置:(1)串口模式选择:要根据实际情况选择串口工作模式,一般有异步串口和同步串口两种。
(2)波特率设置:串口通信需要设置一个波特率,即数据传输速率。
常见的波特率有9600、19200、115200等,需要与通信的设备保持一致。
(3)数据位设置:设置传输的数据位数,常见的有8位、9位等。
(4)停止位设置:设置停止位的个数,常见的有1位、2位等。
(5)校验位设置:可以选择是否启用校验位,校验位主要用于检测数据传输的正确性。
2. 串口应用:串口通信在很多领域都得到广泛应用,下面列举几个常见的应用场景:(1)串口与计算机通信:通过串口可以实现单片机与计算机的通信,可以进行数据的读写、控制等操作。
例如,可以通过串口将传感器采集到的数据发送给计算机,由计算机进行进一步处理分析。
(2)串口与传感器通信:串口可以与各种传感器进行通信,可以读取传感器采集到的数据,并进行处理和控制。
例如,可以通过串口连接温度传感器,读取实时的温度数据,然后进行温度控制。
(3)串口与LCD显示屏通信:通过串口可以实现单片机与LCD显示屏的通信,可以将需要显示的数据发送给LCD显示屏进行显示。
例如,可以通过串口将单片机采集到的数据以数字或字符的形式显示在LCD上。
(4)串口与外部存储器通信:通过串口可以与外部存储器进行通信,可以读写存储器中的数据。
例如,可以通过串口读取SD卡中存储的图像数据,然后进行图像处理或显示。
(5)串口与其他设备通信:通过串口可以和各种其他设备进行通信,实现数据的传输和控制。
例如,可以通过串口与打印机通信,将需要打印的数据发送给打印机进行打印。
总结:单片机的串口设置及应用是一种实现通信的重要方式。
波特率选择在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。
在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
方式0方式0的波特率固定为主振频率的1/12。
方式2方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc方式1和方式3定时器T1作为波特率发生器,其公式如下:T1溢出率= T1计数率/产生溢出所需的周期数式中T1计数率取决于它工作在定时器状态还是计数器状态。
当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。
产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式0:溢出所需周期数=8192-x定时器T1工作于方式1:溢出所需周期数=65536-x定时器T1工作于方式2:溢出所需周期数=256-x因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
下表列出了定时器T1工作于方式2常用波特率及初值。
常用波特率Fosc(MHZ) SMOD TH1初值19200 11.0592 1 FDH9600 11.0592 0 FDH4800 11.0592 0 FAH2400 11.0592 0 F4H1200 11.0592 0 E8H例如9600 11.0592 0 FDHT1溢出率= T1计数率/产生溢出所需的周期数产生溢出所需的周期数=256-FD(253)=3SMOD=0 11059200/12*3 *1/32=9600波特率计算在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。
51单片机波特率计算在单片机的世界里,波特率是一个非常重要的概念。
它关乎着数据通信的准确性和效率。
那么,什么是波特率呢?简单来说,波特率就是指单位时间内传输的二进制位数。
对于 51 单片机而言,正确计算波特率是实现可靠通信的关键。
要理解51 单片机的波特率计算,首先得了解一些相关的基础知识。
51 单片机通常使用串行通信方式来进行数据传输,常见的有同步通信和异步通信两种。
在异步通信中,波特率的设置尤为重要。
51 单片机的波特率是由定时器来产生的。
通常会用到定时器 1 作为波特率发生器。
那为什么要用定时器来产生波特率呢?这是因为单片机的晶振频率是固定的,而我们需要不同的波特率来适应不同的通信需求。
通过设置定时器的初值和工作方式,就可以得到我们想要的波特率。
在计算波特率之前,我们需要知道几个关键的参数。
首先是晶振频率,这是单片机工作的基础时钟。
其次是定时器的工作方式,51 单片机的定时器1 有四种工作方式,不同的工作方式会影响波特率的计算。
还有就是我们期望得到的波特率值。
以常见的方式为例,如果我们使用的晶振频率是 110592MHz,想要得到 9600 的波特率,并且选择定时器 1 工作在方式 2(8 位自动重装模式),那么计算过程是这样的:首先,我们知道波特率=(2^SMOD/32)×(定时器溢出率)其中,SMOD 是电源控制寄存器 PCON 中的一位,当 SMOD = 1 时,波特率会加倍。
定时器溢出率=晶振频率/(12×(256 TH1))将晶振频率 110592MHz 转换为 Hz,即 11059200Hz。
要得到 9600 的波特率,我们可以列出方程:9600 =(2^SMOD/32)×(11059200 /(12×(256 TH1)))假设 SMOD = 0,解方程可得 TH1 = 253。
也就是说,我们需要将定时器 1 的 TH1 和 TL1 都设置为 253,就可以得到 9600 的波特率。
51 单片机串行通讯中波特率的自动检测本文介绍一种在80C51 串行通讯应用中自动检测波特率的方法。
按照经验,程序起动后所接收到的第1个字符用于测量波特率。
这种方法可以不用设定难于记忆的开关,还可以免去在有关应用中使用多种不同波特率的烦恼。
人们可以设想:一种可靠地实现自动波特检测的方法是可能的,它无须严格限制可被确认的字符。
问题是:在各种的条件下,如何可以在大量允许出现的字符中找出波特率的定时间隔。
显然,最快捷的方法是检测一个单独位时间(single bit time),以确定接收波特率应该是多少。
可是,在RS-232 模式下,许多ASCII 字符并不能测量出一个单独位时间。
对于大多数字符来说,只要波特率存在合理波动(这里的波特率是指标准波特率),从起始位到最后一位“可见”位的数据传输周期就会在一定范围内发生变化。
此外,许多系统采用8 位数据、无奇偶校验的格式传输ASCII 字符。
在这种格式里,普通ASCII 字节不会有MSB 设定,并且,UART总是先发送数据低位(LSB),后发送数据高位(MSB),我们总会看见数据的停止位。
在下面的波特率检测程序中,先等待串行通讯输入管脚的起始信号(下降沿),然后起动定时器T0。
在其后的串行数据的每一个上升沿,将定时器T0的数值捕获并保存。
当定时器T0溢出时,其最后一次捕获的数值即为从串行数据起始位到最后一个上升沿(我们假设是停止位)过程所持续的时间。
CmpTable 表格列出了每一波特率的最大测量时间。
这些数据是经过选择的,所以,4 个数据位时间(加上起始位时间)仍可产生正确的波特率。
使用这种方法时,必须遵守一个假设:这种技术仅取决于所接收到的一个字符,接收这个字符的波特率必须大于最低波特率。
本质上来说,这意味着这个字符必须来自正常敲击键盘时所产生的字符。
在PC上,我们不可能快速、连续地敲击两个字符,以欺骗程序。
但是,PC的功能键具有一个问题,因为它会连续发送两个紧挨着的字符,使程序检测得到错误的波特率。
51单片机串口通信及波特率设置MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。
它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。
1. 数据缓冲寄存器SBUFSBUF是可以直接寻址的专用寄存器。
物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCONSCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
它的各个位定义如下:MSB LSBSM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM0 SM1 工作方式功能波特率0 0 0 8位同步移位寄存器Fosc/120 1 1 10位UART 可变1 02 11位UART Fosc/64或Fosc/321 1 3 11位UART 可变SM2在工作方式2和3中是多机通信的使能位。
在工作方式0中,SM2必须为0。
在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。
51系列的串口波特率的计算
1、方式0的波特率,固定为晶振频率的十二分之一。
2、方式2的波特率,取决于PCON寄存器的SMOD位。
PCON是一个特殊的寄存器,除了最高位SMOD 外,其他位都是虚设的。
计算方法如下:
SMOD=0时,波特率为晶振频率的1/64;
SMOD=1时,为晶振频率的1/32.
3、方式1与方式3的波特率,都由定时器的溢出率决定。
公式为:
波特率= (2SMOD/ 32)×(定时器T1的溢出率)
通常情况下,我们使用定时器的工作方式2,即比率发生器,自动重载计数常数。
溢出的周期为:
T=(256-X)×12/fosc
溢出率为溢出周期的倒数,所以:
如此,也可由波特率反推出计数器的初始值。
下面是常用的波特率及初始值:
51单片机模拟串口波特率计算方法
1.计算波特率位间隔时间(即定时时间,其实就是波特率的倒数)
位间隔时间(us) = 106 (us) / 波特率(bps)
2.计算单片机指令周期:
指令周期(us) = 12 / 晶振频率(Mhz)
3.计算定时器初值:
需要指令周期个数 = 位间隔时间(us) / 指令周期(us)
定时器初值 = 2n—需要指令周期个数
n为定时器位数。
51单片机串口通信相关寄存器及设置指引关键字SBUF:串口数据缓存寄存器SCON:串口通信状态控制寄存器Fosc:晶振的震荡频率PSW:程序状态字寄存器1、SBUF数据缓存寄存器SBUF可直接寻址专用寄存器,是个8位寄存器,不可进行位操作。
字节地址99H。
物理上它是两个寄存器,一个发送寄存器,一个接收寄存器。
写数据到SBUF中时(SBUF = 0x52;),单片机自己会判断是写到发送寄存器。
读取SBUF中数据时(rReg = SBUF;),单片机自己会判断是读取接收寄存器。
接收寄存器是双缓冲的,以避免在接收下一帧数据之前,单片机还来不及响应接收中断,没有把上一帧的数据读取走,而产生两次帧数据重叠问题。
发送寄存器,没有缓冲,发送时单片机直接主动发出数据,不会产生重叠问题。
(扩展知识:为了保持最大的传输速率,一般不需要发送寄存器建立双缓冲功能。
双缓冲功能有别于发送数据队列缓存区。
)2、SCON串口通讯状态控制寄存器SCON可直接寻址专用寄存器,是个8位寄存器,可以进行位操作。
SCON用于控制串行通信的模式选择、接收和发送,标识串口的状态。
SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
系统复位时,SCON的所有位都被清除。
SCON串口通讯状态控制寄存器的格式及各位的功能定义如下:●SM0、SM1SM0和SM1是串口模式选择位。
SM0和SM1编码对应串口4种模式,如下表:●SM2SM2在模式2和模式3中是多机通信的使能位。
在模式0中,SM2必须为0。
在模式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在模式2和模式3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
●RENREN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
波特率选择在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。
在8051串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。
方式0方式0的波特率固定为主振频率的1/12。
方式2方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:波特率=2的SMOD次方除以64再乘一个fosc,也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc方式1和方式3定时器T1作为波特率发生器,其公式如下:T1溢出率= T1计数率/产生溢出所需的周期数式中T1计数率取决于它工作在定时器状态还是计数器状态。
当工作于定时器状态时,T1计数率为fosc/12;当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fosc/24。
产生溢出所需周期与定时器T1的工作方式、T1的预置值有关。
定时器T1工作于方式0:溢出所需周期数=8192-x定时器T1工作于方式1:溢出所需周期数=65536-x定时器T1工作于方式2:溢出所需周期数=256-x因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
当时钟频率选用11.0592MHZ时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
下表列出了定时器T1工作于方式2常用波特率及初值。
常用波特率Fosc(MHZ) SMOD TH1初值19200 11.0592 1 FDH9600 11.0592 0 FDH4800 11.0592 0 FAH2400 11.0592 0 F4H1200 11.0592 0 E8H例如9600 11.0592 0 FDHT1溢出率= T1计数率/产生溢出所需的周期数产生溢出所需的周期数=256-FD(253)=3SMOD=0 11059200/12*3 *1/32=9600波特率计算在串行通信中,收发双方对发送或接收的数据速率要有一定的约定,我们通过软件对MCS—51串行口编程可约定四种工作方式。
51单片机波特率设置方法51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。
它的各个位的具体定义如下:SM0 SM1 SM2 REN TB8 RB8 TI RISM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。
串行口工作模式设置。
波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。
波特率是指串行端口每秒内可以传输的波特位数。
这里所指的波特率,如标准9600 不是每秒种可以传送9600个字节,而是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10=960 字节。
其他的字段的含义如下:(2).SM2:多机通信控制位。
多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。
接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接受到的数据放弃。
当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
(3).REN:允许接收位。
REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
(4).TB8:发送接收数据位8。
在方式2和方式3中,TB8是要发送的——即第9位数据位。
在多机通信中同样亦要传输这一位,并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。
(5).RB8:接收数据位8。
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。
(6).TI:发送中断标志位。
可寻址标志位。
方式0时,发送完第8位数据后,由硬件置位,其它方式下,在发送或停止位之前由硬件置位,因此,TI=1表示帧发送结束,TI 可由软件清“0”。
c 51单片机串口初值计算
在C51单片机中,串口通信是一种常用的通信方式。
为了实现串口通信,我们需要对串口的波特率、停止位、数据位、校验位等进行配置。
其中,波特率是串口通信中最重要的参数之一,它决定了数据传输的速度。
在C51单片机中,我们通常使用定时器来产生串口的波特率。
具体来说,我们可以通过配置定时器的溢出值和分频系数来计算波特率。
假设我们要配置的波特率为9600,单片机的晶振频率为12MHz,那么我们可以使用定时器T1来产生波特率。
首先,我们需要将定时器T1设置为工作方式2,即自动重装载模式。
然后,我们可以根据下面的公式计算波特率的初值:
波特率= (2^SMOD / (32 * (65536 - TH1))) * 12
其中,SMOD是波特率倍增位,TH1是定时器T1的初值。
根据上面的公式,我们可以计算出TH1的值为:
TH1 = 65536 - (2^SMOD * 12 / (32 * 波特率))
假设SMOD=0,那么我们可以将上面的公式代入计算出TH1的值为:
TH1 = 65536 - (2^0 * 12 / (32 * 9600)) = 0x4B88
因此,我们可以将TH1的值写入单片机的寄存器中,以配置串口的波特率。
除了配置波特率外,我们还需要配置串口的其他参数,例如停止位、数据位、校验位等。
这些参数可以通过对串口控制寄存器的相应位进行设置来配置。
具体配置方法可以参考单片机的数据手册或参考手册。
51单片机串口通信1./*打开串口调试程序,将波特率设置为9600,无奇偶校验晶振11.0592MHz,发送和接收使用的格式相同,如都使用字符型格式,在发送框输入hello,I Love MCU ,在接收框中同样可以看到相同字符,说明设置和通信正确*/#include <REG52.H>/*主程序*/void main (void){SCON = 0x50; /* SCON: 模式1, 8-bit UART, 使能接收*/TMOD |= 0x20; /* TMOD: timer 1, mode 2,8-bit reload*/TH1 = 0xFD; /* TH1: **********************************/ TR1 = 1; /* TR1: timer 1 run */EA = 1; /*打开总中断*/ES = 1; /*打开串口中断*/while (1) /*主循环不做任何动作*/{}}void UART_SER (void) interrupt 4 //串行中断服务程序{unsigned char Temp; //定义临时变量if(RI) //判断是接收中断产生{RI=0; //标志位清零Temp=SBUF; //读入缓冲区的值P1=Temp; //把值输出到P1口,用于观察SBUF=Temp; //把接收到的值再发回电脑端}if(TI) //如果是发送标志位,清零TI=0;}2.51单片机与电脑串口通信的C程序,最好是中断方式的#include <reg51.h>#include <string.h>unsigned char ch;bit read_flag= 0 ;void init_serialcom( void ) //串口通信初始设定{SCON = 0x50 ; //UART为模式1,8位数据,允许接收TMOD |= 0x20 ; //定时器1为模式2,8位自动重装PCON |= 0x80 ; //SMOD=1;TH1 = 0xFD ; //Baud:19200 fosc="11".0592MHzIE |= 0x90 ; //Enable Serial InterruptTR1 = 1 ; // timer 1 run}//向串口发送一个字符void send_char_com( unsigned char ch){SBUF=ch;while (TI== 0);TI= 0 ;}void serial () interrupt 4 using 3 //串口接收中断函数{if (RI){RI = 0 ;ch=SBUF;read_flag= 1 ; //就置位取数标志}}main(){init_serialcom(); //初始化串口while ( 1 ){if (read_flag) //如果取数标志已置位,就将读到的数从串口发出{read_flag= 0 ; //取数标志清0send_char_com(ch);}}}3.// 单片机串行口发送/接收程序,每接收到字节即发送出去// 和微机相接后键入的字符回显示在屏幕上// 可用此程序测试#include <reg51.h>#define XTAL 11059200 // CUP 晶振频率#define baudrate 9600 // 通信波特率void main(void){unsigned char c;TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率TH1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate)));TL1=(unsigned char)(256 - (XTAL / (32L * 12L * baudrate))); // 定时器0赋初值SCON = 0x50;PCON = 0x00;TR1 = 1;IE = 0x00; // 禁止任何中断{while(RI == 0);RI = 0;c = SBUF; // 从缓冲区中把接收的字符放入c中SBUF = c; // 要发送的字符放入缓冲区while(TI == 0);TI = 0;}}4.//////////////// ///////////////////////////////////////////////////////////E51Pro.c//Easy 51Pro编程器主程序,负责通讯,管理编程操作/////////////////////////////////////////////////////////////////////////#include <E51Pro.h>BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用UINT nAddress;//ROM中地址计数UINT nTimeOut;//超时计数ProWork pw;//编程器一般操作void Delay_us(BYTE nUs)//微秒级延时<255us{TH0=0;TL0=0;TR0=1;while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值{}TR0=0;}void Delay_ms(UINT nMs)//豪秒级的延时<65535ms{UINT n=0;TR0=1;while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值{TH0=0;TL0=20;while(TH0<4){}n++;}TR0=0;}BOOL WaitComm()//等待上位机的命令,18字节{RI=0;while(!RI){}//等待第一个字节ComBuf[n]=SBUF;RI=0;n++;for(n;n<=17;n++){nTimeOut=0;while(!RI){nTimeOut++;if(nTimeOut>10000)//后17个字节都有超时限制return 0;}ComBuf[n]=SBUF;RI=0;}return 1;}BOOL WaitResp()//等待上位机回应,1字节,有超时限制{nTimeOut=0;RI=0;while(!RI){nTimeOut++;if(nTimeOut>50000){return 0;}}RI=0;ComBuf[0]=SBUF;return 1;}BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制{BYTE n;RI=0;for(n=0;n<=17;n++){nTimeOut=0;while(!RI){nTimeOut++;if(nTimeOut>10000){return 0;}}RI=0;ComBuf[n]=SBUF;}return 1;}void SendData()//发送数据或回应操作完成,18字节{BYTE n=0;for(n;n<=17;n++){TI=0;SBUF=ComBuf[n];while(!TI){}TI=0;}}void SendResp()//回应上位机1个字节,在写器件函数中使用{TI=0;SBUF=ComBuf[0];while(!TI){}TI=0;}void SetVpp5V()//设置Vpp为5v{P3_4=0;P3_3=0;}void SetVpp0V()//设置Vpp为0v{P3_3=0;P3_4=1;}void SetVpp12V()//设置Vpp为12v{P3_4=0;P3_3=1;}void RstPro()//编程器复位{pw.fpProOver();//直接编程结束SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同}void ReadSign()//读特征字{pw.fpReadSign();SendData();//通知上位机,送出读出器件特征字}void Erase()//擦除器件{pw.fpErase();SendData();//通知上位机,擦除了器件}void Write()//写器件{BYTE n;pw.fpInitPro();//编程前的准备工作SendData();//回应上位机表示进入写器件状态,可以发来数据while(1){if(WaitData())//如果等待数据成功{if(ComBuf[0]==0x07)//判断是否继续写{for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块{if(!pw.fpWrite(ComBuf[n]))//<<< <<<<<<调用写该器件一个单元的函数{pw.fpProOver();//出错了就结束编程ComBuf[0]=0xff;SendResp();//回应上位机一个字节,表示写数据出错了WaitData();//等待上位机的回应后就结束return;}nAddress++;//下一个单元}ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续SendResp();}else if(ComBuf[0]==0x00)//写器件结束break;else//可能是通讯出错了{pw.fpProOver();return;}}else//等待数据失败{pw.fpProOver();return;}}pw.fpProOver();//编程结束后的工作Delay_ms(50);//延时等待上位机写线程结束ComBuf[0]=0;//通知上位机编程器进入就绪状态SendData();}void Read()//读器件{BYTE n;pw.fpInitPro();//先设置成编程状态SendData();//回应上位机表示进入读状态while(1){if(WaitResp())//等待上位机回应1个字节{if(ComBuf[0]==0)//ComBuf[0]==0表示读结束{break;}else if(ComBuf[0]==0xff)//0xff表示重发{nAddress=nAddress-0x0010;}for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块{ComBuf[n]=pw.fpRead();//<<<<<<<<<<调用写该器件一个单元的函数nAddress++;//下一个单元}ComBuf[0]=6;//向上位机发送读出的数据块SendData();}elsebreak;//等待回应失败}pw.fpProOver();//操作结束设置为运行状态ComBuf[0]=0;//通知上位机编程器进入就绪状态SendData();}void Lock()//写锁定位{pw.fpLock();SendData();}///////////////////////////////////////////////////////////////////////////////////所支持的FID,请在这里继续添加/////////////////////////////////////////////////////////////////////////////extern void PreparePro00();//FID=00:AT89C51编程器extern void PreparePro01();//FID=01:AT89C2051编程器extern void PreparePro02();//FID=02:AT89S51编程器void main(){SP=0x60;SetVpp5V();//先初始化Vpp为5vSCON=0x00;TCON=0x00;//PCON=0x00;//波特率*2IE=0x00;//TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0// 0 0 1 0 0 0 0 1TMOD=0x21;//T0用于延时程序TH1=0xff;TL1=0xff;//波特率28800*2,注意PCON//SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI// 0 1 0 1 0 0 0 0SCON=0x50;TR1=1;Delay_ms(1000);//延时1秒后编程器自举ComBuf[0]=0;SendData();while(1)//串口通讯采用查询方式{if(!WaitComm())//如果超时,通讯出错{Delay_ms(500);ComBuf[0]=0;//让编程器复位,使编程器就绪}switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针{case 0: //at89c51编程器PreparePro00(); break;case 1: //at89c2051编程器PreparePro01(); break;case 2: //at89s51编程器PreparePro02(); break;//case 3:支持新器件时,请继续向下添加// break;//case 4:// break;default: ComBuf[0]=0xff;ComBuf[1]=0xff; //表示无效的操作break;}switch(ComBuf[0])//根据操作ID跳到不同的操作函数{case 0x00:RstPro();break; / /编程器复位case 0x01:ReadSign();break; //读特征字case 0x02:Erase();break;//擦除器件case 0x03:Write();break;//写器件case 0x04:Read();break;//读器件case 0x05:Lock();break;//写锁定位default: SendData();break;}}}5.v oid InitSerial(void){TMOD = 0x20; // T1 方式2PCON=0x00; // PCON=00H,SMOD=0 PD = PCON.2 = 1 进入掉电模式TH1 = TL1 = BAUD_9600; // BAUD: 9600SCON = 0x50; // 串行通信方式1 REN=1 允许接收ET1 = 0; // 不允许中断TR1 = 1; // 开启定时器1IE = 0; // 关闭所有中断允许位memset(&SerialBuf, 0x00, SERIAL_BUF_LEN); // 初始化SerialBuf[SERIAL_BUF_LEN] }/**********************************************************名称:SendByte()**功能:串口发送一个字节**输入:ucData**返回:无**说明:无********************************************************/void SendByte(unsigned char ucData){SBUF = ucData;while(!TI){_CLRWDT_;}TI = 0;}RS232串口通信程序#include <AT89X52.H>unsigned char code dispcode1[]={" welcome! "}; unsigned char code dispcode2[]={""}; unsigned char i,j,k,l,DData;sbit RS = P3^5;sbit RW = P3^6;sbit E = P3^7;unsigned char m=0;void delay(){for(l=0;l<=100;l++){}}void enable() //write order{RS=0;RW=0;E=0;delay();E=1;}void enable2() //write data{RS=1;RW=0;E=0;delay();E=1;}void initializtion() //lcd initializtion{for(i=0;i<=100;i++)P0=0x01;enable();P0=0x38;enable();P0=0x0f;enable();P0=0x06;enable();}void Display(m,DData) // display data{P0=0xC0+m; //write addressenable();P0=DData; //write dataenable2();}void Esisr() interrupt 4 //串口接收中断服务程序{unsigned char temp;ES=0;if(RI == 1){RI = 0;temp = SBUF; //接收数据SBUF=temp; //将接收到的数据发送至PC机Display(m,temp); //将接收到的数据送LCD显示while(!TI); //等待数据发送完成TI=0;m++;if(m>16)m=0;}ES=1;}void system_initial(void) //system initializtion{TMOD=0x21;// 定时器1工作方式2,定时器0工作方式1PCON=0x00;//数据传输率选择。
51单片机定时器模式2与波特率的应用单片机定时器模式2与波特率在通信领域有着广泛的应用。
定时器模式2是一种非常常见的定时器工作模式,可以精确地生成指定的时间间隔,而波特率则是通信中用来描述数据传输速率的参数。
在串口通信中,波特率是非常重要的一个参数。
波特率定义了单位时间内传输的比特数,通常以每秒钟传输的比特数(bps)来表示。
波特率越高,传输速度越快,但同时需要更高的传输能力和更高的抗干扰能力。
在通信中,发送端和接收端必须使用相同的波特率来进行通信,否则将无法正确地接收和发送数据。
单片机定时器模式2可以用来生成固定的时间间隔,通常用作定时器中断。
在串口通信中,定时器中断可以用来在发送和接收数据时定时产生中断,用来检测接收缓冲区中是否有数据到达或者发送缓冲区是否已经空闲,从而及时进行数据的接收或发送。
下面以串口通信为例,详细介绍单片机定时器模式2和波特率的应用。
首先,通过单片机定时器来设置波特率。
单片机的主时钟通常是一个固定的频率,比如12MHz。
通过定时器模式2,可以将主时钟的频率分频,从而得到一个与波特率相匹配的频率信号。
具体的分频系数计算公式为:分频系数=(2^SMOD)*(256-PRESCALER)其中,SMOD是特殊功能寄存器的位,如果设置为1,表示使用双倍波特率模式,否则为普通波特率模式;PRESCALER是定时器的预分频值,可以自由选择。
通过调整分频系数,可以得到与波特率相匹配的定时器溢出时间,从而实现波特率的设置。
例如,假设要设置波特率为9600bps,可以先计算得到分频系数,然后通过设置定时器的预分频值和计数器初值来实现。
接下来,在数据传输过程中,可以利用定时器模式2的中断功能来实现接收和发送的时机控制。
在接收数据时,可以使用定时器模式2的中断函数来检测接收缓冲区中是否有数据到达,如果有,则立即从缓冲区中读取数据。
在发送数据时,可以设置定时器的中断函数来检测发送缓冲区是否已经空闲,如果已经空闲,则将要发送的数据写入发送缓冲区。
51单片机串口通信及波特率设置
MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。
它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。
1. 数据缓冲寄存器SBUF
SBUF是可以直接寻址的专用寄存器。
物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCON
SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
它的各个位定义如下:
MSB LSB
SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM0 SM1 工作方式功能波特率
0 0 0 8位同步移位寄存器Fosc/12
0 1 1 10位UART 可变
1 0
2 11位UART Fosc/64或Fosc/32
1 1 3 11位UART 可变
SM2在工作方式2和3中是多机通信的使能位。
在工作方式0中,SM2必须为0。
在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。
在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。
在多处理机通信中,该位用于表示是地址帧还是数据帧。
RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。
在工作方式0中RB8不使用。
TI 为发送中断标志位,由硬件置位,软件清除。
工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。
TI=1时,申请中断。
CPU 响应中断后,发送下一帧数据。
在任何工作方式中都必须由软件清除TI。
RI为接收中断标志位,由硬件置位,软件清除。
工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。
RI=1时,申请中断,要求CPU取走数据。
但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。
在任何工作方式中都必须由软件清除RI。
系统复位时,SCON的所有位都被清除。
控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB
SMOD —— —— —— GF1 GF0 PD IDL
仅最高位SMOD与串口的控制有关,其他位与掉电方式有关。
PCON的地址为87H只能按字节寻址,SMOD是串行通信波特率系数控制位,当串口工作在工作方式1、2时,若使用T1作为波特率发生器其SMOD=1则波特率加倍(见下面详述)。
GF1 和GF0用于一般的用途,对于A T89系列为通用的标志位,PD为电源下降位,对于A T89系列,PD为1进入掉电状态,IDL为IDLE模式位,对于A T89系列,IDL为1进入空闲工作方式,在PD和IDL同时为1时,PD优先。
(1)工作方式0
SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式。
其数据传输的波特率固定为Fosc/12,数据由RXD引脚输入或输出,同步时钟由TXD引脚输出。
接收/发送的是8位数据,传输是低位在前,帧格式如下:
…….. D0 D1 D2 D3 D4 D5 D6 D7 …….
(2)工作方式1
当SM0=0且SM1=1时,串口选择工作方式1,其数据传输的波特率由定时/计数器T1、T2的溢出速率决定,可通过程序设定。
当T2CON寄存器中的RCLK和TCLK置位时,用T2作为发送和接收波特率发生器,而RCLK=TCLK=0时,用T1作为波特率发生器,两者还可以交叉使用,即发送和接收采用不同的波特率。
数据由TXD引脚发送,由RXD引脚接收。
发送或接收一帧的数据为10位,即1位起始位(0)、8位数据位(低位在先)和1位停止位(1)。
真格式如下:
起始位0 D0 D1 D2 D3 D4 D5 D6 D7 停止位1
类似于工作方式0,当执行任一条SBUF指令时,就启动串行数据的发送。
在执行写入SBUF 的指令时,也将“1”写入发送移位寄存器的第9位,并通知发送控制器有发送请求。
实际上,发送过程始于内部的16分频计数器下次满度翻转(全“1”变全“0”)后的那几个机器周期的开始。
所以,每位的发送过程与16分频计数器同步,而不是与“写SBUF”同步。
此方式的工作过程包括发送和接收两部分。
当执行任一条写SBUF指令时,就启动串行数据的发送。
在执行写入SBUF的指令时,也将“1”写入发送移位寄存器的第9位,并使发送控制器开始发送。
在这期间,内部的定时保证写入SBUF与激活发送之间有一个完整的机器周期。
当发送脉冲有效后,移位寄存器的内容由RXD引脚串行移位输出,移位脉冲由TXD引脚输出。
在发送有效的每个机器周期,发送移位寄存器右移一位,就在其左边补“0 ”。
当数据的最高位移到移位寄存器的输出时,原写入第9位的“1”正好移到最高位的左边一位,由此向左的所有位都为“0”,这标志着发送控制器要进行最后依次移位,并撤消发送有效,同时使发送中断标志TI置位。
当REN=1且接收中断标志RI位清除时,即启动一个接收过程。
在下一个机器周期,接收控制器将“11111110”写入接收移位寄存器,并在下一周期内激发接收有效,同时由TXD 引脚输出移位脉冲。
在移位脉冲的控制下,接收移位寄存器的内容每一个机器周期左移一位,同时由RXD引脚接收一位输入信号。
每当接收移位寄存器左移一位,原写入的“11111110”也左移一位。
当最右边的“0”移到最左边时,标志着接收控制器要进行最后一次移位。
在最后移位即将结束时,接收移位寄存器的内容送入到接收数据缓冲寄存器SBUF,然后在启动接收的第10个机器周期时,清除接收
信号,将RI置位。
如果在第一个时钟周期中接收到的不是起始位(“0”),就复位接收电路,继续检测RXD 引脚上1到0的跳变。
如果接收到的是起始位,就将其移入接收移位寄存器,然后接收该帧的其他位。
接收到的位从右边移入,原来写入的1从左边移出,当起始位移到最左边时,接收控制器将控制进行最后一次移位,把接收到的第9为数据送到接收数据缓冲器SBUF和RB8,同时置位RI。
在进行最后一次移位时,能将数据送入到接收数据缓冲器SBUF和RB8而且置位RI的条件如下:
●RI=0,即上一真数据接收完成时,发出的中断请求已经被响应,SBUF中的上一帧数据已经被取走。
●SM2=0或接收到的停止位为1。
这两个条件有一个不满足接收到的数据就有可能丢失,并且无法修复;如两者都满足则数据装入SBUF,停止位装入RB8且置位RI。
开始发送后的一个位周期,发送信号有效,开始将起始位送TXD引脚。
一位时间后,数据信号有效。
发送移位寄存器将数据由低位到高位顺序输出至TXD引脚。
一位时间后第一个移位脉冲出现,将最低数据位从右边移出,同时从左边补上“0”。
当数据的最高位移到移位寄存器的输出端时,先前写入第9位的“1”正好移到最高位的左边一位,而它的左区全部为“0”。
在第10个位周期(16分频计数器回0时),发送控制器要进行最后一次清除发送信号,同时使发送中断标志TI置位。
当REN=1且接收中断标志RI位清除后,若在RXD引脚上检测到一个由“1”到“0”的跳变,立即启动一次接收的过程。
同时复位16分频计数器,使输入位的边沿与时钟对齐,并将1FFH(9个“1”)写入接收移位寄存器。
接收控制器继续以波特率的16倍的速率继续对RXD引脚进行检测,对每一位时间的第7、8、9个计数状态的采样值用多数表决法,当2次或2次以上的采样值相同时,采样值被接受。
(1)工作方式2和3
当SM0=1且SM1=0时,串口选择工作方式2,当SM0=1且SM1=1时,串口选择工作方式3。
数据由TXD引脚发送由RXD引脚接收。
发送和接收的一帧信息为11位,即1位起始位(0),9位数位(低位在前,第9位数据位是可编程位)1位停止位(1)。
发送时,可编程位(TB8)可赋0或1,接收时可编程位进入SCON中的RB8。
帧的格式如下:
起始位0 D0 D1 D2 D3 D4 D5 D6 D7 可编程位D8 停止位1。