T0的时钟输出引脚是在T0CLKO/P3.5。要想在这里输出时钟我们要配置寄存器INT_CLKO(AUXR2),寄存器INT_CLKO如下表:
T0的时钟输出需要设置T0CLKO(B0)位。当其为1时,允许T0定时器对外输出时钟,输出时钟频率 = T0溢出率 / 2。当其为0时,不允许T0定时器对外输出时钟。(T0的溢出率是指每秒T0上溢的次数)。
我们还可以选择,是否让T0以8051的12倍率工作。
当T0x12配置为
1 时,T0以传统8051的12倍运行,即不分频。当T0x12配置为
0 时,T0的速度和传统8051一样,即12分频。
然后就是和传统的8051一样配置TMOD和TCON寄存器。
下面是测试代码:
#include <reg51.h>
sfr INT_CLKO = 0x8f; //中断及时钟输出寄存器地址配置
sfr AUXR = 0x8e; //辅助特殊功能寄存器配置
sbit T0CLKO = P3^5;
void main()
{
AUXR = 0x80; //T0x12 = 1, 不分频,8051的12倍
TMOD = 0x00; //设置定时器0为模式0,即16位自动重载模式
TH0 = 0xd1; //由于CLK_DIV初始为0x00,那么系统时钟频率 = 主时钟频率 = 11.0592Mhz。大约是12个时钟为1us
TL0 = 0x20; //输出频率 = 12000000/(65536 - 53536)/2 = 500Hz (大致)
TR0 = 1; //开定时器0
INT_CLKO = 0x01; //允许定时器0在引脚T0CLKO/P3.5处输出时钟
while(1)
{
};
}
测试结果:
结论:感觉确实没有12MHz,但是挺接近的。示波器上显示与500Hz差得应该不是太多吧!
下面我们再试试使对定时器 0 引脚 T0/P3.4的外部时钟进行输出。这里外部时钟使用T3输出的时钟。
T3输出时钟要配置以下寄存器:
如果我们想把T3的时钟输出的话,那么就只需把T3T4M配置为0000,1011,即0x0B。
T3H和T3L的地址如下表:
示例代码如下:
/*STC15W4K32S系列 T0外部时钟输出测试*/
#include <reg51.h>
sfr INT_CLKO = 0x8f; //中断及时钟输出寄存器地址定义
sfr AUXR = 0x8e; //辅助特殊功能寄存器地址定义
sfr T4T3M = 0xD1; //T3和T4的控制寄存器地址定义
sfr T3H = 0xD4; //T3的初始计数地址高8位地址定义
sfr T3L = 0xD5; //T3的初始计数地址低8位地址定义
sfr P3M0 = 0xB1; //P3口端口模式寄存器地址定义
sfr P3M1 = 0xB2;
//sbit T0CLKO = P3^5; //可以不定义,但这个可以提醒程序员这个脚已经用掉了
//sbit T3CLKO = P0^4; //同上
void main()
{
T3H = 0xff; //12MHz/(65536 - 65524) = 1MHz , 溢出率
T3L = 0xf4; //输出频率 = 1MHz/2 = 500KHz
T4T3M = 0x0B; //定时器3的相关设置T3R = 1,T3_C/T = 0,T3x12 = 1, T3CLKO = 1
AUXR = 0x80; //定时器0 T0x12 = 1,不分频,8051速度的12倍
TMOD = 0x04; //定时器0设置成为计数模式,从P3^4输入的脉冲计数,16位自动重载
TH0 = 0xfe;
TL0 = 0x0c; //时钟频率 = 500KHz/(65536 - 65036)/2 = 500Hz
TR0 = 1; //开定时器0
INT_CLKO = 0x01; //T0CLKO = 1允许定时器0输出时钟
while(1)
{
}
}
实验结果: