Часы на 74HC595

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 10 декабря 2020, 21:37

Часы состоят из
1. Семи сегментного четырех разрядного дисплея с общим катодом или анодом (разный код, но схема общая).
2. Сдвиговый регистр 74HC595 - 2 штуки
3. Модуль часов реального времени DS1307.
3. Плата Ардуино.
Схема

Часы на 74HC595.jpg
Часы на 74HC595
Часы на 74HC595.jpg (58.35 КБ) 3017 просмотров

1 Часы на 74HC595.jpg
Часы на 74HC595

Скетч для общего анода

Скетч для общего анода

Код: Выделить всё

/*
********************************************************************
  Name    : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
  Author  : CheBuraw
  Date    : 12 Feb, 2015
 Optimiser: Datak
  Version : 1.1
********************************************************************

4-разрядный 7-сегментный индикатор. общий анод
                1  A  F 2  3  B
 _______________|__|__|__|__|__|_____________
|         |         |    |         |         |
|    A    |    A    |    |    A    |    A    |
| F     B | F     B | dp | F     B | F     B |
|    G    |    G    |    |    G    |    G    |
| E     C | E     C | dp | E     C | E     C |
|    D    |    D    |    |    D    |    D    |
|_________|_________|____|_________|_________|
                |  |  |  |  |  |
                E  D dp  C  G  4

74HC595 Map:
     _______
Q1  |1 *  16|  Vcc                  PINS 1-7, 15   Q0 - Q7   Output Pins
Q2  |2    15|  Q0                   PIN 8     GND       Ground, Vss
Q3  |3    14|  DS                   PIN 9    Q7"       Serial Out
Q4  |4    13|  OE                   PIN 10     MR      Master Reclear, active low
Q5  |5    12|  ST_CP                PIN 11     SH_CP     Shift register clock pin
Q6  |6    11|  SH_CP                PIN 12     ST_CP     Storage register clock pin (latch pin)
Q7  |7    10|  MR                   PIN 13     OE      Output enable, active low
GND |8_____9|  Q7"                  PIN 14     DS      Serial data input
                                    PIN 16     Vcc       Positive supply voltage
           _______
   LED B -|1 *  16|-5V
   LED C -|2    15|-LED A
   LED D -|3    14|-PIN 11
   LED E -|4    13|-GND
   LED F -|5    12|-PIN 8
   LED G -|6    11|-PIN 12 ; 1uF TO GND
   LED dp-|7    10|-5V
      GND-|8_____9|-NILL
      
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты 
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 11;     //Пин подключен к DS входу 74HC595

int TimeLight = 5;  //время для разогрева сегментов

byte SegDisplay; // переменная для вывода символов на индикаторе
byte RazrDisplay; // переменная для включения разрядов

// Настройка комбинации для отображения каждого номера на дисплее.

byte g_digits[11]={
 B01000000, B01111001,    // 0 1
 B00100100, B00110000,    // 2 3
 B00011001, B00010010,    // 4 5
 B00000010, B01111000,    // 6 7
 B00000000, B00010000,    // 8 9
 B11111111, };      // все сегменты выключены

byte g_registerArray[4]={8,4,2,1}; //массив цифр, указывающий разряды

void setup() {
  Wire.begin();
  RTC.begin();
  
// обозначаем все пины как выходы
  pinMode(latchPin, OUTPUT); 
  pinMode
(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  int hour,minute,disp = 0;

  DateTime now = RTC.now(); //Создаём переменную для вывода времени

  hour = now.hour(); // Считываем значение часов
  minute = now.minute(); // Считываем значение минут
  
  disp 
= (hour * 100) + minute; //"Собираем" значения часов и минут в одну цифру
 
 
// Разбиваем цифру по разрядам индикатора
for( int i = 0; i < 4; i++ )
{
   if( i == 0 || disp != 0 )
      Indicate( i, disp % 10 );
   else
      Indicate
( i, 10 );

   disp /= 10;
}

 }

void Indicate(int r,int x)
{
SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
RazrDisplay=g_registerArray[r];  // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
  digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
      shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
      shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
  digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах

   delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
}
Скетч для общего катода

Скетч для общего катода

Код: Выделить всё

/*
********************************************************************
  Name    : Arduino, 4-разрядный 7-сегментный индикатор, 74HC595 сдвиговый регистр, DS1307 RTC
  Author  : CheBuraw
  Date    : 12 Feb, 2015
 Optimiser: Datak
  Version : 1.1
********************************************************************

4-разрядный 7-сегментный индикатор. общий анод
                1  A  F 2  3  B
 _______________|__|__|__|__|__|_____________
|         |         |    |         |         |
|    A    |    A    |    |    A    |    A    |
| F     B | F     B | dp | F     B | F     B |
|    G    |    G    |    |    G    |    G    |
| E     C | E     C | dp | E     C | E     C |
|    D    |    D    |    |    D    |    D    |
|_________|_________|____|_________|_________|
                |  |  |  |  |  |
                E  D dp  C  G  4

74HC595 Map:
     _______
Q1  |1 *  16|  Vcc                  PINS 1-7, 15   Q0 - Q7   Output Pins
Q2  |2    15|  Q0                   PIN 8     GND       Ground, Vss
Q3  |3    14|  DS                   PIN 9    Q7"       Serial Out
Q4  |4    13|  OE                   PIN 10     MR      Master Reclear, active low
Q5  |5    12|  ST_CP                PIN 11     SH_CP     Shift register clock pin
Q6  |6    11|  SH_CP                PIN 12     ST_CP     Storage register clock pin (latch pin)
Q7  |7    10|  MR                   PIN 13     OE      Output enable, active low
GND |8_____9|  Q7"                  PIN 14     DS      Serial data input
                                    PIN 16     Vcc       Positive supply voltage
           _______
   LED B -|1 *  16|-5V
   LED C -|2    15|-LED A
   LED D -|3    14|-PIN 11
   LED E -|4    13|-GND
   LED F -|5    12|-PIN 8
   LED G -|6    11|-PIN 12 ; 1uF TO GND
   LED dp-|7    10|-5V
      GND-|8_____9|-NILL
      
*/
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int latchPin = 8;     //Пин "защелки" первого регистра подключен к ST_CP входу первого регистра отвечающего за сегменты 
int clockPin = 12;    //Пин подключен к SH_CP входу 74HC595
int dataPin = 11;     //Пин подключен к DS входу 74HC595

