Проект терморегулятора с гистерезисом на основе микроконтроллера ATmega 128

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 04.05.2014
Размер файла 123,7 K

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

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

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

  • СОДЕРЖАНИЕ
  • ВВЕДЕНИЕ
  • 1. Теоретические сведения и принципы функционирования отдельных узлов устройства
  • 1.1 Микроконтроллер
  • 1.2 Температурный датчик DS18B20
  • 1.3 Контроллер HD44780
  • 1.4 Подключение датчика DS18B20 с использованием порта 1-WIRE
  • 2. Обоснование структурной схемы устройства
  • 3. Обоснование принципиальной схемы устройства
  • 4. Разработка печатной платы
  • 5. Разработка алгоритма работы программы
  • 6. Разработка программы
  • ЗАКЛЮЧЕНИЕ
  • СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
  • ПРИЛОЖЕНИЕ А (листинг программы)

ВВЕДЕНИЕ

Данный курсовой проект представляет собой терморегулятор с гистерезисом, реализованный на микроконтроллере 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) и расширенный дежурный (ExtendedStandby)

- Программный выбор тактовой частоты

- Конфигурационный бит для перевода в режим совместимости с 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 NoiseReduction) останавливает ЦПУ и все модули ввода-вывода, кроме асинхронного таймера и АЦП для минимизации импульсных шумов в процессе преобразования АЦП. В дежурном режиме (Standby) кварцевый/резонаторный генератор продолжают работу, а остальная часть микроконтроллера находится в режиме сна. Данный режим характеризуется малой потребляемой мощностью, но при этом позволяет достичь самого быстрого возврата в рабочий режим. В расширенном дежурном режиме (ExtendedStandby) основной генератор и асинхронный таймер продолжают работать.

Микроконтроллер производится по технологии высокоплотной энергонезависимой памяти компании 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-х годов фирмой DallasSemiconductor, регламентирован разработчиками для применения в четырех основных сферах-приложениях:

приборы в специальных корпусах MicroCAN для решения проблем идентификации, переноса или преобразования информации (технология iButton),

программирование встроенной памяти интегральных компонентов,

идентификация элементов оборудования и защита доступа к ресурсам электронной аппаратуры,

системы автоматизации (технология сетей 1-Wire-сетей).

Первое из этих направлений широко известно на мировом рынке и уже давно пользуется заслуженной популярностью. Второе с успехом обеспечивает возможность легкой перестройки функций полупроводниковых компонентов, производимых фирмой DallasSemiconductor и имеющих малое количество внешних выводов. Третье позволяет обеспечить недорогую, но достаточно эффективную идентификацию и надежную защиту самого разнообразного оборудования. Что касается четвертого применения, то реализация локальных распределенных систем на базе 1-Wire-шины является на сегодня де-факто наиболее оптимальным решением для большинства практических задач автоматизации. В настоящее время DallasSemiconductor поставляет широкую номенклатуру однопроводных компонентов различных функциональных назначений для реализации самых разнообразных сетевых приложений. Поэтому имеется огромное число конкретных примеров использования 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 «Плата печатная».

Разработка печатной платы использовалось программное обеспечение системы автоматизированного проектирования SprintLayout 6.0.

Физические параметры электро-радиоэлементов получены из технической документации.

Габаритные размеры печатной платы составляют 41х50 мм. Что практически не превышает размеров символьного жидкокристаллического дисплея. Минимальное расстояние между печатными проводниками 0,635 мм. Ширина печатного проводника 0,6 мм, печатные проводники располагаются относительно друг друга под углом в 45° и 90°.

Электро-радиоэлементы маркируются на обратной стороне от установки, в непосредственной близости в любом свободном месте краской МКЭЧ, белой по ГОСТ 25804.4-83.

Электро-радиоэлементы подобраны в корпусах навесного монтажа, в виду их дешевизны и доступности. Также электро-радиоэлементы в корпусах навесного монтажа не требуют дополнительного оборудования для их установки. Все электро-радиоэлементы на плате установлены стандартным методом.

5. Разработка алгоритма работы программы

