предпредпоследнюю секундуlong i;// Для затримок
# define STRINGVECTOR (x) #x//Шаблон для обробників переривань
# define ISR (a, b)
_ Pragma (STRINGVECTOR (vector=(b)))
__ interrupt void (a) (void) (TIM1_OVF, TIM1_OVR_UIF_vector)//Переривання по переповненню таймера
{
c=b;// Оновлюємо значення кількості оборотів в останню, передостанню секунду і т.д.
b=a;
a=obSec;
obMin=(a + b + c) * 5;// Вважаємо кількість оборотів за 3 секунди і множимо на 5,
//т.к. за один оборот датчик 4 рази змінює стан (при двох магнітах на валу)
obSec=0;// Скидаємо лічильник оборотів за поточну секунду
IntToStr (obMin);// перегонимо в текст
LCD_Write_String (display_str);// Виводимо на екран
TIM1_SR1_bit.UIF=0;// Скидання прапора переривання
}; LCD_init ()//Функція ініціалізації LCD
{
CLK_SYSCLKDivConfig (CLK_SYSCLKDiv_1);// Вимикаємо визначник. Тепер МК працює на частоті 16МГц.
CLK_PeripheralClockConfig (CLK_Peripheral_LCD, ENABLE);// Подаємо тактовий сигнал на LCD.
CLK_PeripheralClockConfig (CLK_Peripheral_RTC, ENABLE);// Подаємо такт на RTC
CLK_RTCClockConfig (CLK_RTCCLKSource_LSI, CLK_RTCCLKDiv_1);// Прибираємо прескаллер RTC
LCD- gt; CR1=(3 lt; lt; 1) + (5 lt; lt; 3);// Duty=1/4, Blink Freq=LCDclk/256
LCD- gt; CR2=(6 lt; lt; 1) | LCD_CR2_HD;// Контрастність=6 (з 7), низькоомний драйвер.
LCD- gt; FRQ=(2 lt; lt; 4);// LCDclk=32768/2/(2 ^ 1 * 16)=512Hz
//Задіяні всі сегменти:
LCD- gt; PM [0]=0xFF;
LCD- gt; PM [1]=0xFF;
LCD- gt; PM [2]=0xFF;
LCD- gt; CR3 |=LCD_CR3_LCDEN | 2;// ВКЛ і deadtime=2
LCD_Contrast (5);
LCD_Write_String ( Hello );
for (i=0; i lt; 200000; i ++) {asm ( nop );};
LCD_Write_String ( world );
for (i=0; i lt; 200000; i ++) {asm ( nop );};
LCD_Write_String ( 0000 );
//for (i=0; i lt; 300000; i ++) {asm ( nop );};
} Timer1_init ()//Функція ініціалізації таймера 1
{
CLK_PCKENR2_bit.PCKEN21=1;// Включаємо тактирование таймера 1
TIM1_PSCRH=5;
TIM1_PSCRL=255;
TIM1_ARRH=(10000) gt; gt; 8;// Частота переповнень=16М/1600/10000=1 Гц
TIM1_ARRL=(10000) amp; 0xFF;
TIM1_CR1_bit.URS=1;// Переривання тільки по переповненню лічильника
TIM1_EGR_bit.UG=1;// Викликаємо Update Event
TIM1_IER_bit.UIE=1;// Дозволяємо переривання
TIM1_CR1_bit.CEN=1;// Запускаємо таймер
} main (void)//Основна програма
{
asm ( RIM );//Глобально дозволяємо переривання
//Налаштовуємо вхід
PC_DDR_bit.DDR1=0;// На вхід
PC_CR1_bit.C11=1;// Підтягаючий резистор
PC_CR2_bit.C21=0;// Переривання запрещено_SYSCLKDivConfig (CLK_SYSCLKDiv_1);// Вимикаємо визначник. Тепер МК працює на частоті 16МГц.
//ініціалізувавши дисплей і таймер
LCD_init ();
Timer1_init (); _ t sost;// Стан датчика
//У циклі основна програма перевіряє стан датчика і якщо воно змінилося, інкрементує лічильник
while (1) {
sost=PC_IDR_bit.IDR1;// Записуємо поточний стан датчика
//затримка для виключення брязкоту
for (i=0; i lt; 1000; i ++) {
asm ( nop );
}
if (PC_IDR_bit.IDR1!=sost) obSec ++;// Інкрементіруем лічильник, якщо стан датчика змінилося
if (obSec == 167) obSec=0;// Перевіряємо - чи не пішов він за межа
};
}
5. Адаптація пристрою до промислового застосування
У представленому вигляді пристрій для промислової експлуатації не підходить - плата STM8L-Discovery призначена для налагодження та має багато надлиш...