① 已经51单片机的晶振频率是12MHZ 要产生4800BPS的波特率 问波特率的计算公式 还有 计算 TH1 TL1的初始值
串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。
方式0的波特率 = fosc/12
方式2的波特率 =((2^SMOD)/64)• fosc
方式1的波特率 =((2^SMOD)/32)•(T1溢出率)
方式3的波特率 =((2^SMOD)/32)•(T1溢出率)
注意:SMOD为PCON寄存器的最高位(即PCOM<7>)。
T1 溢出率 = fosc /{12×[256 -(TH1)]} --将该公式代人方式1或3
最后推出公式:TH1=256-(fosc*2^SMOD)/(baudrate*12*32);
呵呵
如果你用方式2(波特率 =((2^SMOD)/64)• fosc )的话
12M的晶振就不能得到9600波特率了(除非你改变你的晶振,但是那样的晶振好像没有卖) 所以你只能选择方式1或3
而且12M的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点
TH1又只能是整数的 所以传输时会有误差.
参考:
#include<reg51.h>
#define baudrate 9600UL
#define fosc 11059200UL//其中,UL是不能省略的,代表长整型。
unsigned char a,flag;
void serial_init(void)
{ unsigned char S_MOD=1;
TMOD=0x20;//T1工作在方式2
SCON=0x50;//SM0=0 SM1=1->串口通信在模式1,
//SM2=0->多级通信中使用的位,REN=1;
PCON=0;
if((PCON&0x80)==0x80) S_MOD=2;
TH1=256-(fosc*S_MOD)/(baudrate*12*32);//其中SMOD=0,
TL1=256-(fosc*S_MOD)/(baudrate*12*32);
TR1=1;ES=1;EA=1;
}
② 51单片机中波特率设置计算问题
波特率应该和T1有关,和T0没有什么关系。
11059200是晶振频率,baud是波特率,例如 9600
12是指时钟周期数。
③ 51单片机定时计数器溢出率计算和串口的波特率之间的关系
串口工作在方式1和3,则波特率由定时器T1的溢出率来决定,关系如下:
波特率 = ((2^SMOD)/32)*T1溢出率,
这里T1溢出率 = fosc/[12×(28-X)],则:
波特率=((2^SMOD)/32)×fosc/[12×(28-X)]
2^SMOD是2的SMOD次方,SMOD是波特率是否要加倍的控制位,默认是0,
fosc就是晶振的值,
X就是装入TH1的值。
④ 51单片机串行口工作在方式0,如何求波特率,及定时器初值!
方式0的波特率是系统时钟的十二分之一,为固定波特率,与定时器无关
定时器计算: 溢出中断的定时器 指令周期是 系统时钟的十二分之一 ,16方式
fosc=11.0592M
fcyc=11059200/12 , 定时时间 tmer ms
TH=(65535-timer*1000/fcyc)/256
TL=(65535-timer*1000/fcyc)%256
⑤ 单片机:请教一下,这里的波特率是怎么算的呢
这个应该是标准的51,以12除频来计算的,51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。因此1除以12再除以32就是除以384.
⑥ 单片机波特率计算问题
溢出速率=fosc/[12*(256-TH1初值)]
比如晶振为11.0592MHz,波特率不加倍,那么
波特率=(1/32)*11059200/12/(256-TH1初值)
如果波特率要求为9600
那么TH1初值=256-11059200/12/32/9600=256-3
⑦ MCS-51单片机串口四种工作方式的波特率如何确定
1、串口屏和软件成功联机之后,左上角会显示当前波特率。
⑧ 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单片机波特率公式
而:
溢出速率=(计数速率)/(256-TH1初值) =(fosc/12)/(256 - TH1初值)
先记住吧;
另外,纠正一下,不是一个字节要采集16次检测,而是一个二进制位要采集16次;
⑩ 单片机串行口方式0、方式1的初始化,方式1波特率的计算
51单片机 波特率= 计数器或定时器的溢出速率 / n
在用串口方式1时 计数器或定时器的溢出速率=计数速率 / (256-THx)
这中的n与你单片机在PCON中SMOD位的设置有关,
SMOD设为 1 时 n=32
SMOD设为 0 时 n=16
因T1在做波特率发生器时TH1中是重(再)装载的值
发送完成 SCON中的 ti 位为 1
新接收到信息 SCON中的 ri 位为 1
特别要注意的是二个中断标志位和其它的中断标志位全不一样,中断RETI返回指令不能对它们清除
必须在程序中用软件去清除,否则会对你无完无了的中断,嘿嘿!