Счетчик длительности телефонного разговора

Характеристика счетчика времени телефонного разговора. Особенности таймера телефонного разговора. Выбор и описание прототипов, разработка структурной и принципиальной схемы устройства. Разработка программного обеспечения и моделирование устройства.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид курсовая работа
Язык русский
Дата добавления 27.11.2014
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Министерство образования Республики Беларусь

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

Кафедра промышленной электроники

«К защите допускаю»

руководитель работы

______________________

«___»___________2012г.

Пояснительная записка

к курсовому проекту:

«Вариант 52. Счетчик длительности телефонного разговора»

Выполнил: Ст. гр. 083122

Михальчик А.Д.

Руководитель работы:

Дерюшев А.А.

Минск 2012 г.

Содержание

Введение

1. Обзор литературных источников

1.1 Счетчик времени разговора

1.2 Счетчик времени телефонных разговоров

1.3 Таймер телефонного разговора

2. Выбор и описание прототипов разрабатываемого устройства

3. Разработка структурной схемы устройства

4. Разработка принципиальной схемы устройства

5. Разработка программного обеспечения

6. Моделирование устройства

Заключение

Список использованных источников

  • Введение

В условиях постоянно повышающейся платы за использование стационарных телефонов становится актуальным контроль за продолжительностью разговоров, и в общем случае - вообще за пользованием услугами проводной электросвязи. Так же довольно часто возникает необходимость в контроле совершенных исходящих вызовов с домашнего телефона (пример - несанкционированное использование различных платных сервисов, и дальнейшие выяснения отношений с узлами электросвязи) [1]. счетчик телефонный разговор программный

Проектируемое устройство позволяют контролировать совершаемые с телефонного аппарата звонки, фиксировать их длительность.

Исходные данные:

Время счета - до 5 часов; Дискретность счета - 1 секунда;

Количество запоминаемых разговоров - до 128

Отображаемая информация - длительность текущего разговора в часах, минутах, секундах; суммарная длительность выбранных разговоров;

Тип индикатора - графический ЖК индикатор;

Источник питания - сеть 220В 50Гц;

1. Обзор литературных источников

1.1 Счетчик времени разговора

В случае, когда абонент желает контролировать время исходящей связи с основного телефонного аппарата для запуска кварцевого генератора часов следует применять схему [2], приведенную на рисунок 1.

В состав схемы входят:

* датчик тока--R1,VТ1,R2,DD1.1;

* фильтр индукторного вызова -- R4, СЗ;

* формирователь импульса цифры номера -- VD3,R5,C2,DD1.2,C5;

* счетчик набранной цифры -- DD2;

* инвертор включения генератора -- DD1.4;

* цепь питания микросхем -- VD 1, R3, С 1, VD2.

Рисунок 1: Счетчик времени разговора

Данная схема позволяет:

* включить счетчик времени после снятия трубки и набора первых 3-х цифр номера (исходящая связь);

* выключить счетчик после окончания разговора (погрешность 2-4 с);

* исключить отсчет времени в случае входящей связи (номер не набирался), а также при параллельном подключении к линии.

Работа схемы заключается в следующем. При снятии трубки на ТА срабатывает датчик тока Rl, VT1 и с запаздыванием в 1 с (фильтр вызова) элемент DD2 подготавливается к счету. Элемент счетчика DD2 считает количество набранных цифр номера. Формирователь R5, С2, DD2.1 переключается в меж серийной паузе набора номера. После первых трех цифр высокий уровень на выходе 7 DD2 останавливает счет и, заряжая С4 через R7, переключает DD1.4, включая тем самым электронные часы. При входящей связи микросхема DD2 также подготавливается к счету, но импульсы набора номера в этом режиме отсутствуют. Электронные часы остаются в выключенном состоянии.

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

1.2 Счетчик времени телефонных разговоров

Чтобы иметь возможность контроля счетов предлагается изготовить счетчик продолжительности телефонного разговора из широко распространенных стрелочных электромеханических часов с питанием от одного гальванического элемента типоразмера АА (316, «пальчиковый»)[3]. Схема счетчика показана на рисунок 2

Рисунок 2: Схема счетчика времени телефонных разговоров

В разрыв телефонной линии включен участок база эмиттер транзистора VT1, зашунтированный резистором Rt. Ток, текущий в линии при снятой трубке, открывает транзистор, замыкающий цепь питания электромеханических часов. Они идут, отсчитывая время разговора. Как только телефонная трубка повешена, закрывшийся транзистор размыкает цепь питания часов и прекращает отсчет времени.

Гальванический элемент G1, питающий часы, условно показан на схеме вне их корпуса рисунок3.

Рисунок 3: Гальванический элемент

Однако извлекать его вовсе не обязательно. Достаточно, как показано на рис. 2, вставить между плюсовым выводом элемента и контактной пружиной часов полоску фольгированного с двух сторон стеклотекстолита толщиной 1 мм или меньше. К слою фольги, контактирующему с выводом элемента, припаивают проводник, идущий к резистору R1 и эмиттеру транзистора VT1. к противоположному слою идущий к коллектору транзистора.

Резистор МЛТ-0,125 или другой малогабаритный. Указанный на схеме транзистор можно заменить любым маломощным кремниевым структуры p-n-p. Обе детали можно разместить в любом удобном месте, например, в телефонной розетке. Перед подключением не забудьте проверить полярность напряжения в телефонной линии и соблюдайте ее.

Первого числа каждого месяца устанавливайте стрелки часов на 12:00. К концу месяца их положение покажет, сколько времени «наговорили» по телефону.

1.3 Таймер телефонного разговора

Схема таймера показана на рисунке 4.

Рисунок 4 Схема таймера телефонных разговоров

Эта схема состоит из двух ждущих мультивибраторов на микросхемах NE7555 или NE555.. Эти микросхемы имеют одинаковое назначение выводов. Вы можете использовать любую из них, не внося никаких изменений в схему устройства. Характеристики таймера NE7555 несколько лучше, чем у NE555 (с точки зрения потребляемой мощности и точности установки интервалов времени).

Вместо двух NE555 или NE7555, показанных на рисунке, можно использовать сдвоенную микросхему NE556. Это несколько уменьшит габариты конструкции и, возможно, ее стоимость. При этом придется изменить соответствующим образом нумерацию выводов. Вариант схемы с использованием NE556 показан ниже

Рисунок 5: Схема таймера телефонных разговоров на основе NE556

В этом устройстве используется дополнительный внешний источник питания. Не пытайтесь использовать для этой цели напряжение телефонной линии, поскольку это может привести к ее перегрузке и нарушению нормального функционирования, а это чревато большим штрафом.