Алгоритм работы программы микроконтроллера ATmega128 в проектируемом устройстве строится исходя из поставленных задач технического задания. Условно алгоритм работы программы можно разделить на составные части: управление символьным жидкокристаллическим дисплеем, проверка состояния блока управления и прием данных от термодатчика, обработка полученных данных.

Алгоритм работы программы начинается с инициализации портов согласно их назначения.

Далее производится проверка состояния кнопок блока управления.

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

Пием данных с датчика м сверка с заданным уровнем, если выходит за заданный диапазон то включение (выключение) нагрузки с выводом соответствующей информации на ЖК дисплей.

6. Разработка программы

Для написания программы микроконтроллера для разрабатываемого устройства был выбран язык высокого уровня С.

Написание программы, ее отладка и компиляция осуществляется с помощью интегрированной среды разработки AtmelStudio 6.0.

В начале кода программы указываются все методы и переменные, использующиеся в программе, а также с помощью директивы #define указываются замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. А также производится проверка успешной замены.

Точкой входа в программу является метод-конструктор main(). В этом методе содержится код основной программы и из него происходит вызов остальных методов.

Описание любого метода, включая метод-конструктор, должно начинаться со слова void, за ним идет имя метода (метод-конструктор обязательно должен иметь имя main). После имени метода ставятся скобки, в которых могут указываться имена переменных, задающих параметры метода. Код метода помещается в фигурные скобки {}.

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

В начале кода программы указываются все методы и переменные, использующиеся в программе, а также с помощью директивы #define указываются замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. А также производится проверка успешной замены.

Точкой входа в программу является метод-конструктор main(). В этом методе содержится код основной программы и из него происходит вызов остальных методов.

Описание любого метода, включая метод-конструктор, должно начинаться со слова void, за ним идет имя метода (метод-конструктор обязательно должен иметь имя main). После имени метода ставятся скобки, в которых могут указываться имена переменных, задающих параметры метода. Код метода помещается в фигурные скобки {}.

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

Листинг программы приведен в приложении А.

ЗАКЛЮЧЕНИЕ

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

Габаритные размеры устройства ограничены только габаритами символьного жидкокристаллического дисплея, что делает его весьма компактным.

Проверка работоспособности программы и разработанного устройства в целом производилась с помощью системы автоматизированного проектирования PROTEUS VSM от компании LabcenterElectronics, позволяющая моделировать работу электронных схем.

Разработанное устройство может применяться для мониторинга и контроля подчиненных систем как автономно так и в составе других устройств.

ПРИЛОЖЕНИЕ А (листинг программы)

#define F_CPU 4000000UL // Определяем частоту работы микроконтроллера 4 МГЦ

#include<avr/io.h> // Подключаем библиотеку для работы с портами ввода-вывода и др.

#include<avr/interrupt.h> // Подключаем библиотеку работы с перрываними

#include<util/delay.h> // Подключаем библиотеку с функциями задержки _delay

#define PORTB_MASK 0x01 // zdesispolzuem PB0 kaklinijudannihdljadatcika

#define GISTERESIS 30 // zadaemgisterezis

//---Функципосылки RESET PULSE - датчику-----------------

unsigned char present_ds18b20(void)

