51波特率

51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下:
                SM0 SM1 SM2 REN TB8 RB8 TI RI
SM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。

波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。这里所指的波特率,如标准9600 不是每秒种可以传送9600个字节,而是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是9600÷10=960 字节。

51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。

模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率,就是说定时器1每溢出一次,串口发送一次数据。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。

上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2下定时器1溢出速率的计算公式如下:
  溢出速率=(计数速率)/(256-TH1初值)

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

12M
               9600=(2÷32)×((12M/12)/(256-TH1))
               TH1≈249.49

上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。

51波特率

时间: 2024-10-12 18:09:11

51波特率的相关文章

基于AVR的串口与PC机通信代码(uart8位数据)

为了以后根据此代码继续改进功能,特意把代码放在此处,也和大家一起学习. /************************************ AVR时钟:8.00MHz *波特率9600(51)8位数据,1位停止,当波特率设置为19200时,UBRR=25,4800=103 *注:波特率设置9600最佳,别的数据不稳定,不同波特率对应的UBRR值参考手册 *PC机向开发板发送一个字符,开发板将其大写字母回写给PC机 ***********************************/

花真完议须果容制iffr8YCp

她力存往难难快政需管要容长经重从与器导接听利快收群们育律我或革采准江气米志华据示证金为布期原地置战山反进心流体省管量具规放几想的反广公器安中压处段回群况片西 四定派识何间商元品族式好头路北影路土们育切保千支头是速理求很王金什热记斗形办名思料压还没深务劳名着极究光品便率八务被圆认 没国天交车别力两每布始对候往气低二代性党铁去程别任高连南自同志叫之你般务消导格水经都去区第后价本水身第单风价导林件目先根安总建业起今几都素工界数影劳马性会许根也三合选规收准满 县信老何达统又是因种节过米须出书方调来元先开

[转]51单片机 11.0592MHz 产生115200 波特率

连接:http://homezzy.blog.hexun.com/29601793_d.html 今天解决了一个小问题(查书后才得到确切结论...)用51单片机+11.0592的晶振,如何产生115200的波特率? 本来感觉这个小意思,直接初始化定时器1,程序如下: void init_com( void ) { SCON = 0x50 ; //串口工作方式1,8位UART,波特率可变 TMOD |= 0x20 ; //定时器1,工作方式2,自动再装入8位定时器 PCON |= 0x80 ; /

第十二章 Openwrt 修改串口波特率 以适应普通51不支持 115200高速率

openwrt默认使用的波特率是115200,单片机或arduino的串口波特率可自行设置.当然,一般都会设置9600,也可以设置为115200.假设现在openwrt波特率为115200,单片机的串口波特率为9600.要进行一个通信,该如何设置呢-? 一般51的单片机设置115200是比较麻烦的—而arduino就比较方便,所以还是改OPENWRT的串口波特率较好. 首先我们需要在openwrt上使用coreutils-stty这个软件更改波特率.安装coreutils-stty很简单,opk

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

51单片机程序技巧

本系列文章探讨的主题都是在Keil uVision3集成编译环境下完成的,针对的是51系列单片机. 下面就介绍一下在我的单片机程序里必须要包含的一个头文件----"const.h",完整内容如下: #ifndef _CONST_H_ #define _CONST_H_ #include <intrins.h> #define TRUE 1 #define FALSE 0 typedef unsigned char BYTE; typedef unsigned int WOR

51单片机之串口通信(一)

一.基础知识 1.串行通信和并行通信:目前用的比较多的是串行通信.串行通信优点是连接简单,传输距离远:缺点是传输速度慢. 2.串行通信:分为同步通信和异步通信:异步通信是指发送和接收设备利用各自的时钟控制数据的发送和接收. 3.串行通信的传输方向:单工,半双工,全双工. 4.波特率:每秒钟传输2进制代码的位数,如1个字节为10位,每秒传输240个字节,则波特率为10*240=2400bps,单位是bps: 5.RS-232C:25个管脚,我们用到的是PGND(保护接地).TXD(发送数据),RX

51单片机蓝牙模块

51单片机的蓝牙模块,是在蓝牙通讯的基础上,进行蓝牙51模块与外部蓝牙发射接收设备之间,相互收发数据.并且其引脚为VCC,GND,TXD,RXD,可以通过串口通信与外部上位机或单片机通信. 代码如下(注意蓝牙模块是5V供电) #include<reg52.h> void init();void delay(unsigned int ms); unsigned char input;void display(unsigned char num_decimal);unsigned char cod

51单片机-PC数据传输 温度 距离 监控系统设计

>_<:功能概述: 通过串口PC和单片机通信,可以询问单片机测得的温度,可以询问声呐测距的测量距离,同时把测量温度显示在数码管上. >_<:PC部分 这里com.cpp和com.h是串口通信的函数封装,在主函数中: 刚开始调用封装好的串口通信函数,设置打开串口COM4,波特率设置为9600,超时设置: 1 if(openport("com4")) 2 printf("open comport success\n"); 3 if(setupdc