Перейти к содержанию

Делаем Часы С Динамической Индикацией


mazzi

Рекомендуемые сообщения

Итак, задача следующая, пишем на Си часы с семисегментными индикаторами. Приветствуются желающие повторить конструкцию в железе. Заодно и отладим посредством форума. В качестве микроконтроллера берём любой Атмелевский 51-й микроконтроллер в 40-выводном дип-корпусе. Будем считать, что это например AT89S52.

Писать буду по частям, с комментариями для начинающих. Схему рисовать не буду, буду описывать её в тексте, если кто захочет нарисовать, буду только рад.

Создаём два файла clock.c и clock.h в процессе написания будем добавлять туда код.

Функция вывода символа на дисплей. Пишем в файл clock.c.

//===================================================
// входные параметры
//   ch - семисегментный код для вывода
//   n  -  позиционный номер выводимого символа 0..3
//------------------------------------------------
// используемые константы и переменные
//   DISPLAY          0..7 разряды порта 0
//   CHANNELS	0..3 разряды порта 2
//   num_ch  массив значений для переключения разрядов дисплея
//------------------------------------------------
void view_char( unsigned char ch, unsigned char n ) {
	CHANNELS |= 0x0F; // выключаем все семисегментные символы
	DISPLAY  &= 0x80; // сбрасываем все разряды семисегментного кода в ноль
	DISPLAY  |= (ch&0x7F); // выводим отображаемый символ
	CHANNELS &= num_ch[(n&0x0F)]; // включаем нужный канал
}

Описания констант. Пишем в файл clock.h.

#define DISPLAY    P0
#define CHANNELS   P2

Объявляем массив для хранения состояний порта при переключении отображаемого символа. Пишем в начало файла clock.c.

code unsigned char num_ch[4] = { 0xFE, 0xFD, 0xFB, 0xF7 };

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

На данный момент программа выводит на дисплей тестовую последовательность "1234".

Файл clock.c полностью.

#include "clock.h"

code  unsigned char  num_ch[4] = { 0xFE, 0xFD, 0xFB, 0xF7 };
code  unsigned char  segm_7[11]  = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00};// семисегментный код
idata unsigned char  n_ch = 0; // номер светящегося индикатора
idata unsigned char  t_2ms = 8, f_2ms=0;
idata unsigned char  display[4];
//===================================================
// входные параметры
//   ch - семисегментный код для вывода
//   n  -  позиционный номер выводимого символа 0..3
//------------------------------------------------
// используемые константы и переменные
//   DISPLAY      	0..7 разряды порта 0
//   CHANNELS   0..3 разряды порта 2
//   num_ch  массив значений для переключения разрядов дисплея
//------------------------------------------------
void view_char( unsigned char ch, unsigned char n ) {
	CHANNELS |= 0x0F; // выключаем все семисегментные символы
	DISPLAY  &= 0x80; // сбрасываем все разряды семисегментного кода в ноль
	DISPLAY  |= (ch&0x7F); // выводим отображаемый символ
	CHANNELS &= num_ch[(n&0x0F)]; // включаем нужный канал
}

//================== MAIN ===================
void main( void ) {
TMOD = 0x22;// таймеры 0 и 1 работают как 8-разрядные с автомаической перезагрузкой
TL0  = 5; // прерывание будет срабатывать каждые 250 микросекунд
TH0  = 5;
ET0  = 1; 
TR0  = 1;
EA   = 1;	
display[0] = ~segm_7[1]; // на дисплей выводим "1234"
display[1] = ~segm_7[2];
display[2] = ~segm_7[3];
display[3] = ~segm_7[4];
while ( 1 ) { // основной бесконечный цикл
  	if ( f_2ms ) {
       	f_2ms = 0;
       	n_ch++;
       	if ( n_ch > 3 ) n_ch = 0;
       	view_char ( display[n_ch], n_ch );
  	}
}
}

