Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

тема ~ это функционально законченное изделие состоящее из одного или нескольких устройств

Работа добавлена на сайт samzan.net:


 

Содержание.


Введение 

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

Микропроцессорная система – это функционально законченное изделие, состоящее из одного или нескольких устройств.

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

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

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

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

1 Обзор литературы.

Большинство современных устройств в своем составе имеют хотя бы один микроконтроллер.

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

Очень полно о современных системах сбора данных описывает в своей книге А.Ю. Кузьминов «Интерфейс RS-232. Связь между компьютером и микроконтроллером». Автор этой книги разделяет современные системы сбора данных на два основных класса.

К первому можно отнести так называемые компьютерные системы сбора, когда микроконтроллер расположен в специальном устройстве сопряжения с объектом (УСО), имеющем отдельный корпус, как правило, со своим блоком питания, подключаемым к сети (220В). К этому устройству подведены кабели от датчиков, с которых снимается информация. УСО сопрягается с компьютером по интерфейсу RS-232, по которому в компьютер передаётся измерительная информация. Управление УСО осуществляется также компьютером по тому же интерфейсу, т.е. микроконтроллер получает команды от компьютера, выполняет их, и результат выполнения посылает в компьютер. Последний получает предварительно обработанную (как правило, только оцифрованную) микроконтроллером информацию, окончательно её обрабатывает и выводит результаты этой обработки на экран монитора и/или принтер. Иногда УСО может находиться на значительном удалении от компьютера (до десятков метров и более); такие системы часто называют удаленными.

Отличительные черты компьютерных систем сбора следующие:

  •   Обмен информацией микроконтроллера с компьютером идет постоянно, кроме того, в некоторых случаях основная программа работы  микроконтроллера может передаваться в него из компьютера; в этих условиях от интерфейса потребуется повышенные надежность и скорость обмена (115200 бод); в связи с этим обязательным является возможность программирования микроконтроллера по RS-232.
  •   «Интеллектуальная» нагрузка на микроконтроллер достаточно низкая; микроконтроллер ничего не считает, ввод/вывод информации осуществляется только по интерфейсу, поэтому программа для микроконтроллера примитивна, как правило, написана на ассемблере и в очень редких случаях её объем превышает 2кбайта; основную «интеллектуальную» нагрузку несет программа, написанная для компьютера.
  •   Повышены требования к точности измерений; особенно это касается точности временных характеристик: погрешности таких временных характеристик, как общее время измерений (Т), интервал времени измерений (∆Т) и т.п., как правило, не должны превышать 1мс, а в некоторых случаях (если, например, такая система используется в различного рода поверочных установках, да еще связанных с приборами коммерческого учета) должна быть на порядок выше.
  •   Повышены требования к АЦП: многоканальность (не менее восьми), повышенная точность, дискретность измерений должна быть не менее 16 разрядов; АЦП должен иметь самокалибровку; перед АЦП обязательно должен располагаться низкочастотный фильтр, частота среза которого равна частоте Найквиста – Котельникова (в два раза ниже частоты дискретизации АЦП), кроме того, желательно, чтобы фильтр был еще и заграждающим, т.е. имеющим полюс (0). При этом затухание должно быть не менее |-100| дБ на частоте питающей сети (50Гц).
  •   Системы, как правило, многоканальные и достаточно универсальные, т.е. имеют несколько(восемь и более) аналоговых, частотных и/или дискретных каналов.
  •   Имеют свой блок питания, подключаемый к сети, потребление энергии такими системами  не имеет особого значения; как правило, микроконтроллер работает при напряжении питания 5 В.
  •   Выпускаются, как правило, в небольших количествах, причем, львиная доля стоимости системы приходится на программное обеспечение, написанное для компьютера, поэтому стоимость аппаратных средств (а тем более – стоимость микроконтроллера) особого значения не имеют.

Ко второму классу можно отнести так называемые автономные системы сбора, представляющие собой по существу приборы, правда, достаточно «интеллектуальные». Здесь микроконтроллер выступает в качестве основы, как аппаратных, так и программных средств. Автономные системы сбора представляют собой устройства, оснащенные не только средствами измерений (датчиками измерительной информации), сбора и обработки измерительной информации, но и средствами индикации результатов измерений (в простейших системах это может быть, например, цифровой семисегментный индикатор с несколькими цифрами, в более сложных –одно , либо двустрочный алфавитно – цифровой или матричный графический дисплей; иногда автономная система оснащается даже примитивным печатающим устройством, например – кассовый аппарат), а также средствами ручного ввода информации (например, кнопочной мембранной клавиатурой) или хотя бы примитивного ручного управления.

Автономные системы конструируются в отдельном корпусе и оснащаются своим блоком питания (во многих случаях батарейным). Часто автономные системы содержат в своем составе интерфейс сопряжения с компьютером (например, RS-232). Иногда этот интерфейс выполнен только опционально, реже он все –таки используется, но основные его задачи – плановый съём архивной информации, тестирование системы, начальное занесение в систему необходимых коэффициентов и/или режимов работы и т.п. При штатном режиме работы автономной системы интерфейс, как правило, не используется.

