本帖最后由 770781327 于 2015-9-16 19:13 编辑
R7F0C809有个定时器阵列单元
配置有4个16位定时器
比较有特色不同于其他的是不是不同的定时器哦,而是个定时器阵列,这就意味着各 16 位定时器,既能分别用作独立的定时器,也能组合多个通道用作高级的定时器功能。
这样定时器使用自由,功能更为强大
16位定时器也可拆分2个8位定时器来使用
考虑到项目需要,设置一个1ms的定时中断,计数到1000即1s时把LED2取反一次,
程序也很简单啦,
首先定时器初始化
- void Timer_Init(void)
- {
- TAU0EN = 1;
- TPS0 & = 0x00;
- TT0 |= 0x0FU;
- TMMK00 =1U;
- TMIF00 =0U;
- TMPR100 = 1U;
- TMPR000 = 1U;
- TMR00H = 0x00U;
- TMR00L = 0x00U;
- TDR00H = 0x4EU;
- TDR00L = 0x20U;
-
- TO0 &= 0x0EU;
- TOE0 |= 0x01U;
- }
复制代码此处初始化时有点错误有点问题,后来参考强仔的修改了下
所用系统时钟为20MHz,设定定时时钟的分频系数为0,计数器时钟的周期为:1/20000000Hz = 0.05us,需要设置产生的中断为0.1ms,所以可以算出TDR00 = (0.1 / 0.00005)-1=19999,转成16进制就是0x4E1F,因为TDR00分为高八位的TDR00H和第八位的TDR00L,所以装的初值为:
TDR00H = 0x4EU;
TDR00L =0x1FU;
然后设定定时器中断
- void Timer_Channel1_Interrupt(void)
- {
- if (++inttm00counter ==1000U)
- {
- TDR00H =0x4EU;
- TDR00L = 0x1FU;
-
- P0 ^=0b00000010U;
- inttm00counter =0U;
- count++;
- }
- }
复制代码主函数初始化时钟、led、引脚、定时器就行
- void main(void)
- {
- System_Init();
- LED_Init(); /* Sets used ports */
- Timer_Init();
- while (1)
- {
- }
- }
复制代码实际效果
有了定时中断,下面就可以修改数码管处的代码了
另外谁能告诉我
/*¸ø¶¨ê±Æ÷×°3õÖμ */这种注释乱码如何解决?每次重新打开工程,程序注释就变这样