//----------------------------------------
void timer0 ( void ) interrupt TF0_VECTOR using 2  {
	if ( t_2ms ) t_2ms--;
	else {
     	t_2ms = 8;
     	f_2ms = 1;
}
}

Файл clock.h полностью.

#include <at89x52.h>

#define DISPLAY	P0
#define CHANNELS   P2

Файл at89x52.h полностью.

/*--------------------------------------------------------------------------
AT89X52.H

Header file for the low voltage Flash Atmel AT89C52 and AT89LV52.
Copyright (c) 1995-1996 Keil Software, Inc.  All rights reserved.
--------------------------------------------------------------------------*/

#ifndef AT89X52_HEADER_FILE
#define AT89X52_HEADER_FILE 1

/*------------------------------------------------
Byte Registers
------------------------------------------------*/
sfr P0  	= 0x80;
sfr SP  	= 0x81;
sfr DPL 	= 0x82;
sfr DPH 	= 0x83;
sfr PCON	= 0x87;
sfr TCON	= 0x88;
sfr TMOD	= 0x89;
sfr TL0 	= 0x8A;
sfr TL1 	= 0x8B;
sfr TH0 	= 0x8C;
sfr TH1 	= 0x8D;
sfr P1  	= 0x90;
sfr SCON	= 0x98;
sfr SBUF	= 0x99;
sfr P2  	= 0xA0;
sfr IE  	= 0xA8;
sfr P3  	= 0xB0;
sfr IP  	= 0xB8;
sfr T2CON   = 0xC8;
sfr T2MOD   = 0xC9;
sfr RCAP2L  = 0xCA;
sfr RCAP2H  = 0xCB;
sfr TL2 	= 0xCC;
sfr TH2 	= 0xCD;
sfr PSW 	= 0xD0;
sfr ACC 	= 0xE0;
sfr B   	= 0xF0;

/*------------------------------------------------
P0 Bit Registers
------------------------------------------------*/
sbit P0_0 = 0x80;
sbit P0_1 = 0x81;
sbit P0_2 = 0x82;
sbit P0_3 = 0x83;
sbit P0_4 = 0x84;
sbit P0_5 = 0x85;
sbit P0_6 = 0x86;
sbit P0_7 = 0x87;

/*------------------------------------------------
PCON Bit Values
------------------------------------------------*/
#define IDL_	0x01

#define STOP_   0x02
#define PD_ 	0x02	/* Alternate definition */

#define GF0_	0x04
#define GF1_	0x08
#define SMOD_   0x80

/*------------------------------------------------
TCON Bit Registers
------------------------------------------------*/
sbit IT0  = 0x88;
sbit IE0  = 0x89;
sbit IT1  = 0x8A;
sbit IE1  = 0x8B;
sbit TR0  = 0x8C;
sbit TF0  = 0x8D;
sbit TR1  = 0x8E;
sbit TF1  = 0x8F;

/*------------------------------------------------
TMOD Bit Values
------------------------------------------------*/
#define T0_M0_   0x01
#define T0_M1_   0x02
#define T0_CT_   0x04
#define T0_GATE_ 0x08
#define T1_M0_   0x10
#define T1_M1_   0x20
#define T1_CT_   0x40
#define T1_GATE_ 0x80

#define T1_MASK_ 0xF0
#define T0_MASK_ 0x0F

/*------------------------------------------------
P1 Bit Registers
------------------------------------------------*/
sbit P1_0 = 0x90;
sbit P1_1 = 0x91;
sbit P1_2 = 0x92;
sbit P1_3 = 0x93;
sbit P1_4 = 0x94;
sbit P1_5 = 0x95;
sbit P1_6 = 0x96;
sbit P1_7 = 0x97;

sbit T2   = 0x90;   	/* External input to Timer/Counter 2, clock out */
sbit T2EX = 0x91;   	/* Timer/Counter 2 capture/reload trigger & dir ctl */