К источнику питания не предъявляются особые требования. Таймер NE555 (и его модификации) работоспособны при напряжениях питания от 5В до 15В. Я рекомендовал бы использовать стандартные напряжения 9В или 12В.

Таймер NE555 запускается спадом входного импульса. В исходном состоянии, когда трубка телефона лежит на рычагах аппарата, постоялое напряжение в линии равно примерно +48 В. Напряжение на входе запуска D1 при этом около +5 В, и оно воспринимается таймером как сигнал высокого уровня. Ждущий мультивибратор не запускается, и его выходное напряжение остается низким. Ни один из светодиодов (HL1, HL2) не светится.

При поднятии трубки (для ответа на телефонный звонок или для набора номера) напряжение на выводе 2 микросхемы D1 падает до величины порядка 1 В, что эквивалентно низкому логическому уровню. Ждущий мультивибратор запускается. Для обеспечения надежного запуска, возможно, придется подобрать резистор R1.

После запуска выход таймера переходит в состояние высокого уровня, при этом загорается светодиод HL1. Его ток ограничивается резистором R4. Напряжение на выходе таймера останется высоким в течение интервала времени, определяемого соотношением:

T=l,lxRxC,

где Т -- время в секундах, R -- сопротивление резистора R3 в омах, С -- емкость конденсатора Q2 в фарадах. Длительность этого интервала мы рассчитаем позже.

Сигнал с выхода микросхемы D1 (вывод 3) не только управляет светодиодом HL1, но подается также на вход запуска второго ждущего мультивибратора (вывод 2 микросхемы D2), полностью идентичного первому (за исключением номиналов времязадающих компонентов -- резистора R5 и конденсатора С4).

Когда после окончания импульса первый таймер (D1) переключается в исходное состояние, на его выходе возникает перепад напряжения (с высокого уровня на низкий), который запускает второй таймер D2. Светодиод HL1 гаснет, загорается второй светодиод HL2, который будет светиться в течение интервала времени, определяемого сопротивлением R5 и емкостью С4. После окончания генерируемого импульса таймер D2 переключается в исходное состояние, светодиод HL2 гаснет. Оба светодиода останутся погашенными до тех пор, пока снова не будет снята трубка телефонного аппарата.

Это устройство можно модифицировать для осуществления более "жесткого" контроля за длительностью разговора. Схему можно сконструировать так, что она будет автоматически прерывать связь по истечении определенного времени. Но вполне могут возникнуть ситуации, в которых коротким телефонным разговором не обойдешься.

2. Выбор и описание прототипов разрабатываемого устройства

Система регистрации тарификации исходящих звонков[5]

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

Описываемая система состоит из регистратора набираемых номеров и компьютера с установленной на нем программой. Регистратор подключают к телефонной линии. Он считывает набираемые номера и передает их компьютеру через последовательный порт. Если в момент звонка компьютер был выключен, или обрабатывающая программа не запущена, то зарегистрированные данные временно хранятся в энергонезависимой памяти устройства.

Основа устройства -- PIC-контроллер DD3 (рис. 6). наиболее дешевый из предлагаемых компанией Microchip. Данные о звонках и настройке хранятся в энергонезависимой памяти DD2. Телефонные аппараты (ТА) можно подключать как непосредственно к линии, так и через регистратор. В последнем случае регистратор сможет определить, с какого аппарата велся разговор. Эту возможность удобно использовать, например, для разделения счетов за междугородные переговоры между несколькими пользователями одной телефонной линии. Связь с компьютером осуществляется через оптопару U5. что позволяет гальванически развязать компьютер и телефонную линию. Питание устройства осуществляется от телефонной линии.

В исходном состоянии (т. е. когда телефонные трубки лежат на всех аппаратах, подключенных к линии) контроллер отслеживает состояние датчика напряжения в линии -- делителя R4R6. производит счет текущего времени и примерно каждые полминуты вызывает обрабатывающую программу компьютера. Если компьютер включен и программа запущена, регистратор сверяет свои внутренние часы с часами компьютера и при необходимости передает накопленную информацию о звонках.

Рисунок 6: Система регистрации тарификации исходящих звонков схема принципиальная

После снятия трубки контроллер определяет путем измерения напряжения на коллекторах транзисторов оптопар U1.1 -- U1.44. с какого именно аппарата сняли трубку. Если этот телефон подключен непосредственно к линии, то считается, что трубку сняли с ТА1. Затем информация о занятии линии и номер определенного аппарата передается компьютеру, что отражается в строке состояния программы и в ее значке на панели задач. Далее устройство считывает набираемый номер и одновременно передает его в компьютер для дальнейшей индикации. После набора каждой цифры в контроллере сбрасывается программный счетчик времени, который позволяет определить окончание набора номера.

Если после набора цифры прошло более 5 с и число набранных цифр более пяти, считается, что номер набран. При этом на управляющий электрод ключа К1 поступает высокий уровень, ключ открывается и подключает компаратор DA1 к общему проводу. Однако контроллер продолжает отслеживать состояние датчика напряжения в линии R4R6 на тот случай, если набор номера будет возобновлен. Сели это произойдет, компаратор снова отключится и опять сбросится счетчик времени.

После окончания набора номера устройство начинает измерять длительность разговора. Наиболее сложным моментом здесь является регистрация начала соединения с абонентом, так как городские телефонные станции не посылают абонентским устройствам никаких сигналов о начале разговора. В большинстве телефонных аппаратов или мини-АТС со встроенными регистраторами эта проблема решается следующим образом, по окончанию набора последней цифры отсчитывается заданное время, после чего разговор считается начавшимся. Это приводит к тому, что в базу данных исходящих звонков попадают данные о разговорах, которые на самом деле не велись (например, когда звонящий ждал ответа более заданного времени, а затем повесил трубку).

Так как подобных случаев бывает достаточно много, то результирующая база данных может быть сильно "засорена" неверной информацией. Если для домашних условий это еще может быть приемлемо, то для организаций, где за день производится множество звонков, неверная информация сильно затруднит обработку полученных данных. К тому же подсчет суммарной стоимости разговоров, конечно, будет неточен.

Для минимизации этой проблемы в регистраторе начало разговора определяется отслеживанием сигнала контроля посылки вызова (КПВ) станции. Для этого и служит компаратор DA1. Как уже было сказано, после окончания набора номера компаратор подключается к линии. Питается он через резистор R5, а сигнал с линии поступает на него через конденсатор СЗ и резистор R10. При этом программа контроллера анализирует сигнал с выхода компаратора, сопоставляя его с частотой сигнала контроля посылки вызова. Эта частота должна быть 425±2 Гц.

