freedomhit

ADuC7026定时器(原创)

0
阅读(17789)

在做ADuC7026的实验中,经常需要延时,最简单的就是delay函数,直接deley(),括号内填上适当的数值就可以延时了,但是对于7026这种41.78MHz时钟频率的单片机来说,有时甚至几纳秒的延时都会对整个程序的执行有很大的影响。为了得到精确的时间,我经常采用T1定时器,T1定时器的时间间隔按照公式:

时间间隔=TxLD设定值)/时钟源    

      只要设置好时间间隔就能直接比较准确的定时了。下面写下程序:

 T1LD=0x2000;     //设定计数器初值

T1CON=0Xc4;     //使能定时器1,周期模式运行,二进制个事,时钟周期CLK/16

     一般情况下这样就设置好了定时时间。具体设定值要参照7026的说明书,说明书中对TI定时器的各种寄存器的设置都进行了说明,很简单方便的。(推荐北京航空航天大学出版社的ADuC702x系列嵌入式系统原理及应用)

前两天在看一个德国的程序,发现T1定时器竟然还可以这样用,和大家分享一下。

         T1CON = 0x0184;   // T1       on

         Long = T1VAL + Long * 256/100;

         while ((T1VAL - Long) & 0x80000000){}

         T1CON = 0x0104;                          //T1 off 

这是程序的调用函数。当我们启用单片机的时候,单片机就赋予了T1VAL一个数值,当程序执行到这一步的时候,我们先定义一个long的值,这样long中就把T1VAL + Long * 256/100值赋给了long,单片机在执行就要进入到while函数了,函数中T1VAL – Long直接就把之前的T1VAL的初始值给消去,清除了单片机开关时对延时函数的影响,这样就能精确的计时了。(T1VAL - Long) & 0x80000000进行与运算,当与运算结果为零的时候跳出循环,下面就啰嗦一下怎么计算的吧!因为已经进行了配制T1CON = 0x0184,所以T1VAL的进行的是加运算,这样呢当T1VAL – Long结果的第三十二为不再为一的时候时候跳出循环。我们来计算一下:

设定long=100,那么long*256/100=256,也就是说当TIVAL为257的时候呢跳出循环,再来计算一下时间:

 时间=257*16/41.78M=98.4us,这样就接近了100us。比较精确了。

 

这个方法很巧妙,和大家分享下。另外,由于本人水平有限,哪里错了欢迎大家批评指正啊!哈哈!