home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / wgelectr / pk51demo / files.2 / EXAMPLES / TDP / TIMER.C < prev   
C/C++ Source or Header  |  1995-06-08  |  4KB  |  133 lines

  1. /*------------------------------------------------------------------------------
  2. TIMER.C:  Timer tick routines.
  3.  
  4. Copyright 1995 KEIL Software, Inc.
  5. ------------------------------------------------------------------------------*/
  6.  
  7. #include "tdp.h"
  8. #include <reg51.h>
  9.  
  10. /*------------------------------------------------------------------------------
  11.          Local Macro and Manifest Constant Declarations
  12. ------------------------------------------------------------------------------*/
  13. #define TIMER0_COUNT        0xDC11        /* 10000h - ((11,059,200 Hz / (12 * FREQ)) - 17)  */
  14.  
  15. /*------------------------------------------------------------------------------
  16.               Local Variable Declarations
  17. ------------------------------------------------------------------------------*/
  18. static xdata unsigned timer0_tick;
  19.  
  20. /*------------------------------------------------------------------------------
  21. static void timer0_isr (void);
  22.  
  23. This function is an interrupt service routine for TIMER 0.  It should never
  24. be called by a C or assembly function.  It will be executed automatically
  25. when TIMER 0 overflows.
  26. ------------------------------------------------------------------------------*/
  27. static void timer0_isr (void) interrupt 1 using 1
  28. {
  29. P1 |= 0x80;
  30.  
  31. /*------------------------------------------------
  32. Adjust the timer 0 counter so that we get another
  33. interrupt in 10ms.
  34. ------------------------------------------------*/
  35. TR0 = 0;                /* stop timer 0 */
  36.  
  37. TL0 = TL0 + (TIMER0_COUNT & 0x00FF);
  38. TH0 = TH0 + (TIMER0_COUNT >> 8);
  39.  
  40. TR0 = 1;                /* start timer 0 */
  41.  
  42. /*------------------------------------------------
  43. Increment the timer tick.  This interrupt should
  44. occur approximately every 1ms. So, the resulotion
  45. of the timer will be 1kHz not including interrupt
  46. latency.
  47. ------------------------------------------------*/
  48. timer0_tick++;
  49.  
  50. P1 &= ~0x80;
  51. }
  52.  
  53. /*------------------------------------------------------------------------------
  54. void timer0_initialize (void);
  55.  
  56. This function enables TIMER 0.  TIMER 0 will generate a synchronous interrupt
  57. once every 1kHz.
  58. ------------------------------------------------------------------------------*/
  59. void timer0_initialize (void)
  60. {
  61. INT_DISABLE;            /* disable interrupts */
  62.  
  63. timer0_tick = 0;
  64.  
  65. TR0 = 0;            /* stop timer 0 */
  66.  
  67. TMOD &= ~0x0F;            /* clear timer 0 mode bits */
  68. TMOD |= 0x01;            /* put timer 0 into 16-bit no prescale */
  69.  
  70. TL0 = (TIMER0_COUNT & 0x00FF);
  71. TH0 = (TIMER0_COUNT >> 8);
  72.  
  73. PT0 = 0;            /* set low priority for timer 0 */
  74. ET0 = 1;            /* enable timer 0 interrupt */
  75.  
  76. TR0 = 1;            /* start timer 0 */
  77.  
  78. INT_ENABLE;            /* enable interrupts */
  79. }
  80.  
  81. /*------------------------------------------------------------------------------
  82. unsigned timer0_count (void);
  83.  
  84. This function returns the current timer0 tick count.
  85. ------------------------------------------------------------------------------*/
  86. unsigned timer0_count (void)
  87. {
  88. xdata unsigned t;
  89.  
  90. INT_DISABLE;
  91. t = timer0_tick;
  92. INT_ENABLE;
  93.  
  94. return (t);
  95. }
  96.  
  97. /*------------------------------------------------------------------------------
  98. unsigned timer0_elapsed_count (
  99.   unsigned count);
  100.  
  101. This function returns the number of timer ticks that have elapsed since the
  102. specified count.
  103. ------------------------------------------------------------------------------*/
  104. unsigned timer0_elapsed_count (
  105.   unsigned count)
  106. {
  107. return (timer0_count () - count);
  108. }
  109.  
  110. /*------------------------------------------------------------------------------
  111. void timer0_wait (
  112.   unsigned count);
  113.  
  114. This function waits for 'count' timer ticks to pass.
  115. ------------------------------------------------------------------------------*/
  116. void timer0_wait (
  117.   unsigned count)
  118. {
  119. xdata unsigned start_count;
  120.  
  121. start_count = timer0_count ();
  122.  
  123. while (timer0_elapsed_count (start_count) <= count)
  124.   {
  125.   }
  126. }
  127.  
  128. /*------------------------------------------------------------------------------
  129. ------------------------------------------------------------------------------*/
  130.  
  131.  
  132.  
  133.