После того, как произойдет соединение, звонящий абонент услышит сигнал КПВ, вызываемому будет подаваться сигнал вызова, а контроллер обнаружит сигнал частотой 425 Гц. Длительность посылки сигнала КПВ около 1 с. а пауза между посылками -- не более 5 с. Таким образом, зарегистрировав отсутствие сигнала КПВ в течение более 5 с, можно считать, что на другом конце сняли трубку (начался разговор). В реальном устройстве это время принято немногим больше (10 с), а счет длительности разговора начинается с 5 с. т. е. точность составляет ±5 с.

Однако частота КПВ не всегда равна 425±2 Гц. она может значительно отличаться в зависимости от того, на какую АТС производится вызов. Программа контроллера позволяет обнаруживать частоту в пределах 410...440 Гц. но и этого не всегда бывает достаточно. Если частота сигнала контроля посылки вызова выходит за эти пределы, разговор считается начатым через 20 с после окончания набора последней цифры в случае городского звонка и через 40 с -- в случае междугородного.

Затем регистратор производит подсчет длительности разговора и ожидает, когда трубка будет уложена на аппарат. Как только это произойдет, контроллер зафиксирует полученную информацию в памяти и передаст ее программе компьютера (если она запущена). Объема энергонезависимой памяти достаточно для запоминания примерно 100 внутригородских звонков. После этого контроллер возвращается в состояние ожидания снятия трубки.

Уже упоминалось, что связь с компьютером осуществляется через оптопары U5.1, U5.2 Прием данных производится с коллектора оптрона U5.2. Для передачи зажигается светодиод оптрона U5.1. при этом на выводах порта компьютера RTS и DTR программно выставляются соответственно положительный и отрицательный уровни для питания транзисторов VT2, VT3. Когда светодиод оптопары U5.1 погашен, ее транзистор закрыт. Поэтому транзистор VT2 закрыт, a VT3 открыт и на приемный вывод порта R. поступает отрицательный уровень. При включении оптрона U5.1 транзистор VT2 открывается, VT3 закрывается и на компьютер поступает положительный уровень.

Для включения оптрона U5.1 требуется относительно большой ток (больше, чем ток. который можно потреблять от телефонной линии). Поэтому после передачи каждого байта контроллер делает паузу для зарядки накопительного конденсатора С1, вследствие чего скорость передачи данных будет небольшая, порядка 100 бит/с. Но и этого вполне достаточно для этих целей. Если питать устройство от батареи гальванических элементов, то скорость можно повысить до 300 бит/с. Для этого необходимо в прилагаемой программе прошивки содержимое по адресам 0x01C-0x01F изменить на нуль.

Кварцевый резонатор ZQ1 задает частоту работы внутреннего тактового генератора контроллера DD3. Мультивибратор на элементах DD1.1 и DD1.2 предназначен для работы внутренних часов контроллера, время на которых корректируется при каждом обмене данных с компьютером. Для сохранения показаний часов при кратковременных отключениях от линии служит ионистор С2. Он заряжается через резистор R3 с высоким сопротивлением (100 кОм). чтобы не шунтировать цепь питания контроллера в момент включения устройства. Поэтому зарядка ионистора С2 длится довольно долго, порядка 5...6 часов, а его емкости хватает на 20...30 минут работы регистратора, чего вполне достаточно для поддержания работы часов при недолгом пропадании напряжения питания.

Вместо ионистора С2 допустимо установить батарею гальванических элементов с напряжением 3...4.5 В. Если есть уверенность, что телефонная линия отключаться не будет, можно не устанавливать ни ионистор. ни батарею.

Устройство не требует налаживания и должно работать сразу после сборки. Биты конфигурации для прошивки: генератор LP. сторожевой таймер может быть включенным или выключенным.

Отличием разрабатываемого устройства от приведенного прототипа является отсутствие ПК и наличие графического ЖКИ, что придает устройству большую компактность и мобильность. Так же в функциях проектируемого устройства заложена возможность подсчета общей длины выбранных разговоров, и хранение большого количества данных по длительности разговоров.

3. Разработка структурной схемы устройства

Для определения начала и окончания разговора по стационарному телефону будем использовать датчик в виде кнопки, которая находится под трубкой телефонного аппарата: в момент разговора трубка снята и соответственно кнопка отжата, когда же разговор окончен трубка кладется на место и кнопка вновь прижимается.

Микропроцессор, входящий в блок управления, фиксирует моменты замыкания и размыкания контакта кнопки и таким образом определяет период разговора, производит подсчет его продолжительности и выводит на графический ЖКИ время разговора в формате секунды, минуты, часы. Так же микропроцессор записывает в свою память ОЗУ данные по последним 128 разговорам, причем первым номером едет последний из поступивших звонков, т. е. после каждого нового разговора будет происходить смещение данных в памяти на один вверх. По команде и решению пользователя микропроцессор вычислит суммарную длительность выбранных пользователем разговоров, номера которых также отображаются на ЖКИ.

Информация о текущем разговоре, последнем произведенном разговоре, суммарная длительность выбранных разговоров отображается на графическом ЖКИ, который входит в блок индикации. Графический ЖКИ непосредственно связан с микропроцессором, который производит управление и передачу данных на него по параллельному интерфейсу.

Для пролистывания и просмотра данных в памяти ОЗУ предназначены кнопки блока настройки «ВЕРХ», «НИЗ», микропроцессор фиксирует нажатие на них и производит соответствующую перенастройку памяти ОЗУ и передачу на ЖКИ, в результате на месте отображения последнего из разговоров («Звонок 001») появляется новая надпись и новые данные, соответствующие ранее сохраненным («Звонок 002» и т.д.). При нажатии кнопки «СУММА» происходит прибавление выбранного в памяти разговора к начальному значению суммы длительности разговоров (00:00:00), при выборе данных по другим разговорам их параметры добавляются к новой сумме, полученный результат выводится на ЖКИ. Номера суммированных разговоров так же отображаются на ЖКИ.

Для питания схемы используется блок питания, который понижает входное напряжение с 220В до 5В, а так же преобразует переменное напряжение 50 Гц в постоянное.

В состав проектируемого устройства войдут следующие блоки:

1. Датчик разговора

2. Блок управления

3. Блок индикации

4. Блок настройки

5. Блок питания

4. Разработка принципиальной схемы устройства

