我非常喜欢使用51系列单片机做一些程序开发,可能有人觉得都已经落伍的8位单片机,不值得用。对我来说,只要能快速开发出可用的应用就行,8位也好,32位也好,对于简单控制类应用而言,我觉得影响不大。51单片机中,我最喜欢用STC的。因此买了很多他家的51系列8位单片机。
这几天用来测试程序代码的时候,用了IAP15W4K58S4这款芯片。程序中使用TIME4的定时中断来产生计时时钟信号,按照手册中的说明:
如果主频使用1..0592MHz,那么在1T模式下,根据公式:
T4工作在1T模式(T4T3M.5/T4x12=1)时的输出频率 = (SYSclk) / (65536-[RL_TH4, RL_TL4])/2,设置定时参数为10240,那么得到的频率是:
11.0592 * 10^6/(65536-10240)/2=100Hz,也就是10ms的周期
主要测试代码如下:
// 工作频率为11.0592MHz #define FOSC 11059200L // 100Hz,10ms单位 #define Tfout 10240 // (65536-FOSC/200/2) //1T //======================================================================== // 函数: t4int // 描述: Timer4中断函数. // 参数: none. // 返回: none. // 版本: V1.0, 2020-09-23 //======================================================================== void t4int(void) interrupt 20 { P45 = !P45; //将测试口取反,则闪烁频率=定时器产生的频率的一半 } // 初始化定时器4,允许中断,10ms,100Hz方式 void initTimer4(void) { T4T3M |= 0x20; // 定时器4为1T模式 // T4T3M &= ~0x20; // 定时器4为12T模式 T4L = Tfout; // 初始化计时值 T4H = Tfout >> 8; T4T3M |= 0x80; // 定时器4开始计时 IE2 |= 0x40; // 开定时器4中断 EA = 1; }
按照这个参数,每隔10ms翻转P45的输出,那么P45的输出评率就是20ms,频率就是50Hz。
我烧录时的参数设置如下:
选的是11.0592MHz烧录的,实测波形如下所示:
看没看出来,是不是有点对不上了。实测是P45的运行周期为10ms的脉冲。与预想不一致啊。
然后我有选择时钟频率为22.1184MHz来烧录,也就是主频加倍了。测出来的波形如下:
实际测量出来的周期为5mS。从简单的逻辑上讲,主频加倍了,定时周期减少一半,那不是很正常吗?没错,从这个逻辑讲,一点问题没有。但是,但是哈,我们别忘了,还是要用公式来验证,才是正常的方式。我们之前设置的定时初始化参数没变,还是10240,那么根据公式,
输出频率 = (SYSclk) / (65536-[RL_TH4, RL_TL4])/2
输出频率=22.1184 * 10^6 / (65536-10240)=200Hz,即定时周期为5mS。因此P45翻转的周期应该为10mS,和实际测量依旧是差了一倍。现在问题出在哪里呢?我觉得很可能是我理解错了,手册中说明的那个频率实际上指的就是定时周期时长乘以2以后的频率,这样的话,就能对得上了。因为定时器的工作模式是按照以下方式处理的。
1、在初始值的基础上,没一个工作频率的周期上累加一次
2、累加到寄存器溢出时,产生中断信号
因此,对于10240的初始值,65536-10240=55296,若工作频率为11.0592MHz(即时钟周期为1/11059200秒),则中断发生的周期为:
55296 * (1 / (11059200))=0.005秒,即5毫秒。这个是中断产生的周期,考虑到一个完整的脉冲信号需要翻转两次才能出现,所以要乘以2,才是完整脉冲的周期。这样的话,对11.0592MHz的工作频率,10240的初始值,产生的脉冲周期就是10mS,就是100Hz频率的信号,这样就对上了。
因此,在看手册的时候,不能想当然地去理解,一定要实践,才能得到正确的认知。