Jdi na obsah Jdi na menu
 


Digitální hodiny s mikroprocesorem

1. 3. 2011
Dnes Vám přinášíme návod na velmi jednoduché digitální hodiny s čipem ATmega8.  Hodiny se hodí jako doplněk LCD a plasmových televizí, které v drtivé většině případů neobsahují digitální hodiny jak bylo zvykem u starých CRT televizí na spodním panelu televize.
Co se týče koncepce jsou hodiny tvořeny 2 deskami plošných spojů k sobě navzájem kolmých.
Pokud se podíváme na schéma, tvoří jej vlastně jen čip, zdroj se stabilizátorem, oscilátor určující takt hodin a displej s ochrannými rezistory (R1-R8 ), které určují jas displeje. Dále není co řešit.

Pro zvětšení klikněte na obrázky

Schéma zapojení:

Obrazek


Rozpracované hodiny:

Obrazek


Uvedení do provozu:

je jednoduché. Po připojení k vhodnému napájení ( postačí běžný síťový adaptér 9V / 250mA ) se na displeji rozbliká čas " 00:00 ". Požadovaný čas nastavíme tlačítky SW a to tlačítkem  SW1 ( na desce horní tlačítko ) nastavíme minuty a SW2 ( spodní tlačítko ) hodiny.

Seznam součástek:
R1-R8 - 330R
R9-R11 - 10k
C1,C2 - 22p
C3 - 100nF
C4, C5 - 100uF/16V
IC1 - 7805 / 1A
IC4 - ATmega8-16PU  + patice 28dil
D1 - LED displej viz odkaz: CA56-21SRWA
Q1 - krystal 14.7456 MHz - HC49
SW1, SW2 - mikrotlačítka typu B 6814

Celková cena bez krabičky cirka 300 korun .
Napájecí napětí 9- 20 V ss.

DPS v 1:1, rozložení součástek, hex soubor, soubor hodiny.c a schéma v eaglu stáhnete zde

Pokud neumíte programovat a nemůžete sehnat displej, napište mi, dám Vám kontakt na člověka, který Vám mikroprocesor naprogramuje a displej pošle.


Program v jazyce C

#include <avr/io.h>//
#include <avr/interrupt.h>//
#include <avr/wdt.h>//
#include <stdio.h>//



#define _s_A  2
#define _s_B  0
#define _s_C  6
#define _s_D  4
#define _s_E  3
#define _s_F  1
#define _s_G  7
#define _s_dot 5

const unsigned char segs[] =
{
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F),    //0
_BV(_s_B) | _BV(_s_C),    //1
_BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G),    //2
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G),  //3
_BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),    //4
_BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5
_BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6
_BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),//8
_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),//9

_BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //A
_BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //B
_BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //C
_BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //D
_BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E
_BV(_s_A) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G) //F

};



#define _ms(n) (17*n)

void wait(unsigned int a)    //basic wait
{                           
volatile unsigned int b,c;
for(b=0;b!= a; b++)for(c=0;c!= 50;c++);
return;
}



unsigned char prescale=0;
unsigned char sec=0;
unsigned char min_1=0;
unsigned char min_10=0;
unsigned char hour_1=0;
unsigned char hour_10=0;
unsigned char show_t=0;


ISR(TIMER1_OVF_vect)
{
if(++prescale == 225){prescale = 0;sec++;};
if(sec>59){min_1++;sec=0;};
if(min_1>9){min_1=0;min_10++;};
if(min_10>5){min_10=0;hour_1++;};
if(hour_1>9){hour_1=0;hour_10++;};
if(hour_10>1 && hour_1>3){hour_1=0;hour_10=0;};

if(++show_t==4) show_t=0;
switch(show_t)
{
case 0:    //show minutes
PORTC = 0x04;
PORTD = (~segs[min_1]);
break;
case 1:    //show 10 minutes
PORTC = 0x08;
PORTD = (~segs[min_10]);
break;
case 2:    //show hours
PORTC = 0x10;
PORTD = (~segs[hour_1]) & ~_BV(_s_dot);
break;
case 3:    //show 10hours
PORTC = 0x20;
PORTD = (~segs[hour_10]);
break;
default:
show_t = 0;
break;
}   
return;
}


#define B1() (bit_is_clear(PINB,3))
#define B2() (bit_is_clear(PINB,4))
#define B_WAIT 300

#define nop() asm volatile ("nop;")

int main(void)
{

TIMSK = 0x04;
TCCR1B = 0x01;

DDRD = 0xFF;
DDRC = 0x3F;
DDRB = 0x00;
PORTB = 0xFF;

sei();
while(1)
{
if(B1())
{
wait(_ms(B_WAIT));
min_1++;
sec=0;
}
if(B2())
{
wait(_ms(B_WAIT));
hour_1++;
sec=0;
}
}
}



Popis, úprava, fotky: Volta190 (c). Zdroj: ok1kv
 

Komentáře

Přidat komentář

Přehled komentářů

Programování

(Michal Vyplel, 15. 1. 2016 15:40)

Musí se to před programováním nějak upravit (nastavení pojistek) ?? nebo je to obsaženo přímo v programu ?? PROSÍM SPĚCHÁ