В соответствии со структурной схемой разработаем принципиальную схему, выберем компоненты для каждого из введенного блока. В качестве устройства управления выберем микропроцессор фирмы AVR удовлетворяющий следующим требованиям: количество портов ввода/вывода должно позволять подключить ЖК индикатор - 14 выводов; на подключение кнопок отводится 4 вывода, т.е. общее количество портов должно быть не меньше 18. Подсчет времени осуществляется по прерыванию таймера. Общий объем программы составляет 2848 байт. Выдвинутым требованиям отвечает микропроцессор ATmega8 [6]

Рисунок 7: Микропроцессор ATmega8

Краткие характеристики микропроцессора ATmega8:

8-разрядный высокопроизводительный AVR микроконтроллер с малым потреблением

Прогрессивная RISC архитектура

130 высокопроизводительных команд, большинство команд выполняется за один тактовый цикл

32 8-разрядных рабочих регистра общего назначения Полностью статическая работа

Приближающаяся к 16 MIPS (при тактовой частоте 16 МГц) производительность

Встроенный 2-цикловый перемножитель

Энергонезависимая память программ и данных

8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)

1 Кбайт встроенной SRAM

Встроенная периферия

Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения

Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения

Счетчик реального времени с отдельным генератором

Три канала PWM

6-канальный аналого-цифровой преобразователь (в корпусе PDIP)

4 канала с 10-разрядной точностью

2 канала с 8-разрядной точностью

Байт-ориентированный 2-проводный последовательный интерфейс

Программируемый последовательный USART

Последовательный интерфейс SPI (ведущий/ведомый)

Встроенный аналоговый компаратор

Специальные микроконтроллерные функции

Встроенный калиброванный RC-генератор

Внутренние и внешние источники прерываний

Выводы I/O и корпуса

23 программируемые линии ввода/вывода

28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF

Рабочие напряжения

4,5 - 5,5 В (ATmega8)

Рабочая частота

0 - 16 МГц (ATmega8)

Для изначального функционирования микроконтроллера к его выводам VCC,AVCC,GND нужно подключить питание, кварцевый резонатор ZQ1 нужно подключить к выводам XTAL1,XTAL2 и через конденсаторы С4,С5 на землю.

Кнопки предназначенные для выбора разговоров в памяти, произведения суммирования, определения текущего разговора SB1 - SB4, они одним выводом подключены к портам микропроцессора (PB0,PB1,PB2,PB3), а вторым на землю, к тем же портам подключены подтягивающие резисторы (R1,R2,R3,R4). Определение нажатия кнопки осуществляется следующим образом: когда кнопка находится в отжатом состоянии, цепь не замкнута через кнопку на землю, и ток через резистор не течет, следовательно, на резисторе не происходи падения напряжения и на вход порта поступает логическая единица, если нажать на кнопку, то цепь замкнется, через резистор потечет значительный ток, а на порт микропроцессора поступи логический нуль. Анализируя состояния порта, определяется нажатие кнопки.

В качестве графического ЖК индикатора выберем монохромный LCD LGM12641BS1R, на нем можно разместить до восьми строчек и 25-ти столбцов текстовой информации с величиной символа 8x5 , что достаточно для вывода строк текущего разговора, выбранного разговора в памяти, суммарной длительности выбранных разговоров. Все восемь линий данных ЖКИ заведены на порт D микропроцессора через резисторы R11 - R18, которые предназначены для согласования по току, управляющие выводы ЖКИ подключены к выводам PC0 - PC5 через согласующие резисторы R5 - R10.

Непосредственно ЖК дисплеем управляет два контроллера ks0108 - каждый своей половиной дисплея 64*64 точек, выбор соответствующего чипа осуществляется выводами CS1 и CS2 [7]. При высоких уровнях на обоих выводах запись осуществляется в оба чипа.

Назначение выводов индикатора:

1. Vss - общий 0В.

2. Vdd - +5В питание логики.

3. Vo - контрастность.

4. D/I - выбор данные/инструкции 1-данные 0-инструкции.

5. R/W - чтение/запись 1- чтение, 0-запись.

6. E - стробирующий сигнал при записи/чтении.

7-14. DB0-DB7 - шина данных/инструкций.

15. CS1 - выбор кристалла.

16. CS2 - выбор кристалла.

17. RST - сброс.

18. Vee - выход отрицательного напряжения.

19. A - анод подсветки

20. K - катод подсветки.

Управление контрастностью осуществляется отрицательным напряжением с вывода Vee.

Система команд ЖК приведена на рисунке 8.

Рисунок 8: Система команд ЖКИ LGM12641BS1R

По техническому заданию источник питания имеет переменное напряжение 220В с частотой 50Гц, все блоки устройства запитываются постоянным напряжением 5В. Для уменьшения и выравнивания напряжения служит блок питания. Блок питания состоит из понижающего трансформатора (T1), который уменьшает входное напряжения до 12В, диодного моста (набор диодов собранных по мостовой схеме VD1-VD4), преобразователя напряжения L7805CV [8]. Для фильтрации низкочастотных гармоник служат конденсаторы C1,C3(47мкФ), конденсатор C2(0,1 мкФ) отфильтровывает высокочастотные гармоники.

L7805CV -- линейный стабилизатор c фиксированным напряжением положительной полярности 5V и выходным током 1A. На вход линейного стабилизатора подаётся не стабилизированное напряжение 0 до 36V. Внешние радиокомпоненты используются для ускорения переходных процессов. L7805CV выпускается в прочном корпусе TO-220. Данные микросхемы нашли широкое применение в источниках питания логических систем, в радиоэлектронных устройствах, и измерительной технике.

Особенности:

Максимальный выходной ток: 1.5A;

Не требуются внешние компоненты;

Внутренняя термозащита, ограничение тока;

Защита выходного транзистора от КЗ;

Номинальный выходной: 1A

Максимальное входное напряжение: 40V;

Выходное напряжение: 5V;

Корпус: TO220.

Рисунок 9: Линейный стабилизатор напряжения L7805CV

5. Разработка программного обеспечения

.include "m8def.inc"//подключить библиотеку

.equ RST = 5

.equ DI = 4//управляющий вывод ЖКИ прием/передача

.equ RW = 3//управляющий вывод ЖКИ чтение/запись

.equ E = 2//управляющий вывод ЖКИ строб

.equ CS1 = 1

.equ CS2 = 0

.def Temp=R16

.org 0

rjmp reset//перейти к началу программы

//++++++++++ таблица вектаров прерывания ++++++++++++++++++++++++++++++++++++++++++

.org 1nop//rjmp EXT_INT0;

.org 2nop//rjmp EXT_INT1;

.org 3nop//rjmp TIM2_COMP;

.org 4rjmp TIM2_OVF;

.org 5nop//rjmp TIM1_CAPT;

.org 6nop//rjmp TIM1_COMPA;

