Микропроцессорный модуль управления цифровой магнитолой
СОДЕРЖАНИЕ
Введение
Техническое задание
Функциональная схема
Выбор управляющего контроллера
Разработка функционирования программы
Заключение
Приложение 1
ПРИЛОЖЕНИЕ 2
Введение
Развитие микроэлектроники и широкое применение
её изделий в промышленном производстве, в устройствах и системах управления
самыми разнообразными объектами и процессами является в настоящее время одним
из основных направлений научно-технического прогресса.
Использование микроэлектронных средств в
изделиях производственного и культурно-бытового назначения приводит не только к
повышению технико-экономических показателей изделия (стоимости, потребляемой
мощности, габаритных размеров) и позволяет многократно сократить сроки
разработки и отодвинуть сроки «морального старения» изделий, но придает им
принципиально новые потребительские качества (расширенные функциональные
возможности, модифицируемость, адаптивность и т.д.).
В связи с бурным развитием микроэлектроники
стали появляться все более сложные и более функциональные микроконтроллеры.
Микроконтроллеры известных фирм-производителей окружают нас везде: в лифте, в
таксофонных аппаратах, автомобильных сигнализациях, музыкальных центрах,
телевизорах, всевозможных играх и другой как бытовой, так и промышленной
технике.
Техническое
задание
В данном курсовом проекте поставлена задача
разработать микропроцессорный модуль управления цифровой магнитолой,
обеспечивающий полнофункциональное управление тюнером с автоматическим поиском
станций по обнаружению максимума несущей и запоминание 4 станций. Модуль должен
управлять громкостью, уровнем НЧ и ВЧ, а так же декой магнитофона, а именно,
воспроизведение, перемотка, поиск предшествующей песни, поиск следующей песни и
команду стоп. А так же электронно-управляемый по шине I2C тембр-блок.
В качестве устройства отображения по заданию
определено
использование активного, матричного, двух
строчного жидко кристаллического индикатора, размерностью 12x2, что позволяет
нам наблюдать на его экране все необходимые информационные сообщения о режиме
работы и параметрах устройства.
Для управления используются восемь клавиш, две
клавиши работают как энкодер, клавиша включения режима магнитола, клавиша ВЧ,
НЧ, громкость. А так же клавиша выключения звука «mute».
- перемотка влево, стоп, поиск предшествующей
песни, воспроизведение, поиск следующей песни, смена направления, перемотка
вправо;
- AM\FM, поиск следующей станции.
Функциональная
схема
Рис. 1
Описание функциональных блоков:
МП - микропроцессор;
БТ - блок тюнера;
ЦАП - цифровой аналоговый преобразователь;
КС - компоратор сигнала;
БК - блок клавиш;
ЖКИ - жидкокристаллический индикатор;
БКМ - блок коммутации;
БР-1,2,3 - буфер регистров.
Выбор
управляющего контроллера
Перед тем как выбрать контроллер, я решил
провести анализ след серий микроконтроллеров представленных на рынке и
используемых в аналогичных устройствах: AVR, PIC, MK-51.
Обзор PIC
Альтернативой является PIC 16С745. Все команды
данного контроллера состоят из одного слова (14 бит шириной) и исполняются за один
цикл (200 нс при 20 МГц), кроме команд перехода, которые выполняются за два
цикла (400 нс). Контроллер имеет прерывание, срабатывающее от четырех
источников, и восьмиуровневый аппаратный стек. Высокая нагрузочная способность
(25 мА макс. втекающий ток, 20 мА макс. вытекающий ток) линий ввода/вывода
упрощают внешние драйверы и, тем самым, уменьшается общая стоимость системы.
Имеется возможность работы с тремя таймерами и каналом I2C. Но при всем этом
цена более высокая, чем у 52 контроллера. Так же недостатком является
однократно программируемое ПЗУ, что требует покупки более дорогого отладочного
кристалла.
Краткий обзор AVRядро базируется на
усовершенствованной RISC архитектуре, с регистровым файлом быстрого доступа,
содержащим 32 регистра общего назначения, непосредственно связанных с
арифметико-логическим устройством (ALU), и мощной системой команд. За один
тактовый цикл из регистрового файла извлекаются два операнда, выполняется
команда и результат записывается в регистр назначения. Такая высокоэффективная
архитектура обеспечивает производительность почти в десять раз большую, чем
стандартные CISC микроконтроллеры. Одним из основных минусов является
отсутствие аппаратной возможности использования функции деления. Ее необходимо
прописывать программно, что влечет к риску переполнения ПЗУ.
Обзор семейства МК51
МК семейства МК-51 используют гарвардскую
архитектуру: память программ (ПЗУ) и память данных (ОЗУ) имеют раздельное
адресное пространство. И, как следствие, для обращения к ячейкам памяти разного
типа должны быть использованы разные типы команд. Максимальный размер адресного
пространства для каждого типа памяти составляет 64 Кбайта. Однако
непосредственно на кристалле МК 8051 АН располагаются только 4 Кбайта ПЗУ и 128
байт ОЗУ. МК семейства MCS-51 имеют открытую архитектуру, т.е. позволяют
подключать внешнюю память. Поэтому при необходимости, как память программ, так
и память данных могут быть увеличены посредством подключения дополнительных
микросхем памяти. МК-51 имеет четыре 8-разрядных параллельных порта
ввода/вывода и два 16-разрядных программируемых таймера. В отличии от 51
контроллеры 52 серии имеет больший объем ОЗУ, 3 таймера, возможность работы по
шине I2C, что позволяет подключить внешнее ПЗУ и достаточное количество портов
(4×8).
Свой выбор я остановил на контроллере семейства
МК51 AT89C51. Потому что у этого контроллера наиболее доступная цена при
достаточном количестве портов, памяти и функций; архитектура данного контролера
изучена в курсе лабораторных работ.
Параметры AT89C51:
Память программ - 4 Кбайта
Память данных - 128 байт
Выводы ввода/вывода - 32
битовые таймеры счётчики - 2
Источники прерываний - 6
Биты защиты - 3
Разработка
функционирования программы
Перед началом разработки алгоритма работы
программы необходимо продумать назначение клавиш и индикацию на ЖКИ дисплее.
При включении устройства в сеть происходит
автоматическое включение радио тюнера. Автоматический поиск станций
продолжается до тех пор, пока не найдется активная радиостанция. Громкость по
умолчанию 25% от мощности УЗЧ. Громкость звучания отображается как V и 15 -
единиц громкости по шкале от 0-60.
Индикация на ЖКИ будет выглядеть следующим
образом:
_
|
T
|
U
|
N
|
E
|
R
|
_
|
A
|
M
|
_
|
_
|
_
|
|
|
|
|
|
|
|
|
V
|
1
|
5
|
|
Рисунок 1 - Индикация на ЖКИ
Для регулировки громкости используем энкодер подключенный
к выводам 3 и 4 буфера регистров БК-3.
Для перехода в режим авто магнитолы нажимаем
клавишу 7, для возврата в режим радиоприемника нажимаем клавишу 8.
_
|
A
|
G
|
N
|
I
|
T
|
O
|
L
|
A
|
_
|
_
|
|
|
|
P
|
L
|
A
|
Y
|
|
V
|
1
|
5
|
|
Рисунок 2 - Индикация на ЖКИ
Для включения режима CD плеера нажимаем клавишу
13. Индикация на дисплее показана на рисунке 3.
_
|
C
|
D
|
-
|
P
|
L
|
A
|
E
|
R
|
_
|
_
|
_
|
|
|
|
S
|
T
|
O
|
P
|
|
V
|
1
|
5
|
|
Рисунок 3 - Индикация на ЖКИ
Клавиши 14, 17, 18 имеют многофункциональное
назначение. В режиме авто магнитолы и CD плеера - это клавиши перемотка назад,
играть \ остановить, перемотка вперед. В режиме радио НЧ \ ВЧ, AM \ FM, Выкл
звук (MUTE).
Для того чтобы выводить на экран данные я решил
объявить массив и в дальнейшем в цикле выполнять вывод массива с определёнными
задержками между передачей каждого элемента на ЖК - индикатор. Чтобы экономить
память, процедура вывода использует автоматический переход на вторую строчку с
заполнением невидимых позиций нулями. Поэтому первая строчка заполняет первые
12 символ, вторая - вторые 12 символ.
Для удобства использования, большую часть флагов
я задал как битовые, но некоторые флаги, например, направление перемотки, как
байт, чтобы младшими битами каждой тетрады идёт перемотка и её направление. Так
как всё подключено через буферный регистр, я запоминаю их состояния, текущее и
предшествующее, чтобы выполнить сравнения.
Большая часть процедур вынесена в обработчик
прерываний. В обработчике прерывания таймера задал предделитель равный 10 мс,
что соответствует 20 Гц переполнения. Для того чтобы выполнить функцию счётчика
времени подсчитали секунды, минуты, часы в диапазоне 60,60,24.
Для того, чтобы определить состояние датчиков, в
обработчике таймера выполняется проверка текущего значения сейчас и в
предыдущем такте таймера. Частота опроса 10 раз в секунду вполне достаточна.
Если срабатывает в начале первый потом второй датчик, то производится
прибавление, в противном случае производится вычитание.
Микровыключатели К1-К6 выполняют следующие
функции:
К1 - прижатие головки;
К2 - подмотка вправо;
К3 - подмотка влево;
К4 - перемотка вправо;
К5 - перемотка влево;
К6 - автостоп
Для восприятия нажатия клавиатуры сигнал со
специального клавиатурного шифратора К155ИВ3 заведён на прерывание EX1, что
позволяет просто считав код нажатой клавиши, определить какое нужно выполнить
действие: клавиша 0/1 переключает режимы. Далее идёт основная процедура (тело
программы). В начале выполняется инициализация таймеров-счётчиков, далее
разрешаются все требуемые прерывания, запускаются таймеры-счётчики,
устанавливается в нужное состояние порты контроллера. После чего программа
переходить в бесконечный цикл обслуживания, при этом на индикатор в цикле
выводится время. Если не установлен режим сна, выполняется отображение режима
тюнера или магнитофона при этом во второй строчке отображается частота
настройки или метраж и режим работы магнитофона. Здесь же выполняется
дополнительный блок функций: автоматический поиск предыдущей/ следующей станции
или перемотка на предыдущую следующую песню. В таком режиме система
функционирует всё время. Приращение часов, минут или убавление их производится
в режиме сна по контролю флага sleep. Таким образом, обеспечивается полное
управление всеми функциями простого музыкального центра, включающего в себя
тюнер, CD плеер и магнитофон.
Заключение
В процессе выполнения курсового проекта по
предмету «Микропроцессорные системы» я научился проектировать музыкальный центр
под управление микропроцессорной системы на платформе МК 51.
Научился писать программу в среде Kiel для
программирования системы управления музыкальным центром.
Полученные знания по предмету, несомненно,
пригодятся в моей будущей карьерной деятельности.
Приложение
1
Схема устройства
Приложение 2
Листинг программы
микроконтроллер магнитола программа
#include <REG52.H> /* special
function register declarations */
#include <stdio.h> /*
prototype declarations for I/O functions */
#ifdef MONITOR51 /* Debugging with
Monitor-51 needs */code reserve [3] _at_ 0x23; /* space for serial interrupt if
*/
#endif /* Stop Exection with Serial
Intr. */char dacnastr; //uroven U dla nastroiki
priemnikabolch_mench=P3^3;//upravlen
tranzistoramiFM=P0^6;am=P0^7;upravl=P0^2;sda=0;scl=0;rs=0;e=0;char takt,
uprbyte;char key,keyold;char regim; //char reginmagnit; //char param[]={10,0,0};
// gromk bass & trablechar bas; //char treble; //char regimplai;char
unastr; //stupen nastrchar pp,i,j,n; char parametr;char line;//input line CD
Magn,Radiochar sot,sek,min,chas;char lcd1[]={0,0,0,0,0,0,0,0,0,0,0,0};char
lcd2[]={0,0,0,0,0,0,0,0,0,0,0,0};char
cd[]={0x5F,0x43,0x44,0x2D,0x50,0x4C,0x41,0x45,0x52, 0x5F,0x5F,0x5F};char
tuner[]={0x5F,0x54,0x55,0x4E,0x45,0x52,0x5F,0x,0x,0x,0x,0x};char
mag[]={0x5F,0x4D,0x41,0x47,0x4E,0x49,0x54,0x4F,0x4C, 0x41,0x5F,0x5F};delay
(void )//timeout na 5mks)
{char k;(k=0;k<4;k++);
}i2c (void )//timeout na 5mks)
{(n=0;n<4;n++)//peredat 4
parametra
{ =1;delay();sda=0;//start
puls=0xc0;//koman write parametr(j=0;j<8;j++)
{=param[n];if(n==1)pp=pp|0xc0;if(n==2)pp=pp|0x80;(j=0;j<8;j++)
{scl=0;delay();pp=pp>>1;sda=CY;delay();scl=1;delay();delay();}
}
{pp=line|0xe0;//set input
line(j=0;j<8;j++)
{scl=0;delay();pp=pp>>1;sda=CY;delay();scl=1;delay();delay();}}
}
}0int0 (void) interrupt 0 using 1
{=P1;(keyold==0)&&(key==1)
{=key; param[parametr]++; if
(param[parametr]>=61)param[parametr]=60;[10]=param[parametr]/10+0x30;lcd[11]=param[parametr]%10+0x30;
}(keyold==1)&&(key==0)
{keyold=key;param[parametr]--; if
(param[parametr]<=1)param[parametr]=1;[10]=param[parametr]/10+0x30;lcd[11]=param[parametr]%10+0x30;
}(keyold!=2)&&(key==2){line=0;for(j=0;j<12;j++)lcd1[j]=
cd[j];}//CD
line(keyold!=3)&&(key==3){line=1;for(j=0;j<12;j++)lcd1[j]=
tuner[j];}//Tuner(keyold!=4)&&(key==4){line=2;for(j=0;j<12;j++)lcd1[j]=
mag[j];} //Magnitofon(line==2)
{if(keyold!=5)&&(key==5){upravl=0;P2=0x10;
upravl=1;}//peremotka left(keyold!=6)&&(key==6){++;if (regimplai==3)
regimplai=0;//stop(regimplai==1){upravl=0;P2=0x03;
upravl=1;lcd[9]=0x3e;}//proigratpravo(regimplai==2){upravl=0;P2=0x05;
upravl=1;lcd[9]=0x3e;}//proigratlevo(regimplai==0){upravl=0;P2=0x00;
upravl=1;lcd[9]=0x3e;}//proigratpravo(keyold!=7)&&(key==7){upravl=0;P2=0x20;
upravl=1;}//peremotka rich
}(line==0)
{(keyold!=5)&&(key==5){parametr=2;}//vibor
treble(keyold!=6)&&(key==6){parametr=1;}//vibor
bass(keyold!=6)&&(key==6){parametr=0;}//vibor bass
}(line==1) //upravlen tuner
+nastorika
{(keyold==0)&&(key==1)
{keyold=key;
unastr++;while(bolch_mench){unastr++; if (unastr>=255)unastr=254;}} //verner
nastraivaet tuner(keyold==1)&&(key==0)
{keyold=key;unastr--;while(bolch_mench){unast--;
if (unastr<=1)unastr=1;}}(keyold!=5)&&(key==5) { fm=1;am=0;}}//nastr
FM diapazona(keyold!=6)&&(key==6){fm=0;am=1;}//vibor AM
diapasona(keyold!=6)&&(key==7){fm=1;am=1;}//vibor FM2s diapazona
}c();//zapis v regulator ustanov
parametr
}timer0int (void) interrupt 1 using
1
{TL0=0xff; //delid dla chastoti
10000 mks - 10ms =0xb8;(++sot==100)//prohla sek
{(++sek==60)
{=0;(++min==60)
{=0;(++chas==24) chas=0;
}[1]=chas/10+0x30;lcd2[2]=chas%10+0x30;lcd2[3]=0x3a;[4]=min/10+0x30;lcd2[5]=min%10+0x30;lcd2[6]=0x3a;[7]=sek/10+0x30;lcd2[8]=sek%10+0x30;
}
}
}main (void) main (void) {
unsigned char i,p;n1,n2;
/*------------------------------------------------the
serial port for 9600 baud at 11.0592MHz.
-----------------------------------------------*/
#ifndef MONITOR51= 0x50; /* SCON:
mode 1, 8-bit UART, enable rcvr */|= 0x21; /* TMOD: timer 1, mode 2, 8-bit
reload */= 0xfd; /* TH1: reload value for 9600 baud @ 11.0592MHz */= 1; /* TR1:
timer 1 run */= 1;= 1; /* TI: set TI to send first char of UART */
TI = 0;//set obrabot prerivanii= 1;
EA = 1;
#endif=0;(1)//osnovnoi cikl raboti
{
//out data
lcd=0;rs=0;rw=0;P2=1;e=1;delay();delay();delay();e=0;delay();delay();(j=0;j<12;j++)
{rs=1;rw=0;P2=lcd1[j];e=1;delay();delay();delay();e=0;delay();delay();}
//out 1 (j=0;j<28;j++)
{rs=1;rw=0;P2=0x20;e=1;delay();delay();delay();e=0;delay();delay();}
//out ---- do end string(j=0;j<12;j++)
{rs=1;rw=0;P2=lcd1[j];e=1;delay();delay();delay();e=0;delay();delay();}
//out 2 string
}(j=0;j<255;j++) delay();
}