STC15定时器4设置
要做一个STC15的定时器,产生定时中断,按照STC-ISP软件中的定时器计算器来生成定时器,工作只完成了一半,无法产生定时中断,又是百度又是手册,最终找出教科书,终于使定时中断开始工作,写下来给遇到同样问题的朋友参考。
1. 采用STC-ISP生成定时器
用STC官网提供的STC-ISP下载软件可以做许多事情。其中之一是有定时器计算器的功能。通过定时器计算器,可以选择:
- 系统时钟
- 定时长度
- 选择定时器
- 定时模式
- 定时器时钟
在这里选择了15系列的定时器4作为定时器,定时器模式只有16位自动重载模式,定时器时钟1T (FOSC)
生成的程序如下:
void Timer4Init(void) //1毫秒@11.0592MHz
{
T4T3M |= 0x20; //定时器时钟1T模式
T4L = 0xCD; //设置定时初值
T4H = 0xD4; //设置定时初值
T4T3M |= 0x80; //定时器4开始计时
}
有了这个程序后,设置一个中断程序
// Interrupt Routine of timer4
void timer4_ISR (void) interrupt TIMER4_VECTOR
{
static uint16 ui;
static uint16 ccdInt;
ui++;
ccdInt++;
if ( ui > 20 )
{
ui = 0;
Time0flag_20ms = 1;
}
if ( ccdInt > 500 )
{
ccdInt = 0;
P55 = !P55;
}
}
再在主程序中简单的设置,程序就应该运行了。
main()
{
Timer4Init();
while(1);
}
但下载运行后啥也没有发生,该闪亮的LED不闪亮!
打开定时器4中断允许
通过查看手册,注意到EI2这个寄存器,各位的定义如下:
位 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|---|
命名 | – | ET4 | ET3 | ES4 | ES3 | ET2 | ESPI | ES2 |
T4中断允许 | T3中断允许 | UART4 | UART3 | T2中断允许 | SPI | UART2 |
在头文件中有
#define ET4 0x40
所以,在初始化程序中增加
EI2 |= ET4;
IE2 |= ET4;
设置IE2寄存器的B6位为1,定时器4中断允许。这样就可以自动调用中断程序了。错,这里的坑还没有结束。
打开总中断开关
再查找,总中断还没有使能,中断程序还是不能执行。
在主程序中各项初始化完成后,打开总的中断,程序正常工作。主程序中增加EA = 1;指令,中断程序定时打开和关闭指示LED。
终于让定时器开始工作了,希望能给遇到同样问题的朋友有所帮助。
博友说的对,应该是IE2.