Отличительные черты автономных систем сбора следующие:

  •   Обмен информацией с компьютером по интерфейсу (если он вообще существует) происходит время от времени  и достаточно редко; от интерфейса не требуется высокое быстродействие (115200 бод); если автономная система сбора все-таки оборудована интерфейсом RS-232 для обмена информацией с компьютером, то желательна возможность программирования по RS-232.
  •   «Интеллектуальная нагрузка» на микроконтроллер достаточно высокая; в связи с этим программа для микроконтроллера сложная, как правило, написана на языке Си и, хотя даже современные компиляторы Си (например, С-Keil, V.6.12-6.20) для микроконтроллера и обладают массой оптимизационных свойств (в том числе – оптимизацией объема памяти), эта программа занимает десятки килобайт программной памяти и/или памяти данных; кроме того, повышены требования и к объему ОЗУ.
  •   Повышенная точность измерения временных характеристик, как правило, не требуется, зато необходим из большой временной диапазон: секунды, минуты, часы, сутки, месяцы и даже годы; это нужно для возможного архивирования результатов измерений, так как автономная система (оснащена, например, батарейным блоком питания с литиевыми элементами) может работать несколько лет.
  •   Повышены требования к АЦП: многоканальность (не менее восьми), повышенная точность, дискретность измерений должна быть не менее 16 разрядов; АЦП должен иметь самокалибровку; перед АЦП обязательно должен располагаться низкочастотный фильтр, частота среза которого равна частоте Найквиста – Котельникова (в два раза ниже частоты дискретизации АЦП), кроме того, желательно, чтобы фильтр был еще и заграждающим, т.е. имеющим полюс (0). При этом затухание должно быть не менее |-100| дБ на частоте питающей сети (50Гц).
  •   Не содержат большого числа однотипных измерительных каналов (как правило, число однотипных каналов не превышает трех – четырех), но число различного рода устройств, входящих в состав микроконтроллера, может быть большим (АЦП, ЦАП, таймеры/счетчики, часы, источники опорного напряжения и/или тока и т.п.), т.е. от микроконтроллера требуется повышенная универсальность.
  •   Во многих случаях работают от батарейного блока питания, поэтому от микроконтроллера требуется пониженное энергопотребление; в связи с этим такие системы, как правило, работают от напряжения 3 В (литиевые батарейки).
  •   Выпускаются в достаточно больших количествах, поэтому стоимости аппаратных средств (в том числе, стоимость микроконтроллера) играет важную роль, а вот стоимость программного обеспечения, которая иногда даже превышает стоимость программного обеспечения компьютерных систем (программа для микроконтроллера + программа для компьютера), существенного значения не имеет, так как распределяется на большое число устройств.


2 Анализ технического задания.

Согласно ТЗ на курсовой проект необходимо разработать систему сбора данных с использованием стендов SDK 1.1 и  SDX 0.9.

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

- число каналов 8;

- источник входного сигнала – генератор звуковых частот;

- диапазон частот входного сигнала (20-20000)Гц;

- оцифрованные данные должны сохраняться на ЖМД ПК;

 - интерфейс связи с ПК – 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

0

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

0х2

1

0х1

0

0х0

1

Адресное пространство процессора разделяется на два, не отображаемых друг на друга участка - внешнюю память и внутреннюю. На рисунке 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. Распределение внутренней памяти

Регистры общего назначения

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

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

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

1

2

3

4

Адрес

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-памяти, в простом режиме доступ к ним закрыт. Это необходимо учесть при разработке программы - код должен располагаться по адресам не ниже 0x2000. Это область, в которой располагается таблица векторов прерываний  и резидентный загрузчик файлов в формате HEX в память SRAM.

Память SRAM (Внешнее ОЗУ). Статическая память имеет страничную организацию и представляет собой восемь страниц размером 64Кб каждая. Условно всю память SRAM разделяют на три участка: первая страница, страницы со второй по седьмую и восьмая страница.

Выборка кода может осуществляться только из первой страницы, и поэтому весь код должен располагаться именно здесь. Страницы со второй по седьмую могут быть использованы только для хранения данных. Восьмая страница особенна тем, что в первых 8 байтах расположены регистры микросхемы MAX 8064.

В младших адресах восьмой страницы адресного пространства (080000h-080007h) располагается 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,382375 МГц

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 x 125 x 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

Клавиатура организована в виде матрицы 4x4. Доступ к колонкам и рядам организован как чтение/запись определенного байта внешней памяти (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 символов), имеет подсветку (цвет желто-зеленый). Основные характеристики:

• Габариты: 80x36x13.2 мм.

• Активная область 56.21x11.5 мм.

• Размеры точки 0.56x0.66 мм; размеры символа 2.96x5.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. Перечень регистров ПЛИС

Адрес

Регистр

Доступ

Назначение

080000H

KB

R/W

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

080001H

DATA_IND

R/W

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

080002H

EXT_LO

R/W

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

080003H

EXT_HI

R/W

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

080004H

ENA

W

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

080006H

C_IND

W

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

080007H

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).

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

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 Создание нового проекта

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

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

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

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

При включении питания происходит инициализация всех регистров специального назначения их значениями по умолчанию и на ЖКИ выводится надпись «SDK-1.1, 2001 ©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 <ADuC812.h>

void main(void)

{

}

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

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

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

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

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

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

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

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

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

RI = 1; // Transmit & Recive

EA  =0x0;// 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 & 0x80);

 // Чтение 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 C\n", NumChanel,value2);

 }else

 {  

  printf ("ADC Channel %d = 0x%X\n", NumChanel,conv_val);

 }

}else

{

 printf("Error selection channel\n");

 }

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