/*------------------------------------------------
SCON Bit Registers
------------------------------------------------*/
sbit RI   = 0x98;
sbit TI   = 0x99;
sbit RB8  = 0x9A;
sbit TB8  = 0x9B;
sbit REN  = 0x9C;
sbit SM2  = 0x9D;
sbit SM1  = 0x9E;
sbit SM0  = 0x9F;

/*------------------------------------------------
P2 Bit Registers
------------------------------------------------*/
sbit P2_0 = 0xA0;
sbit P2_1 = 0xA1;
sbit P2_2 = 0xA2;
sbit P2_3 = 0xA3;
sbit P2_4 = 0xA4;
sbit P2_5 = 0xA5;
sbit P2_6 = 0xA6;
sbit P2_7 = 0xA7;

/*------------------------------------------------
IE Bit Registers
------------------------------------------------*/
sbit EX0  = 0xA8;   	/* 1=Enable External interrupt 0 */
sbit ET0  = 0xA9;   	/* 1=Enable Timer 0 interrupt */
sbit EX1  = 0xAA;   	/* 1=Enable External interrupt 1 */
sbit ET1  = 0xAB;   	/* 1=Enable Timer 1 interrupt */
sbit ES   = 0xAC;   	/* 1=Enable Serial port interrupt */
sbit ET2  = 0xAD;   	/* 1=Enable Timer 2 interrupt */

sbit EA   = 0xAF;   	/* 0=Disable all interrupts */

/*------------------------------------------------
P3 Bit Registers (Mnemonics & Ports)
------------------------------------------------*/
sbit P3_0 = 0xB0;
sbit P3_1 = 0xB1;
sbit P3_2 = 0xB2;
sbit P3_3 = 0xB3;
sbit P3_4 = 0xB4;
sbit P3_5 = 0xB5;
sbit P3_6 = 0xB6;
sbit P3_7 = 0xB7;

sbit RXD  = 0xB0;   	/* Serial data input */
sbit TXD  = 0xB1;   	/* Serial data output */
sbit INT0 = 0xB2;   	/* External interrupt 0 */
sbit INT1 = 0xB3;   	/* External interrupt 1 */
sbit T0   = 0xB4;   	/* Timer 0 external input */
sbit T1   = 0xB5;   	/* Timer 1 external input */
sbit WR   = 0xB6;   	/* External data memory write strobe */
sbit RD   = 0xB7;   	/* External data memory read strobe */

/*------------------------------------------------
IP Bit Registers
------------------------------------------------*/
sbit PX0  = 0xB8;
sbit PT0  = 0xB9;
sbit PX1  = 0xBA;
sbit PT1  = 0xBB;
sbit PS   = 0xBC;
sbit PT2  = 0xBD;

/*------------------------------------------------
T2CON Bit Registers
------------------------------------------------*/
sbit CP_RL2= 0xC8;  	/* 0=Reload, 1=Capture select */
sbit C_T2 = 0xC9;   	/* 0=Timer, 1=Counter */
sbit TR2  = 0xCA;   	/* 0=Stop timer, 1=Start timer */
sbit EXEN2= 0xCB;   	/* Timer 2 external enable */
sbit TCLK = 0xCC;   	/* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */
sbit RCLK = 0xCD;   	/* 0=Serial clock uses Timer 1 overflow, 1=Timer 2 */
sbit EXF2 = 0xCE;   	/* Timer 2 external flag */
sbit TF2  = 0xCF;   	/* Timer 2 overflow flag */

/*------------------------------------------------
T2MOD Bit Values
------------------------------------------------*/
#define DCEN_   0x01	/* 1=Timer 2 can be configured as up/down counter */
#define T2OE_   0x02	/* Timer 2 output enable */

/*------------------------------------------------
PSW Bit Registers
------------------------------------------------*/
sbit P	= 0xD0;
sbit FL   = 0xD1;
sbit OV   = 0xD2;
sbit RS0  = 0xD3;
sbit RS1  = 0xD4;
sbit F0   = 0xD5;
sbit AC   = 0xD6;
sbit CY   = 0xD7;