{ unsignedcharres;

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 - navhod (шлембит=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 - navhod (стоппосылки)

_delay_us(10); //pause 10mks }

data=data>>1; // сдвигаем посылаемый байт на бит вправо для посылки следующего бита и так все 8 бит шлем.}}

//---------Функция приема 2-х байт температуры от датчика

// температура хранится в 2-х байтнойtemperature

unsignedint receive_ds18b20(void)

{ unsigned char i;

unsignedint 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 - navhod

_delay_us(9); //Pause 9mks , т.е. на 15 мкс считываем полученный бит

if ((PINB & PORTB_MASK)==0x00) temperature&=~_BV(i); //Ifrecived0 // если бит 0 записываем в i-ую позицию temperature бит 0, ~_BV(i) тоже самое что ~(1<<i)

else {temperature|=_BV(i); //Ifrecived1 // если бит 1 записываем в i-ую позицию temperature бит 1, _BV(i) тоже самое что (1<<i) }

_delay_us(55); //Pause 55mks }

return temperature; // возвращаем 2 байтатемпературы}

charASCII_high; // переменная для старшей цифры температуры для вывода на дисплей

charASCII_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(intsys_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 // posleposilkikomandinuznopodozdatvremjai ne slat}// шлемданныенадисплей

void SEND_DATA(intsym_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 // posleposilkikomandinuznopodozdatvremjai ne slat}// инициализациядисплея

voidLCD_init(void)

{SEND_COM(0b00110000);// 8 bit 1 srtrokarazmersinvola 5x8

SEND_COM(0b00000001);// ustanovka 0-adres iocistkaekrana

SEND_COM(0b00000110);//increment adressa , t.e. kazdi sled simvol v sled znakomestozapisetsa

SEND_COM(0b00001100);// vklucitekrat

SEND_DATA('1'); // risuemnacalnieustanovki

SEND_DATA('5');

SEND_DATA('.');

SEND_DATA('0');

SEND_COM(0b00010100);// sdvigkursoravpravo

SEND_DATA('O');

SEND_DATA('F');

SEND_DATA('F');

SEND_COM(0b00010100);// sdvigkursoravpravo

SEND_DATA('X');

SEND_DATA('X');

SEND_DATA('.');

SEND_DATA('X');}

//--------Обработчик прерывания по таймеру T0 ----------------

volatilechar button0_state=0; // переменная-флаг нажантия кнопки 0

volatilechar button1_state=0; // переменная-флаг нажантия кнопки 1

ISR(TIMER0_OVF_vect)

{staticintcount_buttons_reading=0; // переменная для отсчета 40-ka интревалов по 4 мс

staticint count_button0_yea=0; // переменная для подсчета количесва нажатий кнопки 0 в интервале 4*40 ms

staticint count_button0_no=0; // переменная для подсчета количесваотжатий кнопки 0 в интервале 4*40 ms

staticint count_button1_yea=0; // переменная для подсчета количесва нажатий кнопки 1 в интервале 4*40 ms

staticint 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 sostoiniiprinimaetsacerez 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; // taimerzapuskaetsakaktolko v TCCR0 zadadutpredddelitel(CS00-CS02)

TIMSK=int_mode;// razr-zaprprerivanijazdestolkopoperepolneniju}

//---------------Функция чтения температуры от дачтчика--------

unsignedintread_temp(void)

{unsignedint temp;

SREG&=~(1<<7); // globalnozaprescaemprerivanija

// код который пойдет ниже нельзя прерывать так как шина 1 Wire очень чувсвительна к временным интервалам

//------------------START preobrazovanija

while(!present_ds18b20()); // zdemпоканетotveta present отдатчика

send_ds18b20(0xcc); // если дождались послыаем команду тгнорированияадресса (если 1 датчик на шине то так проще просо работать)

send_ds18b20(0x44); // шлем команду на старт преоращования

_delay_ms(750); // zdempreobrazovanije не менее 750 мс

//---------CITAEM DANNIE---------

while(!present_ds18b20()); // zdemпоканетotveta present отдатчика

send_ds18b20(0xcc); // если дождались послыаем команду игнорирования адресса (если 1 датчик на шине то так проще просо работать)

send_ds18b20(0xbe); // посылаем команду чтения температуры

temp = receive_ds18b20(); // читаем 2 байта

SREG|=(1<<7); // globalnoopjatrazrecaemprerivanija

returntemp; // возвращаем 2 прочитанных байта температуры}

#define HIGH_TEMP 300 // верхний предел температуры здесь и далее имеется ввиду формат 30.0

#define LOW_TEMP 150 // нижний предел температуры здесь и далее имеется ввиду формат 15.0

// намприер 15.5 будет 155

signedinttemperatura_tek=LOW_TEMP; // по умолчанию нижний предел температуры

signedinttemperatura_tek_pred=LOW_TEMP; // по умолчанию нижний предел предыдущей текущей температуры

unsignedinttemperatura_ust=LOW_TEMP; // поумолчаниюнижнийпределтемпературы

int main(void)

{ chari;

unsignedintreceive_temp;// temperauraotdancika

PORTB&=~PORTB_MASK; // otklucaemvnutrennjuupodtjazkuotvhoda PB0

DDRB&=~PORTB_MASK; // pokanastraivaemnavhodlinijudannih, s ucetomvnesneypodtazki tam 1

DDRC |= (1<<E) | (1<<RS) | (1<<RW); // navihodliniiuprekranom

PORTC &= ~(1<<E) & ~(1<<RS) & ~(1<<RW); // obnuljaem

DDRC &= ~(1<<PC3) & ~(1<<PC4); // PC3 i PC4 navhoddlaknopok

PORTC |= (1<<PC3) | (1<<PC4); // na PC3 i PC4 vklucaemvnutrenniepodtjazki

DDRC |= (1<<PC5) ; // PC5 navihoddljaupravlenijaoptoparoy (u nasdiod)

PORTC |= (1<<PC5) ; // PC5 =1 ; posheme ten viklucen/svetodiod ne gorit

Timer0Init( (1<<CS00) | (1<<CS01),1<<TOIE0);// prerivpo taymeru0 poperepolmenijuna 4 msnastraivaem

// делитель 64, (64/4000000)*256=0.004с

SREG|=(1<<7); // globalnorazrecaemprerivanija

LCD_init(); // начальнаяинициализация LCD

while (1) // beskonecniycikl

{//********************Проверяем и обрабатываем кнопку + с выводом на экран *************************

if (button0_state==1) // если нажата кнопка увеличения температуры

{ button0_state=0; // sbrasivaem ,t.e. obrabotalinazatieknopki

temperatura_ust = temperatura_ust + 5;

if (temperatura_ust> HIGH_TEMP) // проверказавыходиздиапазона

temperatura_ust=LOW_TEMP;

SEND_COM(0b00000010);// ustanovkav 0-jaddressLCD (с 0-ойпозициидисплеяунаснаходитсяэтатемпература)

decByte2asciiPair((char)(temperatura_ust/10),&ASCII_high,&ASCII_low); // perevodim v askiceliju cast temperaturi

// (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значитпереводим 15 в '1' и '5')

SEND_DATA(ASCII_high); // vivodimcelluji cast temperatiri

SEND_DATA(ASCII_low);

decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v askiceliju cast temperaturi (например 15.5 , унас 155. / - целочисленноеделение, значит 155/5=15, точтонадо!)

// (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvigkursoravpravo

SEND_DATA(ASCII_low); // vivodimdrobniju cast temperaturi}

//********************Проверяем и обрабатываем кнопку - с выводорм на экран *************************

if (button1_state==1) // если нажата кнопка уменшения температуры { button1_state=0; // sbrasivaem ,t.e. obrabotalinazatieknopki

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 askiceliju cast temperaturi

// (например 15.5 , у нас 155. / это целочисленное деление, значит 155/5=15, то что надо! Значит переводим 15 в '1' и '5')

SEND_COM(0b00000010);// ustanovka v 0-j address LCD (на -ой позиции дисплея у нас находится эта температура)

SEND_DATA(ASCII_high); // vivodimcelluji cast temperatiri

SEND_DATA(ASCII_low); decByte2asciiPair((char)(temperatura_ust%10),&ASCII_high,&ASCII_low); // perevodim v askiceliju cast temperaturi (например 15.5 , унас 155. / - целочисленноеделение, значит 155/5=15, точтонадо!)

// (например 15.5 , у нас 155. % это остаток от деление, значит 155%5=5, то что надо! Значит переводим 05 в '0' и '5') SEND_COM(0b00010100);// sdvigkursoravpravo

SEND_DATA(ASCII_low); // vivodimdrobniju 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 askiceliju cast temperaturi

SEND_COM(0b00000010);// ustanovka v 0-j address LCD

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

SEND_COM(0b00010100);// sdvigkursoravpravoна - 7 позиций (с 7-йпозицииунаснаходитсянадисплееэтатемпература)

SEND_DATA(ASCII_high); // vivodimcelluji cast temperatirinaekran SEND_DATA(ASCII_low);

decByte2asciiPair((char)(temperatura_tek%10),&ASCII_high,&ASCII_low);

SEND_COM(0b00010100);// sdvigkursoravpravo

SEND_DATA(ASCII_low); // vivodimdrobniju cast temperaturi

//************* Сравниваем температуру текущую и требуемую c гистерезисом и принимаем решение а ключении тэна с выводдом ON - OFF на экран

if ((temperatura_tek-temperatura_tek_pred)>0)

{// еслитемпературарастет

if ( temperatura_tek<= (temperatura_ust + GISTERESIS)) // eslineobhodimopovisattemperaturu?

{PORTC &= ~(1<<PC5) ; // да PC5 =0 ; posheme ten vklucen/svetodiodgorit

SEND_COM(0b00000010);// ustanovka v 0-j address LCD

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

SEND_COM(0b00010100);// sdvigkursoravpravo на - 5 позиций (с 5-й позиции у нас находится слово ON)

SEND_DATA('O');

SEND_DATA('N');

SEND_DATA(' ');}

else {PORTC |= (1<<PC5) ; // нет PC5 =1 ; posheme ten viklucen/svetodiod ne gorit SEND_COM(0b00000010);// ustanovka v 0-j address LCD

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

SEND_COM(0b00010100);// sdvigkursoravpravo на - 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)) // eslineobhodimoponizattemperaturu?

{PORTC |= (1<<PC5) ; // нет PC5 =1 ; posheme ten viklucen/svetodiod ne gorit

SEND_COM(0b00000010);// ustanovka v 0-j address LCD

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

SEND_COM(0b00010100);// sdvigkursoravpravo на - 5 позиций (с 5-й позиции у нас находится слово OFF)

SEND_DATA('O');

SEND_DATA('F');

SEND_DATA('F');}

else{PORTC &= ~(1<<PC5) ; // да PC5 =0 ; posheme ten vklucen/svetodiodgorit

SEND_COM(0b00000010);// ustanovka v 0-j address LCD

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

SEND_COM(0b00010100);// sdvigkursoravpravo на - 5 позиций (с 5-й позиции у нас находится слово ON)

SEND_DATA('O');

SEND_DATA('N');

SEND_DATA(' '); }}

return 0;

Размещено на Allbest.ru


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

  • Разработка структурной и принципиальной схемы. Блок-схема основной программы и подпрограмм обработки прерываний. Имена переменных, используемых в них. Результаты моделирования работы устройства в программе ISIS пакета Рroteus. Разработка печатной платы.

    курсовая работа [1,5 M], добавлен 13.11.2016

  • Общие сведения о микроконтроллерах AVR, их основные параметры. Функции термометра, реализованного на микроконтроллере AVR. Порядок программирования микроконтроллера с использованием программы на языке С. Передача данных сом-порт, вывод значений на ЖКИ.

    курсовая работа [35,8 K], добавлен 08.04.2010

  • Разработка алгоритма работы устройства, описание выбора элементной базы и работы принципиальной схемы. Текст программы, инициализация указателя стека, структура системы и ресурсов микроконтроллера. Запись кодов при программировании данного устройства.

    контрольная работа [18,4 K], добавлен 24.12.2010

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

    курсовая работа [577,8 K], добавлен 24.06.2013

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

    курсовая работа [3,5 M], добавлен 26.08.2014

  • Разработка компьютерного устройства RAM-диск, позволяющего считывать, записывать и хранить информацию в модулях динамической памяти типа SDRAM под управлением микроконтроллера. Составление структурной и принципиальной схемы устройства, листинг программы.

    курсовая работа [3,9 M], добавлен 24.12.2012

  • Создание приемника команд RC5 для персонального компьютера на основе микроконтроллера ATmega8. Особенности написания файла прошивки и симулирование устройства. Порядок выполнения сборки собственной схемы и характеристика полученного микроконтроллера.

    курсовая работа [2,0 M], добавлен 24.11.2013

  • Разработка принципиальной электрической схемы микропроцессорного устройства управления двигателем постоянного тока на базе контроллера ATmega 128. Разработка пакета подпрограмм на языке Assembler в целях регулирования и корректной работы устройства.

    курсовая работа [271,5 K], добавлен 14.01.2011

  • Применение однокристального микроконтроллера в адаптере параллельного обмена. Связь с внешними устройствами. Структурная схема устройства и ее описание. Назначение отдельных функциональных блоков. Разработка принципиальной схемы и программы устройства.

    курсовая работа [303,0 K], добавлен 06.01.2009

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

    курсовая работа [177,6 K], добавлен 30.06.2014

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