定时器:
定时器学习关键一步,就是能够看明白下面 定时器模式0的框架图。
如果你正真理解了这个框架图,那么定时器、计数器,甚至串口的波特率设定,都不在话下。
那么就一定要耐着心思,把这个框框图看明白!
上面标识出来了两部分。
定时器各种模式,
在模块1这部分,控制是相同的;
在模块2这部分,就是要根据是13/16/8位计数的不同,采用不同的公式计算即可。
模块一,对应的控制寄存器主要有两个。
TMOD :
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
GATE | C/~T | M1 | M0 | GATE | C/~T | M1 | M0 |
T1方式字段 | T0方式字段 |
TCON:
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
T1溢出标识 | T1运行控制 | T0溢出标识 | T0运行控制 | T1中断申请标志位 | 同IE1 | 同IT1 | |
IT1说明:IT1=0时,对应中断在每个机器周期(S5P2)采样~INT1为低电平时,则至IE1为1.响应中断后,该位由硬件清零。IT1=1时,为~INT1由高电平到低电平变化时,才触发中断IE1 |
简单识别一下上个框框图中一部分,如下:
由上图逻辑关系可知,GATE位如果为0(注意:GATE位后有一个“非门”),则经过 “或门” 输出后,输出点一定为 1;而且该输出点位,不再受INT(外部中断脚位)控制。也就说明,GATE为0时,一定是作为 定时器 而 非计数器用的。
TR位,只有为1,后端定时、计数功能才会起作用。如果TR为0,则通过框框图可知,定时/计数功能,已关闭了。
其他位,实际都比较好理解。如:C/~T / IE / IT / TF,不过要要注意下 IT位选择,IT位控制了 中断触发模式,IT=0 时,为低电平触发;IT=1时,为电平高→低变化时触发中断。
模块2:
该部分只提供一个模式0的公式,实际上这部分就是一个算数的问题。
CusTimeLen = (2(13/16/8次方) - X)*12/晶振频率
值得说明的是 模式0 13位计数时,寄存器的设定要注意移位。
例如:
X = 0x1E0C
那么TH0 = 0xF0(0x1e<<3)
TL0 = 0x0C
因为 模式0 , THX 低五位 溢出后,便进位。因此,计算出结果后,要讲高8位,左移三位后,得到THx的值。
串口:
控制寄存器如下:SCON
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
模式设定:0,1,2,3 | 在模式2,3中,当SM2=1时,则RB8,即接收到的第9位为0时(即接收的为数据时),不触发RI,串口读中断。这一点,为多机通讯提供了可能,如果有多个“子机”,只有“主机”端,接收到了RB8为1时,才会主动去开启RI,等待数据传过来。 | 接收控制 | 方式2,3中使用。TB8可作为奇偶校验位;或“地址(1)”和“数据(0)”的识别位。TB8和RB8是相互的 | 发送中断标记 | 接收中断标记 |
波特率 = 2(SMOD)/32*定时器1的溢出率。
定时器1的溢出率,可通过第一部分定时器说明设定即可。