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的波特率了。