/*

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

который в данный момент оцифровываем

*/

 svet=convert(NumChanel,0);

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

 for(pause=0;pause<=64000;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.

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

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

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

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

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

  1.  Конспект лекций.
    1.  Справочные материалы по интегрированной среде программирования keilC.
    2.  С. Бобровский “Самоучитель программирования на языке С++ в системе Borland C++ Builder 4.0 ”, десс inforcom press, Москва 1999
    3.  П. Киммел и др. “Borland C++ 5”: пер. с англ. — СПб.: BHV — Санкт-Петербург, 1999. — 976 с., ил.
    4.  www.sibsitus.nsk.ru/~mavr
    5.  Микропроцессорный комплекс SDK 1.1. Архитектура и программирование:  учебное пособие /Е.В. Бурькова, А.С. Бобровский – Оренбург, ГОУ ОГУ, 2009г – 107с.

Приложение А

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

#include <ADuC812.h>

#include <stdio.h>

#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*2580369#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 = 0x1 << colnum; //0001, 0010, 0100, 1000, 0001, ...

       WriteMax(KB, ~col); //11111110, 11111101, 11111011, 11110111, 11111110, ...

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

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

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

       {

           row = ReadMax(KB) & (0x10 << rownum);

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

           {       

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

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

               row = ReadMax(KB) & (0x10 << 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[]="0123456789";

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: %d\nData start:\n", NumChanel);// номер канала и служебное слово

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

{

 tmp=ReadEXTRAM(i);

 //val=conv_val[i];

 printf ("%d\n", tmp);// передача данных

}

 printf ("Data stop\n");// конец вывода данных

}

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

/*

описание:

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

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

 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  = 0x20;// Таймер 1 в режиме autoreload

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

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

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

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

 RI   = 1; // Transmit & Recive

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

 TCON &=0xC0; //T0 stop.

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

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

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

 TH0  = 0x32; //

 IE  = 0x9A; //UART enable

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

ADCCON1 = 0x7C;

TCON |=0x10; //запуск T0

do

{  

 while(!TF0);

 TCON &=0xC0; //остановим T0

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

 if (ScanKBOnce(&c))

  NumChanel=chrtoint(c);

 /*

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

 который в данный момент оцифровываем

 */

 if (NumChanel<9)

 /*

  для объединения бит в одно число использована операция

  логического суммирования(|=), а для указания номера бита –

  сдвиг(<<) единицы влево на необходимое число разрядов(NumChanel)

 */

  svet=(1<<(NumChanel-1));

 else

  svet=255;// неправильно выбран канал

 WriteMax(0x7,svet);//Зажигаем светодиоды

 if (NumChanel<9)

 {

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

  ADCCON2 = (ADCCON2 & 0xF0) | NumChanel;

  SCONV = 1;

  while (ADCCON3 & 0x80);

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

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

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

  if (NumChanel==8)// если номер канала равен восьмому

  {  // то нужно преобразовать полученное значение в понятное для человека(в температуру)

   grad = (675-tmpVal*0.61)/3;  

   WriteValue(grad,NumChanel);// запишем значение

  }else

   WriteValue(tmpVal,NumChanel);// запишем значение

 }else

  printf ("Error selection channel\n");// скажем что неверно выбран канал

 OldChanel=NumChanel;// для отслеживания изменения канала

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

 // повторная настройка таймера и его запуск

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

 TH0  = 0x32; //

 TCON |=0x10; //запуск T0

}// do

 while(1);// бесконечный цикл

}

ASSEMBLY LISTING OF GENERATED OBJECT CODE

; FUNCTION _WriteMax (BEGIN)

                                          ; SOURCE LINE # 28

;---- Variable 'val' assigned to Register 'R5' ----

;---- Variable 'regnum' assigned to Register 'DPTR' ----

0000 8F82              MOV     DPL,R7

0002 8E83              MOV     DPH,R6

                                          ; SOURCE LINE # 29

                                          ; SOURCE LINE # 30

;---- Variable 'oldDPP' assigned to Register 'R7' ----

0004 AF84              MOV     R7,DPP

                                          ; SOURCE LINE # 31

0006 758408            MOV     DPP,#08H

                                          ; SOURCE LINE # 32

0009 ED                MOV     A,R5

000A F0                MOVX    @DPTR,A

                                          ; SOURCE LINE # 33

000B 8F84              MOV     DPP,R7

                                          ; SOURCE LINE # 34

000D 22                RET     

            ; FUNCTION _WriteMax (END)

            ; FUNCTION _ReadMax (BEGIN)

                                          ; SOURCE LINE # 42

;---- Variable 'regnum' assigned to Register 'DPTR' ----

0000 8F82              MOV     DPL,R7

0002 8E83              MOV     DPH,R6

                                          ; SOURCE LINE # 43

                                          ; SOURCE LINE # 44

;---- Variable 'oldDPP' assigned to Register 'R7' ----

0004 AF84              MOV     R7,DPP

                                          ; SOURCE LINE # 45

;---- Variable 'val' assigned to Register 'R6' ----

                                          ; SOURCE LINE # 46

0006 758408            MOV     DPP,#08H

                                          ; SOURCE LINE # 47

0009 E0                MOVX    A,@DPTR

                                          ; SOURCE LINE # 48

000A 8F84              MOV     DPP,R7

                                          ; SOURCE LINE # 49

000C FF                MOV     R7,A

                                          ; SOURCE LINE # 50

000D         ?C0002:

000D 22                RET     

            ; FUNCTION _ReadMax (END)

            ; FUNCTION _ScanKBOnce (BEGIN)

                                          ; SOURCE LINE # 60

0000 8B00        R     MOV     ch,R3

0002 8A00        R     MOV     ch+01H,R2

0004 8900        R     MOV     ch+02H,R1

                                          ; SOURCE LINE # 61

                                          ; SOURCE LINE # 66

;---- Variable 'colnum' assigned to Register 'R4' ----

0006 E4                CLR     A

0007 FC                MOV     R4,A

0008         ?C0003:

                                          ; SOURCE LINE # 67

                                          ; SOURCE LINE # 68

0008 7401              MOV     A,#01H

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 7   

000A A804              MOV     R0,AR4

000C 08                INC     R0

000D 8002              SJMP    ?C0045

000F         ?C0044:

000F C3                CLR     C

0010 33                RLC     A

0011         ?C0045:

0011 D8FC              DJNZ    R0,?C0044

;---- Variable 'col' assigned to Register 'R7' ----

                                          ; SOURCE LINE # 69

0013 F4                CPL     A

0014 FD                MOV     R5,A

0015 E4                CLR     A

0016 FF                MOV     R7,A

0017 FE                MOV     R6,A

0018 120000      R     LCALL   _WriteMax

                                          ; SOURCE LINE # 72

;---- Variable 'rownum' assigned to Register 'R5' ----

001B E4                CLR     A

001C FD                MOV     R5,A

001D         ?C0006:

                                          ; SOURCE LINE # 73

                                          ; SOURCE LINE # 74

001D E4                CLR     A

001E FF                MOV     R7,A

001F FE                MOV     R6,A

0020 120000      R     LCALL   _ReadMax

0023 7410              MOV     A,#010H

0025 A805              MOV     R0,AR5

0027 08                INC     R0

0028 8002              SJMP    ?C0047

002A         ?C0046:

002A C3                CLR     C

002B 33                RLC     A

002C         ?C0047:

002C D8FC              DJNZ    R0,?C0046

002E 5F                ANL     A,R7

002F FF                MOV     R7,A

;---- Variable 'row' assigned to Register 'R7' ----

                                          ; SOURCE LINE # 75

0030 7036              JNZ     ?C0008

                                          ; SOURCE LINE # 76

                                          ; SOURCE LINE # 77

;---- Variable 'i' assigned to Register 'R2/R3' ----

0032 FB                MOV     R3,A

0033 FA                MOV     R2,A

0034         ?C0010:

0034         ?C0012:

0034 0B                INC     R3

0035 BB0001            CJNE    R3,#00H,?C0048

0038 0A                INC     R2

0039         ?C0048:

0039 BA27F8            CJNE    R2,#027H,?C0010

003C BB10F5            CJNE    R3,#010H,?C0010

003F         ?C0011:

                                          ; SOURCE LINE # 79

003F E4                CLR     A

0040 FF                MOV     R7,A

0041 FE                MOV     R6,A

0042 120000      R     LCALL   _ReadMax

0045 7410              MOV     A,#010H

0047 A805              MOV     R0,AR5

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 8   

0049 08                INC     R0

004A 8002              SJMP    ?C0050

004C         ?C0049:

004C C3                CLR     C

004D 33                RLC     A

004E         ?C0050:

004E D8FC              DJNZ    R0,?C0049

0050 5F                ANL     A,R7

                                          ; SOURCE LINE # 80

0051 7015              JNZ     ?C0008

                                          ; SOURCE LINE # 81

                                          ; SOURCE LINE # 82

0053 EC                MOV     A,R4

0054 25E0              ADD     A,ACC

0056 25E0              ADD     A,ACC

0058 2D                ADD     A,R5

0059 2400        R     ADD     A,#LOW KBTable

005B F8                MOV     R0,A

005C E6                MOV     A,@R0

005D AB00        R     MOV     R3,ch

005F AA00        R     MOV     R2,ch+01H

0061 A900        R     MOV     R1,ch+02H

0063 120000      E     LCALL   ?C?CSTPTR

                                          ; SOURCE LINE # 83

0066 D3                SETB    C

0067 22                RET     

                                          ; SOURCE LINE # 84

                                          ; SOURCE LINE # 85

                                          ; SOURCE LINE # 86

0068         ?C0008:

0068 0D                INC     R5

0069 BD04B1            CJNE    R5,#04H,?C0006

                                          ; SOURCE LINE # 87

006C         ?C0005:

006C 0C                INC     R4

006D EC                MOV     A,R4

006E 6404              XRL     A,#04H

0070 7096              JNZ     ?C0003

0072         ?C0004:

                                          ; SOURCE LINE # 88

0072 C3                CLR     C

                                          ; SOURCE LINE # 89

0073         ?C0014:

0073 22                RET     

            ; FUNCTION _ScanKBOnce (END)

            ; FUNCTION _chrtoint (BEGIN)

                                          ; SOURCE LINE # 99

0000 8F00        R     MOV     ch,R7

                                          ; SOURCE LINE # 100

                                          ; SOURCE LINE # 101

0002 7800        R     MOV     R0,#LOW Digits

0004 7C00        R     MOV     R4,#HIGH Digits

0006 7D00              MOV     R5,#00H

0008 7BFF              MOV     R3,#0FFH

000A 7A00        R     MOV     R2,#HIGH _?ix1000

000C 7900        R     MOV     R1,#LOW _?ix1000

000E 7E00              MOV     R6,#00H

0010 7F0B              MOV     R7,#0BH

0012 120000      E     LCALL   ?C?COPY

                                          ; SOURCE LINE # 103

;---- Variable 'sym' assigned to Register 'R6/R7' ----

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 9   

0015 E4                CLR     A

0016 FF                MOV     R7,A

0017 FE                MOV     R6,A

0018         ?C0015:

                                          ; SOURCE LINE # 104

                                          ; SOURCE LINE # 105

0018 7400        R     MOV     A,#LOW Digits

001A 2F                ADD     A,R7

001B F8                MOV     R0,A

001C E6                MOV     A,@R0

001D B50001      R     CJNE    A,ch,?C0017

                                          ; SOURCE LINE # 106

                                          ; SOURCE LINE # 107

0020 22                RET     

                                          ; SOURCE LINE # 108

                                          ; SOURCE LINE # 109

0021         ?C0017:

0021 0F                INC     R7

0022 BF0001            CJNE    R7,#00H,?C0051

0025 0E                INC     R6

0026         ?C0051:

0026 EF                MOV     A,R7

0027 640A              XRL     A,#0AH

0029 4E                ORL     A,R6

002A 70EC              JNZ     ?C0015

002C         ?C0016:

                                          ; SOURCE LINE # 110

002C 7E00              MOV     R6,#00H

002E 7FFF              MOV     R7,#0FFH

                                          ; SOURCE LINE # 111

0030         ?C0019:

0030 22                RET     

            ; FUNCTION _chrtoint (END)

            ; FUNCTION _ReadEXTRAM (BEGIN)

                                          ; SOURCE LINE # 113

;---- Variable 'adr' assigned to Register 'DPTR' ----

0000 8F82              MOV     DPL,R7

0002 8E83              MOV     DPH,R6

                                          ; SOURCE LINE # 114

                                          ; SOURCE LINE # 115

;---- Variable 'oldDPP' assigned to Register 'R7' ----

0004 AF84              MOV     R7,DPP

                                          ; SOURCE LINE # 116

;---- Variable 'val' assigned to Register 'R6' ----

                                          ; SOURCE LINE # 117

0006 758403            MOV     DPP,#03H

                                          ; SOURCE LINE # 118

0009 E0                MOVX    A,@DPTR

                                          ; SOURCE LINE # 119

000A 8F84              MOV     DPP,R7

                                          ; SOURCE LINE # 120

000C FF                MOV     R7,A

                                          ; SOURCE LINE # 121

000D         ?C0020:

000D 22                RET     

            ; FUNCTION _ReadEXTRAM (END)

            ; FUNCTION _WriteEXTRAM (BEGIN)

                                          ; SOURCE LINE # 122

;---- Variable 'val' assigned to Register 'R5' ----

;---- Variable 'adr' assigned to Register 'DPTR' ----

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 10  

0000 8F82              MOV     DPL,R7

0002 8E83              MOV     DPH,R6

                                          ; SOURCE LINE # 123

                                          ; SOURCE LINE # 124

;---- Variable 'oldDPP' assigned to Register 'R7' ----

0004 AF84              MOV     R7,DPP

                                          ; SOURCE LINE # 125

0006 758403            MOV     DPP,#03H

                                          ; SOURCE LINE # 126

0009 ED                MOV     A,R5

000A F0                MOVX    @DPTR,A

                                          ; SOURCE LINE # 127

000B 8F84              MOV     DPP,R7

                                          ; SOURCE LINE # 128

000D 22                RET     

            ; FUNCTION _WriteEXTRAM (END)

            ; FUNCTION _WriteToUART (BEGIN)

                                          ; SOURCE LINE # 138

0000 8E00        R     MOV     count,R6

0002 8F00        R     MOV     count+01H,R7

                                          ; SOURCE LINE # 139

                                          ; SOURCE LINE # 141

0004 E4                CLR     A

0005 F500        R     MOV     tmp,A

0007 F500        R     MOV     tmp+01H,A

                                          ; SOURCE LINE # 142

0009 7BFF              MOV     R3,#0FFH

000B 7A00        R     MOV     R2,#HIGH ?SC_0

000D 7900        R     MOV     R1,#LOW ?SC_0

000F 850000      E     MOV     ?_printf?BYTE+03H,NumChanel

0012 850000      E     MOV     ?_printf?BYTE+04H,NumChanel+01H

0015 120000      E     LCALL   _printf

                                          ; SOURCE LINE # 143

0018 E4                CLR     A

0019 F500        R     MOV     i,A

001B F500        R     MOV     i+01H,A

001D         ?C0022:

001D D3                SETB    C

001E E500        R     MOV     A,i+01H

0020 9500        R     SUBB    A,count+01H

0022 E500        R     MOV     A,i

0024 9500        R     SUBB    A,count

0026 5025              JNC     ?C0023

                                          ; SOURCE LINE # 144

                                          ; SOURCE LINE # 145

0028 AE00        R     MOV     R6,i

002A AF00        R     MOV     R7,i+01H

002C 120000      R     LCALL   _ReadEXTRAM

002F 750000      R     MOV     tmp,#00H

0032 8F00        R     MOV     tmp+01H,R7

                                          ; SOURCE LINE # 147

0034 7BFF              MOV     R3,#0FFH

0036 7A00        R     MOV     R2,#HIGH ?SC_29

0038 7900        R     MOV     R1,#LOW ?SC_29

003A 850000      E     MOV     ?_printf?BYTE+03H,tmp

003D 850000      E     MOV     ?_printf?BYTE+04H,tmp+01H

0040 120000      E     LCALL   _printf

                                          ; SOURCE LINE # 148

0043 0500        R     INC     i+01H

0045 E500        R     MOV     A,i+01H

0047 70D4              JNZ     ?C0022

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 11  

0049 0500        R     INC     i

004B         ?C0052:

004B 80D0              SJMP    ?C0022

004D         ?C0023:

                                          ; SOURCE LINE # 149

004D 7BFF              MOV     R3,#0FFH

004F 7A00        R     MOV     R2,#HIGH ?SC_33

0051 7900        R     MOV     R1,#LOW ?SC_33

0053 020000      E     LJMP    _printf

            ; FUNCTION _WriteToUART (END)

            ; FUNCTION _WriteValue (BEGIN)

                                          ; SOURCE LINE # 162

0000 8E00        R     MOV     Value,R6

0002 8F00        R     MOV     Value+01H,R7

;---- Variable 'Channel' assigned to Register 'R4/R5' ----

                                          ; SOURCE LINE # 163

                                          ; SOURCE LINE # 164

0004 ED                MOV     A,R5

0005 6500        R     XRL     A,OldChanel+01H

0007 7003              JNZ     ?C0053

0009 EC                MOV     A,R4

000A 6500        R     XRL     A,OldChanel

000C         ?C0053:

000C 6014              JZ      ?C0026

                                          ; SOURCE LINE # 165

                                          ; SOURCE LINE # 166

000E E500        R     MOV     A,IndexMas+01H

0010 1500        R     DEC     IndexMas+01H

0012 7002              JNZ     ?C0054

0014 1500        R     DEC     IndexMas

0016         ?C0054:

0016 14                DEC     A

0017 FF                MOV     R7,A

0018 AE00        R     MOV     R6,IndexMas

001A 120000      R     LCALL   _WriteToUART

                                          ; SOURCE LINE # 167

001D E4                CLR     A

001E F500        R     MOV     IndexMas,A

0020 F500        R     MOV     IndexMas+01H,A

                                          ; SOURCE LINE # 168

0022         ?C0026:

                                          ; SOURCE LINE # 169

0022 AE00        R     MOV     R6,IndexMas

0024 AF00        R     MOV     R7,IndexMas+01H

0026 AD00        R     MOV     R5,Value+01H

0028 120000      R     LCALL   _WriteEXTRAM

                                          ; SOURCE LINE # 171

002B 0500        R     INC     IndexMas+01H

002D E500        R     MOV     A,IndexMas+01H

002F 7002              JNZ     ?C0055

0031 0500        R     INC     IndexMas

0033         ?C0055:

                                          ; SOURCE LINE # 172

0033 C3                CLR     C

0034 9500        R     SUBB    A,CountMas+01H

0036 E500        R     MOV     A,IndexMas

0038 9500        R     SUBB    A,CountMas

003A 4014              JC      ?C0028

                                          ; SOURCE LINE # 173

                                          ; SOURCE LINE # 174

003C E500        R     MOV     A,IndexMas+01H

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 12  

003E 1500        R     DEC     IndexMas+01H

0040 7002              JNZ     ?C0056

0042 1500        R     DEC     IndexMas

0044         ?C0056:

0044 14                DEC     A

0045 FF                MOV     R7,A

0046 AE00        R     MOV     R6,IndexMas

0048 120000      R     LCALL   _WriteToUART

                                          ; SOURCE LINE # 175

004B E4                CLR     A

004C F500        R     MOV     IndexMas,A

004E F500        R     MOV     IndexMas+01H,A

                                          ; SOURCE LINE # 176

                                          ; SOURCE LINE # 177

0050         ?C0028:

0050 22                RET     

            ; FUNCTION _WriteValue (END)

            ; FUNCTION main (BEGIN)

                                          ; SOURCE LINE # 187

                                          ; SOURCE LINE # 188

                                          ; SOURCE LINE # 189

0000 E4                CLR     A

0001 F500        R     MOV     grad+03H,A

0003 F500        R     MOV     grad+02H,A

0005 F500        R     MOV     grad+01H,A

0007 F500        R     MOV     grad,A

                                          ; SOURCE LINE # 190

0009 F500        R     MOV     c,A

                                          ; SOURCE LINE # 191

000B F500        R     MOV     svet,A

                                          ; SOURCE LINE # 192

000D F500        R     MOV     tmpVal,A

000F F500        R     MOV     tmpVal+01H,A

                                          ; SOURCE LINE # 194

0011 758DFD            MOV     TH1,#0FDH

                                          ; SOURCE LINE # 195

0014 758920            MOV     TMOD,#020H

                                          ; SOURCE LINE # 196

0017 758840            MOV     TCON,#040H

                                          ; SOURCE LINE # 197

001A 759850            MOV     SCON,#050H

                                          ; SOURCE LINE # 198

001D 53877F            ANL     PCON,#07FH

                                          ; SOURCE LINE # 199

0020 D299              SETB    TI

                                          ; SOURCE LINE # 200

0022 D298              SETB    RI

                                          ; SOURCE LINE # 202

0024 5388C0            ANL     TCON,#0C0H

                                          ; SOURCE LINE # 203

0027 5389F0            ANL     TMOD,#0F0H

                                          ; SOURCE LINE # 204

002A 438901            ORL     TMOD,#01H

                                          ; SOURCE LINE # 205

002D 758AFE            MOV     TL0,#0FEH

                                          ; SOURCE LINE # 206

0030 758C32            MOV     TH0,#032H

                                          ; SOURCE LINE # 207

0033 75A89A            MOV     IE,#09AH

                                          ; SOURCE LINE # 209

0036 75EF7C            MOV     ADCCON1,#07CH

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 13  

                                          ; SOURCE LINE # 210

0039 438810            ORL     TCON,#010H

                                          ; SOURCE LINE # 212

003C         ?C0032:

                                          ; SOURCE LINE # 213

003C 308DFD            JNB     TF0,?C0032

003F         ?C0033:

                                          ; SOURCE LINE # 214

003F 5388C0            ANL     TCON,#0C0H

                                          ; SOURCE LINE # 216

0042 7B00              MOV     R3,#00H

0044 7A00        R     MOV     R2,#HIGH c

0046 7900        R     MOV     R1,#LOW c

0048 120000      R     LCALL   _ScanKBOnce

004B 5009              JNC     ?C0034

                                          ; SOURCE LINE # 217

004D AF00        R     MOV     R7,c

004F 120000      R     LCALL   _chrtoint

0052 8E00        R     MOV     NumChanel,R6

0054 8F00        R     MOV     NumChanel+01H,R7

0056         ?C0034:

                                          ; SOURCE LINE # 222

0056 C3                CLR     C

0057 E500        R     MOV     A,NumChanel+01H

0059 9409              SUBB    A,#09H

005B E500        R     MOV     A,NumChanel

005D 9400              SUBB    A,#00H

005F 5013              JNC     ?C0035

                                          ; SOURCE LINE # 228

0061 E500        R     MOV     A,NumChanel+01H

0063 14                DEC     A

0064 FF                MOV     R7,A

0065 7401              MOV     A,#01H

0067 A807              MOV     R0,AR7

0069 08                INC     R0

006A 8002              SJMP    ?C0058

006C         ?C0057:

006C C3                CLR     C

006D 33                RLC     A

006E         ?C0058:

006E D8FC              DJNZ    R0,?C0057

0070 F500        R     MOV     svet,A

0072 8003              SJMP    ?C0036

0074         ?C0035:

                                          ; SOURCE LINE # 230

0074 7500FF      R     MOV     svet,#0FFH

0077         ?C0036:

                                          ; SOURCE LINE # 231

0077 AD00        R     MOV     R5,svet

0079 7F07              MOV     R7,#07H

007B 7E00              MOV     R6,#00H

007D 120000      R     LCALL   _WriteMax

                                          ; SOURCE LINE # 232

0080 C3                CLR     C

0081 E500        R     MOV     A,NumChanel+01H

0083 9409              SUBB    A,#09H

0085 E500        R     MOV     A,NumChanel

0087 9400              SUBB    A,#00H

0089 506D              JNC     ?C0037

                                          ; SOURCE LINE # 233

                                          ; SOURCE LINE # 235

008B E5D8              MOV     A,ADCCON2

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 14  

008D 54F0              ANL     A,#0F0H

008F 4500        R     ORL     A,NumChanel+01H

0091 F5D8              MOV     ADCCON2,A

                                          ; SOURCE LINE # 236

0093 D2DC              SETB    SCONV

0095         ?C0038:

                                          ; SOURCE LINE # 237

0095 E5F5              MOV     A,ADCCON3

0097 20E7FB            JB      ACC.7,?C0038

009A         ?C0039:

                                          ; SOURCE LINE # 239

009A E5DA              MOV     A,ADCDATAH

009C 540F              ANL     A,#0FH

009E ADD9              MOV     R5,ADCDATAL

00A0 F500        R     MOV     tmpVal,A

00A2 ED                MOV     A,R5

00A3 F500        R     MOV     tmpVal+01H,A

                                          ; SOURCE LINE # 241

00A5 E500        R     MOV     A,NumChanel+01H

00A7 6408              XRL     A,#08H

00A9 4500        R     ORL     A,NumChanel

00AB 703E              JNZ     ?C0040

                                          ; SOURCE LINE # 242

                                          ; SOURCE LINE # 243

00AD AC00        R     MOV     R4,tmpVal

00AF 120000      E     LCALL   ?C?FCASTI

00B2 7BF6              MOV     R3,#0F6H

00B4 7A28              MOV     R2,#028H

00B6 791C              MOV     R1,#01CH

00B8 783F              MOV     R0,#03FH

00BA 120000      E     LCALL   ?C?FPMUL

00BD A804              MOV     R0,AR4

00BF A905              MOV     R1,AR5

00C1 AA06              MOV     R2,AR6

00C3 AB07              MOV     R3,AR7

00C5 7F00              MOV     R7,#00H

00C7 7EC0              MOV     R6,#0C0H

00C9 7D28              MOV     R5,#028H

00CB 7C44              MOV     R4,#044H

00CD 120000      E     LCALL   ?C?FPSUB

00D0 E4                CLR     A

00D1 FB                MOV     R3,A

00D2 FA                MOV     R2,A

00D3 7940              MOV     R1,#040H

00D5 7840              MOV     R0,#040H

00D7 120000      E     LCALL   ?C?FPDIV

00DA 8F00        R     MOV     grad+03H,R7

00DC 8E00        R     MOV     grad+02H,R6

00DE 8D00        R     MOV     grad+01H,R5

00E0 8C00        R     MOV     grad,R4

                                          ; SOURCE LINE # 244

00E2 120000      E     LCALL   ?C?CASTF

00E5 AD00        R     MOV     R5,NumChanel+01H

00E7 AC00        R     MOV     R4,NumChanel

                                          ; SOURCE LINE # 245

00E9 8008              SJMP    ?C0059

00EB         ?C0040:

                                          ; SOURCE LINE # 246

00EB AD00        R     MOV     R5,NumChanel+01H

00ED AC00        R     MOV     R4,NumChanel

00EF AF00        R     MOV     R7,tmpVal+01H

00F1 AE00        R     MOV     R6,tmpVal

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 15  

00F3         ?C0059:

00F3 120000      R     LCALL   _WriteValue

                                          ; SOURCE LINE # 247

00F6 8009              SJMP    ?C0042

00F8         ?C0037:

                                          ; SOURCE LINE # 248

00F8 7BFF              MOV     R3,#0FFH

00FA 7A00        R     MOV     R2,#HIGH ?SC_44

00FC 7900        R     MOV     R1,#LOW ?SC_44

00FE 120000      E     LCALL   _printf

0101         ?C0042:

                                          ; SOURCE LINE # 249

0101 850000      R     MOV     OldChanel,NumChanel

0104 850000      R     MOV     OldChanel+01H,NumChanel+01H

                                          ; SOURCE LINE # 252

0107 758AFE            MOV     TL0,#0FEH

                                          ; SOURCE LINE # 253

010A 758C32            MOV     TH0,#032H

                                          ; SOURCE LINE # 254

010D 438810            ORL     TCON,#010H

                                          ; SOURCE LINE # 255

                                          ; SOURCE LINE # 256

0110 020000      R     LJMP    ?C0032

            ; FUNCTION main (END)

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 16  

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE

====                                    =====   ======  ====    ======  ====

NumChanel. . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0000H  2

SCONV. . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00DCH  1

IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1

_WriteValue. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 Value. . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2

 Channel. . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0004H  2

_WriteToUART . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 count. . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0000H  2

 i. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0002H  2

 tmp. . . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0004H  2

size_t . . . . . . . . . . . . . . . .  TYPEDEF  -----  U_INT    -----  2

_printf. . . . . . . . . . . . . . . .  EXTERN   CODE   PROC     -----  -----

RI . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0098H  1

_ScanKBOnce. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 ch . . . . . . . . . . . . . . . . .  AUTO     DATA   PTR      0000H  3

 row. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

 col. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

 rownum . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1

 colnum . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0004H  1

 i. . . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0002H  2

TI . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0099H  1

IndexMas . . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0002H  2

I2CCON . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00E8H  1

DCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00E8H  1

_ReadMax . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 regnum . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0082H  2

 oldDPP . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

 val. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1

main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 grad . . . . . . . . . . . . . . . .  AUTO     DATA   FLOAT    0000H  4

 c. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0004H  1

 svet . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0005H  1

 tmpVal . . . . . . . . . . . . . . .  AUTO     DATA   U_INT    0006H  2

ADCDATAH . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00DAH  1

CountMas . . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0004H  2

ADCDATAL . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D9H  1

PCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0087H  1

SCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0098H  1

TMOD . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0089H  1

TCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0088H  1

_WriteMax. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 regnum . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0082H  2

 val. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1

 oldDPP . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

_?ix1000 . . . . . . . . . . . . . . .  STATIC   CODE   ARRAY    0045H  11

TF0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      008DH  1

TH0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008CH  1

TH1. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008DH  1

TL0. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008AH  1

_ReadEXTRAM. . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 adr. . . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0082H  2

 oldDPP . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

 val. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1

ADCCON1. . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00EFH  1

ADCCON2. . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D8H  1

conv_val . . . . . . . . . . . . . . .  PUBLIC   XDATA  ARRAY    0000H  254

ADCCON3. . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00F5H  1

C51 COMPILER V9.00   HELLO                                                                 12/30/2010 14:08:56 PAGE 17  

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE

====                                    =====   ======  ====    ======  ====

_WriteEXTRAM . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 adr. . . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0082H  2

 val. . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1

 oldDPP . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1

DPP. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0084H  1

OldChanel. . . . . . . . . . . . . . .  PUBLIC   DATA   U_INT    0006H  2

_chrtoint. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----

 ch . . . . . . . . . . . . . . . . .  AUTO     DATA   CHAR     0000H  1

 Digits . . . . . . . . . . . . . . .  AUTO     DATA   ARRAY    0001H  11

 sym. . . . . . . . . . . . . . . . .  * REG *  DATA   U_INT    0006H  2

KBTable. . . . . . . . . . . . . . . .  PUBLIC   DATA   ARRAY    0008H  17

MODULE INFORMATION:   STATIC OVERLAYABLE

  CODE SIZE        =    663    ----

  CONSTANT SIZE    =     80    ----

  XDATA SIZE       =    254    ----

  PDATA SIZE       =   ----    ----

  DATA SIZE        =     25      31

  IDATA SIZE       =   ----    ----

  BIT SIZE         =   ----    ----

END OF MODULE INFORMATION.

C51 COMPILATION COMPLETE.  3 WARNING(S),  0 ERROR(S)

Описание основных блоков:

1.

unsigned char ReadEXTRAM(unsigned char xdata *adr)

{

unsigned char oldDPP=DPP;

unsigned char val=0;

DPP=MyData;

val=*adr;

DPP=oldDPP;

 return val;

}

Данная функция читает из внеш.ОЗУ из страницы, номер которой записан в переменную MyData (0х3) (см. начало программы – описание переменных), по адресу adr и возвращает значение, хранящееся в ячейке по этому адресу.

2.

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

{     

unsigned char oldDPP=DPP;

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

 *adr=val;

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

}

Данная функция является аналогом ReadEXTRAM, только используется для записи: пишем в ячейку с адресом adr значение переменной val.

3.

void WriteToUART(unsigned short count)

{    

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

unsigned short tmp=0;

printf ("ADC Channel: %d\nData start:\n", NumChanel);// номер канала и служебное слово

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

{

 tmp=ReadEXTRAM(i);

 //val=conv_val[i];

 printf ("%d\n", tmp);// передача данных

}

printf ("Data stop\n");// конец вывода данных

}

Данная функция вызывает чтение из внешней памяти (ReadEXTRAM) и записывает в COM-Port.

4.

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;// данные выведены можно заполнять массив сначала

}

}

