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

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


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 пользователей онлайн

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

    • Наверное существуют, но как реализовать данный алгоритм для самодельной конструкции ? Но постоянный и пульсирующий то же не одно и то же. В том то и проблема . КАК его мерить ?
    • Переменный и пульсирующий постоянный ток- не одно и то же.
    • Я не плавную регулировку тока. Я про увеличить ток заряда с 6 до 10 ампер, и всё. Подобрать ёмкости C14/C15 - по каким параметрам? Поменять ключи на более низкоомные - я хотел поставить например BUV48A или 2SC3320. Пойдут на замену 2SC2335 которые сейчас стоят? А вот этот самый "резистор обмоток связи R19" уже достал! На всех зарядках он набран из 8, бывает из 10 SMD резисторов под которыми выгорает текстолит. Падла греется до 150 градусов. В этом экземпляре, стыдно даже писать его название, Striver PW-150 всё по другому. Зарядка собрана этажеркой, да так криво и нелепо, что выглядит в 100 раз хуже многих самоделок. Так вот этот "резистор обмоток связи R19" тут стоит обычный на 1 или 2 Вт - кетайский, его хрен поймёшь. Я поставил керамический - цементный на 5 Вт - нагрев 75 градусов при 5 амперах. Что ж туда ставить то? 10-20 ваттные проволочные? А вот с делителем R4/R5/R6 я не согласен! Тут за пороги вкл-выкл циклов заряд - пауза отвечает другая часть микросхемы. В этом я уже убедился, регулировку порогов делаю подстроечным резистором на 2 ноге 393. В этих зарядках и схемах часто перепутаны компараторы. Ваше утверждение про 5, а точнее 6 ногу относиться к другим схемам и зарядкам.  Резистором R7 определяется разница между напряжением окончания и начала зарядки. А вот это ценная информация - никак не мог понять как сократить минимальный и максимальный порог заряда.
    • Вообщем буду моделировать цепи включения и авто выключения 
    • @Less Если между собой созванивать контактные площадки мест под конденсаторы, то в обе стороны, и созванивается на GND. В районе антенны блютуз подозрения сняты, там проходит жёлтая дорожка, это не КЗ Остаётся подозрение на конденсатор в районе диодов, они звенят в обе стороны 196, сниму и проверю позднее. Резистор звенящий в 003 не звенит на GND.
    • Да скорость в модуле я сразу переключил на 9600 при помощи терминала из компа.  
    • Для таких целей существуют фотоамперметры.  В основе  лампочка , световой поток которой при прохождении тока сложной формы фиксируется фотоэлементом. Затем неизвестный ток заменяется известным и добиваются тех же показаний фотоэлемента, но  уже при токе , измеренным обычным амперметром.
×
×
  • Создать...