.org 7nop//rjmp TIM1_COMPB

.org 8nop//rjmp TIM1_OVF

.org 9nop//rjmp TIM0_OVF;

.org 10nop//rjmp SPI_STC;

.org 11nop//rjmp USART_RXC;

.org 12nop//rjmp USART_UDRE;

.org 13nop//rjmp USART_TXC;

.org 14nop//rjmp ADC;

.org 15nop//rjmp EE_RDY;

.org 16nop//rjmp ANA_COMP;

.org 17nop//rjmp TWI;

.org 18nop//rjmp SPM_RDY;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

reset:

//************** начальные установки **********************************************

ldi r19,high(RAMEND)//определить верхний адрес стека

out sph,r19//установить верхний адрес стека

ldi r19,low(RAMEND)//определить нижний адрес стека

out spl,r19//установить нижний адрес стека

ldi r16,0xff

out ddrc,r16//установить все выводы порта C как цифровые выходы

out ddrd,r16//установить все выводы порта D как цифровые выходы

ldi r16,0xf0

out ddrb,r16//установить выводы порта B

ldi r16,0x0f

out pinb,r16//установить выводы порта B

//******************* настройка прерывания по таймеру1 *******************************

ldi r17,(0<<TOIE2)+(1<<OCIE2)

out TIMSK,r17//разрешить прерывание таймера/счетчика Т2

ldi r17,(0<<WGM21)+(0<<WGM20)+(0<<COM21)+(0<<COM20)+(1<<CS22)+(0<<CS21)+(1<<CS20)+(0<<FOC2)

out TCCR2,r17//режим работы таймера Т1 -- normal(CS),clk/128(WGM) ,таймер отключен от OC2(COM)

ldi r17,(1<<AS2)

out ASSR,r17//асинхронный режим

ldi r17,0x1F//значения заносимые в старший байт времени срабатывания прерывания таймера Т1

out OCR2,r17//установить старший байт времени срабатывания прерывания таймера Т1

sei

//********************************************************************************************

ldi temp,0x00//сбросить буфер

movr5,temp//сбросить счетчик верхушки памяти

movr9,temp//сбросить регистр суммы часов

movr10,temp//сбросить регистр суммы минут

movr11,temp//сбросить регистр суммы секунд

ldi temp,0x09

movr6,temp//начальное значение отображаемого звонка

ldi temp,0x01

movr7,temp//начальное значение номера отображаемого звонка

rcall init_LCD//инициализация ЖКИ

rcall LCD_Call_0//вывод на ЖКИ "Текущий разговор"

rcall LCD_Call_2//вывод на ЖКИ "Сумма разговоров"

ldi r16,0x03//Y

ldi r18,0x07//X

rcall X_Y_pos//назначить позицию на ЖКИ

rcall LCD_Call//вывод на ЖКИ "Звонок"

ldi r16,0x03//Y

ldi r18,0x2c//X

rcall X_Y_pos//назначить позицию на ЖКИ

ldi temp, 0x30//0

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30//0

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x31//1

rcall write_symbol_LCD//вывести символ на ЖКИ

cyclle:

ldi r16,0x03//Y

ldi r18,0x00//X

rcall X_Y_pos2//назначить позицию на второй половине ЖКИ

ldi xl,0x00//установить младший разряд для чтения таблицы

ldi xh,0x01//установить старший разряд для чтения таблицы

add xl,r6//перейти в область памяти

rcall RTC_LCD//вывод на ЖКИ "Звонок"

sbis pinb,1//проверить нажата ли кнопка "Вверх"

rcallUp_LCD//перейти на подпрограмму обработки нажатия кнопки "В верх"

sbis pinb,2//проверить нажата ли кнопка "На низ"

rcallDown//перейти на подпрограмму обработки нажатия кнопки "В низ"

sbis pinb,3//проверить нажата ли кнопка "Сумма"

rcallSumma//перейти на подпрограмму обработки нажатия кнопки "Сумма"

rcall trub//перейти на подпрограмму обработки датчика положеной трубки

rjmp cyclle

//================================================================================

//--------- Обработка нажатия кнопки "Сумма" ---------------------------------------------------------------------------------

Summa:

sbis pinb,3

rjmpSumma//перейти на начало подкрограммы пока не отжата кнопка

add r11,r15//добавить секунды выбраного разговора

mov temp, r11

subi temp,60//проветка переполнения секунд

brcs inc_r10//переход по переносу, C = 1

inc r10//добавить 1 минуту

ldi temp,0

mov r11, temp//сброс секунд

inc_r10:

add r10,r14//добавить минуты выбраного разговора

mov temp, r10

subi temp,60//проветка переполнения минут

brcs inc_r9//переход по переносу, C = 1

inc r9//добавить 1 час

ldi temp,0

mov r10, temp//сброс минут

inc_r9:

add r9,r13//добавить часы выбраного разговора

rcall LCD_summa//вывод на ЖКИ "Сумма разговоров"

ldi r16,0x06//Y

ldi r18,0x00//X

add r18,r25//позиция номера текущего слагаемого

rcall X_Y_pos//назначить позицию на ЖКИ

ldi temp, 0x30//разряд сотен

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r8//разряд десятков

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r7//разряд едениц

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp,23

add r25,temp//позиция номера текущего слагаемого

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Обработка нажатия кнопки "Вверх" ----------------------------------------------------------------------------------

Up_LCD:

sbis pinb,1

rjmpUp_LCD//перейти на начало подкрограммы пока не отжата кнопка

dec r6//уменьшить мерхушку адреса

dec r6//уменьшить мерхушку адреса

dec r6//уменьшить мерхушку адреса

inc r7//увеличить на 1 номер звонка в памяти

mov temp,r7

subi temp,10//проверка переполнения разряда

brne no_inc_des//переход по переносу, C = 1

inc r8//увеличить на 10 номер звонка в памяти

ldi temp,0

mov r7,temp

no_inc_des:

ldi r16,0x03//Y

ldi r18,0x2c//X

rcall X_Y_pos//назначить позицию на ЖКИ

ldi temp, 0x30//разряд сотен

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r8//разряд десятков

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r7//разряд едениц

rcall write_symbol_LCD//вывести символ на ЖКИ

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Обработка нажатия кнопки "В низ" ----------------------------------------------------------------------------------

Down:

sbis pinb,2

rjmpDown//перейти на начало подкрограммы пока не отжата кнопка

inc r6

inc r6

inc r6

dec r7

mov temp,r7//проверка окончания минуты

subi temp,255

brne no_dec_des//переход по переносу, C = 1

dec r8

ldi temp,9

