Аппаратные и программные средства встраиваемых систем



Pdf көрінісі
бет237/268
Дата07.01.2022
өлшемі3,23 Mb.
#18255
1   ...   233   234   235   236   237   238   239   240   ...   268

разделе 6.2. 
unsigned long __systime = 0; 
 
///////////////////////////////////////////////////////////////////////////
// Инициализация Таймера 0 (1000Гц) 
///////////////////////////////////////////////////////////////////////////
void InitSystimer0( void ) 

TCON = 0x00; 
// Выключение таймера 0 (и таймера 1) 
 TMOD = 0x01; 
// Выбор режима работы 16-разрядный таймер  
 TH0 = 0xFC;  
// Инициализация таймера 0: 
 TL0 = 0x67;  
// настройка на частоту работы 1000 Гц (чуть больше) 
 TCON = 0x10; 
// Включение таймера 0 

 
 
///////////////////////////////////////////////////////////////////////////
// Чтение милисекундного счетчика 
///////////////////////////////////////////////////////////////////////////
unsigned long GetMsCounter( void ) 

 unsigned long res
 
 ET0 = 0; 
 res = __systime; 
 ET0 = 1; 
 
 return res; 

 
///////////////////////////////////////////////////////////////////////////
// Возвращает прошедшее время (от момента замера) 
/////////////////////////////////////////////////////////////////////////// 
unsigned long DTimeMs( unsigned long t2 ) 

    unsigned long t1 = ( unsigned long )GetMsCounter(); 
 
    return t1 - t2;   

 
///////////////////////////////////////////////////////////////////////////
// Задержка в милисекундах 
///////////////////////////////////////////////////////////////////////////
void DelayMs( unsigned long ms ) 

 unsigned long t1 = ( unsigned long )GetMsCounter(); 
 
 while ( 1 ) 
 { 
  
if ( DTimeMs( t1 ) > ms ) break; 
 }   



 
253 
 
//////////////////////// T0_ISR ////////////////////////////// 
// Обработчик прерывания от таймера 0. 
////////////////////////////////////////////////////////////// 
void T0_ISR( void ) __interrupt ( 1 ) 

 // Время в милисекундах 
 __systime++; 
 
TH0 = 0xFC;  
// Инициализация таймера 0: 
 TL0 = 0x67;  
// настройка на частоту работы 1000 Гц (чуть больше) 

 
//////////////////////// SetVector ////////////////////////// 
// Функция, устанавливающая вектор прерывания в пользовательской таблице 
// прерываний. 
// Вход:      Vector - адрес обработчика прерывания
//            Address - вектор пользовательской таблицы прерываний. 
// Выход:     нет. 
// Результат: нет. 
////////////////////////////////////////////////////////////// 
void SetVector(unsigned char xdata * Address, void * Vector) 

 unsigned char xdata * TmpVector; // Временная переменная 
 // Первым байтом по указанному адресу записывается 
 // код команды передачи управления ljmp, равный 02h 
 *Address = 0x02; 
 // Далее записывается адрес перехода Vector 
 TmpVector = (unsigned char xdata *) (Address + 1); 
 *TmpVector = (unsigned char) ((unsigned short)Vector >> 8); 
 ++TmpVector; 
 *TmpVector = (unsigned char) Vector; 
 // Таким образом, по адресу Address теперь 
 // располагается инструкция ljmp Vector 

 
void main( void ) 

 unsigned char light = 1; 
 
 InitSystimer0(); 
 
 // Установка вектора в пользовательской таблице 
 SetVector( 0x200B, (void *)T0_ISR ); 
 // Разрешение прерываний от таймера 0 
 ET0 = 1; EA = 1; 
 
    while( 1 ) 
 { 
  
leds( light ); 
  
if( light == 0xFF ) light = 1; 
  
else light |= light << 1; 
  
DelayMs( 300 ); 
 } 
}     


 
254 


Достарыңызбен бөлісу:
1   ...   233   234   235   236   237   238   239   240   ...   268




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет