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
Rozpracované hodiny:
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.
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.
#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
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í:
Rozpracované hodiny:
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/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řehled komentářů
Prosím ťa v tom zipe je len program nepíše sa tam nastavenie poistiek. Lebo keď som to tam naprogramoval takto ako to je ukazuje to blbosti. Mohol by si mi prosím ťa napísať sem ako majú byť poistky
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Á
Nastavenie poistiek
(Marián, 8. 4. 2021 23:31)