mov r7,temp

no_dec_des:

ldi r16,0x03//Y

ldi r18,0x2c//X

rcall X_Y_pos//назначить позицию на ЖКИ

ldi temp, 0x30//разряд сотен

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r8//разряд десятков

rcall write_symbol_LCD//вывести символ на ЖКИ

ldi temp, 0x30

add temp,r7//разряд едениц

rcall write_symbol_LCD//вывести символ на ЖКИ

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Обработка датчика ----------------------------------------------------------------------------------------------------

trub:

sbis pinb,0

rjmpcall_off//датчик не сработал

rjmpcall_on//датчик сработал

call_on:

ldi r17,(0<<TOIE2)+(1<<OCIE2)

out TIMSK,r17//разрешить прерывание таймера/счетчика Т2

rcall RTC_LCD_0//индикация времени текущего разговора

ldi r16,0x01

mov r4,r16//установить статус работы с новым звонком

ret

call_off:

sbrc r4,0

rcall new_call//перейти на подпрограмму работы с новым звонком

ldi temp, 0//сбрость часы текущего звонка

mov r0,temp//сбрость часы текущего звонка

ldi temp, 0//сбрость минуты текущего звонка

mov r1,temp//сбрость минуты текущего звонка

ldi temp, 0//сбрость секунды текущего звонка

mov r2,temp//сбрость секунды текущего звонка

ldi r16,0x00

mov r4,r16//сбросить статус работы с новым звонком

rcall RTC_LCD_0//индикация времени текущего разговора

ldi r17,(0<<TOIE2)+(0<<OCIE2)

out TIMSK,r17//разрешить прерывание таймера/счетчика Т2

ret

ret

//--------------------------------------------------------------------------------------------------------------------------------

new_call:

inc r5//счетчик последнего значения в памяти

inc r5

inc r5

mov r6,r5

ldi temp,1

mov r7,temp

ldi r16,0x03//Y

ldi r18,0x2c//X

rcall X_Y_pos

ldi temp, 0x30

rcall write_symbol_LCD

ldi temp, 0x30

rcall write_symbol_LCD

ldi temp, 0x30

add temp,r7

rcall write_symbol_LCD

ldi zh,0x04//установить старший разряд для чтения таблицы

ldi zl,0x00//установить младший разряд для чтения таблицы

ldi xl,0x00//установить младший разряд для чтения из блока памяти текста

ldi xh,0x01//установить старший разряд для чтения из блока памяти текста

add xl,r5

stx+,r0//записать символ по адресу x в память программ

stx+,r1

stx+,r2

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Вывод на ЖКИ "Звонок" ------------------------------------------------------------------------------------------------

LCD_Call:

ldi temp, 0xc7//З

rcall write_symbol_LCD

ldi temp, 0xe2//в

rcall write_symbol_LCD

ldi temp, 0xee//о

rcall write_symbol_LCD

ldi temp, 0xed//н

rcall write_symbol_LCD

ldi temp, 0xee//о

rcall write_symbol_LCD

ldi temp, 0xea//к

rcall write_symbol_LCD

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Вывод на ЖКИ "Текущий разговор" ---------------------------------------------------------------------------------

LCD_Call_0:

ldi r16,0x00//Y

ldi r18,0x08//X

rcall X_Y_pos

ldi temp, 0xd2//Т

rcall write_symbol_LCD

ldi temp, 0xe5//е

rcall write_symbol_LCD

ldi temp, 0xea//к

rcall write_symbol_LCD

ldi temp, 0xf3//у

rcall write_symbol_LCD

ldi temp, 0xf9//щ

rcall write_symbol_LCD

ldi temp, 0xe8//и

rcall write_symbol_LCD

ldi temp, 0xe9//й

rcall write_symbol_LCD

ldi r16,0x00//Y

ldi r18,0x00//X

rcall X_Y_pos2

ldi temp, 0xf0//р

rcall write_symbol_LCD2

ldi temp, 0xe0//а

rcall write_symbol_LCD2

ldi temp, 0xe7//з

rcall write_symbol_LCD2

ldi temp, 0xe3//г

rcall write_symbol_LCD2

ldi temp, 0xee//о

rcall write_symbol_LCD2

ldi temp, 0xe2//в

rcall write_symbol_LCD2

ldi temp, 0xee//о

rcall write_symbol_LCD2

ldi temp, 0xf0//р

rcall write_symbol_LCD2

ret

//--------------------------------------------------------------------------------------------------------------------------------

//--------- Вывод на ЖКИ "Сумма разговоров" ---------------------------------------------------------------------------------

LCD_Call_2:

ldi r16,0x05//Y

ldi r18,0x08//X

rcall X_Y_pos

ldi temp, 0xd1//С

rcall write_symbol_LCD

ldi temp, 0xf3//у

rcall write_symbol_LCD

ldi temp, 0xec//м

rcall write_symbol_LCD

ldi temp, 0xec//м

rcall write_symbol_LCD

ldi temp, 0xe0//а

rcall write_symbol_LCD

ldi temp, 0x00//

rcall write_symbol_LCD

ldi r16,0x05//Y

ldi r18,0x00//X

rcall X_Y_pos2

ldi temp, 0xf0//р

rcall write_symbol_LCD2

ldi temp, 0xe0//а

rcall write_symbol_LCD2

ldi temp, 0xe7//з

rcall write_symbol_LCD2

ldi temp, 0xe3//г

rcall write_symbol_LCD2

ldi temp, 0xee//о

rcall write_symbol_LCD2

ldi temp, 0xe2//в

rcall write_symbol_LCD2

ldi temp, 0xee//о

rcall write_symbol_LCD2

ldi temp, 0xf0//р

rcall write_symbol_LCD2

ldi temp, 0xee//о

rcall write_symbol_LCD2

ldi temp, 0xe2//в

rcall write_symbol_LCD2

ret

//-----------------------------------------------------------------------------------------------------

//подпрограмма обработки прерывания таймера2

TIM2_OVF:

sbrc r12,3//проверка счетчика секунды

rcall RTC_count//подпрограмма увеличения времени в формате часы:минуты:секунды дни месяцы

ldi r16,0//сбросить буфер

sbrc r12,3//проверка переполнения счетчика секунды

mov r12,r16//сбросить счетчик секунды

inc r12//инкрементировать счетчик секунды

ldi r17,0//очистить счетчика таймера 2

out TCNT2,r17

reti

//-------- подпрограмма счета часов реального времени----------------------------------------------------

RTC_count:

inc r0//инкрементировать секунды

mov r17,r0//проверка окончания минуты

subi r17,60

brcc min_inc//переход по переносу, C = 1

