Помощь в написании студенческих работ
Антистрессовый сервис

Разработка системы сбора данных с последующей их оцифровкой и записью на жесткий магнитный диск

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Интерфейс процессора с памятью В силу того, что в SDK1.1 используется общая шина адреса-данных, мы вынуждены использовать защелки для передаваемого адреса ячейки — пара маленьких прямоугольных элементов посередине схемы. Вначале, мы используем шину, как шину адреса — передаем по ней адрес ячейки. Этот адрес мы запоминаем в защелках — специальных запоминающих элементах, по сигналу ALE… Читать ещё >

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

  • Содержание
  • Введение
  • 1. Обзор литературы.
  • 2. Анализ технического задания.
  • 3. Разработка структурной схемы системы и ее описание.
  • 4. Разработка функциональной схемы системы и ее описание
  • 4.1 Микроконтроллер ADuC812
  • 4.2 Внешняя память E2PROM
  • 4.3 Матричная клавиатура AK1604A-WWB
  • 4.4 Жидкокристаллический индикатор WH1602B-NGK-CP
  • 4.5 Часы реального времени PCF8583P
  • 4.6 ПЛИС PM3064ATC100
  • 4.7 Интерфейс RS232 (COM порт)
  • 4.8 Интерфейс процессора с памятью
  • 5. Разработка схемы электрической принципиальной системы и ее описание
  • 6. Разработка программного обеспечения.
  • 6.1 Разработка программы для микроконтроллера
  • 6.1.1 Создание нового проекта
  • 6.1.2 Резидентный загрузчик НЕХ202
  • 6.1.3 Загрузка программ в лабораторный стенд SDK-1.1
  • 6.1.4 Описание основной части кода программы для микроконтроллера
  • 6.2 Разработка программы для ПК
  • Заключение

    .

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

    .

  • Приложение А
  • Приложение Б
  • Введение
  • В настоящее время жизнь современного человека уже трудно представить без электронных устройств. Они используются во всех сферах жизни и деятельности людей. В современной технике все чаще используются встраиваемые компьютерные системы, основанные на микропроцессорах и однокристальных микроконтроллерах.
  • Микропроцессорная система — это функционально законченное изделие, состоящее из одного или нескольких устройств.
  • Микроконтроллер помимо центрального процессора содержит память и многочисленные устройства ввода/вывода: последовательные и параллельные каналы передачи информации, аналого-цифровые преобразователи, таймеры реального времени и т. д.
  • Микроконтроллеры в основном применяются в системах автоматического управления, встраиваемые в различные устройства: сотовые телефоны, фотоаппараты, телевизоры, стиральные машины, микроволновые печи и т. д.
  • На сегодняшний день производители микропроцессоров все больше и больше сближают их с однокристальными микроконтроллерами, сочетая в одном кристалле вычислительную мощь и возможность реализации функций контроля и управления.
  • Использование микроконтроллеров в оборудовании позволяет повысить производительность, качество работы, помогает снизить затраты некоторых ресурсов. Даёт возможность решать сложные проблемы программного регулирования, существенно улучшает технические и экономические характеристики автоматизированного оборудования.
  • 1. Обзор литературы
  • Большинство современных устройств в своем составе имеют хотя бы один микроконтроллер.
  • Информационно — измерительные и управляющие цифровые и микропроцессорные системы предназначены для измерения, сбора, обработки, хранения и отображения информации с реальных объектов, а также для управления ими.
  • Очень полно о современных системах сбора данных описывает в своей книге А. Ю. Кузьминов «Интерфейс RS-232. Связь между компьютером и микроконтроллером». Автор этой книги разделяет современные системы сбора данных на два основных класса.
  • К первому можно отнести так называемые компьютерные системы сбора, когда микроконтроллер расположен в специальном устройстве сопряжения с объектом (УСО), имеющем отдельный корпус, как правило, со своим блоком питания, подключаемым к сети (220В). К этому устройству подведены кабели от датчиков, с которых снимается информация. УСО сопрягается с компьютером по интерфейсу RS-232, по которому в компьютер передаётся измерительная информация. Управление УСО осуществляется также компьютером по тому же интерфейсу, т. е. микроконтроллер получает команды от компьютера, выполняет их, и результат выполнения посылает в компьютер. Последний получает предварительно обработанную (как правило, только оцифрованную) микроконтроллером информацию, окончательно её обрабатывает и выводит результаты этой обработки на экран монитора и/или принтер. Иногда УСО может находиться на значительном удалении от компьютера (до десятков метров и более); такие системы часто называют удаленными.
  • Отличительные черты компьютерных систем сбора следующие:
  • · Обмен информацией микроконтроллера с компьютером идет постоянно, кроме того, в некоторых случаях основная программа работы микроконтроллера может передаваться в него из компьютера; в этих условиях от интерфейса потребуется повышенные надежность и скорость обмена (115 200 бод); в связи с этим обязательным является возможность программирования микроконтроллера по RS-232.
  • · «Интеллектуальная» нагрузка на микроконтроллер достаточно низкая; микроконтроллер ничего не считает, ввод/вывод информации осуществляется только по интерфейсу, поэтому программа для микроконтроллера примитивна, как правило, написана на ассемблере и в очень редких случаях её объем превышает 2кбайта; основную «интеллектуальную» нагрузку несет программа, написанная для компьютера.
  • · Повышены требования к точности измерений; особенно это касается точности временных характеристик: погрешности таких временных характеристик, как общее время измерений (Т), интервал времени измерений (?Т) и т. п., как правило, не должны превышать 1мс, а в некоторых случаях (если, например, такая система используется в различного рода поверочных установках, да еще связанных с приборами коммерческого учета) должна быть на порядок выше.
  • · Повышены требования к АЦП: многоканальность (не менее восьми), повышенная точность, дискретность измерений должна быть не менее 16 разрядов; АЦП должен иметь самокалибровку; перед АЦП обязательно должен располагаться низкочастотный фильтр, частота среза которого равна частоте Найквиста — Котельникова (в два раза ниже частоты дискретизации АЦП), кроме того, желательно, чтобы фильтр был еще и заграждающим, т. е. имеющим полюс (0). При этом затухание должно быть не менее |-100| дБ на частоте питающей сети (50Гц).
  • · Системы, как правило, многоканальные и достаточно универсальные, т. е. имеют несколько (восемь и более) аналоговых, частотных и/или дискретных каналов.
  • · Имеют свой блок питания, подключаемый к сети, потребление энергии такими системами не имеет особого значения; как правило, микроконтроллер работает при напряжении питания 5 В.
  • · Выпускаются, как правило, в небольших количествах, причем, львиная доля стоимости системы приходится на программное обеспечение, написанное для компьютера, поэтому стоимость аппаратных средств (а тем более — стоимость микроконтроллера) особого значения не имеют.
  • Ко второму классу можно отнести так называемые автономные системы сбора, представляющие собой по существу приборы, правда, достаточно «интеллектуальные». Здесь микроконтроллер выступает в качестве основы, как аппаратных, так и программных средств. Автономные системы сбора представляют собой устройства, оснащенные не только средствами измерений (датчиками измерительной информации), сбора и обработки измерительной информации, но и средствами индикации результатов измерений (в простейших системах это может быть, например, цифровой семисегментный индикатор с несколькими цифрами, в более сложныходно, либо двустрочный алфавитно — цифровой или матричный графический дисплей; иногда автономная система оснащается даже примитивным печатающим устройством, например — кассовый аппарат), а также средствами ручного ввода информации (например, кнопочной мембранной клавиатурой) или хотя бы примитивного ручного управления.
  • Автономные системы конструируются в отдельном корпусе и оснащаются своим блоком питания (во многих случаях батарейным). Часто автономные системы содержат в своем составе интерфейс сопряжения с компьютером (например, RS-232). Иногда этот интерфейс выполнен только опционально, реже он всетаки используется, но основные его задачи — плановый съём архивной информации, тестирование системы, начальное занесение в систему необходимых коэффициентов и/или режимов работы и т. п. При штатном режиме работы автономной системы интерфейс, как правило, не используется.
  • Отличительные черты автономных систем сбора следующие:
  • · Обмен информацией с компьютером по интерфейсу (если он вообще существует) происходит время от времени и достаточно редко; от интерфейса не требуется высокое быстродействие (115 200 бод); если автономная система сбора все-таки оборудована интерфейсом RS-232 для обмена информацией с компьютером, то желательна возможность программирования по RS-232.
  • · «Интеллектуальная нагрузка» на микроконтроллер достаточно высокая; в связи с этим программа для микроконтроллера сложная, как правило, написана на языке Си и, хотя даже современные компиляторы Си (например, С-Keil, V.6.12−6.20) для микроконтроллера и обладают массой оптимизационных свойств (в том числе — оптимизацией объема памяти), эта программа занимает десятки килобайт программной памяти и/или памяти данных; кроме того, повышены требования и к объему ОЗУ.
  • · Повышенная точность измерения временных характеристик, как правило, не требуется, зато необходим из большой временной диапазон: секунды, минуты, часы, сутки, месяцы и даже годы; это нужно для возможного архивирования результатов измерений, так как автономная система (оснащена, например, батарейным блоком питания с литиевыми элементами) может работать несколько лет.
  • · Повышены требования к АЦП: многоканальность (не менее восьми), повышенная точность, дискретность измерений должна быть не менее 16 разрядов; АЦП должен иметь самокалибровку; перед АЦП обязательно должен располагаться низкочастотный фильтр, частота среза которого равна частоте Найквиста — Котельникова (в два раза ниже частоты дискретизации АЦП), кроме того, желательно, чтобы фильтр был еще и заграждающим, т. е. имеющим полюс (0). При этом затухание должно быть не менее |-100| дБ на частоте питающей сети (50Гц).
  • · Не содержат большого числа однотипных измерительных каналов (как правило, число однотипных каналов не превышает трех — четырех), но число различного рода устройств, входящих в состав микроконтроллера, может быть большим (АЦП, ЦАП, таймеры/счетчики, часы, источники опорного напряжения и/или тока и т. п.), т. е. от микроконтроллера требуется повышенная универсальность.
  • · Во многих случаях работают от батарейного блока питания, поэтому от микроконтроллера требуется пониженное энергопотребление; в связи с этим такие системы, как правило, работают от напряжения 3 В (литиевые батарейки).
  • · Выпускаются в достаточно больших количествах, поэтому стоимости аппаратных средств (в том числе, стоимость микроконтроллера) играет важную роль, а вот стоимость программного обеспечения, которая иногда даже превышает стоимость программного обеспечения компьютерных систем (программа для микроконтроллера + программа для компьютера), существенного значения не имеет, так как распределяется на большое число устройств.
  • 2. Анализ технического задания
  • Согласно ТЗ на курсовой проект необходимо разработать систему сбора данных с использованием стендов SDK 1.1 и SDX 0.9.
  • Исходные данные:
  • — число каналов 8;
  • — источник входного сигнала — генератор звуковых частот;
  • — диапазон частот входного сигнала (20−20 000)Гц;
  • — оцифрованные данные должны сохраняться на ЖМД ПК;
  • — интерфейс связи с ПК — RS-232.
  • Записываемая на ЖМД информация должна включать:
  • — 12-разрядные оцифрованные данные;
  • — номер канала;
  • — время начала оцифровки данных.
  • По заданию на КП необходимо разработать систему сбора данных с последующей их оцифровкой и записью на жесткий магнитный диск. Система включает программную и аппаратную части. Аппаратная часть реализована на базе двух стендов и описана ниже.
  • Рассмотрим аппаратную часть микропроцессорного стенда SDK-1.1.
  • В своей основе стенд имеет микроконтроллер ADuC812BS. Процессор ADuC812 является клоном Intel 8051 со встроенной периферией.
  • Основные характеристики микропроцессора:
  • — рабочая частота 11,0592 МГц;
  • — 8-канальный 12-битный АЦП со скоростью выборок 200 K/c (в режиме ПДП);
  • — два 12-битных ЦАП (код-напряжение);
  • — внутренний температурный сенсор;
  • — 640 байт программируемого E2PROM со страничной организацией (256 страниц по 4 байта);
  • — 256 байт внутренней памяти данных (участок регистров общего назначения, битовый сегмент, свободный участок, участок регистров специального назначения);
  • — адресное пространство 16 Мб;
  • — память программ 8Кб
  • — внешнее ОЗУ 512 Кб;
  • — режим управления питанием;
  • — асинхронный последовательный ввод-вывод;
  • — интерфейс I2C;
  • — три 16-битных таймера/счетчика и таймер WatchDog.
  • Внешняя E2PROM. E2PROM — перепрограммируемое электрически стираемое постоянное запоминающее устройство. Объем памяти E2PROM, установленной в стенде SDK-1.1, составляет 128 байт (возможна установка E2PROM большего объема, до 32 Кб). Микросхема E2PROM взаимодействует с процессором посредством интерфейса I2С. В таблице 1.2 дана адресация микросхем E2PROM.
  • Основные характеристики E2PROM:
  • — возможность перезаписи до 1 млн. раз;
  • — возможность побайтной и постраничной записи (в текущей конфигурации размер страницы составляет 8 байт).
  • Таблица 1 — Адресация микросхем E2PROM
  • Бит

    Значение

    Описание

    0х7

    RW

    переключатель

    0х6

    А0

    Адреса устройств расширения

    0х5

    А1

    0х4

    А2

    0х3

    • Обязательная последовательность для всех устройств E2PROM

    0х2

    0х1

    0х0

    • Адресное пространство процессора разделяется на два, не отображаемых друг на друга участка — внешнюю память и внутреннюю. На рисунке 1 показана схема распределения памяти в SDK-1.1. На представленной схеме внутренняя память расположена в левой части, а внешняя — в правой части.
    • Рисунок 1. Схема распределения памяти SDK-1.1
    • Внутренняя память. Микропроцессор ADuC812BS, являясь аналогом процессора Intel 8051, унаследовал типичную для процессоров этого семейства структуру организации внутренней памяти. Внутренняя память (256 байт) разделена на 4 участка:
    • — участок регистров общего назначения;
    • — битовый сегмент;
    • — свободный участок;
    • — участок регистров специального назначения.
    • В таблице 2 содержится информация о распределении внутренней памяти в SDK-1.1.
    • Стандартная для архитектуры 8051 структура внутренней памяти представлена четырьмя банками по восемь регистров общего назначения (диапазоны адресов 00h-07h, 08h-0Fh, 10h-17h, 18h-lFh), битовым сегментом (20h-2Fh), свободным участком 30h-7Fh, областью размещения SFR (регистров специального назначения) 80h-FFh, доступной при прямой адресации, и свободной областью 80h-FFh, доступной при косвенной адресации.
    • Таблица 2. Распределение внутренней памяти
    • Регистры общего назначения

      Битовый сегмент

      Свободный участок

      Рег. Спец. наз

      Адрес

      00−07

      08−0F

      10−17

      18−1h

      20−2F

      30−7F

      80-FF

      • Внешняя память. Внешняя память SDK-1.1 разбита на следующие области: AduC812 Flash/EE, SRAM, MAX. Распределение адресов внешней памяти представлено в таблице 3.
      • Таблица 3. Распределение адресов внешней памяти
      • Flash/EE

        SRAM

        Page 1

        Pages 2.7

        Page 8

        Диапазон адресов

        0x0000

        0x02000

        0x10000

        0x80000

        0x2000

        0x0FFF

        0x7FFFF

        0x8FFFF

        • ADuC812 Flash/EE. Память Flash/EE представляет собой постоянную память, в которой хранится сервисная программа обслуживающая стенд, в ней находится набор тестов оборудования и драйвер RS232, позволяющий загружать пользовательский программы. При подаче питания или сбросе управление передаётся по нулевому адресу и происходит инициализация всех регистров.
        • Если пользовательская программа обратится к адресу 0, то стенд пройдёт процедуру реинициализации, что равносильно нажатию кнопки «сброс». Запись в эту область памяти возможна только в режиме программирования Flash-памяти, в простом режиме доступ к ним закрыт. Это необходимо учесть при разработке программы — код должен располагаться по адресам не ниже 0×2000. Это область, в которой располагается таблица векторов прерываний и резидентный загрузчик файлов в формате HEX в память SRAM.
        • Память SRAM (Внешнее ОЗУ). Статическая память имеет страничную организацию и представляет собой восемь страниц размером 64Кб каждая. Условно всю память SRAM разделяют на три участка: первая страница, страницы со второй по седьмую и восьмая страница.
        • Выборка кода может осуществляться только из первой страницы, и поэтому весь код должен располагаться именно здесь. Страницы со второй по седьмую могут быть использованы только для хранения данных. Восьмая страница особенна тем, что в первых 8 байтах расположены регистры микросхемы MAX 8064.
        • В младших адресах восьмой страницы адресного пространства (8 0000h-8 0007h) располагается 8 ячеек регистров ПЛИС МАХ8064 (МАХ8128). Эта область предназначена для взаимодействия с периферийными устройствами стенда.
        • Таблица 4. Модели и селекторы памяти
        • Селек-тор

          Область памяти

          data

          128 байт во встроенной RAM — непосредственная адресация

          bdata

          16 байт во встроенном RAM — непосредственная битовая/байтовая адресация

          idata

          256 байт во встроенном RAM — косвенная адресация

          pdata

          256 байт в страничной внешней RAM

          xdata

          64 Kбайт расширенной RAM

          code

          64 Kбайт памяти программ

          far

          16 Мбайт памяти data/const, размер объекта 64 Kбайт

          near

          64 Kбайт непосредственно адресуемой памяти для 251

          huge

          16 Мбайт косвенно адресуемой памяти, объект произвольного размера

          edata

          96 байт расширенной побитно адресуемой памяти для 251

          • Рассчитаем объем памяти буферного ОЗУ, которое необходимо для хранения данных, которые будут получены за 1 секунду работы АЦП.
          • Согласно техническим параметрам стенда SDK1.1, быстродействие встроенного АЦП, т. е время, которое требуется АЦП на преобразование одной выборки равно 20 тактам (периодам) частоты АЦП. Диапазон частот АЦП 400КГц — 3 МГц. Частота тактового генератора стенда FBQ=11,059. Тактовая частота АЦП выбирается программистом с помощью регистра ADCCon1. Программный делитель частоты, задаются битами 4 и 5 этого регистра след значение -1,2,4,8
          • Fтактовое АЦП=
          • где k — принимает значение 1,2,4,8
          • Fтакт ацп== 1,382 375 МГц
          • Tпреобр АЦП =20*Такт=20
          • По теореме Котельникова следует, что частота дискретизации должна быть минимум вдвое выше верхней частоты спектра (по заданию 20КГц), следовательно, частота дискретизации будет равна 40КГц.
          • Период дискретизации =
          • Это означает, что временной интервал между выборками составляет 25 микросекунд. Мы получаем 40 тысяч выборок за одну секунду. Размер каждой выборки равен двум байтам, соответственно, нам необходим объем памяти равный 80 тысячам байт или 80 килобайтам для одного канала и 640 килобайтам для восьми каналов, соответственно. Следовательно, мы получим слишком большой объем данных. Так как 8кб внутренней памяти программ нам недоступно, а 640 Байт внутренней памяти данных нам явно недостаточно, мы вынуждены будем использовать для хранения данных внешнее ОЗУ, а точнее его 456 килобайт (первые 64 Кб из 512Кб используются для хранения программ). Подробнее структурная организация внешнего ОЗУ описана выше. Распределение адресов внешней памяти приведено в таблице 3.
          • Нам необходимо решить ситуацию с размещением данных в памяти без их потери. Решений проблемы несколько — понижение частоты ГТИ или уменьшение частоты дискретизации. Можно также использовать стенд в режиме прямого доступа к памяти для приложений, в которых ЦП не может поддерживать высокую скорость оцифровки.
          • Так как в данном стенде используется микроконтроллер ADuC812, мы не можем изменить частоту тактового генератора (она жестко фиксирована), а лишь с использованием делителя частоты (к=8). Есть еще вариант выключать АЦП и производить обработку данных и запись их в память, затем включать АЦП и получать следующую порцию данных. Понижение верхней частоты спектра с 20КГц до 10КГц мы добьемся уменьшения частоты дискретизации также в два раза. (Уменьшив частоту дискретизации вдвое, уменьшится количество выборок, время преобразования АЦП увеличится). Но и эти действия не позволят целиком решить проблему,
          • Нам необходимо разбить 1 секунду на интервалы, которые позволят АЦП успеть оцифровать данные и записать их в память. Период дискретизации будем задавать при помощи таймера счетчика.
          • Следующей задачей является запись данных из внешнего ОЗУ стенда на ЖМД компьютера через интерфейс RS-232. Проблема заключается в согласовании обмена данными между стендом и ПК. Появляется необходимость написания управляющей программы, которая бы принимала данные от стенда через СОМ порт и записывала их на ЖМД в нужном нам формате.
          • По ТЗ необходимо в записываемых данных учитывать также номер канала, и время начала оцифровки.
          • Для программирования стенда может использоваться любой транслятор ассемблера или C для ядра 8051, например, пакет µVision (Keil Software). До начала программирования на языке C рекомендуется внимательно ознакомиться с документацией по используемому компилятору, так как компиляторы для микроконтроллеров имеют нестандартные расширения.
          • Основные этапы программирования стенда:
          • — подготовка программы в текстовом редакторе или среде программирования;
          • — транслирование исходного текста и получение загрузочного HEX-модуля программы;
          • — подготовка и загрузка HEX-модуля в стенд через интерфейс RS232C с помощью поставляемых инструментальных систем. Под подготовкой понимается добавление в конец модуля строчки со стартовым адресом программы, то есть адреса, по которому передается управление после загрузки в стенд;
          • — прием и обработка HEX-модуля резидентным загрузчиком HEX202, передача управления загруженной программе.
          • На рисунке 2 показаны этапы программирования стенда SDK-1.1.
          • Рисунок 2. Этапы программирования на стенде SDK-1.1
          • Напишем алгоритм приблизительной работы нашей будущей программы:
          • 1. Запустить АЦП (предварительно подключив ЗГ к стенду)
          • 2. Сохранить оцифрованные АЦП данные во внешнем ОЗУ
          • 3. Выгрузить данные из внешнего ОЗУ и передать их через СОМ порт в компьютер.
          • 4. На компьютере получив данные — мы должны их преобразовать в определенный формат и сохранить на ЖМД
          • 5. Проверить полученные данные, например, путем их направления на осциллограф.
          • При написании программ для стенда будем пользоваться средой программирования Keil Vision. Для приема данных от стенда и последующей их записи была выбрана программа Terminal v1.9b. Для написания программы работы с уже полученными данными выбрана среда программирования Borland Delphi 7.
          • 3. Разработка структурной схемы системы и ее описание

          Рисунок 3. Структурная схема стенда системы накопления.

          Учебный лабораторный комплекс SDK-1.1 разработан на базе микроконтроллера ADuC812 с ядром MCS-51.

          В состав учебного стенда SDK-1.1 входят:

          · Микроконтроллер ADuC812BS;

          · Внешняя E2PROM объемом 256 байт;

          · Клавиатура AK1604A-WWB фирмы ACCORD;

          · Жидкокристаллический индикатор (ЖКИ) WH1602B-YGK-CP фирмы Winstar Display;

          · Часы реального времени PCF8583;

          · 128K внешней SRAM с возможностью расширения до 512K;

          · Набор сигнальных светодиодов (8 шт.).

          Технические и эксплуатационные характеристики

          · Центральный процессор-ADuC812 (Analog Devices), 8 Кб FLASH, 256 байт ОЗУ, 640 байт EEPROM

          · Расширитель портов ввода-вывода — ПЛИС MAX3064 (Altera)

          · Внешнее ОЗУ 128 КБ, внешняя EEPROM-память 256 байт

          · Часы реального времени-PCF8583 (Philips), подключение по интерфейсу I2C

          · Дискретные и аналоговые порты ввода-вывода

          · 4-разрядный порт ввода-вывода, поддерживающий функции запроса прерывания (2 канала), счетных входов (2 канала), входа синхронизации АЦП, интерфейса microLAN (Dallas)

          · 16-разрядный параллельный порт ввода-вывода (шина расширения)

          · 2 канала 12-разрядного ЦАП, 8 каналов 12-разрядного АЦП

          · Консоль оператора

          · Символьный ЖКИ, 16 * 2

          · Матричная клавиатура, 4 * 4

          · Звуковой излучатель — 1 шт.

          · Управляемые светодиоды — 8 шт.

          · Ручные переключатели тестовых сигналов для аналоговых и дискретных портов ввода: коммутатор аналоговых каналов и стимулятор дискретных портов.

          · Интерфейсы

          · Оптически развязанный приемопередатчик инструментального канала RS-232C.

          · Интерфейс JTAG (IEEE 1149.1) для контроля периферийной шины и портов, реализованных в ПЛИС MAX3064.

          · Габаритные размеры: 128×125×33 мм

          · Напряжение питания: 12 ± 20% В DC

          · Потребляемый ток: 150 мА

          · Модуль расширения: SDX-09.

          Модуль дискретного и аналогового ввода-вывода SDX-09 обеспечивает согласование уровней напряжения и тока, гальваническую изоляцию при подключении типовых датчиков (дискретных и аналоговых) и исполнительных устройств (двигатели, клапаны, лампы).

          Технические и эксплуатационные характеристики

          · Дискретные порты ввода-вывода (с гальванической изоляцией до 3 кВ)

          · 8 дискретный выходов — 350 В DC, 120 мА

          · 8 дискретных входов — 24 В AC/DC

          · 4 релейных выхода — 220 В AC/DC, 2 А

          · Аналоговые порты ввода-вывода (без гальванической изоляции)

          · 2 аналоговых выхода — ±10 В, 0.20 мА

          · 4 аналоговых входа — ±10 В, 0.20 мА

          · Габаритные размеры: 140 * 125 * 33 мм

          · Напряжение питания: 12 ± 20% В DC

          · Потребляемый ток: 300 мА Рисунок 4. Структурная схема стенда-расширителя SDX-09

          4. Разработка функциональной схемы системы и ее описание В этой главе будут рассмотрены основные функциональные блоки стенда SDK-1.1: микроконтроллер ADuC812, внешняя память, матричная клавиатура, жидко кристаллический индикатор, часы реального времени, ПЛИС, интерфейс RS 232, интерфейс процессора с памятью и будет разработана функциональная схема всего стенда.

          4.1 Микроконтроллер ADuC812

          Микропроцессорный стенд SDK-1.1 построен на базе однокристальной микро-ЭВМ фирмы Analog Device типа ADuC812 (вычислительное ядро MCS-51). ADuC812 — интегральная 12-разрядная система сбора информации, включающая в себя прецизионный многоканальный АЦП с самокалибровкой, два 12-разрядных ЦАП и программируемое 8-битное микропроцессорное ядро (совместимое с 8051, MCU). MCU поддерживается внутренними 8К FLASH ЭРПЗУ программ, 640 байт ЭРПЗУ памяти данных и 256 байт статической памяти данных с произвольной выборкой (RAM). MCU поддерживает следующие функции: сторожевой таймер, монитор питания и канал прямого доступа к памяти для АЦП. Для мультипроцессорного обмена и расширения ввода/вывода имеются 32 программируемые линии, I2C, SPI и UART интерфейсы. Для гибкого управления в приложениях с низким потреблением в MCU и аналоговой части предусмотрены 3 режима работы: нормальный, холостой и дежурный. Продукт специфицирован для +3/+5 В работы в индустриальном диапазоне температур и поставляется 52-выводном пластмассовом корпусе (PQFP).

          Микроконтроллер имеет стандартный набор из 4-х 8-разрядных портов ввода/вывода дискретных сигналов P0, P1, P2 и P3. Они характеризуются многофункциональностью.

          Рисунок 5. Структурная схема ADuC812

          Рисунок 6. Условно-графическое изображение ADuC812

          4.2 Внешняя память E2PROM

          E2PROM — перепрограммируемое электрически стираемое постоянное запоминающее устройство. Объем памяти E2PROM, установленной в стенде SDK-1.1, составляет 128 байт (возможна установка E2PROM большего объема, до 32 Кб). Микросхема E2PROM взаимодействует с процессором посредством интерфейса I2C.

          Основные характеристики:

          * Возможность перезаписи до 1 млн. раз.

          * Возможность побайтной и постраничной записи (в текущей конфигурации размер страницы составляет 8 байт).

          Диапазон рабочих температур -55°C — +125°C

          Условия хранения -65°C — +150°C

          Напряжение на ножках с учетом заземления -0.1V — +7.0V

          Максимальное рабочее напряжение 6.25V

          Постоянный ток выхода 5.0 mA

          Рисунок 7. Микросхема AT24C01A (объемом 128 кб)

          4.3 Матричная клавиатура AK1604A-WWB

          Клавиатура организована в виде матрицы 4×4. Доступ к колонкам и рядам организован как чтение/запись определенного байта внешней памяти (4 бита соответствуют 4 колонкам, другие 4 бита — рядам).

          Рисунок 8. Схема электрическая принципиальная матричной клавиатуры AK1604A-WWB.

          При нажатии на кнопку напряжение не сразу устанавливается на уровне 0 В, а «скачет» в течение некоторого времени (1−10 мс), пока цепь надежно не замкнется. После того, как клавиша будет отпущена, напряжение также «скачет», пока не установится на уровне логической «1» .

          Рисунок 9. Дребезг Поскольку процессор обладает высоким быстродействием, то он может воспринять эти скачки напряжения за несколько нажатий. Для программного устранения влияния «дребезга» используется задержка. После того, как в результате сканирования обнаружится «0» в регистре ROW, сканирование прекращается и производится задержка на некоторое время. После этого сканируется тот же столбец и, если на том же месте регистра ROW обнаружен «0», то фиксируется нажатие клавиши. После этого через некоторое время, достаточное для отпускания клавиши, еще раз проверяется тот же столбец. Если состояние линии изменилось, то фиксируется отпускание клавиши и продолжается сканирование клавиатуры. Если клавиша все еще нажата, то производится задержка на время перед повтором символа, и если состояние регистра не изменилось, то в буфер клавиатуры повторно заносится символ. После этого, пока клавиша не будет отпущена, в буфер заносится код клавиши через промежутки времени, определяемые скоростью повтора символа.

          4.4 Жидкокристаллический индикатор WH1602B-NGK-CP

          ЖКИ в контроллере SDK-1.1 подключен не напрямую к микроконтроллеру ADuC812, а через расширитель портов ввода-вывода, выполненный на базе ПЛИС. В ЖКИ есть специальный контроллер, формирующий необходимые напряжения на входах матрицы и осуществляющий динамическую индикацию. Для работы с этим контроллером реализован простейший интерфейс, описанный на рисунке 10.

          Рисунок 10. Схема электрическая принципиальная ЖКИ ЖКИ работает в текстовом режиме (2 строки по 16 символов), имеет подсветку (цвет желто-зеленый). Основные характеристики:

          * Габариты: 80×36×13.2 мм.

          * Активная область 56.21×11.5 мм.

          * Размеры точки 0.56×0.66 мм; размеры символа 2.96×5.56 мм.

          * Встроенный набор 256 символов (ASCII + кириллица).

          * Генератор символов с энергозависимой памятью на 8 пользовательских символов.

          Рисунок 11 — Схема подключения контроллера ЖКИ к МК ADuC812

          Таблица 5.

          Обозначение

          Описание

          RS

          Переключение между регистрами команд и данных: 1 — данные, 0 — команды

          R/W

          1- чтение (из контроллера ЖКИ), 0 — запись (в контроллер ЖКИ)

          E

          Разрешающий сигнал (1 — активный уровень). Если сигнал E = 0, то контроллер ЖКИ игнорирует все остальные сигналы

          DB0

          Бит данных 0

          DB1

          Бит данных 1

          DB2

          Бит данных 2

          DB3

          Бит данных 3

          DB4

          Бит данных 4

          DB5

          Бит данных 5

          DB6

          Бит данных 6

          DB7

          Бит данных 7

          4.5 Часы реального времени PCF8583P

          PCF8583 — часы/календарь с памятью объемом 256 байт, работающие от кварцевого резонатора с частотой 32.768 кГц. Питание осуществляется ионистором (0.1 ф). Из 256 байт памяти собственно часами используются только первые 16 (8 постоянно обновляемых регистров-защелок на установку/чтение даты/времени и 8 на будильник), остальные 240 байт доступны для хранения данных пользователя. Точность измерения времени — до сотых долей секунды. Взаимодействие с процессором осуществляется через интерфейс I2C.

          матричный клавиатура процессор микроконтроллер Рисунок 12. Схема электрическая принципиальная PCF8583P

          4.6 ПЛИС PM3064ATC100

          ПЛИС — программируемая логическая интегральная схема. Некоторые устройства стенда подключены к микроконтроллеру через периферийный расширитель портов ввода-вывода, реализованный на базе ПЛИС небольшой емкости, перепрограммируемой через имеемый в SDK-1.1 JTAG-порт, что дает возможность изменять механизмы работы с этими устройствами.

          К ПЛИС подключены: клавиатура, ЖКИ, линейка светодиодов, звуковой излучатель, 16 дискретных портов ввода-вывода.

          Рисунок 13. ПЛИС PM3064ATC100

          ПЛИС имеет в своем составе 8 регистров.

          Таблица 6. Перечень регистров ПЛИС

          Адрес

          Регистр

          Доступ

          Назначение

          8 0000H

          KB

          R/W

          Регистр клавиатуры.

          8 0001H

          DATA_IND

          R/W

          Регистр шины данных ЖКИ.

          8 0002H

          EXT_LO

          R/W

          Регистр данных параллельного порта (разряды 0.7).

          8 0003H

          EXT_HI

          R/W

          Регистр данных параллельного порта (разряды 8.15).

          8 0004H

          ENA

          W

          Регистр управления портами ввода-вывода, звуком, сигналом INT0 и прерыванием от клавиатуры.

          8 0006H

          C_IND

          W

          Регистр управления ЖКИ.

          8 0007H

          SV

          W

          Регистр управления светодиодами.

          ПЛИС выбирается при выставлении сигнала #CS RAM/EPM (на второй защелке в схеме интерфейса памяти) — то есть при выборе восьмой страницы памяти. Регистры ПЛИС можно читать или писать через подсоединенную шину адреса/данных — видна на левой средней половине микросхемы на рисунке. Через эту же шину выставляется адрес используемого регистра ПЛИС. Выводы ПЛИС в принципе соответствуют регистрам, которые расположены в ней — то что мы подаем на соответствующие вывода ПЛИС, отображается в соответствующих регистрах и наоборот.

          Определенные выводы микросхемы подключены к внешнему разъему и к DIP-переключателям. Когда эти переключатели отключены, высокий уровень напряжения с +5V поступает на соответствующие выводы ПЛИС и в регистрах устанавливаются соответствующие значения. Когда же переключатели включены, высокий уровень напряжения с +5V идет на землю, и на выводах ПЛИС мы получаем низкий уровень напряжения — логический ноль.

          4.7 Интерфейс RS232 (COM порт) Эта схема, в принципе, типична — присутствует оптическая развязка (KPC357), DC/DC-преобразователь (VA-0505S1) и основной элемент — драйвер RS-232 (ST202CD). Эта микросхема обеспечивает обмен последовательными данными с другим устройством через протокол RS-232 (в случае ПК используется COM порт). Данные преобразуются из параллельной формы в последовательную при помощи встроенного в ADuC812 UART-контроллера, драйвер же лишь преобразует сигнал, выдаваемый UART так, чтобы он соответствовал требования стандарта.

          На схеме стенда можно заметить элементы (рядом с микроконтроллером) внешней EEPROM и часов реального времени — AT24C02A и PCF8583P соответственно. С микроконтроллером они общаются при помощи I2C

          Рисунок 14. Схема электрическая принципиальная RS232

          4.8 Интерфейс процессора с памятью В силу того, что в SDK1.1 используется общая шина адреса-данных, мы вынуждены использовать защелки для передаваемого адреса ячейки — пара маленьких прямоугольных элементов посередине схемы. Вначале, мы используем шину, как шину адреса — передаем по ней адрес ячейки. Этот адрес мы запоминаем в защелках — специальных запоминающих элементах, по сигналу ALE с микроконтроллера. На следующем такте работы микроконтроллера мы используем шину, уже как шину данных — посылаем, или передаем по ней информацию. При этом, адрес, выставленный на адресных входах микросхемы остается неизменным — ведь на этом такте мы считываем его с защелок, а не с шины адреса/данных.

          Стоит заметить, что в силу использования в стенде Гарвардской архитектуры, процессы чтения/записи из памяти команд и данных различаются. В случае чтения команд мы используем сигнал PSEN для сигнализации процесса начала чтения. Для адресации используется лишь два байта — мы используем просто 2 защелки.

          Для сигнализации начала чтения данных используется сигнал RD. Для адресации используются уже три байта. Младший байт адреса передается через порт P0 — запоминается в верхней по схеме защелке. Старший байт запоминается в нижней по схеме защелке (через порт P2). Средний же байт передается через порт P2 уже после того, как два остальных байта «запомнились» в защелках.

          Для записи информации в память данных используется сигнал WR; в память же команд писать нельзя.

          Рисунок 15 — Микросхема памяти K6X4008C1F

          Рисунок 16. Интерфейс процессора с памятью Подробнее структура распределения памяти стенда приведена в анализе технического задания.

          5. Разработка схемы электрической принципиальной системы и ее описание Схема электрическая принципиальная строится на основании структурной схемы. Схема и перечень элементов, входящих в систему накопления данных, представлены в Приложении 1.

          Работа схемы электрической принципиальной разрабатываемой системы происходит по тем же принципам, что и работа структурной схемы. Описание работы системы изложено в разделе «Разработка структурной схемы системы и ее описание» (раздел 3).

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

          6.1 Разработка программы для микроконтроллера

          Основные этапы разработки ПО и его загрузки в стенд SDK-1.1, исключая разработку алгоритмов решения задачи, таковы (см. Рисунок 2)

          · создание файлов с исходным текстом программы на выбранном языке программирования;

          · трансляция исходного кода в объектный код, сборка в один объектный файл;

          · приведение исполняемого кода к виду, пригодному для передачи в стенд SDK-1.1;

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

          Написание программы для стенда производилось в среде Keil Visio. В основе данной среды лежит язык C 51.

          В состав инструментальных средств для процессоров с ядром АРМ7 входит:

          1. Интегрированная среда разработки uVision;

          2. Компилятор языка C;

          3. Ассемблер;

          4. Симулятор — отладчик;

          5. Линкер;

          6. Библиотекарь;

          7. Комплект компиляторов с лицензией GNU.

          Рассмотрим подробнее процесс работы в среде uVision;

          Рисунок 18. Схема средств разработки, входящих в состав пакета Keil Software

          6.1.1 Создание нового проекта После создания программного проекта в интегрированной среде программирования keil_c конечным файлом трансляции является абсолютный файл. Для загрузки в микросхему обычно используется HEX файл. Для создания этого файла необходимо включить соответствующую опцию в свойствах программного проекта.

          При написании программ для лабораторного стенда SDK-11 нужно учитывать такую особенность разработки программы, что программа должна находиться во внешней памяти программ. Поэтому начальный адрес памяти программ необходимо установить за пределами внутренней памяти программ, т. е. 0×2000. Начальный адрес внешней памяти данных можно установить, начиная с половины страницы, т. е. с адреса 0×8000.

          6.1.2 Резидентный загрузчик НЕХ202

          Резидентный загрузчик НЕХ202 располагается во Flash-памяти ADuC812. Он обеспечивает начальную инициализацию системы, загрузку программ в hex-формате в память SDK-l.l и передачу им управления.

          При включении питания происходит инициализация всех регистров специального назначения их значениями по умолчанию и на ЖКИ выводится надпись «SDK-1.1, 2001 (c)LMT Ltd». Одновременно на звуковой излучатель выдается короткий сигнал.

          После процедуры инициализации системы последовательный канал настраивается в режим 9600 бит/сек, 8 бит данных, 1 стоп-бит, нет контроля четности и в него выдается строчка «НЕХ202-ХХ», где XX — номер версии загрузчика. Далее с интервалом примерно в 200мс выдается символ `.' и ожидается ответ программы-загрузчика, запускаемой на компьютере. После успешной загрузки программы управление передаётся этой программе.

          Все передаваемые из лабораторного стенда символы можно наблюдать в терминальном режиме загрузчика T167.exe.

          6.1.3 Загрузка программ в лабораторный стенд SDK-1.1

          Для облегчения работы с загрузчиком в директории проекта создан пакетный файл RUN_T167.BAT. Этот файл выполняет все необходимые действия по загрузке исполняемого модуля во внутреннюю память лабораторного стенда SDK-1.1.

          При выполнении этого командного файла в конец загрузочного файла, который обязательно должен быть в hex-формате, дописывается строка, обеспечивающая запуск программы с адреса 2100h. Затем открывается последовательный порт компьютера и настраивается для работы в 8-ми битном режиме работы на скорости обмена 9600 бит/с и загружается полученный в предыдущем пункте загрузочный файл во внешнюю память лабораторного стенда. Последнее, что выполняет командный файл RUN_T167.BAT — это переводит программу T167. exe в терминальный режим, в котором отображает на экране компьютера всю информацию, получаемую от лабораторного стенда по последовательному порту.

          Для выхода из терминального режима загрузчика нужно нажать на кнопку клавиатуры компьютера `Esc'.

          6.1.4 Описание основной части кода программы для микроконтроллера

          Минимальная программа, не выполняющая никаких действий, для микроконтроллера выглядит следующим образом:

          #include

          void main (void)

          {

          }

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

          Инициализация АЦП, таймеров и UART будет выполнена один раз, поэтому она не будет входить в основной цикл программы, а будет расположена сразу перед ним:

          //———-Инициализация UART—————;

          TH1 = 0xFD; // Скорость 9600 бит/с

          TMOD = 0×20;// Таймер 1 в режиме autoreload

          TCON = 0×40;// Запуск таймера 1

          SCON = 0×50;// 8 bit UART, разрешение приема

          PCON &= 0x7 °F;// Отключение удвоения скорости

          TI = 1; // Флаги UART

          RI = 1; // Transmit & Recive

          EA =0×0;// UART interrupts only

          // Настроить A/D to sequentially convert each input channel.

          ADCCON1 = 0x7C; // 0111 1100

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

          do

          {

          …// здесь будет расположена большая часть кода

          }

          While (1)

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

          1. чтение состояния клавиатуры;

          2. проверка нажатия цифровой клавиши;

          3. проверка ошибки выбора канала;

          4. задание номера канала для оцифровки;

          5. запуск АЦП и ожидание от него данных;

          6. запись данных в память;

          7. передача данных и номера канала на ПК;

          8. изменение состояния светодиодов в соответствии с оцифрованным каналом.

          Это минимально необходимые действия для нормального функционирования системы:

          unsigned int conv_val = 0;

          unsigned char channel = 0;

          unsigned char c=0;

          if (ScanKBOnce (&c))

          NumChanel=chrtoint (c);

          if (NumChanel>8)// каналы больше 8го не обрабатываем

          NumChanel=255;

          if (NumChanel≠255)// 255 — ошибка выбора канала

          {

          // начать преобразование и дождаться завершения

          ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;

          SCONV = 1;

          while (ADCCON3 & 0×80);

          // Чтение A/D данных

          channel = ADCDATAH >> 4;

          conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);

          // вывод на терминал

          if (NumChanel==8)

          {

          value2= (675-conv_val*0.61)/3;

          printf («ADC Channel %d = %f Cn», NumChanel, value2);

          }else

          {

          printf («ADC Channel %d = 0x%Xn», NumChanel, conv_val);

          }

          }else

          {

          printf («Error selection channeln»);

          }

          // выведем оцифрованное значение

          /*

          зажигаем светодиот соответствующий номеру канала который в данный момент оцифровываем

          */

          svet=convert (NumChanel, 0);

          WriteMax (0×7,svet);//вывод на светодиды

          for (pause=0;pause<=64 000;pause++);// задержка Полный листинг программы, а также доработанная версия с использованием таймера/счетчика (с подробными комментариями описания каждого участка программы) приведены в приложении А.

          6.2 Разработка программы для ПК

          Компьютерная программа должна выполнять следующие функции:

          1. Чтение данных с COM порта;

          2. Отображение принятых данных на экране;

          3. Запись принятых данных на ЖМД;

          4. Запись служебных данных на ЖМД.

          Всеми вышеприведенными функциями обладает уже созданное программное обеспечение Terminal.

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

          Terminal — простая программа эмуляции терминала последовательного порта (COM). Она может использоваться для соединения с различными устройствами, такими как модемы, маршрутизаторы, встроенные uC системы, телефоны GSM… Это очень полезное средство отладки для приложений последовательной передачи.

          Данное ПО полностью устраивает требования задания курсового проекта. Поэтому для записи на ЖМД будем использовать её.

          Для сопряжения стенда и ПК необходимо задать правильные настройки программы:

          · Com port — порт к которому подключен стенд;

          · Baud rate — скорость передачи данных, выставить в 9600;

          · Data bits — кол-во бит данных, выставить 8;

          · Parity — бит паритета, неиспользуется (none).

          Рисунок 19. Главное окно программы Terminal

          После того как все настройки были выставлены можно подключаться к стенду, для этого служит кнопка «Connect».

          Для того что бы данные записывались на диск нужно нажать кнопку «StartLog», после этого появится окно выбора файла, в который и будут сохраняться принятые данные.

          Заключение

          В данном курсовом проекте была разработана система накопления данных, которая предназначена для оцифровки данных, поступающих с генератора звуковых частот, и записи их на жесткий магнитный диск. Данные записываются в файл, имя файла задает оператор, со служебной информацией, такой как время начала/конца оцифровки и номера оцифрованного канала. Спроектированная система организована с помощью учебного стенда SDK-1.1 на базе микроконтроллера ADuC812 с ядром MCS51 и расширителя SDX-09.

          Разработка проектируемой системы состоит из двух этапов:

          описание аппаратной части;

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

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

          На втором этапе был разработан алгоритм управления, который затем был реализован в виде программы на языке C#. Была написана программа непосредственно для стенда и выбрана программа для сохранения получаемых данных на компьютере.

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

          1. Конспект лекций.

          2. Справочные материалы по интегрированной среде программирования keil_C.

          3. С. Бобровский «Самоучитель программирования на языке С++ в системе Borland C++ Builder 4.0 «, десс inforcom press, Москва 1999

          4. П. Киммел и др. «Borland C++ 5»: пер. с англ. — СПб.: BHV — Санкт-Петербург, 1999. — 976 с., ил.

          5. www.sibsitus.nsk.ru/~mavr

          6. Микропроцессорный комплекс SDK 1.1. Архитектура и программирование: учебное пособие /Е.В. Бурькова, А. С. Бобровский — Оренбург, ГОУ ОГУ, 2009 г — 107с.

          Приложение, А Листинг доработанной программы для микроконтроллера

          #include

          #include

          #define MAXBASE 0x8

          #define MyData 0x3

          #define KB 0x0

          /*

          То, что эта ячейка памяти находится во внешней памяти данных показывает уточняющее слово «xdata»,

          */

          unsigned int xdata conv_val[127] = 0;// массив из 128 элементов

          unsigned short CountMas = 127;// кол-во элементов в массиве

          unsigned int IndexMas = 0;

          char KBTable[]="147*2 580 369#ABCD" ;

          unsigned int NumChanel = 8;// номер канала для оцифровки

          unsigned int OldChanel = 8;// номер канала для оцифровки

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

          //Функция записи значения регистра regnum.

          /*

          входные данные:

          *regnum — адрес регистра

          val — записываемое значение возвращаемый результат:

          отсутствует

          */

          void WriteMax (unsigned char xdata *regnum, unsigned char val)

          {

          unsigned char oldDPP=DPP;

          DPP=MAXBASE;

          *regnum=val;

          DPP=oldDPP;

          }

          //Функция чтения значения регистра regnum.

          /*

          входные данные:

          *regnum — адрес регистра возвращаемый результат:

          значения регистра

          */

          unsigned char ReadMax (unsigned char xdata *regnum)

          {

          unsigned char oldDPP=DPP;

          unsigned char val=0;

          DPP=MAXBASE;

          val=*regnum;

          DPP=oldDPP;

          return val;

          }

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

          //Функция реализующая опрос клавиатуры.

          /*

          входные данные:

          *ch — адрес буфера куда будет записан прочитанный результат возвращаемый результат:

          0 — в случае если нажатия не было

          1 — нажатие было

          */

          bit ScanKBOnce (char *ch)

          {

          unsigned char row, col, rownum, colnum;

          unsigned int i;

          //Сканирование производится по «столбцам» клавиатуры, на которые подается

          //" бегущий 0″ .

          for (colnum = 0; colnum < 4; colnum++)

          {

          col = 0×1 << colnum; //0001, 0010, 0100, 1000, 0001, …

          WriteMax (KB, ~col); //11 111 110, 11 111 101, 11 111 011, 11 110 111, 11 111 110, …

          //При подаче нуля на очередной столбец на каждом из «рядов» проверяется

          //наличие нуля (факт замыкания контакта клавишей)

          for (rownum = 0; rownum < 4; rownum++)

          {

          row = ReadMax (KB) & (0×10 << rownum);

          if (!row) //Обнаружено нажатие клавиши:

          {

          for (i = 0; i<10 000; i++)continue;//проверка на дребезг контакта:

          //через примерно 40мс повтор сканирования той же клавиши

          row = ReadMax (KB) & (0×10 << rownum);

          if (!row)

          {

          *ch = (KBTable[(colnum<<2) + rownum]);

          return 1; //Стабильное нажатие клавиши

          }

          }

          }

          }

          return 0; //Ни одна клавиша не нажата

          }

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

          // функция преобразует символ в число

          /*

          входные данные:

          ch — символ, который необходимо преобразовать возвращаемый результат:

          255 — в случае если передана не цифра (код ошибки) либо преобразованную цифру (0,1,2…, 9)

          */

          unsigned int chrtoint (char ch)

          {

          char Digits[]="123 456 789″ ;

          unsigned int sym;

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

          {

          if (Digits[sym]==ch)

          {

          return sym;

          }

          }

          return 255;// ошибка

          }

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

          unsigned char ReadEXTRAM (unsigned char xdata *adr)

          {

          unsigned char oldDPP=DPP;

          unsigned char val=0;

          DPP=MyData;

          val=*adr;

          DPP=oldDPP;

          return val;

          }

          void WriteEXTRAM (unsigned char xdata *adr, unsigned char val)

          {

          unsigned char oldDPP=DPP;

          DPP=MyData;// третья страница памяти

          *adr=val;

          DPP=oldDPP;// возвращаем старое значение

          }

          // передача данных на ПК

          /*

          описание:

          передает, через UART, массив (conv_val) с сохраненными, в нем до этого, значениями входные данные:

          отсутствуют возвращаемый результат:

          отсутствует

          */

          void WriteToUART (unsigned short count)

          {

          unsigned short i;// счетчик

          unsigned short tmp=0;

          printf («ADC Channel: %dnData start: n», NumChanel);// номер канала и служебное слово

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

          {

          tmp=ReadEXTRAM (i);

          //val=conv_val[i];

          printf («%dn», tmp);// передача данных

          }

          printf («Data stopn»);// конец вывода данных

          }

          // запись значения во внешенее ОЗУ

          /*

          описание:

          записывает входное значение в массив, хранящейся во внешнем ОЗУ входные данные:

          Value — записываемое значение

          Channel — номер канала с которого было получено значение, необходимо для вывода сохраненных до этого значений при смене канала оцифровки возвращаемый результат:

          отсутствует

          */

          void WriteValue (unsigned short Value, unsigned short Channel)

          {

          if (Channel≠OldChanel)// если был сменен канал нужно вывести данные

          {

          WriteToUART (—IndexMas);// вывод

          IndexMas=0;// данные выведены можно заполнять массив сначала

          }

          WriteEXTRAM (IndexMas, Value);// пишем во внешнее ОЗУ

          //conv_val[IndexMas]=Value;// пишем данные во внешнее ОЗУ

          IndexMas++;// увеличиваем индекс

          if (IndexMas>=CountMas)// Проверяем не конец ли это массива

          {

          WriteToUART (—IndexMas);// если массив заполнен выведем данные

          IndexMas=0;// данные выведены можно заполнять массив сначала

          }

          }

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

          /*

          описание:

          основная часть программы на которую после загрузки попадает управление входные данные:

          отсутствуют возвращаемый результат:

          отсутствует

          */

          void main (void)

          {

          float grad = 0;

          unsigned char c=0;

          unsigned char svet = 0;

          unsigned short tmpVal = 0;

          //———-Инициализация UART—————;

          TH1 = 0xFD;// Скорость 9600 бит/с

          TMOD = 0×20;// Таймер 1 в режиме autoreload

          TCON = 0×40;// Запуск таймера 1

          SCON = 0×50;// 8 bit UART, разрешение приема

          PCON &=0x7 °F;// Отключение удвоения скорости

          TI = 1; // Флаги UART

          RI = 1; // Transmit & Recive

          // инициализация таймера Т0

          TCON &=0xC0; //T0 stop.

          TMOD &=0xF0; //сброс настроек T0.

          TMOD |=0×01; //установка T0 в режим T 16-bit

          TL0 = 0xFE; //задержка

          TH0 = 0×32; //

Показать весь текст
Заполнить форму текущей работой