Електронни шахматни часовници. Най-простият вариант на такъв часовник е, само два последователно включен секундомер.
Материал статия може да бъде полезна за тези, на CT започва да се развива CodeVisionAVR.
Без значение колко е голям в Интернет, обаче, прости и интересни схеми не са толкова лесни за намиране и.
Така например от типа на шахматни часовници, Google и аз не се сблъскате с подобна схема, а в действителност да направи такава схема на КН, че е лесно.
Определение: "Часовник за шах", наречен часовник с две единици време на дисплея, свързани помежду си по такъв начин, че само един от тях може да работи в същото време.
Нека ви дам един прост пример за такъв шах часовник (всъщност е прототип на хронометър. Вместо таймера за обратно отброяване. И дори опростена версия без допълнителни функции, но това може да се фиксира :)) изходния код са включени).
Функции: Контролът е проста, докато натискане на KH-1 преминава през първата хронометъра, докато натискане на KH-3 минава през 2-ри бутон хронометър KH-2 (нулиране) до нула резултатът на четене.
Ако контролът започне хронометрите използвани P2K ключ или обикновена смяна. то приблизително ще съответства на желаната функционалност на веригата.
В този проект, основната е да се използват два хронометри, ако е необходимо, броят им може да се увеличи, което може да бъде полезно и за други вериги, например, създаване на проект, в горната му част CodeVisionAVR.
Моля изберете MK и честота.
свържете дисплея да PORTB
и пристанище PORTD направя контролира входните бутони с вътрешни гостилница резистори към +.
Най-интересното нещо е да изберете таймера за точен резултат секунди.
Как се прави това, аз съм много лесно да се разбере по това време, помогна за информация от my-avr.at.ua уебсайт.
Таймер опциите на таймера Изберете 1, Clock стойност 7813 кХц, Прекъсване на: сравнение на мач, Comp. А = 1e85 (чисто показва, че той ще бъде часовник с честота от 1 секунда)
часовник стойност - отчитане на честотата
Прекъсване на сравнение на мач - прекъсне случайно с регистрирате
Тук имаме малко стоп. Какъв е този номер 1e85? Защо решихте да се вземе точно този номер?
Така че, да правилно изчисли каква е честотата на таймера който искате да отворите научен калкулатор. Брой 1e85 (това е 16-матрични нотация) в 10sitichnoy = 7813 и / час. От това следва, че 7813 (честота = 1 Hz прекъсване) на * 5 (сек) = 39065 и го трансформира в 16chnuyu / ч 9899 тогава се получи, че този брой се вмъква в Comp. А и нашата таймер ще работи с честота от 0,2 Hz, което е един път на 5 секунди.
Генериране на код и спаси.
В таймерът за код: (TIM1_COMPA)
Трябва да се прави в средата на следните редове с код:
TCNT1H = 0;
TCNT1L = 0;
За правилното функциониране на тези регистри се възлага на таймера 0.
Тук е източникът код се оказа в крайна сметка.
невалидни основни (свободен)
<
// Декларирам вашите локални променливи тук
// Crystal Oscillator фактор разделяне: 1
#pragma optsize-
CLKPR = 0x80;
CLKPR = 0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize +
# endif
ПОРТА = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x1C;
DDRD = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x05;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x1e;
OCR1AL = 0x85;
OCR1BH = 0x00;
OCR1BL = 0x00;
TIMSK = 0x40;
USICR = 0x00;
ACSR = 0x80;
lcd_init (16);
#asm ( "SEI")
докато (1)
<
lcd_gotoxy (0,0); // Поставете дисплея
lcd_putchar (hour_A / 10 + 0x30);
lcd_putchar (hour_A% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_A / 10 + 0x30);
lcd_putchar (min_A% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_A / 10 + 0x30);
lcd_putchar (sek_A% 10 + 0x30);
ако (PIND.2 == 0) // за състоянието на екрана на първия хронометъра
lcd_putsf ( "
<
lcd_putsf ( "
lcd_gotoxy (0,1); // Поставете дисплея
ако (PIND.4 == 0) // за състоянието на екрана на 2-ри хронометъра
lcd_putsf ( "START2>");
още
<
lcd_putsf ( "payza>");
>;
lcd_putchar (hour_B / 10 + 0x30);
lcd_putchar (hour_B% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_B / 10 + 0x30);
lcd_putchar (min_B% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_B / 10 + 0x30);
lcd_putchar (sek_B% 10 + 0x30);
ако (sek_A == 60)
ако (min_A == 60)
ако (hour_A == 96)
ако (sek_B == 60)
ако (min_B == 60)
ако (hour_B == 96)
#pragma optsize-
CLKPR = 0x80;
CLKPR = 0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize +
# endif
ПОРТА = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTD = 0x1C;
DDRD = 0x00;
TCCR1A = 0x00;
TCCR1B = 0x05;
TCNT1H = 0x00;
TCNT1L = 0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH = 0x1e;
OCR1AL = 0x85;
OCR1BH = 0x00;
OCR1BL = 0x00;
TIMSK = 0x40;
USICR = 0x00;
ACSR = 0x80;
lcd_init (16);
#asm ( "SEI")
докато (1)
<
lcd_gotoxy (0,0); // Поставете дисплея
lcd_putchar (hour_A / 10 + 0x30);
lcd_putchar (hour_A% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_A / 10 + 0x30);
lcd_putchar (min_A% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_A / 10 + 0x30);
lcd_putchar (sek_A% 10 + 0x30);
ако (PIND.2 == 0) // за състоянието на екрана на първия хронометъра
lcd_putsf ( "
<
lcd_putsf ( "
>;
lcd_gotoxy (0,1); //
lcd_putchar (hour_AA / 10 + 0x30);
lcd_putchar (hour_AA% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_AA / 10 + 0x30);
lcd_putchar (min_AA% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_AA / 10 + 0x30);
lcd_putchar (sek_AA% 10 + 0x30);
lcd_gotoxy (0,2); //
ако (PIND.4 == 0) // за състоянието на екрана на 2-ри хронометъра
lcd_putsf ( "START2>");
още
<
lcd_putsf ( "payza>");
hour_BB = 0, min_BB = 0, sek_BB = 0; // нулиране на текущото време
>;
lcd_putchar (hour_B / 10 + 0x30);
lcd_putchar (hour_B% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_B / 10 + 0x30);
lcd_putchar (min_B% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_B / 10 + 0x30);
lcd_putchar (sek_B% 10 + 0x30);
lcd_gotoxy (8,3); // текущото време
lcd_putchar (hour_BB / 10 + 0x30);
lcd_putchar (hour_BB% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (min_BB / 10 + 0x30);
lcd_putchar (min_BB% 10 + 0x30);
lcd_putchar ( ":");
lcd_putchar (sek_BB / 10 + 0x30);
lcd_putchar (sek_BB% 10 + 0x30);
ако (PIND.3 == 0) /общий сброс
hour_A = 0, min_A = 0, sek_A = 0; // нулиране време
hour_AA = 0, min_AA = 0, sek_AA = 0; // Reset тока
hour_B = 0, min_B = 0, sek_B = 0; // нулиране време
hour_BB = 0, min_BB = 0, sek_BB = 0; // Reset тока
>;
ако (sek_A == 60)
ако (min_A == 60)
ако (hour_A == 96)
ако (sek_AA == 60)
ако (min_AA == 60)
ако (hour_AA == 24)
ако (sek_B == 60)
ако (min_B == 60)
ако (hour_B == 96)
Свързани статии