MOD: Timer/Counter Mode Control Register

TMOD是一个8位寄存器,用于逐位定义定时器/计数器的设置。然而,由于只能使用字节寻址,其字节地址为$89H$。D0~D3用于设置T0定时/计数器,D4~D7用于设置T1定时/计数器。

GATE: Gate Control Bit

GATE的值决定了定时器/计数器的启动方式。当GATE=0时,只需在编写程序时将TCON中的TRO或TR1设置为1,即可启动定时器/计数器工作。而当GATE=1时,除了需要在编写程序时将TCON中的TRO或TR1设置为1外,还需要外部引脚为高电平才能工作。

C/T: Count/Timer Mode Switch

C/T的值决定了定时器/计数器的工作模式。当C/T=0时,为定时模式;当C/T=1时,为计数模式。

M1和M0: Mode Selection for Timer/Counter

通常使用16位计时计数器。

TCON: Timer Control Register

TCON的作用是控制定时器的启停、标志定时器溢出和中断情况。

TF1: Timer Flag 1

TF1=1表示T1有中断产生。(Timer Flag,定时器标志位)

TR1: Timer Run Control 1

TR1=1表示T1开始运行。(单片机中T0引脚需要高低电平驱动)

TF0: Timer Flag 0

TF0=1表示T0有中断产生。

TR0: Timer Run Control 0

TR0=1表示T0开始运行。(单片机中T1引脚需要高低电平驱动)

IE1: Interrupt Enable 1

IE1=1表示INT1有中断产生。

IT1: Interrupt Trigger Type 1

IT1=1表示INT1为下降沿触发,IT1=0表示INT1为低电平触发。

IE0: Interrupt Enable 0

IE0=1表示INT0有中断产生。

IT0: Interrupt Trigger Type 0

定时器的工作方式(关于定时/计数器的4种工作方式,以下会有具体介绍):

1. 方式0:N=13(此为TH为8位,TL为5位)

2. 方式1:N=16(此为TH为8位,TL为8位)

3. 方式2:N=8(此为TH为8位,TL为0位)

4. 方式3:N=8(此为TH为8位,TL为8位,只适用于T0,且T0被分成两个独立的8位计数器TH与TL)

根据定时时间和工作方式,通过公式:定时时间T=(2的N次方-X)12/单片机晶振频率,计算出时间常数X。把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定时了。

定时器的3种工作方式图解:

1. 工作方式0:

2. 工作方式1:

3. 工作方式2:

4. 工作方式3:

总结定时器的操作步骤如下:

1. 选择工作方式(设置M0,M1的值)

2. 选择控制方式GATE(为0是只要软件设定好参数即可,为1则需要软件设定参数,且定时器/计数器的中断引脚需要为高电平)

3. 确定定时器的工作模式,是定时模式还是计数模式 C/T。

4. 给定时器设初值(设置THX与TLX)

5. 开启定时器中断(设置ET0或ET1)

6. 开启总中断(设置EA的值)

7. 定时器/计数器的选择T0/T1(设置TR1或TR0的值)

例:设置一个LED灯每500ms的评率闪烁

c51单片机中断程序中的interrupt1、2、3是由什么决定的?

interrupt X 语句 X是中断标号,计算公式是:(地址-3)/8=中断标号,其中“地址”*/指的是中断服务程序的入口地址,比如:

外部中断0,入口地址为0003H,对应的中断标号为0

外部中断1,入口地址为0013H(十进制为19),对应中断标号为2

定时器0中断,入口地址为000BH(十进制为11),对应中断标号为1

定时器1中断,入口地址为001BH(十进制为27),对应标号为3

串口中断,入口地址为0023H(十进制为35),对应中断标号4

入口地址在数据手册里有。

以下是根据您提供的内容重构的文本:

TL0和TH0是51单片机定时器0的低8位和高8位寄存器。当TL0的低5位溢出时,向TH0进位;当TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。TL0和TH0的值是由机器周期、计数速率、晶振频率等参数计算得出的。在中断函数中重新赋初值是为了确保定时器的计数值正确,避免下次计数值为65535(16位最大计数值),而不是922(上图中的922)。

计算TL0和TH0的方法如下:假设计时10毫秒,即10ms=10000ms/1.085(机器周期)=9216次。那么,65535(16位最大计数值)- 9216=56319,转换为16进制为0xDBFF。因此,TH0=0xDB,TL0=0xFF。

机器周期是指一个机器周期等于12个晶振周期。对于51单片机而言,公式为:12/fsoc。其中fsoc是晶振频率。波特率=(2SMOD/32)*T1溢出率=(计数速率)/(256-TH1初值)。为了计算溢出速率,需要将计数速率除以((256-TH1初值)/fosc)。其中fosc是晶振频率,T1溢出率是指定时器每秒钟溢出的次数。

希望这些信息对您有所帮助。如果您还有其他问题,请随时问我。

当SMOD=1时,K=2,波特率加倍,公式为:

```

波特率 = K × 11059200 / 32 × 12 × (256 - TH1)

```

所以,TH1=0xfa=256-(2×11059200/384×波特率)。其中波特率为9600。这时,即使令TH1=0xff,所得波特率最大只能为57600,也就是说,这样无法得到115200的波特率。

为了实现115200的波特率,可以采用以下方法:

1. 换晶振,使用22.1184M晶振,在TH1=0xff时,刚好可以产生115200波特率。

2. 采用6个时钟周期的单片机(换单片机啊...)。

3. 增强型51单片机有定时器2!(幸好偶用的是增强型...)。

这里选择第三种方法。此时的波特率公式如下:

```

波特率 = 11059200 / { 32 × [65536 - (RCAP2H, RCAP2L)] }

```

其中的RCAP2H,RCAP2L为自动重装值,由上式得:

```

RCAP2H, RCAP2L = 65536 - 11059200 / (32 × 波特率)

```

这样得到波特率为115200时,RCAP2H,RCAP2L=0xff,0xfd。初始化程序如下:

```c

void init_com( void ) {

SCON = 0x50; //串口工作方式1,8位UART,波特率可变

TH2 = 0xFF; //波特率:115200 晶振=11.0592MHz

TL2 = 0xFD; //波特率:115200 晶振=11.0592MHz

RCAP2H = 0xFF; //16位自动再装入值

RCAP2L = 0xFD; //16位自动再装入值

/*****************/

TCLK = 1; //时钟信号使能

RCLK = 1; //时钟信号使能

C_T2 = 0; //计数器清零

EXEN2 = 0; //波特率发生器工作方式

/*****************/

TR2 = 1; //定时器2开始

}

```

OK! 这样就实现了用51单片机+11.0592的晶振,产生115200的波特率了。