int TimeLight = 5;  //время для разогрева сегментов

byte SegDisplay; // переменная для вывода символов на индикаторе
byte RazrDisplay; // переменная для включения разрядов

// Настройка комбинации для отображения каждого номера на дисплее.

byte g_digits[11]={
B00111111, B00000110,    // 0 1
B01011011, B01001111,    // 2 3
B01100110, B01101101,    // 4 5
B01111101, B00000111,    // 6 7
B01111111, B01101111,    // 8 9
B00000000, };         // все сегменты выключены


byte g_registerArray[4]={~8,~4,~2,~1};

void setup() {
  Wire.begin();
  RTC.begin();
  
// обозначаем все пины как выходы
  pinMode(latchPin, OUTPUT); 
  pinMode
(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop() {
  int hour,minute,disp = 0;

  DateTime now = RTC.now(); //Создаём переменную для вывода времени

  hour = now.hour(); // Считываем значение часов
  minute = now.minute(); // Считываем значение минут
  
  disp 
= (hour * 100) + minute; //"Собираем" значения часов и минут в одну цифру
 
 
// Разбиваем цифру по разрядам индикатора
for( int i = 0; i < 4; i++ )
{
   if( i == 0 || disp != 0 )
      Indicate( i, disp % 10 );
   else
      Indicate
( i, 10 );

   disp /= 10;
}

 }

void Indicate(int r,int x)
{
SegDisplay=g_digits[x]; // получаем цифру и выводим символ, из массива цифр, соответствующий этой цифре.
RazrDisplay=g_registerArray[r];  // получаем цифру и выводим номер регистра, из массива цифр, соответствующий этой цифре.
  digitalWrite(latchPin, LOW);  // устанавливаем синхронизацию "защелки" на LOW
      shiftOut(dataPin, clockPin, MSBFIRST, RazrDisplay); // Записываем информацию для второго регистра (Номер разряда)
      shiftOut(dataPin, clockPin, MSBFIRST, SegDisplay);  // Записываем информацию для первого регистра (Номер символа)
  digitalWrite(latchPin, HIGH);  //"защелкиваем" регистр, тем самым устанавливая значения на выходах

   delay(TimeLight); // пауза, чтобы сегменты "разгорелись"
Файлы для proteus

proteus.zip
Файлы для proteus
(20.66 КБ) 284 скачивания
[center]i love you [s]mxIni[/s] Mysql[/center]


Влад-s
Аватара
Влад-s

#2 Влад-s » 14 августа 2022, 21:56

Это динамическое управление индикаторами, а как будет выглядеть схема , для статического управления , 4-ми семисегментными индикаторами , чтоб глаза не выпадали от мерцания индикаторов.


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 7 гостей