ret

min_inc:

inc r1//инкрементировать минуты

ldi r17,0//сбросить счетчик секунд

mov r0,r17

mov r17,r1//проверка окончания часа

subi r17,60

brcc hour_inc//переход по переносу, C = 1

ret

hour_inc:

ldi r17,0//сбросить счетчик минут

mov r1,r17

mov r17,r2//проверка окончания дня

subi r17,5

brcc hour_end//переход по переносу, C = 1

inc r2//инкрементировать часы

ret

hour_end:

ret

//------------------------------------------------------------------------------------------------------------------------

//-------- отображение на ЖКИ времени текущего разговора ---------------------------------------------------------------

RTC_LCD_0:

ldi r16,0x01//Y

ldi r18,0x00//X

rcall X_Y_pos2

mov r18,r2

rcall hex_to_binary_decimal

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r1

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r0

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

ret

//------------------------------------------------------------------------------------------------------------------------------

//-------- отображение на ЖКИ времени выбраного разговора --------------------------------------------------------------

RTC_LCD:

ldr15,x+

ldr14,x+

ldr13,x+

mov r18,r13

rcall hex_to_binary_decimal

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r14

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r15

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

ret

//-----------------------------------------------------------------------------------------------------------------------------

//-------- отображение на ЖКИ суммы выбраных разговоров --------------------------------------------------------------

LCD_summa:

ldi r16,0x07//Y

ldi r18,0x00//X

rcall X_Y_pos2

mov r18,r9

rcall hex_to_binary_decimal

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r10

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

mov r18,r11

rcall hex_to_binary_decimal

ldi temp,0x3a//":"

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r19

rcall write_symbol_LCD2//передать на ЖКИ

ldi temp,0x30

add temp,r18

rcall write_symbol_LCD2//передать на ЖКИ

ret

/////////// подпрограмма перевода шеснадцатиричного числа в двоично-десятичное //////////////

hex_to_binary_decimal:

ldi r19,0

mov r20,r18

div_10:

subi r20,10

brcs div_10_end//переход по переносу, C = 1

inc r19

rjmp div_10

div_10_end:

subi r20,246

mov r18,r20

ret

/////////////////////////////////////////////////////////////////////////////////////////////

/////////// подпрограмма задержки на 50 циклов //////////////////////////////////////////////

delay_50:

ldi r21,50//установить время задержки

ldi r20,0//сбросить счетчик задержки

inc_50:

inc r20//инкрементировать счетчик задержки

cpse r20,r21//сравнить время и счетчик задержки

rjmp inc_50//вернуться инкрементированию счетчика(r20<r21)

ret

/////////////////////////////////////////////////////////////////////////////////////////////

/////////// иницивиализация ЖКИ дисплея /////////////////////////////////////////////////////

init_LCD:

sbi portc,RST

rcall delay_250

cbi portc,DI//настроить ЖКИ на прием команд

cbi portc,RW//ЖЛИ в режиме приема

cbi portc,E//импульс строба

ldi r17,0x3e//включить дисплей

rcall LCD//передать на ЖКИ

ldi r16,0x00//Y

ldi r18,0x00//X

rcall X_Y_pos

ldi r17,0xc0

rcall Write_com

ldi r17,0x3f

rcall Write_com

ret//выход из подпрограммы

/////////////////////////////////////////////////////////////////////////////////////////////

X_Y_pos:

ldi r17,0xb8

add r17,r16

rcall Write_com

ldi r17,0x40

add r17,r18

rcall Write_com

ret

Write_data:

sbi portc,CS1

cbi portc,CS2

sbi portc,DI

cbi portc,RW

nop

nop

out portd,r17//установить передаваемые данные

sbi portc,E//установить строб

nop

nop

nop

cbi portc,E//сбросить строб

rcall delay_50//установить задержку

nop

cbi portc,CS1

ret

Write_com:

sbi portc,CS1

cbi portc,CS2

cbi portc,DI

cbi portc,RW

nop

nop

out portd,r17//установить передаваемые данные

sbi portc,E//установить строб

nop

nop

nop

cbi portc,E//сбросить строб

rcall delay_50//установить задержку

nop

cbi portc,CS1

ret

X_Y_pos2:

ldi r17,0xb8

add r17,r16

rcall Write_com2

ldi r17,0x40

add r17,r18

rcall Write_com2

ret

Write_data2:

cbi portc,CS1

sbi portc,CS2

sbi portc,DI

cbi portc,RW

nop

nop

out portd,r17//установить передаваемые данные

sbi portc,E//установить строб

nop

nop

nop

cbi portc,E//сбросить строб

rcall delay_50//установить задержку

nop

cbi portc,CS1

ret

Write_com2:

cbi portc,CS1

sbi portc,CS2

cbi portc,DI

cbi portc,RW

nop

nop

out portd,r17//установить передаваемые данные

sbi portc,E//установить строб

nop

nop

nop

cbi portc,E//сбросить строб

rcall delay_50//установить задержку

nop

cbi portc,CS1

ret

///////////передача данных на ЖКИ ///////////////////////////////////////////////////////////

LCD:

out portd,r17//установить передаваемые данные

sbi portc,E//установить строб

nop

nop

nop

cbi portc,E//сбросить строб

//rcall delay_50//установить задержку

nop

ret//выход из подпрограммы

write_symbol_LCD:

//ldi r17,0x00

ldi zl,0x00//установить младший разряд для чтения таблицы

ldi zh,0x08//установить старший разряд для чтения таблицы

clc//сброс флага переноса заема C = 0

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_1//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_1:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_2//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_2:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_3//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_3:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_4//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_4:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_5//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_5:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_6//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_6:

mov r17,temp

subi r17,0x33

BRCSdec_zl_1//переход если нет переноса

dec zl

dec_zl_1:

mov r17,temp

subi r17,0x66

BRCSdec_zl_2//переход если нет переноса

dec zl

dec_zl_2:

mov r17,temp

subi r17,0xb7

BRCSdec_zl_3//переход если нет переноса

dec zl

dec_zl_3:

mov r17,temp

subi r17,0xcc

BRCSdec_zl_4//переход если нет переноса

dec zl

dec_zl_4:

lpmr17,z+

rcall Write_data//передать на ЖКИ

lpmr17,z+

rcall Write_data//передать на ЖКИ

lpmr17,z+

rcall Write_data//передать на ЖКИ

lpmr17,z+

rcall Write_data//передать на ЖКИ

lpmr17,z+

rcall Write_data//передать на ЖКИ

lpmr17,z+

rcall Write_data//передать на ЖКИ

ret

write_symbol_LCD2:

