T1用作串行口波特率发生器时,设置为工作方式1时,如何初始化?波特率如何计算?

如题所述

#include<reg51.h>

#define Baud 9600 //波特率9600
#define Fosc 11059200 //系统时钟11.0592MHz

main()
{

TMOD=0x22; //T1模式2波特率,T0模式2定1/3600秒
SCON= 0x52; //串口工作方式1,允许接收,TI=1
TL1=256-Fosc/12/16/Baud; //波特率装初值
TH1=256-Fosc/12/16/Baud;
TR1=1; //开启T1
IE=0x9A; //开总中断,开定时和串口,关外部
...
...

这里用的定时器模式2,方式2虽然定时数少一点,但是好像定时比较精确吧

看其中关于T1的部分,T0的就不要管了
TH1,TL1,在模式2下一个是用来重装初值的,一个是用来计数的

Fosc/12/16/Baud中 Fosc为系统时钟,除12是因为12个系统时钟为一个指令,除16是因为一帧的接收要经过16次扫描,即串口工作方式1下,采样频率是波特率的16倍
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-05-16
定时/计数器T1(T0)工作模式1

模式1是一个16位的定时/计数器,定时工作时计数初值:
X=216-t×fosc/12

2.模式1的使用方法

例2:用定时器T1产生一个50Hz的方波,由P1.1输出,仍用程序查询方式,fosc=12MHz。

解:方波周期T=1/50=0.02s=20ms,用T1定时10ms。

X=216-10×103×12/12=65536-10000=55536=D8F0H

源程序如下:MOVTMOD, #10H;T1模式1,定时

SETBTR1;启动`T1

LOOP:MOVTH1, #0D8H;T1计数初值

MOVTL1, #0F0H

JNBTF1, $

CLRTF1;产生溢出清标志位

CPLP1.1;P1.1取反输出

SJMPLOOP;循环本回答被提问者采纳