传统51MCU的定时器没有时钟输出功能,此处使用的是增强型51MCU,型号stc12c5a60。
寄存器功能介绍之类的就省略了,数据手册上写的足够明了。由于protues不支持stc增强型MCU,只能烧写到芯片中,再用示波器验证。这点对于个人用户而言还是挺不方便的
真心希望哪天stc能提供protues的仿真元件。
STC提供了3路时钟输出,可以运行在1T/12T(即,对系统时钟12分频)模式下,1T模式感觉都可以取代其PCA的高速输出模式。
下面罗列代码,T0工作在1T模式/T1工作在12T模式。
#include "STC/STC12C5A.H"
#define MakeByte(target, Hi,Lo) \
do{ \
target |= (((Hi)<<4)|(Lo)); \
}while(0); \
#define SetTH(n,val) \
do{ \
TH##n = val; \
}while(0); \
#define SetTL(n,val) \
do{ \
TL##n = val; \
}while(0); \
#define StartTn(n) \
do{ \
TR##n = 0x01; \
}while(0); \
#define Enable1TMode(n) \
do{ \
AUXR |= n; \
}while(0); \
#define EnableClkOut(n) \
do{ \
WAKE_CLKO |= n; \
}while(0); \
int main()
{
//T1 T0工作在定时器输出时,只能工作在模式2
MakeByte(TMOD,0x02,0x02);
//允许T1(P3.5)脚输出溢出脉冲
EnableClkOut(T1CLKOEN);
//T1 12分频,输出时钟频率 = Fosc/(12*(256-TH1)*2)
SetTL(1,0x38);
SetTH(1,0x38);
//开启1T模式
Enable1TMode(T0x12);
//允许T0(P3.4)脚输出溢出脉冲
EnableClkOut(T0CLKOEN);
//T0 1分频 输出时钟频率 = Fosc/((256-TH1)*2)
SetTL(0,0xF4);
SetTH(0,0xF4);
StartTn(1);
StartTn(0)
while(1);
}
感觉时钟输出功能就是把本来应该在中断中翻转引脚的功能,拿到MCU内部由片上系统实现了,所以输出的时钟频率被减半了。(2次时钟中断正好完成一个波形周期)
鉴于示波器比较简陋,就不上图了