Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Особенности схемы дисплея в учебной системе управления.

Читайте также:
  1. I. 2. 2. Современная психология и ее место в системе наук
  2. I. Психофизиологические особенности
  3. I. Цели и задачи учебной дисциплины
  4. I.2 Особенности управления тормозами грузовых поездов повышенного веса и длины
  5. I.3 Особенности управления тормозами в зимних условиях
  6. II. ПРАКТИЧЕСКИЕ ОСОБЕННОСТИ ИССЛЕДОВАНИЯ. ОСНОВЫ ПРОФЕССИОНАЛЬНОЙ ЭТИКИ В РАБОТЕ С ПАЦИЕНТАМИ В ГЕРИАТРИИ
  7. III. особенности обследования больного с заболеваниями тонкого кишечника

 

1) В учебной системе управления (рисунок 62) на шине данных включен последовательный сдвиговый регистр DD2. Обработчик дисплея, кроме выполнения основных действий, должен обеспечить последовательную запись данных (семисегментного кода) в сдвиговый регистр DD2. Данные должны выдаваться в разряд РС.0 микроконтроллера младшим битом семисегментного кода вперед. Запись и сдвиг бита в регистр должна производиться положительным импульсом в разряде РС.7 микроконтроллера (вход С регистра DD2). После выполнения этой процедуры семисегментный код из регистра DD2 через резисторы R1-R8 поступает на сегментные входы индикаторов.

2) Выбор (включение) разряда индикатора производится сигналом низкого уровня с соответствующего выхода дешифратора DD3. Этот уровень поступает на базу одного из ключей VT1-VT4 и открывает ключ. Напряжение +5В поступает через открытый транзистор и включает соответствующий разряд индикатора. Таким образом, обработчиком выбор разряда индикатора должен производиться двоичным кодом в разрядах РС.0 и РС.1. Соответственно разряд РС.6 должен быть установлен в единицу.

 

 

Рисунок 62

3) При загрузке семисегментного кода в регистр DD2, во избежание подсветки включенного разряда дисплея, необходимо установить РС.6 микроконтроллера в состояние логической единицы, что приведет к выключению всех разрядов.

 

 

# include <mega16.h>

# include <delay.h> //Подключение функции программной задержки.

// Директивы препроцессора

# define set_c PORTC | = 0x80; //Присвоить имя выражению PORTC | = 0x80,

// т.е.установить в единицу 7-й разряд порта С.

# define clr_c PORTC & = 0x7f; //Присвоить имя выражению PORTC & = 0x7f,

// т.е.сбросить в ноль 7-й разряд порта С.

 

//------Массив сегментных кодов-----

unsigned char segm_kod [] = { 3, 0x9f, 0x25, 0xd, 0x99, 0x49, 0x41, 0x1f, 1, 9 };

unsigned int data_bin = 0x13db; // Объявлена индицируемая переменная

unsigned char i, m, code_7segm; // Переменные программы

//-------Главная функция---------------------------

main ()

