Читайте также:
|
|
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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Обработка динамического дисплея | | | Измерение временных параметров импульсов |