/*------------------------------------------------
Interrupt Vectors:
Interrupt Address = (Number * 8) + 3
------------------------------------------------*/
#define IE0_VECTOR	0  /* 0x03 External Interrupt 0 */
#define TF0_VECTOR	1  /* 0x0B Timer 0 */
#define IE1_VECTOR	2  /* 0x13 External Interrupt 1 */
#define TF1_VECTOR	3  /* 0x1B Timer 1 */
#define SIO_VECTOR	4  /* 0x23 Serial port */

#define TF2_VECTOR	5  /* 0x2B Timer 2 */
#define EX2_VECTOR	5  /* 0x2B External Interrupt 2 */

/*------------------------------------------------
------------------------------------------------*/
#endif

Весь проект для Keil с прошивкой в одном архиве. KEIL.zip

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Вон справа от разьёма второй такой же, а он исправный? Почему решили что он неисправный? А сравнить их прозвонкой? А со схемой их включения разобрались? А ничего не сделав
    • Ясен красен, что фуфел. Вертеть надыть диск, либо совместно, ибо магнитное поле, созданное магнитом, оному не принадлежит, статично. Сиречь - флуктуация. П.С. ТРЕТИЙ ЗАКОН ЧИЗХОЛМА: Любые ваши предложения обязательно истолкуют иначе, чем вы их имеете в виду.
    • Земляная мекка, она же звезда работает лучше всего.
    • Попросил сотрудник отремонтировать фонарь со сгоревшей микросхемой заряда TP4056. Снял её с платки ломаного зарядника, поставил. Работает. Если заряд литиевого аккумулятора восстановил, то вот питание светодиодов оказалось сверхпримитивным - через одноваттные токоограничительные резисторы, что не совсем комильфо. И даже совсем не комильфо. В своё время затарился линейными стабилизаторами тока CN5711 (регулируемый до 1,5 А) и AMC7135 (фиксированный на 350 мА). Решил запитать пятиваттный светодиод фары Cree первым из них, с током 800 мА и одноваттный светодиод общей подсветки вторым. Фото дорожек платы после установки драйверов. AMC7135 обведен красным овалом, а CN5711 - зелёным. По центру вверху - замененная TP4056. Особых проблем с их монтажом не встретил, кроме единственной, решение которой и составило суть данного поста.  А именно: поскольку драйверы линейные, то они греются и монтировать их следует к медному теплоотводному полигону. Которого взять неоткуда. Поэтому применил старую наработку по пистонированию переходных отверстий на противоположную сторону платы латунными пистонами из Поднебесной диаметром 1 мм. Получилось два "массива" близко расположенных пистонов, к которым и были подпаяны "подбрюшья" драйверов. Обведены овалами соответствующих цветов. А уже к ним подпаяны медные "флажки", вырезанные из 0,3 мм шинки, бывшей вторичной обмоткой какого-то импульсного трансформатора (в красном овале). При длительной работе (более 10 минут) нижний "флажок" (красный) тёплый, а верхний (зелёный) горячий, но рука терпит. AMC7135.PDF CN5711.PDF
    • Гость Михаил
      Добрый день! Собрал данный фонокорректор на монтажной плате по схеме на первой странице на ОУ NE5532P. Стабилизированное питание +-12В. Голова ММ. Заработал сразу и звучит хорошо но есть несколько вопросов. Какой уровень шума у данного фонокорректора? При подключении питания он шумит сильнее чем встроенный в ресивер фонокорректор на ОУ AN6558F. Какие детали могут влиять на повышенный уровень? Все детали подобраны по номиналам схемы но не хватает высоких частот. Что можно изменить в схеме что бы немного их поднять?
    • Куда оно денется. И кто уже навряд ли БП мог держать 19 А на 12 В шине, потому замена никак не повлияет на его работу.
×
×
  • Создать...