{

DDRC = 0xc3; // Настройка на вывод разрядов порта С (по схеме)

while (1) // Бесконечный цикл вывода

{

for (i = 0;i < 4;i + +) // Цикл разрядов дисплея

{

switch (i)

{

case 0: code_7segm = segm_kod [data_bin % 10]; break; //Выделение разряда

// единиц - остатка от деления data_bin

//на 10 и преобр. в семисегм. код

case 1: code_7segm = segm_kod [data_bin /10%10]; break; //Выделение разряда

//десятков делением на 10 data_bin и остаток

//от второго деления на 10 в 1-йразряд дисплея.

case 2: code_7segm = segm_kod [data_bin / 100 % 10]; break; // Разряд сотен.

case 3: code_7segm =s egm_kod [data_bin / 1000 % 10]; break; //Разряд тысяч.

}

 

for (j = 0; j < 8;j ++) // Цикл загрузки регистра

{

PORTC = code_7segm & 0b01111111 | 0b01000000; // Загрузка в PORTC

// семисегм. кода (младший разряд поступает

//на вход D1 регистра) и значения битов

// РС.7=0 и РС.6 =1.

code_7segm = code_7segm >> 1; //Для след. бита

set_c; //Установить бит PC.7 = 1 (фронт импульса С)

clr_c; //Сбросить бит PC.7 = 0 (срез импульса С)

 

}

PORTC = i; // Включение текущего разряда дисплея.

delay_ms (5); // Время свечения разряда дисплея.

}

}

 

 

Часы

Для реализации функции часов необходимо сформировать временной интервал длительностью в 1 сек. Временной интервал целесообразно формировать с помощью таймера/счетчика Т1 в режиме сброса по совпадению.

В соответствие с формулой (8), которая справедлива для любого таймера, при условии равенства коэффициента деления входного делителя значению 1024 и при тактовой частоте равной 16 мГц, получим значение в регистре совпадения для интервала в 1сек:

OCR1А = tинттакт * К = 1*24*106*2-10 = 56 = 15625.

Очевидно, что в качестве исходного текста для обработчика часов, можно использовать копию текста обработчика дисплея.

Ниже приведена программа часов реального времени. Функция программы: вывод текущего времени в секундах и минутах в разряды порта микроконтроллера, к которым подключен динамический индикатор.

Так как код четвертого режима (сброса по совпадению Т1) равен 0100, то младшие разряды его установлены в регистре TCCR1A по умолчанию. Ниже приведен текст программы часов с индикацией минут и секунд.

 

 

#include <mega16.h>

#include <delay.h>

//Препроцессор

#define set_c PORTC |=0x80 //Присвоить имя-Установить бит - ИЛИ порта и числа 0x80

#define clr_c PORTC &=0x7f //Присвоить имя-Сбросить бит - И порта и числа 0х80

 

//------Массив кодов сегментных-----

unsigned char SEGM_COD[] = {3,0x9f,0x25,0xd,0x99,0x49,0x41,0x1f,1,9};

unsigned char sec,min; // Переменные для секунд и минут.

unsigned char m, i,code_7segm;

//-------Главная функция---------------------------

main ()

{

TCCR1A = 0;

TCCR1B = 0b00001101; // Режим сброса по совпадению № 4, коэфф. деления =1024

OCR1A = 15625 - 1; // Значение, (совместно с к =1024) соответсвует 1 секунде

TIMSK = 0x10; // Разрешить прерывание по совпадению Т1 канала А

#asm("sei") // В СИ вставлена ассемблерная команда общего разр. прерыв.

DDRC = 0 x С3;

while (1)

{

for (i = 0; i < 4; i + +)

{

 

switch (i)

{

case 0: code_7segm = SEGM_COD [ sec % 10 ]; break; // Сегм. код единиц секунд

case 1: code_7segm = SEGM_COD [ sec / 10 ]; break; // Сегм. код десятков секунд

case 2: code_7segm = SEGM_COD [min % 10 ]; break; // Сегм. код единиц минут

case 3: code_7segm = SEGM_COD [ min / 10 ]; break; // Сегм. код десятков минут

 

}

 

//---Загрузка последовательного регистра---

for (m = 0; m < 8; m + +)

{

PORTC = code_7segm | 0x40 & 0x7f; // На РС.0 младший бит кода

code_7segm >> = 1; //Для след. бита

set_c; //Импульс записи бита

clr_c; //в последовательный регистр

}

PORTC = i; //Включить текущий индикатор

delay_ms (5); //Время свечения

}

}

}

 

interrupt [TIM1_COMPA] time _1sec () //Прерывание через каждую секунду

{

if ((+ + sec) = = 60) //Если счетчик сек.=60

{sec = 0; //то его обнулить.

if ((+ +min = = 60)) //и проверка счетчика минут. Если он равен 0,

min = 0; //то его обнулить.

 

}

}


Дата добавления: 2015-07-20; просмотров: 53 | Нарушение авторских прав


Читайте в этой же книге: Типы данных, объявление данных | Операторы | Оператор if-else (ветвления ) | Оператор switch | Оператор цикла for | Программный способ формирования временных интервалов на языке Ассемблер | Программный способ формирования временных интервалов на языке СИ | Генерация пакета импульсов | Генератор заданного числа пакетов импульсов | Формирование импульсных сигналов управления с использованием таймеров микроконтроллера |
<== предыдущая страница | следующая страница ==>
Обработка динамического дисплея| Измерение временных параметров импульсов

mybiblioteka.su - 2015-2024 год. (0.01 сек.)