Данная функция методом комбинирования вышеописанных функций выводит данные, если канал был сменен (т.е. срабатывает при смене канала, когда нажата клавиша). Затем когда данные выведены, заполняет массив снова и пишет во внеш.ОЗУ и выводит в COM-Port.



МИВУ 230101.65 – 05 ПЗ

Лист

55

Изм

Лист

№ документа

Подпись

Дата




1. і Для того щоб випередити конкурента а це потребує якнайшвидшого прийняття оптимальних управлінських рішен
2. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата фармацевтичних наук
3. Сущность,состав финансовых ресурсов и капитала
4. Бокситогорск ~ Наш любимый город ПРАЗДНИЧНЫЙ ПРОЕКТ НОВОГОДНИЕ ОКНА НАШЕГО ГОРОДА Интерне.html
5.  Факультет заочный Курс Студент Шифр специальн
6. Культура общения
7. Контрольная работа- Регулирование внешнеэкономической деятельности
8. тема намного актуальнее сегодня нежели ранее
9. Реферат- Роль государства в повышении качества продукции
10. Целая и дробная части действительного числа.html
11. .ru-types-sponsorstvo- Спонсор ~ это физическое или юридическое лицо финансирующее организацию или проведение к.
12. на тему- Разработка базы данных Аптека
13. пособие по сочинению Розенталь
14. а возвратности и платности т
15. Южное Бутово Конспект комплексного коррекционноразвивающего занятия Путешествие по сказкам
16. Теория Эволюции Ч
17. Контрольная работа 2 по дисциплине Основы цифровой схемотехники Синтез пересчетной схемы
18. светлому прошлому
19. Методология и методы социологического исследования Объект и предметная область социологии
20. Человек Homo выделился из царства животных свыше двух миллионов лет назад с конца древнекаменного века сор