//ldi r17,0x00

ldi zl,0x00//установить младший разряд для чтения таблицы

ldi zh,0x08//установить старший разряд для чтения таблицы

clc//сброс флага переноса заема C = 0

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_12//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_12:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_22//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_22:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_32//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_32:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_42//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_42:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_52//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_52:

adc zl,Temp//прибавить адрес текущего символа в кодировке ASCII к начальному

BRCCadc_62//переход если нет переноса

inczh//инкриментировать старший адрес таблицы при переполнении младшего

adc_62:

mov r17,temp

subi r17,0x33

BRCSdec_zl_12//переход если нет переноса

dec zl

dec_zl_12:

mov r17,temp

subi r17,0x66

BRCSdec_zl_22//переход если нет переноса

dec zl

dec_zl_22:

mov r17,temp

subi r17,0xb7

BRCSdec_zl_32//переход если нет переноса

dec zl

dec_zl_32:

mov r17,temp

subi r17,0xcc

BRCSdec_zl_42//переход если нет переноса

dec zl

dec_zl_42:

lpmr17,z+

rcall Write_data2//передать на ЖКИ

lpmr17,z+

rcall Write_data2//передать на ЖКИ

lpmr17,z+

rcall Write_data2//передать на ЖКИ

lpmr17,z+

rcall Write_data2//передать на ЖКИ

lpmr17,z+

rcall Write_data2//передать на ЖКИ

lpmr17,z+

rcall Write_data2//передать на ЖКИ

ret

.org 1024

.db 0x00, 0x00, 0x2f, 0x00, 0x00 // !0x21

.db 0x00, 0x07, 0x00, 0x07, 0x00 // "0x22

.db 0x14, 0x7f, 0x14, 0x7f, 0x14 // #0x23

.db 0x24, 0x2a, 0x7f, 0x2a, 0x12 // $0x24

.db 0xc4, 0xc8, 0x10, 0x26, 0x46 // %0x25

.db 0x36, 0x49, 0x55, 0x22, 0x50 // &0x26

.db 0x00, 0x05, 0x03, 0x00, 0x00 // '0x27

.db 0x00, 0x1c, 0x22, 0x41, 0x00 // (0x28

.db 0x00, 0x41, 0x22, 0x1c, 0x00 // )0x29

.db 0x14, 0x08, 0x3E, 0x08, 0x14 // *0x2a

.db 0x08, 0x08, 0x3E, 0x08, 0x08 // +0x2b

.db 0x00, 0x00, 0x50, 0x30, 0x00 // ,0x2c

.db 0x10, 0x10, 0x10, 0x10, 0x10 // -0x2d

.db 0x00, 0x60, 0x60, 0x00, 0x00 // .0x2e

.db 0x20, 0x10, 0x08, 0x04, 0x02 // /0x2f

.db 0x3E, 0x51, 0x49, 0x45, 0x3E // 00x30

.db 0x00, 0x42, 0x7F, 0x40, 0x00 // 1

.db 0x42, 0x61, 0x51, 0x49, 0x46 // 2

.db 0x21, 0x41, 0x45, 0x4B, 0x31 // 3

.db 0x18, 0x14, 0x12, 0x7F, 0x10 // 4

.db 0x27, 0x45, 0x45, 0x45, 0x39 // 5

.db 0x3C, 0x4A, 0x49, 0x49, 0x30 // 6

.db 0x01, 0x71, 0x09, 0x05, 0x03 // 7

.db 0x36, 0x49, 0x49, 0x49, 0x36 // 8

.db 0x06, 0x49, 0x49, 0x29, 0x1E // 9

.db 0x00, 0x36, 0x36, 0x00, 0x00 // :

.db 0x00, 0x56, 0x36, 0x00, 0x00 // ;

.db 0x08, 0x14, 0x22, 0x41, 0x00 // <

.db 0x14, 0x14, 0x14, 0x14, 0x14 // =

.db 0x00, 0x41, 0x22, 0x14, 0x08 // >

.db 0x02, 0x01, 0x51, 0x09, 0x06 // ?

.db 0x32, 0x49, 0x59, 0x51, 0x3E // @0x40

.db 0x7E, 0x11, 0x11, 0x11, 0x7E // A

.db 0x7F, 0x49, 0x49, 0x49, 0x36 // B

.db 0x3E, 0x41, 0x41, 0x41, 0x22 // C

.db 0x7F, 0x41, 0x41, 0x22, 0x1C // D

.db 0x7F, 0x49, 0x49, 0x49, 0x41 // E

.db 0x7F, 0x09, 0x09, 0x09, 0x01 // F

.db 0x3E, 0x41, 0x49, 0x49, 0x7A // G

.db 0x7F, 0x08, 0x08, 0x08, 0x7F // H

.db 0x00, 0x41, 0x7F, 0x41, 0x00 // I

.db 0x20, 0x40, 0x41, 0x3F, 0x01 // J

.db 0x7F, 0x08, 0x14, 0x22, 0x41 // K

.db 0x7F, 0x40, 0x40, 0x40, 0x40 // L

.db 0x7F, 0x02, 0x0C, 0x02, 0x7F // M

.db 0x7F, 0x04, 0x08, 0x10, 0x7F // N

.db 0x3E, 0x41, 0x41, 0x41, 0x3E // O

.db 0x7F, 0x09, 0x09, 0x09, 0x06 // P0x50

.db 0x3E, 0x41, 0x51, 0x21, 0x5E // Q

.db 0x7F, 0x09, 0x19, 0x29, 0x46 // R

.db 0x46, 0x49, 0x49, 0x49, 0x31 // S

.db 0x01, 0x01, 0x7F, 0x01, 0x01 // T

.db 0x3F, 0x40, 0x40, 0x40, 0x3F // U

.db 0x1F, 0x20, 0x40, 0x20, 0x1F // V

.db 0x3F, 0x40, 0x38, 0x40, 0x3F // W

.db 0x63, 0x14, 0x08, 0x14, 0x63 // X

.db 0x07, 0x08, 0x70, 0x08, 0x07 // Y

.db 0x61, 0x51, 0x49, 0x45, 0x43 // Z

.db 0x00, 0x7F, 0x41, 0x41, 0x00 // [

.db 0x55, 0x2A, 0x55, 0x2A, 0x55 // 55

.db 0x00, 0x41, 0x41, 0x7F, 0x00 // ]

.db 0x04, 0x02, 0x01, 0x02, 0x04 // ^

.db 0x40, 0x40, 0x40, 0x40, 0x40 // _

.db 0x00, 0x01, 0x02, 0x04, 0x00 // '0x60


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.