close

Вход

Забыли?

вход по аккаунту

?

Курсач!!

код для вставкиСкачать
 Министерство образования Республики Беларусь
Учреждение образования "Белорусский государственный университет информатики и радиоэлектроники"
Факультет заочного образования
Кафедра проектирования информационно-компьютерных систем
Дисциплина: Программирование технических средств и программируемые цифровые устройства в системах безопасности
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
на тему
Реализация терморегулятора с гистерезисом на основе микроконтроллера ATmega 128 (с использованием термодатчика DS18B20)
БГУИР КР 3-38 02 03
Студент: гр. 902501 Сидяко В.В.
Руководитель: магистр технических наук, старший преподаватель Логин В. М.
Минск 2013
СОДЕРЖАНИЕ
ВВЕДЕНИЕ3
1.ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ И ПРИНЦИПЫ ФУНКЦИОНИРОВАНИЯ ОТДЕЛЬНЫХ УЗЛОВ УСТРОЙСТВА.4
1.1 Микроконтроллер4
1.2 Температурный датчик DS18B2010
1.3 Контроллер HD4478011
1.4 Подключение датчика DS18B20 с использованием порта 1-WIRE.12
2. ОБОСНОВАНИЕ СТРУКТУРНОЙ СХЕМЫ УСТРОЙСТВА15
3. ОБОСНОВАНИЕ ПРИНЦИПИАЛЬНОЙ СХЕМЫ УСТРОЙСТВА16
4. РАЗРАБОТКА ПЕЧАТНОЙ ПЛАТЫ17
5.РАЗРАБОТКА АЛГОРИТМА РАБОТЫ ПРОГРАММЫ.18
6. РАЗРАБОТКА ПРОГРАММЫ19
ЗАКЛЮЧЕНИЕ21
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ22
ПРИЛОЖЕНИЕ А (листинг программы)23
ПРИЛОЖЕНИ В (графический материал)39
СВОДНАЯ ВЕДОМОСТЬ40
ВВЕДЕНИЕ
Данный курсовой проект представляет собой терморегулятор с гистерезисом, реализованный на микроконтроллере AVR. Устройство может выполнять следующие действия:
определение температуры окружающей среды;
отображение температуры окружающей среды на ЖК дисплее;
поддерживать температуру;
своевременное реагирование на изменение температуры.
1.ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ И ПРИНЦИПЫ ФУНКЦИОНИРОВАНИЯ ОТДЕЛЬНЫХ УЗЛОВ УСТРОЙСТВА.
1.1 Микроконтроллер
Основным узлом разрабатываемого устройства контроля доступам явлеется микроконтроллер Atmega128, приведем его описание ниже.
Отличительные особенности: Высокопроизводительный, маломощный 8-разрядный AVR-микроконтроллер Развитая RISC-архитектура
- 133 мощных инструкций, большинство из которых выполняются за один машинный цикл
- 32 8-разр. регистров общего назначения + регистры управления встроенной периферией
- Полностью статическая работа
- Производительность до 16 млн. операций в секунду при тактовой частоте 16 МГц
- Встроенное умножающее устройство выполняет умножение за 2 машинных цикла - Энергонезависимая память программ и данных
-Износостойкость 128-ми кбайт внутрисистемно перепрограммируемой флэш-памяти: 1000 циклов запись/стирание
- Опциональный загрузочный сектор с отдельной программируемой защитой
Внутрисистемное программирование встроенной загрузочной программой
Гарантированная двухоперационность: возможность чтения во время записи - Износостойкость 4 кбайт ЭСППЗУ: 100000 циклов запись/стирание
- Встроенное статическое ОЗУ емкостью 4 кбайт
- Опциональная возможность адресации внешней памяти размером до 64 кбайт
- Программируемая защита кода программы
- Интерфейс SPI для внутрисистемного программирования Интерфейс JTAG (совместимость со стандартом IEEE 1149.1)
- Граничное сканирование в соответствии со стандартом JTAG
- Обширная поддержка функций встроенной отладки
- Программирование флэш-памяти, ЭСППЗУ, бит конфигурации и защиты через интерфейс JTAG Отличительные особенности периферийных устройств
- Два 8-разр. таймера-счетчика с раздельными предделителями и режимами сравнения
- Два расширенных 16-разр. таймера-счетчика с отдельными предделителями, режимами сравнения и режимами захвата
- Счетчик реального времени с отдельным генератором
- Два 8-разр. каналов ШИМ
- 6 каналов ШИМ с программируемым разрешением от 2 до 16 разрядов
- Модулятор выходов сравнения
- 8 мультиплексированных каналов 10-разрядного аналогово-цифрового преобразования 8 несимметричных каналов
7 дифференциальных каналов
2 дифференциальных канала с выборочным усилением из 1x, 10x и 200x - Двухпроводной последовательный интерфейс, ориентированный не передачу данных в байтном формате
- Два канала программируемых последовательных УСАПП
- Последовательный интерфейс SPI с поддержкой режимов ведущий/подчиненный
- Программируемый сторожевой таймер со встроенным генератором
- Встроенный аналоговый компаратор Специальные возможности микроконтроллера
- Сброс при подаче питания и программируемая схема сброса при снижении напряжения питания
- Встроенный калиброванный RC-генератор
- Внешние и внутренние источники прерываний
- Шесть режимов снижения энергопотребления: холостой ход (Idle), уменьшение шумов АЦП, экономичный (Power-save), выключение (Power-down), дежурный (Standby) и расширенный дежурный (Extended Standby)
- Программный выбор тактовой частоты
- Конфигурационный бит для перевода в режим совместимости с ATmega103
- Общее выключение подтягивающих резисторов на всех линиях портов ввода-вывода Ввод-вывод и корпуса
- 53 -программируемые линии ввода-вывода
- 64-выв. корпус TQFP Рабочие напряжения
- 2.7 - 5.5В для ATmega128L
- 4.5 - 5.5В для ATmega128 Градации по быстродействию
- 0 - 8 МГц для ATmega128L
Рисунок 1 - Расположение выводов у ATmega128
Краткий обзор ATmega128 - маломощный 8-разр. КМОП микроконтроллер, основанный на расширенной AVR RISC-архитектуре. За счет выполнения большинства инструкций за один машинный цикл ATmega128 достигает производительности 1 млн. операций в секунду/МГц, что позволяет проектировщикам систем оптимизировать соотношение энергопотребления и быстродействия.
Ядро AVR сочетает богатый набор инструкций с 32 универсальными рабочими регистрами. Все 32 регистра непосредственно подключены к арифметико-логическому устройству (АЛУ), который позволяет указать два различных регистра в одной инструкции и выполнить ее за один цикл. Данная архитектура обладает большей эффективностью кода за счет достижения производительности в 10 раз выше по сравнению с обычными CISC-микроконтроллерами.
Рисунок 2 - Функциональная схема
ATmega128 содержит следующие элементы: 128 кбайт внутрисистемно программируемой флэш-памяти с поддержкой чтения во время записи, 4 кбайт ЭСППЗУ, 4 кбайт статического ОЗУ, 53 линии универсального ввода-вывода, 32 универсальных рабочих регистра, счетчик реального времени (RTC), четыре гибких таймера-счетчика с режимами сравнения и ШИМ, 2 УСАПП, двухпроводной последовательный интерфейс ориентированный на передачу байт, 8-канальный 10-разр. АЦП с опциональным дифференциальным входом с программируемым коэффициентом усиления, программируемый сторожевой таймер с внутренним генератором, последовательный порт SPI, испытательный интерфейс JTAG совместимый со стандартом IEEE 1149.1, который также используется для доступа к встроенной системе отладке и для программирования, а также шесть программно выбираемых режимов уменьшения мощности. Режим холостого хода (Idle) останавливает ЦПУ, но при этом поддерживая работу статического ОЗУ, таймеров-счетчиков, SPI-порта и системы прерываний. Режим выключения (Powerdown) позволяет сохранить содержимое регистров, при остановленном генераторе и выключении встроенных функций до следующего прерывания или аппаратного сброса. В экономичном режиме (Power-save) асинхронный таймер продолжает работу, позволяя пользователю сохранить функцию счета времени в то время, когда остальная часть контроллера находится в состоянии сна. Режим снижения шумов АЦП (ADC Noise Reduction) останавливает ЦПУ и все модули ввода-вывода, кроме асинхронного таймера и АЦП для минимизации импульсных шумов в процессе преобразования АЦП. В дежурном режиме (Standby) кварцевый/резонаторный генератор продолжают работу, а остальная часть микроконтроллера находится в режиме сна. Данный режим характеризуется малой потребляемой мощностью, но при этом позволяет достичь самого быстрого возврата в рабочий режим. В расширенном дежурном режиме (Extended Standby) основной генератор и асинхронный таймер продолжают работать. Микроконтроллер производится по технологии высокоплотной энергонезависимой памяти компании Atmel. Встроенная внутрисистемно программируемая флэш-память позволяет перепрограммировать память программ непосредственно внутри системы через последовательный интерфейс SPI с помощью простого программатора или с помощью автономной программы в загрузочном секторе. Загрузочная программа может использовать любой интерфейс для загрузки прикладной программы во флэш-память. Программа в загрузочном секторе продолжает работу в процессе обновления прикладной секции флэш-памяти, тем самым поддерживая двухоперационность: чтение во время записи. За счет сочетания 8-разр. RISC ЦПУ с внутрисистемно самопрограммируемой флэш-памятью в одной микросхеме ATmega128 является мощным микроконтроллером, позволяющим достичь высокой степени гибкости и эффективной стоимости при проектировании большинства приложений встроенного управления. ATmega128 поддерживается полным набором программных и аппаратных средств для проектирования, в т.ч.: Си-компиляторы, макроассемблеры, программные отладчики/симуляторы, внутрисистемные эмуляторы и оценочные наборы.
1.2 Температурный датчик DS18B20
DS18B20 - Калиброванный цифровой термометр с однопроводным 1-Wire-интерфейсом и перестраиваемой разрядностью преобразования. Диапазон измеряемых температур от - 55°C до +125°C. Считываемый с микросхемы цифровой код является результатом непосредственного прямого измерения температуры и не нуждается в дополнительных преобразованиях. Программируемая пользователем разрешающая способность встроенного АЦП может быть изменена в диапазоне от 9 до 12 разрядов выходного кода. Абсолютная погрешность преобразования меньше 0,5°C в диапазоне контролируемых температур - 10°C до +85°C. Максимальное время полного 12-ти разрядного преобразования ~750 мс. Энергонезависимая память температурных установок микросхемы обеспечивает запись произвольных значений верхнего и нижнего контрольных порогов. Кроме того, термометр содержит встроенный логический механизм приоритетной сигнализации в 1-Wire-линию о факте выхода контролируемой им температуры за один из выбранных порогов. Узел 1-Wire-интерфейса компонента организован таким образом, что существует теоретическая возможность адресации неограниченного количества подобных устройств на одной 1-Wire-линии. Термометр имеет индивидуальный 64-разрядный регистрационный номер (групповой код 028Н) и обеспечивает возможность работы без внешнего источника энергии, только за счет паразитного питания 1-Wire-линии. Питание микросхемы через отдельный внешний вывод производится напряжением от 3,0 В до 5,5 В. Термометр размещается в транзисторном корпусе TO-92, или в 8-контактном корпусе SO для поверхностного монтажа (DS18B20Z), или 8-контактном корпусе микро-SOP для поверхностного монтажа (DS18B20U).
Выпускается специальная модификация цифрового термометра, предназначенная только для работы в режиме паразитного питания DS18B20-PAR. Она размещается в транзисторном корпусе TO-92, один из выводов которого не используется.
1.3 Контроллер HD44780
Контроллер HD44780 потенциально может управлять 2-мя строками по 40 символов в каждой (для модулей с 4-мя строками по 40 символов используются два однотипных контроллера), при матрице символа 5 х 7 точек. Контроллера также поддерживает символы с матрицей 5 х 10 точек, но в последние годы ЖКИ-модули с такой матрицей практически не встречаются, поэтому можно считать, что фактически бывают только символы 5х7 точек.
Существует несколько различных более-менее стандартных форматов ЖКИ-модулей (символов х строк): 8х2, 16х1, 16х2, 16х4, 20х1, 20х2, 20х4, 24х2, 40х2, 40х4. Встречаются и менее распространенные форматы: 8х1, 12х2, 32х2 и др., - принципиальных ограничений на комбинации и количество отображаемых символов контроллер не накладывает - модуль может иметь любое количество символов от 1 до 80, хотя в некоторых комбинациях программная адресация символов может оказаться не очень удобной.
У контроллера HD44780 существует набор внутренних флагов, определяющих режимы работы различных элементов контроллера. Переопределение значений флагов производится специальными командами, записываемыми в регистр IR, при этом комбинации старших битов определяют группу флагов или команду, а младшие содержат собственно флаги.
Подключение модуля LCD:
Функции работы с LCD используются для интерфейса между программами на C и LCD модулями, построенными на микросхемах Hitachi HD44780 или аналогичных. Прототипы для этих функций находятся в файле lcd. h.
До включения файла lcd. h, вы должны объявить порт микроконтроллера, который будет использоваться с модулем LCD. Поддерживаются следующие форматы LCD: 1x8, 2x12, 3x12, 1x16, 2x16, 2x20, 4x20, 2x24 и 2x40 символов.
1.4 Подключение датчика DS18B20 с использованием порта 1-WIRE.
Однопроводной интерфейс 1-Wire, разработанный в конце 90-х годов фирмой Dallas Semiconductor, регламентирован разработчиками для применения в четырех основных сферах-приложениях:
приборы в специальных корпусах MicroCAN для решения проблем идентификации, переноса или преобразования информации (технология iButton),
программирование встроенной памяти интегральных компонентов,
идентификация элементов оборудования и защита доступа к ресурсам электронной аппаратуры,
системы автоматизации (технология сетей 1-Wire-сетей).
Первое из этих направлений широко известно на мировом рынке и уже давно пользуется заслуженной популярностью. Второе с успехом обеспечивает возможность легкой перестройки функций полупроводниковых компонентов, производимых фирмой Dallas Semiconductor и имеющих малое количество внешних выводов. Третье позволяет обеспечить недорогую, но достаточно эффективную идентификацию и надежную защиту самого разнообразного оборудования. Что касается четвертого применения, то реализация локальных распределенных систем на базе 1-Wire-шины является на сегодня де-факто наиболее оптимальным решением для большинства практических задач автоматизации. В настоящее время Dallas Semiconductor поставляет широкую номенклатуру однопроводных компонентов различных функциональных назначений для реализации самых разнообразных сетевых приложений. Поэтому имеется огромное число конкретных примеров использования 1-Wire-интерфейса для целей автоматизации в самых различных областях, и все больше разработчиков проявляют интерес к этой технологии.
Преимущества 1-Wire-технологии:
простое и оригинальное решение адресуемости абонентов,
несложный протокол,
простая структура линии связи,
малое потребление компонентов,
легкое изменение конфигурации сети,
значительная протяженность линий связи,
исключительная дешевизна всей технологии в целом.
Ведомые однопроводные компоненты, содержащие 1-Wire-интерфейс, выпускаются в двух различных видах. Либо в корпусах MicroCAN, похожих внешне на дисковый металлический аккумулятор, либо в обычных корпусах для монтажа на печатную плату.
Однако наиболее популярными ведомыми компонентами 1-Wire, на базе которых реализовано, пожалуй, наибольшее количество однопроводных приложений, безусловно, являются цифровые термометры типа DS1820. Преимущества этих цифровых термометров с точки зрения организации магистрали, по сравнению с любыми другими интегральными температурными сенсорами, а также неплохие метрологические характеристики и хорошая помехоустойчивость, уже на протяжении полутора десятков лет неизменно выводят их на первое место при построении многоточечных систем температурного контроля в диапазоне от - 55°С до125°С. Они позволяют не только осуществлять непосредственный мониторинг температуры в режиме реального времени, но и благодаря наличию встроенной энергонезависимой памяти температурных уставок, могут обеспечивать приоритетную оперативную сигнализацию в 1-Wire-линию о факте выхода контролируемого параметра за пределы заданных значений. Также поставляются более совершенные термометры DS18В20, у которых скорость преобразования определяется разрядностью результата, программируемой непосредственно по 1-Wire-линии. Цифровой код, считываемый с такого термометра, является прямым результатом измеренного значения температуры и не нуждается в дополнительных преобразованиях.
2. ОБОСНОВАНИЕ СТРУКТУРНОЙ СХЕМЫ УСТРОЙСТВА
Проектируемое устройство состоит из пяти функциональных блоков, каждый из которых выполняет свою специфическую задачу: источник напряжения, цифровое программируемое устройство (ЦПУ), символьный ЖК-дисплей, блок управления
Блок цифрового программируемого устройства является основой проектируемого устройства. На него возлагаются такие задачи как управление символьным жидкокристаллическим дисплеем (инициализация, очистка, вывод информации), прием данных от датчика и вывод на ЖК дисплей. Цифровое программируемое устройство выполняет обработку полученной информации и выполняет действия согласно заданной программе. Основу блоки цифрового программируемого устройства составляет микроконтроллер ATmega128 компании Atmel.
Стабилизированное и фильтрованное питание поступает с источника питания на блок цифрового программируемого устройства, блок символьного жидкокристаллического дисплея и датчик.
Блок символьного жидкокристаллического дисплея выполняет функцию взаимодействия проектируемого устройства с пользователем посредством визуального отображения информации в текстовом виде. Для проектируемого устройства был выбран символьный жидкокристаллический дисплей LM016L c контроллером HD44780.
Структурная схема устройства приведена в графическом материале на чертеже БГУИР 902501.22 Э1 "Схема структурная".
3. ОБОСНОВАНИЕ ПРИНЦИПИАЛЬНОЙ СХЕМЫ УСТРОЙСТВА
Принципиальная схема приведена на чертеже БГУИР 902501.22 Э2 "Схема электрическая принципиальная".
Рабочее напряжение схемы 5В подается на вывод 52 питания микроконтроллера DD1 (ATmega128) и вывод 2 питания символьного жидкокристаллического дисплея HG1 (LM016L). Разрешающий вход символьного жидкокристаллического дисплея (вывод 6) подключен к выводу 35 (PС0) микроконтроллера DD1. Порты ввода данных (вывода 11-14) символьного жидкокристаллического дисплея подключены к выводам 25-32(PD0-PD7 соответственно) микроконтроллера DD1.
Термодатчик подключен к выводу 10 микроконтроллера DD1.Блок управления (кнопки S1 и S2) подключены к портам ввода /вывода PC3 и PC4 (выводы 38-39 микроконтроллера соответственно)
4. РАЗРАБОТКА ПЕЧАТНОЙ ПЛАТЫ
Чертеж печатного рисунка, расположения отверстий и маркировка электро-радиоэлементов показаны на чертеже печатной платы БГУИР 902501.22 "Плата печатная".
Разработка печатной платы использовалось программное обеспечение системы автоматизированного проектирования Sprint Layout 6.0.
Физические параметры электро-радиоэлементов получены из технической документации.
Габаритные размеры печатной платы составляют 41х50 мм. Что практически не превышает размеров символьного жидкокристаллического дисплея. Минимальное расстояние между печатными проводниками 0,635 мм. Ширина печатного проводника 0,6 мм, печатные проводники располагаются относительно друг друга под углом в 45° и 90°.
Электро-радиоэлементы маркируются на обратной стороне от установки, в непосредственной близости в любом свободном месте краской МКЭЧ, белой по ГОСТ 25804.4-83.
Электро-радиоэлементы подобраны в корпусах навесного монтажа, в виду их дешевизны и доступности. Также электро-радиоэлементы в корпусах навесного монтажа не требуют дополнительного оборудования для их установки. Все электро-радиоэлементы на плате установлены стандартным методом.
5.РАЗРАБОТКА АЛГОРИТМА РАБОТЫ ПРОГРАММЫ.
Алгоритм работы программы микроконтроллера ATmega128 в проектируемом устройстве строится исходя из поставленных задач технического задания. Условно алгоритм работы программы можно разделить на составные части: управление символьным жидкокристаллическим дисплеем, проверка состояния блока управления и прием данных от термодатчика, обработка полученных данных.
Алгоритм работы программы начинается с инициализации портов согласно их назначения.
Далее производится проверка состояния кнопок блока управления.
После этого, в случай изменения состояния кнопок блока управления, выводится соответствующая информация на HG1 Пием данных с датчика м сверка с заданным уровнем, если выходит за заданный диапазон то включение (выключение) нагрузки с выводом соответствующей информации на ЖК дисплей.
6. РАЗРАБОТКА ПРОГРАММЫ
Для написания программы микроконтроллера для разрабатываемого устройства был выбран язык высокого уровня С. Написание программы, ее отладка и компиляция осуществляется с помощью интегрированной среды разработки Atmel Studio 6.0. В начале кода программы указываются все методы и переменные, использующиеся в программе, а также с помощью директивы #define указываются замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. А также производится проверка успешной замены.
Точкой входа в программу является метод-конструктор main(). В этом методе содержится код основной программы и из него происходит вызов остальных методов.
Описание любого метода, включая метод-конструктор, должно начинаться со слова void, за ним идет имя метода (метод-конструктор обязательно должен иметь имя main). После имени метода ставятся скобки, в которых могут указываться имена переменных, задающих параметры метода. Код метода помещается в фигурные скобки {}. Имя метода или переменной не должно начинаться с цифры и не должно содержать никаких разделительных знаков, за исключением нижнего подчеркивания.
В начале кода программы указываются все методы и переменные, использующиеся в программе, а также с помощью директивы #define указываются замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. А также производится проверка успешной замены.
Точкой входа в программу является метод-конструктор main(). В этом методе содержится код основной программы и из него происходит вызов остальных методов.
Описание любого метода, включая метод-конструктор, должно начинаться со слова void, за ним идет имя метода (метод-конструктор обязательно должен иметь имя main). После имени метода ставятся скобки, в которых могут указываться имена переменных, задающих параметры метода. Код метода помещается в фигурные скобки {}. Имя метода или переменной не должно начинаться с цифры и не должно содержать никаких разделительных знаков, за исключением нижнего подчеркивания.
Листинг программы приведен в приложении А.
ЗАКЛЮЧЕНИЕ
В ходе проделанной работы цель курсового проектирования была достигнута и выполнены поставленные задачи в полном объеме.
Габаритные размеры устройства ограничены только габаритами символьного жидкокристаллического дисплея, что делает его весьма компактным.
Проверка работоспособности программы и разработанного устройства в целом производилась с помощью системы автоматизированного проектирования PROTEUS VSM от компании Labcenter Electronics, позволяющая моделировать работу электронных схем.
Разработанное устройство может применяться для мониторинга и контроля подчиненных систем как автономно так и в составе других устройств. СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров./Ю. А. Шпак.- Киев.: "МК Пресс", 2006 - 400с.
2. Техническая документация на жидкокристаллический дисплей LM016L фирмы Hitachi.
3. Техническая документация на микроконтроллер Atmega 128 фирмы Atmel.
4. Доманов А.Т., Сорока Н.И. Дипломные проекты (работы). Общие требования./А. Т. Доманов [и др.] .-Минск.: "УО БГУИР", 2010 - 176с.
5. Белов А.В. Конструирование устройств на микроконтроллерах./ А. В. Белов.- СПб.: Наука и Техника, 2005. - 256 С.
6. Евстифеев А.В. Микроконтроллеры AVR семейств Tiny и Mega фирмы "ATMEL" /А. В. Евстифеев - М.: Издательский дом "Додека-ХХI", 2004. - 560 с.
ПРИЛОЖЕНИЕ А (листинг программы)
(обязательное)
Листинг программы
#define F_CPU 4000000UL // Определяем частоту работы микроконтроллера 4 МГЦ
#include<avr/io.h> // Подключаем библиотеку для работы с портами ввода-вывода и др.
#include<avr/interrupt.h> // Подключаем библиотеку работы с перрываними
#include <util/delay.h> // Подключаем библиотеку с функциями задержки _delay
#define PORTB_MASK 0x01 // zdes ispolzuem PB0 kak liniju dannih dlja datcika
#define GISTERESIS 30 // zadaem gisterezis
//---Функци посылки RESET PULSE - датчику-----------------
unsigned char present_ds18b20(void)
{ unsigned char res;
DDRB|= PORTB_MASK; // Далее такого рода конструкция означает
// DDRB = DDRB | PORTB_MASK, т.е. DDRB = (xxxxxxxx | 00000001) = xxxxxxx1 _delay_ms(0.48); //Pause 480mks DDRB&=~PORTB_MASK; // Далее такого рода конструкция означает
// DDRB = DDRB & ~PORTB_MASK, т.е. DDRB = (xxxxxxxx & 11111110) = xxxxxxx0 delay_us(70); //Pause 70mks if ((PINB&PORTB_MASK) == 0x00) // Если в PB0 0 , т.е. получен ответ от датчика present и возвращаем 1
res=1; //if present, res=1
else res=0; // else возвращаем 0
_delay_ms(0.41); //pause 410mks return res;
}
//----------Функция шлет датчику побитно комманду command------
void send_ds18b20(unsigned char command)
{ unsigned char i, data;
data=command;
for(i=0;i<8;i++)
{
if ((data&0x01)==0x01) { // Если бит 1 - Шлем бит = 1 DDRB|=PORTB_MASK; // liniju v 0 (старт посылки)
_delay_us(6); //pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (шлем бит=1 и стоп посылки)
delay_us(64); //pause 64mks }
else { //Если бит 0 - Шлем бит 0
DDRB|=PORTB_MASK; // liniju v 0 (старт посылки и шлем бит 0) _delay_us(60); //pause 60mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod (стоп посылки)
_delay_us(10); //pause 10mks }
data=data>>1; // сдвигаем посылаемый байт на бит вправо для посылки следующего бита и так все 8 бит шлем.
}
}
//---------Функция приема 2-х байт температуры от датчика // температура хранится в 2-х байтной temperature unsigned int receive_ds18b20(void)
{ unsigned char i;
unsigned int temperature=0;
for(i=0;i<16;i++)
{
DDRB|=PORTB_MASK; // liniju v 0 (старт приема)
_delay_us(6); //Pause 6mks DDRB&=~PORTB_MASK; // liniju v 1 - na vhod
_delay_us(9); //Pause 9mks , т.е. на 15 мкс считываем полученный бит
if ((PINB & PORTB_MASK)==0x00) temperature&=~_BV(i); //If recived 0 // если бит 0 записываем в i-ую позицию temperature бит 0, ~_BV(i) тоже самое что ~(1<<i)
else {
temperature|=_BV(i); //If recived 1 // если бит 1 записываем в i-ую позицию temperature бит 1, _BV(i) тоже самое что (1<<i) }
_delay_us(55); //Pause 55mks }
return temperature; // возвращаем 2 байта температуры
}
char ASCII_high; // переменная для старшей цифры температуры для вывода на дисплей char ASCII_low; // переменная для младшей цифры температуры для вывода на дисплей char * decTab = "0123456789"; // массив где номеру его элемента соответсвует цифра в ASCII (это для вывода на дисплей)
// функция принимает значение value и адресса high и high записывает в
// в эти адресса код в Ascii .
// например у нас в детятичной системе 15 , для вывода на дисплей // мы должны послпать байт '1' и байт '5' во т15 - это value
// 1 - хранится по адрессу high, 5 по адрессу low
void decByte2asciiPair(char value, char * high, char * low)
{
*high = decTab[ value/10 ];
*low = decTab[ value%10 ];
}
//--------------------LCD------------------------------------------
// задержки
#define WAIT_1ms _delay_ms(1);
#define WAIT_10ms _delay_ms(10);
// Макроопределения E - PC0 , RS - PC1 , RW - PC2
#define E PC0
#define RS PC1
#define RW PC2
// - шлем комманду на дисплей
void SEND_COM(int sys_com)
{
PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda)
WAIT_1ms
PORTC = (PORTC |(1<<E)) & ~(1<<RW) & ~(1<<RS); //E=1,RW=0 (peredaem),RS=0(komanda)
WAIT_1ms
PORTD = sys_com;
WAIT_1ms
PORTC &= ~(1<<E) & ~(1<<RW) & ~(1<<RS); //E=0,RW=0 (peredaem),RS=0(komanda)
WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// шлем данные на дисплей
void SEND_DATA(int sym_com)
{ PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie)
WAIT_1ms
PORTC = ( PORTC |(1<<RS)|(1<<E) ) & ~(1<<RW); //E=1,RW=0 (peredaem),RS=1(dannie) WAIT_1ms
PORTD = sym_com;
WAIT_1ms
PORTC = (PORTC |(1<<RS)) & ~(1<<E) & ~(1<<RW); //E=0,RW=0 (peredaem),RS=1(dannie)
WAIT_10ms // posle posilki komandi nuzno podozdat vremja i ne slat }// инициализация дисплея
void LCD_init(void)
{
SEND_COM(0b00110000);// 8 bit 1 srtroka razmer sinvola 5x8
SEND_COM(0b00000001);// ustanovka 0-adres i ocistka ekrana
SEND_COM(0b00000110);//increment adressa , t.e. kazdi sled simvol v sled znakomesto zapisetsa
SEND_COM(0b00001100);// vklucit ekrat
SEND_DATA('1'); // risuem nacalnie ustanovki SEND_DATA('5');
SEND_DATA('.');
SEND_DATA('0');
SEND_COM(0b00010100);// sdvig kursora vpravo
SEND_DATA('O'); SEND_DATA('F');
SEND_DATA('F');
SEND_COM(0b00010100);// sdvig kursora vpravo
SEND_DATA('X');
SEND_DATA('X');
SEND_DATA('.');
SEND_DATA('X');
}
//--------Обработчик прерывания по таймеру T0 ----------------
volatile char button0_state=0; // переменная-флаг нажантия кнопки 0
volatile char button1_state=0; // переменная-флаг нажантия кнопки 1
ISR(TIMER0_OVF_vect) {
static int count_buttons_reading=0; // переменная для отсчета 40-ka интревалов по 4 мс
static int count_button0_yea=0; // переменная для подсчета количесва нажатий кнопки 0 в интервале 4*40 ms
static int count_button0_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms
static int count_button1_yea=0; // переменная для подсчета количесва нажатий кнопки 1 в интервале 4*40 ms
static int count_button1_no=0; // переменная для подсчета количесва отжатий кнопки 0 в интервале 4*40 ms
count_buttons_reading++; // прошло 4 мс , подсчитываем if ( !((PINC>>PC3)&0x01) ) // если нажата кнопка 0
count_button0_yea++; // подсчитываем нажатие
else // если отжата кнопка 0
count_button0_no++; // подсчитываем отжатие
if ( !((PINC>>PC4)&0x01) ) // тоже самое для кнопки 1
count_button1_yea++;
else
count_button1_no++;
if ( count_buttons_reading==40 ) // resenie o sostoinii prinimaetsa cerez 40*4=160ms
{ if(count_button0_yea>count_button0_no) // если по прошествию 40-ka 4-ех милисекундных интервало нажатий больше отжатий button0_state=1; // считаем что кнопка нажата
else
button0_state=0; // в проивном случае считаем что кнопка отжата
if(count_button1_yea>count_button1_no) // аналогично для кнопки 1
button1_state=1;
else
button1_state=0;
count_buttons_reading=0; // сброс всех счетчиков для следующего цикла из 40-ка 4 мс интервалов
count_button0_yea=0;
count_button0_no=0;
count_button1_yea=0;
count_button1_no=0;
}
}
// функция настройки таймере T0 на прерывание по переполнению
void Timer0Init(unsigned char prescaller,unsigned char int_mode)
{
TCCR0=prescaller; // taimer zapuskaetsa kak tolko v TCCR0 zadadut predddelitel(CS00-CS02)
TIMSK=int_mode;// razr-zapr prerivanija zdes tolko po perepolneniju }
//---------------Функция чтения температуры от дачтчика--------
unsigned int read_temp(void)
{
unsigned int temp;
SREG&=~(1<<7); // globalno zaprescaem prerivanija
// код который пойдет ниже нельзя прерывать так как шина 1 Wire очень чувсвительна к временным интервалам
//------------------START preobrazovanija
while(!present_ds18b20()); // zdem пока нет otveta present от датчика
send_ds18b20(0xcc); // если дождались послыаем команду тгнорирования адресса (если 1 датчик на шине то так проще просо работать)
send_ds18b20(0x44); // шлем команду на старт преоращования
_delay_ms(750); // zdem preobrazovanije не менее 750 мс
//---------CITAEM DANNIE---------
while(!present_ds18b20()); // zdem пока нет otveta present от датчика
send_ds18b20(0xcc); // если дождались послыаем команду игнорирования адресса (если 1 датчик на шине то так проще просо работать)
send_ds18b20(0xbe); // посылаем команду чтения температуры
temp = receive_ds18b20(); // читаем 2 байта
SREG|=(1<<7); // globalno opjat razrecaem prerivanija
return temp;// возвращаем 2 прочитанных байта температуры
}
#define HIGH_TEMP 300 // верхний предел температуры здесь и далее имеется ввиду формат 30.0
#define LOW_TEMP 150 // нижний предел температуры здесь и далее имеется ввиду формат 15.0
// намприер 15.5 будет 155
signed int temperatura_tek=LOW_TEMP; // по умолчанию нижний предел температуры
signed int temperatura_tek_pred=LOW_TEMP; // по умолчанию нижний предел предыдущей текущей температуры
unsigned int temperatura_ust=LOW_TEMP; // по умолчанию нижний предел температуры
int main(void)
{ char i; unsigned int receive_temp;// temperaura ot dancika
PORTB&=~PORTB_MASK; // otklucaem vnutrennjuu podtjazku ot vhodaPB0
DDRB&=~PORTB_MASK; // poka nastraivaem na vhod liniju dannih, s ucetom vnesney podtazki tam 1 DDRC |= (1<<E) | (1<<RS) | (1<<RW); // na vihod linii upr ekranom
PORTC &= ~(1<<E) & ~(1<<RS) & ~(1<<RW); // obnuljaem
DDRC &= ~(1<<PC3) & ~(1<<PC4); // PC3 i PC4 na vhod dla knopok
PORTC |= (1<<PC3) | (1<<PC4); // na PC3 i PC4 vklucaem vnutrennie podtjazki
DDRC |= (1<<PC5) ; // PC5 na vihod dlja upravlenija optoparoy (u nas diod)
PORTC |= (1<<PC5) ; // PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit
Timer0Init( (1<<CS00) | (1<<CS01),1<<TOIE0);// preriv po taymeru0 po perepolmeniju na 4 ms nastraivaem
// делитель 64, (64/4000000)*256=0.004с
SREG|=(1<<7); // globalno razrecaem prerivanija
LCD_init(); // начальная инициализация LCD
while (1) // beskonecniy cikl
{
//********************Проверяем и обрабатываем кнопку + с выводом на экран *************************
if (button0_state==1) // если нажата кнопка увеличения температуры
{
button0_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki temperatura_ust = temperatura_ust + 5;
if (temperatura_ust > HIGH_TEMP) // проверка за выход из диапазона
temperatura_ust=LOW_TEMP;
SEND_COM(0b00000010);// ustanovka v 0-j address LCD(с 0-ой позиции дисплея у нас находится эта температура)
decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi
// (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!)
// (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo
SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi
}
//********************Проверяем и обрабатываем кнопку - с выводорм на экран *************************
if (button1_state==1) // если нажата кнопка уменшения температуры{
button1_state=0; // sbrasivaem , t.e. obrabotali nazatie knopki
temperatura_ust = temperatura_ust - 5;
if (temperatura_ust < LOW_TEMP ) // проверка за выход из диапазона
temperatura_ust=HIGH_TEMP; decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi
// (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5') SEND_COM(0b00000010);// ustanovka v 0-j address LCD(на -ой позиции дисплея у нас находится эта температура)
SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi (например 15.5 , у нас 155. / - целочисленное деление, значит 155/5=15, то что надо!)
// (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvig kursora vpravo
SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi
}
// запомнили предыдущую температуру
temperatura_tek_pred = temperatura_tek;
//*********** Получаем 2 байта температуры от датчика и переводим ее в нужный формат *************************
receive_temp=read_temp(); // получаем 2 байта температуры от датчика (0-ой бит =1 - 0.5, 0 - 0.0 десятая часть) temperatura_tek = ((receive_temp>>1)*10 ); // присваеваем температуре текущей целую часть температуры от датчика переведенную в нужный нам формат,
// т.е. если например 15.5 станет 15*10 =150
if (receive_temp & 0x01) // если дробная часть 0.5 - то (т.е. 0-й бит равен 1)
temperatura_tek = temperatura_tek+5; // то 15+5 = 155 (т.е. 15.5)
//****** Выводим на экран температуру от датчика****************************
decByte2asciiPair((char)(temperatura_tek/10),&ASCII_high,&ASCII_low); // perevodim v aski celiju cast temperaturi
SEND_COM(0b00000010);// ustanovka v 0-j address LCD
for (i=0;i<9;i++)
SEND_COM(0b00010100);// sdvig kursora vpravo на - 7 позиций (с 7-й позиции у нас находится на дисплее эта температура)
SEND_DATA(ASCII_high); // vivodim celluji cast temperatiri na ekran SEND_DATA(ASCII_low);
decByte2asciiPair((char)(temperatura_tek%10),&ASCII_high,&ASCII_low); SEND_COM(0b00010100);// sdvig kursora vpravo
SEND_DATA(ASCII_low); // vivodim drobniju cast temperaturi
//************* Сравниваем температуру текущую и требуемую c гистерезисом и принимаем решение а ключении тэна с выводдом ON - OFF на экран
if ((temperatura_tek-temperatura_tek_pred)>0) {
// если температура растет
if ( temperatura_tek <= (temperatura_ust + GISTERESIS)) // esli neobhodimo povisat temperaturu?
{
PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit
SEND_COM(0b00000010);// ustanovka v 0-j address LCD
for (i=0;i<5;i++)
SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON)
SEND_DATA('O');
SEND_DATA('N');
SEND_DATA(' ');
}else
{
PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD
for (i=0;i<5;i++)
SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF)
SEND_DATA('O');
SEND_DATA('F');
SEND_DATA('F');
}
}
Else if ((temperatura_tek-temperatura_tek_pred)<0)
{
// если температура убывает
if ( temperatura_tek > (temperatura_ust - GISTERESIS)) // esli neobhodimo ponizat temperaturu?
{
PORTC |= (1<<PC5) ; // нет PC5 =1 ; po sheme ten viklucen/svetodiod ne gorit
SEND_COM(0b00000010);// ustanovka v 0-j address LCD
for (i=0;i<5;i++)
SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF)
SEND_DATA('O');
SEND_DATA('F');
SEND_DATA('F');
}
else
{
PORTC &= ~(1<<PC5) ; // да PC5 =0 ; po sheme ten vklucen/svetodiod gorit
SEND_COM(0b00000010);// ustanovka v 0-j address LCD
for (i=0;i<5;i++)
SEND_COM(0b00010100);// sdvig kursora vpravo на - 5 позиций (с 5-й позиции у нас находится слово ON)
SEND_DATA('O');
SEND_DATA('N');
SEND_DATA(' '); }
}
return 0;
ПРИЛОЖЕНИ В (графический материал)
СВОДНАЯ ВЕДОМОСТЬ
2
Документ
Категория
Рефераты
Просмотров
549
Размер файла
98 Кб
Теги
курсач
1/--страниц
Пожаловаться на содержимое документа