实验7 - 定时器实验.pdf

Timer0 寄存器配置

Timer0 的配置涉及到如下寄存器:

  • TCON:定时器/计数器控制寄存器;
  • TMOD:定时器模式寄存器;
  • Timer 0:TH0, TL0

image.png

image.png


例:配置 Timer0 为 16 位定时器,定时时间为 20ms,产生溢出中断的代码如下:

  1. /*********************************************************************
  2. * 描 述 : 配置Timer0为16位定时器,定时时间20ms,开启中断
  3. * 入 参 : 无
  4. * 返回值 : 无
  5. *********************************************************************/
  6. void Timer0Init(void)
  7. {
  8. TMOD = 0x01; //16位定时器
  9. TH0 = (65536-TIMER0_VALUE)/256; //写入初值
  10. TL0 = (65536-TIMER0_VALUE)%256;
  11. ET0 = 1; //使能Timer0溢出中断
  12. EA = 1; //使能全局中断
  13. TR0 = 1; //启动Timer0
  14. }

定时器初值计算

先计算出定时时间,再用 65536(16 位定时器)-定时时间对应的数值,即得到定时器初值

  • 系统时钟:16MHz
  • 定时器使用的是系统时钟的12分频
  • 假设预定的时间为T,对应的初值为:

定时器 - 图3
(单次T最多不到500毫秒)
以20ms为例:
image.png

代码

  1. #include <stdio.h>
  2. #include <reg24le1.h>
  3. #include <stdint.h>
  4. /* 本试验用到的nRF24LE1的管脚
  5. P00:输出,驱动指示灯D1 (需要短接跳线)
  6. */
  7. /*-------------------管脚定义--------------------------------------------------*/
  8. #define D1 P00 // 开发板上的指示灯D1
  9. #define TIMER0_VALUE 26666 //Timer0定时器定时20ms对应的数值
  10. uint8_t count=0; //软件计数变量
  11. /*******************************************************************************************************
  12. * 描 述 : 配置 IO P0.0为输出
  13. * 入 参 : 无
  14. * 返回值 : 无
  15. *******************************************************************************************************/
  16. void IO_Init(void)
  17. {
  18. P0DIR &= ~0x01; //配置P0.0为输出
  19. D1 = 1; //设置D1初始状态为熄灭
  20. }
  21. /*******************************************************************************************************
  22. * 描 述 : 配置Timer0为16位定时器,定时时间20ms,开启中断
  23. * 入 参 : 无
  24. * 返回值 : 无
  25. *******************************************************************************************************/
  26. void Timer0Init(void)
  27. {
  28. TMOD = 0x01; //16位定时器
  29. TH0 = (65536-TIMER0_VALUE)/256; //写入初值
  30. TL0 = (65536-TIMER0_VALUE)%256;
  31. ET0 = 1; //使能Timer0溢出中断
  32. EA = 1; //使能全局中断
  33. TR0 = 1; //启动Timer0
  34. }
  35. /*******************************************************************************************************
  36. * 描 述 : 主函数
  37. * 入 参 : 无
  38. * 返回值 : 无
  39. *******************************************************************************************************/
  40. void main(void)
  41. {
  42. IO_Init(); //配置IO
  43. Timer0Init(); //Timer0初始化
  44. while(1); //死循环,等待Timer0溢出中断
  45. }
  46. /*******************************************************************************************************
  47. * 描 述 : Timer0中断服务函数
  48. * 入 参 : 无
  49. * 返回值 : 无
  50. *******************************************************************************************************/
  51. void Timer0_irq() interrupt INTERRUPT_T0
  52. {
  53. TH0=(65536-TIMER0_VALUE)/256; //写入初值
  54. TL0=(65536-TIMER0_VALUE)%256;
  55. count++; //软件计数器加1
  56. if(count==25) //500ms时间到
  57. {
  58. count=0; //软件计数器清零
  59. D1 = ~D1; //D1指示灯状态取反
  60. }
  61. }