Текст
                    I
I
\l
I В A
`Уроки ‚Ё? — I
ll
реализации ‘ЁЫЬАЁЁ7
икропроце чрдии" икроконтролпер-у
о - ‚оамми-ов-[иэ интерфе-й ‘о °
Паралпеч ьн tn? иЁп - ¢31.9Ao‘Ea1en вн ый
и те- -- -uc ‘ ~' ‘иду
'-\ т‘.
ц, | ‚ц „у \
— ч.
_ .
\
Издательство «Мир» Q Newnes


Computer Interfacing  .................................................................................... -.-.-._x-.-.-.- 4. ~ - ч ° .-.-.v.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.;.;.~.;.-.-.- .................. . .-.-.-.- -:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-.-.-:-.-:-:-:-:-:-:-:-:-:-:-:-:~:-:-.-.-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-.—.-.-.-.-:-.-.-.-.-.-.-.-.-.—:-.-:-:-:-:-.-.-.-.-.-:-:-:-:-:~:-:-:-:-:-:~:-:-.-:-:-:-:-:-:-:-:-:-:-:<-:-:§: .:9.~.?S:~: «.  George A. Smith, B. A. (Hons), C. Eng., М.|.Е.Е.  И’)  Newnes  Oxford ч Auckland о Boston о Johannesburg o Melbourne о New Delhi 
Джордж Смит  Сопряжение компьютеров с внешними устройствами  . . . . . - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ° . ' . ' . ‘ . ‘ . ‘ . ' . ' . ‘ . ‘ . ‘ . ' . ' . ' ‚ ' - ' ь ' . ' . ‘ . ' ' . ‘ . ‘ . ' . ' . ' . ' . ' . ' . ' . ' . ’ ' ' . ' . ' . ' . ' . ' . ' . ' . ' . ' ' . ' ' ' ' ' - - ° ' ° ч ч - -I-.~:-:-:-:.;.; ....... ._ ._ ' '»'-:-:-:-\‘-' ' '-I-)2-:-I-'-:-:-:-:-'<{-‘-:«‘- x - 1-‘:_-:;:;:;:;:;:3:;:::;:3:E':‘I'{:;:;:;:;:g:;:§:;:E:;:;:g:g:::g:g:;:g:§:;:;:§:::::g:;:3:g:;:::§:;:§:§:;:::::9:9:9:519:35:§:;:§:5:3:§:§:§:§:§2:1rt:I:3:1:533:I:!:I:I:i:I:':':':':i:2:1:1:1:1:1:I:I:2:I:I§I?I5I:I:1:1:I:i:I:I:I:IEI:1:2:I:2::::::::E:E:E:§:;:: к ------------------------- -: ------ -:- —. т ------------------------ -'5'-‘-~\":.\.= 335.1.  Уроки реализации  Перевод с английского канд. физ.-мат. наук В. В. Матвеева  под редакцией д-ра физ.-мат. наук В. М. Матвеева  ‘ЁЁАд V’ 9» ш О  #41ичд  Москва «Мир» 2000  ё 
УДК 681.3 ББК 32.97 С50  Смит Дж.  С50 Сопряжение компьютеров с внешними устройствами. Уроки реализации: Пер. с англ. -— М.: Мир, 2000. — 266 c., ил.  ISBN 5-03-003371-8  Книга английского автора является практическим курсом по исполь- зованию компьютера для управления внешними устройствами через com- порт, параллельный принтерный порт или параллельный программиру- емый интерфейсный порт. Книга дает общее представление о микропроцессорных системах и выгодно отличается от других тем, что в ней содержится описание как ап- паратных, так и программных средств. Приведенные серии программных примеров знакомят читателя с применением языка высокого уровня для ввода/вывода и управления внешними устройствами. В целях облегчения самостоятельного изучения предмета в книгу включено множество практических заданий и программных упражнений, в которых используются минимальный набор аппаратных средств и прос- тые для восприятия программы. Для студентов вузов и колледжей, а таюке преподавателей.  ББК 32.97  Редакция литературы по информатике и йогой технике  Computer Interfacing by George Smith © Reed Educational & Professional Publishing Ltd (2000) ISBN 5-03-003371-3 (РУС) © перевод на русский язык, оформление, ISBN 0-7 506-4474-5 (англ) «Мир», 2000 
Оглавление  Введение 12 Часть 1. Основы цифровой электроники 15 Глава 1. Системы счисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.1. Прямое преобразование двоичных чисел . . . . . . . . . . . . . . . . . . . 15  1.1.1. Преобразование чисел из десятичной формы в двоичную 16 1.1.2 Преобразование чисел из двоичной формы в десятичную 17  1.2. Двоично-десятичный код (ДЦК) 17 1.3. Шестнадцатеричные числа (hex) . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 1.4. Числа со знаком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.4.1. «Дополнение до 2» как способ представления отрица- тельных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4.2. Суммирование двоичных чисел со знаком . . . . . . . . . . . . . 21 1.5. Числа с плавающей точкой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 1.5.1. Примеры преобразования чисел с плавающей точкой . . . 23 1.5.2. Смещенные порядки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.6. Представление алфавитно-Цифровых символов 25 1.7. Преобразования из одной системы счисления в другую . . . . . . . 25 1.7.1. Перевод всех символов в прописные . . . . . . . . . . . . . . . . . . 25 1.7.2. Перевод символов в строчные . . . . . . . . . . . . . . . . . . . . . . . 26 1.7.3. Преобразование АЗСП-кодов чисел от 0 до 9 в 4-разряд- ные двоичные числа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 1.7.4. Преобразование АЗСП-кодов в шестнадцатеричные числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 1.8. Вопросы 27 Глава 2. Электронные логические элементы и регистры . . . . . . . . . . . 30 2.1. Логические элементы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.1.1. Логические элементы: таблицы истинности и условные графические обозначения . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.1.2. Коммерческие логические элементы 33 2.1.3. Примеры ТГЛ ИС и КМОП ИС. . . . . . . . . . . . . . . . . . . . . . 34  2.2. Дещифраторы адреса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 
6 Оглавление  2.3. Устройства с тремя выходными состояниями . . . . . . . . . . . . . . . . 37 2.3.1. Буфер с тремя состояниями . . . . . . . . . . . . . . . . . . . . . . . . . 37 2.3.2. Управление входами статического ОЗУ 38 2.3.3. З-разрядные буферы с тремя состояниями. . . . . . . . . . . . . 39 2.3.4. 8-разрядные двунаправленные буферы с тремя состояни- ями 40 2.4. Логические схемы последовательного действия. . . . . . . . . . . . . . 42 2.4.1. Фиксатор (триггер-защелка) В-типа . . . . . . . . . . . . . . . . . . 42 2.4.2. З-разрядный буфер с тремя состояниями . . . . . . . . . . . . . . 43 2.5. Шинные системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 2.6. Упражнение для ознакомления с работой ОЗУ 45 Глава 3. В-разрядный микропроцессор . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.1. Введение в микропроцессоры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.2. З-разрядная микропроцессорная система . . . . . . . . . . . . . . . . . . . 49 3.2.1. Работа системы 50 3.2.2. Микропроцессор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.2.3. Постоянное запоминающее устройство (ПЗУ) 51 3.2.4. Оперативное запоминающее устройство (ОЗУ) 52 3.2.5. Схемы синхронизации и сброса . . . . . . . . . . . . . . . . . . . . . . 52 3.2.6. Адресная шина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.2.7. Шина данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.2.8. Управляющая шина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.2.9. Дешифратор адреса 53 3.2.10. Стек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 54 3.3. Микропроцессор Zilog Z80 55 3.3.1. Общее описание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 3.3.2. Регистр состояния 58 3.3.3. Временная диаграмма микропроцессора . . . . . . . . . . . . . . 59 3.3.4. Команды и режимы адресации . . . . . . . . . . . . . . . . . . . . . . . 61 3.3.5. Примеры режимов адресации . . . . . . . . . . . . . . . . . . . . . . . . 62 3.3.6. Программа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 3.3.7. Прерывания . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 3.3.8. Короткая подпрограмма прерывания . . . . . . . . . . . . . . . . . 70 Часть 2. Теория и программирование . . . . . . . . . . . . . . . . . . . . . . . . 73 Глава 4. Типы микропроцессоров 73 4.1. Типы микропроцессоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.1.1. Факторы, влияющие на конструкцию системы . . . . . . . . . 74  4.1.2. Скорость обработки и передачи данных . . . . . . . . . . . . . . . 74 
7.4.1. Типичные ошибки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  Оглавление 7 I 4.1.3. Стоимость системы 75 4.1.4. Средства ввода/вывода 76 4.1.5. Физический размер 76 4.2. Способы увеличения производительности микропроцессоров . 77 4.2.1. Конвейерная обработка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.2.2. Кэширование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.2.3. Перекрывающиеся окна регистров . . . . . . . . . . . . . . . . . . . 80 4.2.4. Управление микропроцессором и его синхронизация . . 82 4.3. Компьютер с полным набором команд (CISC) . . . . . . . . . . . . . . . 83 4.3.1. Микропроцессор МС68000 фирмы Motorola 84 4.4. Компьютер с сокращенным набором команд (RISC) 86 4.4.1. Микропроцессор МС88100 фирмы Motorola 87 4.5. Однокристальные микроконтроллеры . . . . . . . . . . . . . . . . . . . . . . 88 4.5.1. Микроконтроллер Philips 83/87C752 (8XC752) 88 Глава 5. Применения микропроцессоров . . . . . . . . . . . . . . . . . . . . . . . . 91 5.1. Системы управления и измерительная аппаратура: измеритель потока воздуха 92 5.1.1. Аппаратное обеспечение . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.1.2. Разработка программного обеспечения . . . . . . . . . . . . . . . 96 5.2. Системы связи: цифровая обработка сигнала (digital signal pro- cessing -—— DSP) 98 5.3. Потребительские системы: настольный компьютер 101 5.3.1. Компьютерная система 102 Глава 6. Структура программного обеспечения 106 6.1. Разработка программного обеспечения . . . . . . . . . . . . . . . . . . . . . 107 6.2. Конструирование программ методом сверху вниз . . . . . . . . . . . . 108 6.3. Структурное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 6.3.1. Структурное программирование Джексона (СПД) . . . . . . 109 6.4. Псевдокод (структурированный английский) 112 6.4.1. Последовательность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 6.4.2. Выбор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 6.4.3. Итерация 114 6.5. Блок-схемы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 15 Глава 7. Программирование на языке Си . . . . . . . . . . . . . . . . . . . . . . . . . . 117 7.1. Введение в язык Си . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 7.2. Восемь этапов программирования на языке Си . . . . . . . . . . . . . . 119 7.3. Создание программ на языке Си . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 7.4. Отладка программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123  124 
8 Оглавление  7.5. Примеры программ и упражнения . . . . . . . . . . . . . . . . . . . . . . . . . 124 7.5.1. Упражнение «Вывод строк, функция printf()» . . . . . . . . . . 124 7.5.2. Упражнение «Вывод тшсла байтов, зарезервированных под переменные» 125 7.5.3. Упражнение «Преобразователь числа» . . . . . . . . . . . . . . . . 126 7.5.4. Упражнение «Очистка экрана» . . . . . . . . . . . . . . . . . . . . . . . 127 7.5.5. Упражнение «Цикл for» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 7.5.6. Упражнение «Квадраты тшсел» . . . . . . . . . . . . . . . . . . . . . . . 129 7.5.7. Упражнение «Запись данных в массив» . . . . . . . . . . . . . . . 129 7.5.8. Упражнение «Изменения в упражнении 7 .5.7» . . . . . . . . . 130 7.5.9. Упражнение «Запись данных на диск» . . . . . . . . . . . . . . . . 131 7.5. 10. Упражнение «Тестирование упражнения 7.5.9 133 7.5.11. Упражнение «Загрузка данных с дискового файла» 134 7.5.12. Упражнение «Альтернативная загрузка данных с диско- вого файла» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 7 .5.1 3. Упражнение «Преобразование температуры» 138 7.5.14. Упражнение «Определение функций» . . . . . . . . . . . . . . . . 141 7.6. Выбранные ответы 141 Часть 3. Упражнения по интерфейсу 143 Глава 8. Последовательный интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 8.1. Последовательная передача данных . . . . . . . . . . . . . . . . . . . . . . . 143 8.2. Аппаратные средства последовательного интерфейса . . . . . . . . 146 8.3. Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 8.3.1. Упражнение «Тестирование петлевой конфигурации» 148 8.3.2. Упражнение «Исследование сигналов СОМ-порта» . . . . . 150 8.3.3. Упражнение «Связь между двумя компьютерами» . . . . . . 151 8.3.4. Упражнение «Передача текста» 152 8.4. Вопросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 Глава 9. Параллельный интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 9.1. ИС Intel 82C55A PPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 9.1.1. РР1-режим 0 (базовый ввод/вывод) . . . . . . . . . . . . . . . . . . . 156 9.1.2. Упражнение «Вывод тшсел в режиме 0» . . . . . . . . . . . . . . . 157 9.1.3. Упражнение «Тестирование ввода в режиме 0» . . . . . . . . . 159 9.1.4. РР1-режим 1, стробируемый ввод/вывод . . . . . . . . . . . . . . 162 9.1.5. Упражнение «РР1-режим 1, тест вывода данных» . . . . . . . 163 9.1.6. Упражнение «Тест ввода данных в режиме 1» . . . . . . . . . . 166 9.2. Упражнения с шаговым двигателем . . . . . . . . . . . . . . . . . . . . . . . . 169  9.2.1. Упражнение «Управление шаговым двигателем» . . . . . . . 169 
12.3.2. Упражнение «Шаговый двигатель; три скорости в каж- дом направлении»  Оглавление 9 9.2.2. Упражнение «Управление двигателем; три скорости вра- щения» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 9.2.3. Упражнение «Управление двумя шаговыми двигателями» 174 Глава 10. цифро-аналоговый параллельный интерфейс . . . . . . . . . . . 175 10.1. Цифро-аналоговое преобразование . . . . . . . . . . . . . . . . . . . . . . . 175 10.2. Упражнения по преобразованию цифрового сигнала в анало- говый . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 10.2.1.Упражнение «Тестирование цифро-аналогового преоб- разователя» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 10.3. Функциональный генератор (генератор сигналов специальной формы) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 10.3.1. Упражнение «Функциональный генератор» . . . . . . . . . . 182 10.3.2.Упражнение «Полный вариант ФУНКционального гене- ратора» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 10.4. Вопросы 186 Глава 1 1. Аналого-цифровой параллельный интерфейс . . . . . . . . . . . . 187 11.1. Аналого-цифровые преобразователи . . . . . . . . . . . . . . . . . . . . . . 187 9 11.1.1. Аналого-цифровой преобразователь с динамической компенсацией . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 11.1.2. АЦП параллельного, или мгновенного, преобразования 190 11.2. Упражнения по аналоге-цифровому преобразованию сигнала 191 11.2.1. Упражнение «Тестирование АЦП» . . . . . . . . . . . . . . . . . . 191 11.2.2. Упражнение «Вольтметр» . . . . . . . . . . . . . . . . . . . . . . . . . . 197 11.2.3. Упражнение «Двухдиапазонный вольтметр» . . . . . . . . . . 198 11.3. Вопросы 199 Глава 12. Параллельный принтерный порт . . . . . . . . . . . . . . . . . . . . . . . . 200 12.1. Параллельный принтерный порт 200 12.2. Упражнения по вводу/выводу данных . . . . . . . . . . . . . . . . . . . . . 201 12.2.1. Упражнение «Вывод данных через принтерный порт» 201 12.2.2. Упражнение «Ввод/вывод данных Через принтерный порт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 12.3. Упражнения с шаговым двигателем . . . . . . . . . . . . . . . . . . . . . . . 208 12.3.1.Упрахшение «Шаговый двигатель; две скорости вра1це- ния в каждом направлении» . . . . . . . . . . . . . . . . . . . . . . . . . 208 
10 Оглавление  12.3.3. Упражнение «Два двигателя, две скорости» . . . . . . . . . . . . 12.4. Упражнения с фУНкциональным генератором . . . . . . . . . . . . . . 12.41. Упражнение «Функциональный генератор» . . . . . . . . . . . 12.4.2. Упражнение «Полный вариант функционального гене- ратора» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5. Упражнения с вольтметром . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.1. Упражнения «АЦП» ‚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.5.2. Упражнение «Вольтметр» 12.5.3. Упражнение «Двухдиапазонный вольтметр» . . . . . . . . . .  Глава 13. дополнительные упражнения  13.1. Теория частотомера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1.1. Триггер Шмитга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.1.2. Двоичный счетчик 13.2. Упражнения с частотомером 13.2.1. Упражнения «Базовый счетчик» . . . . . . . . . . . . . . . . . . . . . 13.2.2. Упражнение «Четырехдиапазонный счетчик» . . . . . . . . . 13.2.3. Упражнение «Увеличение точности до 1‘ 1Гц» 13.2.4. Упражнение «Автоматическая калибровка» . . . . . . . . . . . 13.2.5. Упражнение «Входная схема счетчика» . . . . . . . . . . . . . . . 13,3. Последовательная передача данных . . . . . . . . . . . . . . . . . . . . . . . 13.4. Управление шаговым двигателем по линии последовательной передачи данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.1.Упражнение «Управление двумя шаговыми двигателя- ми по 4—проводной линии последовательной передачи данных» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.2. Упражнение «Использование двухпроводного кабеля и общего провода для управления двумя шаговыми двига- телями» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13.4.3. Упражнение «Последовательное управление тремя ша- говыми двигателями» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .  Глава 14. Контрольно-измерительная аппаратура и тестирование  14.1. Контрольно-измерительная аппаратура 14.2. Проблемы аппаратного обеспечения . . . . . . . . . . . . . . . . . . . . . . 14.3. Тестирование РР1-портов 14.3.1.Тестирование РР1-порта на правильность вывода дан- ных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14. 3.2. Тестирование РР1-порта на правильность ввода данных 14.4. Тестирование параллельного принтерного порта 14.4.1. Программа для теста вывода данных . . . . . . . . . . . . . . . .  211 211 211  214 214 214 218 218  220 220 221 223 225 225 228 229 231  231 232  233  234  240  241  245 245 246 247  248 250 252 253 
Оглавление 11  14.4.2. Программа для теста ввода данных . . . . . . . . . . . . . . . . . . 253 14.5. Конструкция блоков светодиодов и переключателей . . . . . . . . 254 14.5.1. Блок светодиодов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 14.5.2. Блок переключателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 14.5.3. Экономичный блок переключателей/светодиодов . . . . . 256 14.6. Устройство управления шаговым двигателем . . . . . . . . . . . . . . . 258 14.7. Проблемы программного обеспечения 259 Список литературы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261  Предметный указатель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 
Моей жене Оливин Луизе  Введение  Эта книга написана для того, чтобы, во-первых, дать студентам об- щее представление о микропроцессорных системах и их использова- нии в измерительной технике, системах управления и технике связи и, во-вторых, помочь студентам, обучающимся профессии инженера по электронике, в выполнении практических упражнений и созда- нии проектов, включающих в себя разработку как аппаратных, так и программных средств. Описываемые в книге упражнения используют язык программи- рования высокого уровня Си и разработаны на персональном компь- ютере (ПК). Аппаратные средства представляют собой ряд интег- ральных схем, которые могут быть просто вставлены в макетную пла- ту или припаяны к монтажной плате. Приведенные в книге упражне- ния разработаны так, чтобы при их выполнении использовался ми- нимальный набор аппаратных средств, а программы были простыми для восприятия. Главы 8, 9, 10, 11 и 12 содержат основные упражнения, в которых полностью описываются как аппаратные, так и программные средст- ва. Эти упражнения предназначены для того, чтобы научить студен- тов практической реализации интерфейса с ПК с помощью простых программных и аппаратных средств. Все упражнения были разрабо- таны и протестированы самим автором. Многие из них являются усовершенствованными вариантами упражнений, используемых на курсах «ВТЕС Interfacing and Electronics courses» И предназначенных для обучения студентов Suffolk College. Данные упражнения могут служить в качестве базиса для дальнейшего развития й преобразова- ния B полномасштабные проекты. Упражнения не предъявляют высоких требований ни к памяти, ни к быстродействию процессора, вполне достаточно иметь персо- нальный компьютер с 286-ым процессором. 
Введение 13  Четырнадцать глав разбиты на три части:  Часть 1.  Часть 2.  Часть 3.  Главы с 1 по 3 носят, главным образом, справочный ха- рактер.  Главы с 4 по 7 образуют теоретический раздел, хотя гла- ва 5 содержит и некоторые программные идеи.  Главы с 8 по 14 содержат много упражнений по интер- фейсу. В главе 8 обсуждается интерфейс с использова- нием последовательного порта. В главах с 9 по 11 много упражнений с применением программируемого интер- фейса с периферийными устройствами. В главе 12 по- вторяются соответствующие упражнения, приведенные в главах с 9 по 11, но с использованием параллельного порта принтера. В некоторых случаях программное обеспечение изменено с целью иллюстрации новых идей. Глава 13 содержит группу упражнений, которые могут быть преобразованы в проекты. В главе 14 обсуж- дается ряд вопросов, касающихся контрольно-измери- тельной аппаратуры, методов контроля и некоторых других проблем, связанных с использованием аппарат- ных и программных средств интерфейса.  При выполнении упражнений по интерфейсу с ПК требуется не  только умение разрабатывать короткие программы на языке Си, но и создавать работоспособные логические схемы. При практической ре- ализации интерфейса с компьютером важно соблюдать следующую последовательность мер предосторожности:  0 проверьте электрическую схему перед ее подключением к ком- пьютеру,  0 попросите какое-либо компетентное лицо (например, препо- давателя) проверить Все схемные и компьютерные соедине-  ния,  Фубедитесь, что компьютер ВЫКЛЮЧЕН при подключении или отключении схемы,  0 избегайте искривления контактов разъемов при включении их в гнезда,  ° убедитесь, что после включения компьютер работает нормально.  Автор добросовестно изложил в книге информацию о необходи-  МЫХ СОСДИНСНИЯХ, НО не МОЖСТ НССТИ ОТВСТСТВСННОСТЬ за НЗНВССНИС 
14 Введение  ущерба электрическому оборудованию и вреда какому-либо лицу во время выполнения упражнений, описаннь1х в этой книге. Автор выражает огромную благодарность Майку Тули за его под- держку во время работы над этой книгой, а также следующим ком- паниями‚ позволившим частично воспользоваться опубликованной ими информацией:  Intel Corporation (UK), Ltd, Motorola Semiconductor Products Sector, Philips Semiconductor Inc., Zilog Inc. 
Основы цифровой электроники  . . ....- -. . . - .. . -. ... . .._ . . .._. ...‘....~...... Vs .-. ..... ..... ..‚.. -.~.- ----~.-.-.- .... —._ .. -....»,~‘-*.- “-:-:-.~.~.~‘--°2-.“'va§§‘E$_':»§w- ъ ._\_;_ _ __ __ _ _.._,...‘;...;. \._ . _\-.;.;.-.;.;\-.-. _ .; -- ._ с. ’°§___§‘ „.._ . . . ........„_.`.\.\ ..... . . .... .\. \ . "" \“ д . \  Глава 1 Системы счисления  1. 1 . Прямое преобразование двоичных чисел 1.2. Двоично-десятичный код 1.3. Шестнадцатеричные числа 1.4. Числа со знаком 1 .5. Числа с плавающей точкой 1.6. Представление алфавитно-цифровых символов  1.7. Преобразования из одной системы счисления В ДРУГУЮ 1.8. Вопросы  В этой главе приводится обзор систем счисления, используемых в цифровых компьютерах. «Строительными блоками» этих ком- пьютеров, работающих только с двоичными сигналами, являют- ся логические устройства с двумя состояниями. В отличие от обычных арифметических расчетов с помощью ручки и бумаги, электронная система манипулирует с двоичны- ми числами, представленными в виде некоторого фиксирован- ного количества двоичных разрядов (битов): чаще всего с бай- тами (8 бит), словами (16 бит) или длинными (двойными) сло- вами (32 бит).  1.1. Прямое преобразование ДВОИЧНЫХ ЧИСЕЛ Каждый разряд двоичного числа имеет свой десятичный вес.  Самый младший разряд (СМР) двоичного целого числа соответ- ствует 2°, a вес каждого следующего разряда, появляющегося 
16 Глава 1  Разряд 2‘ Разряд 2= 7 128 -1 0.5 6 64 -2 0.25 5 32 -3 0.125 4 16 -4 0.0625 3 8 -5 0.03125 2 4 -6 0.015625 1 2 -7 0.0078125 0 1 -8 0.0039063 Рис. 1.1. Десятичные веса дво- Рис. 1 .2. Десятичные веса двоич- ичных разрядов для целых чисел. ных разрядов для чисел, меньших 1.  слева (0 -› 7), увеличивается по сравнению с весом предь1дуще- го разряда в два раза (см. рис. 1.1). На рисунке 1.2 приведена таб- лица, где представлены десятичные веса двоичных разрядов для чисел, меньших 1, здесь вес каждого следующего разряда, появ- ляющегося справа (—1 —› —8)‚ уменьшается по сравнению с ве- сом предыдущего разряда в два раза.  1.1 . 1 . Преобразование чисел из десятичной формы в двоичную  Один из методов преобразования чисел из десятичной формы в двоичную приведен ниже. Пример 1 . Преобразовать 4410 в 8-разрядное двоичное число.  Метод. Из данного числа вычитать ближайший, меньший по величине, вес разряда (рис. 1.1), а затем так же поступать с каждым остатком:  Разряд 7 6 5 4 З 2 1 0 Вес разряда 128 64 32 16 8 4 2 1 Число 44 ;12. 1 Остаток 12 ;§ 1 Остаток 4 -_4 1 Остаток 0 Двоичное 0 0 1 0 1 1 0 0 число  Ответ: 41:11.,-= 001011002 
Системы счисления 17  ._._.j:  1 .1 .2. Преобразование чисел из двоичной формы в десятичную  Для перевода числа из двоичной системы счисления в десятич- ную следует сложить все веса каждою разряда исходного дво- ичного числа, если значение этого разряда в исходном двоич- ном числе равно 1.  Пример 2. Преобразовать 100011112 B десятичное число.  Разряд 7 6 5 4 3 2 1 0 Сумма  Вес разряда 128 64 32 16 8 4 2 1 Число 1 0 0 0 1 1 1 1 Значение 128 8 4 2 1 143  Ответ: 100011112 = 14310  1.2. двоично-десятичный код (ддК)  Альтернативный вариант использования двоичных чисел для представления десятичных чисел заключается в том, чтобы по- ставить в соответствие каждой цифре десятичного числа (от О до 9) некоторый двоичный код. Для этого требуется не больше четырех разрядов двоичного кода. Таблица на рис. 1.3 демонст- рирует несколько различных способов выбора 10 различных 4- разрядных двоичных комбинаций. Приведен также код «2 из 5», предусматривающий защиту от ошибок‘; этот код уменьшает вероятность ошибок при работе ряда механических преобразо- вателеи.  Комментарии к рис. 1.3: 1. 8421 — естественный двоичный код. 2. Код 2421 уменьшает величину однобитовой ошибки с 8 до 4.  3. XS3 (КОД с избытком 3) — код, где вероятность появле- ния 1 в каком-либо из 4 разрядов равна вероятности появления 0. Заметьте, что кодовое слово 0000 отсутст- вует.  1 Если число единиц в полученном кодовом слове отличается от двойки, то слово отклоняется. 
18 Глава 1  ч“  Цифра 8421 2421 XS3 Код Грея Код «2 из 5» 0 0000 0000 0011 0000 11000 1 0001 0001 0100 0001 00011 2 0010 0010 0101 0011 00101 3 0011 0011 0110 0010 00110 4 0100 0100 0111 0110 01001 5 0101 1011 1000 1110 01010 6 0110 1100 1001 1010 01100 7 0111 1101 1010 1011 10001 8 1000 1110 1011 1001 10010 9 1001 1111 1100 1000 10100  Рис. 1.3. Системы двоично-десятичного кодирования.  4. Код Грея — это последовательность кодовых слов с еди- ничным кодовым расстоянием между двумя соседними слоями в последовательности‘.  5. Код «2 из 5» обнаружит одну ошибку, так как все кодовые слова должны содержать две единицы.  1.3. Шестнадцатеричные числа (hex)  Одним из простых способов наглядного представления двоич- ных чисел является их преобразование в систему счисления с основанием 16, т. е. в так называемые шестнадцатеричные (hex) числа, каждая «цифра» которых представляет 4 бита (рис. 1.4). Для записи шестнадцатеричных чисел требуется шестнадцать символов: цифры от 0 до 9 используются для представления соответствующих значений от 0 до 9, а симво- ль1 английского алфавита от Адо F (строчные или прописные) соответствуют значениям десятичных чисел от 10 до 15. В таблице на рис. 1.4 приведены соотношения между десяти- чными числами от 0 до 2010 и их двоичными, шестнадцатерич-  1 КОДОВЫМ РЗССТОЯНИСМ HEISIJIBBCTCSI ЧИСЛО ОТЛИЧЗЮЩИХСЯ ПО ЗНЗЧСНИЮ раз- рядов B паре КОДОВЫХ СЛОВ. СЛЕДУЮЩИЕ? пары КОДОВЫХ СЛОВ ИМСЮТ СДИНИЧНОС КО- ДОВОС рЗССТОЯНИСС  0100 1100 111101010 0000 1101 101101010 
Системы счисления 19  .__._‚г—  чч  десятичные двоичные Шестнад- Двоичная двоично-  с основанием с основанием цатеричныв кодировка десятичный 10 2 соснов.16 десятков код 101 168421 161 8421 8421 0 0 00000 00 0000 0000 01 00001 01 0000 0001 02 00010 02 0000 0010 03 00011 03 0000 0011 04 00100 04 0000 0100 05 00101 05 0000 0101 06 00110 06 0000 0110 07 00111 07 0000 0111 08 01000 08 0000 1000 09 01001 09 0000 1001 10 01010 0А 0001 0000 11 01011 0В 0001 0001 12 01100 ОС 0001 0010 13 01101 0D 0001 0011 14 01110 OE 0001 0100 15 01111 OF 0001 0101 16 10000 10 0001 0110 17 10001 11 0001 0111 18 10010 12 0001 1000 19 10011 13 0001 1001 20 10100 14 0010 0000  Рис. 1 .4. Соотношения между числами.  ными и ДДК—эквивалентами. Числа в верхней части колонок указывают веса разрядов в заданной колонке.  1.4. Числа со знаком  Часто возникает необходимость указывать знак числа. В отли- чие от обычной записи чисел, когда слева от числа ставится знак + или —‚ в цифровой системе знак числа должен быть частью двоичного кода. Существуют несколько способов представле- ния знака числа, один из которых описывается ниже. Основная Идея заключается в том, чтобы самый старший разряд (ССР) (крайний левый) двоичного кода использовать как знаковый разряд, 0 в этом разряде служит для представления положитель- ных чисел, 1 — для отрицательных. 
20 Глава 1  Пример 3.  В З-разрядной системе существует 23 (= 256) двоичных ком- бинаций. Двоичные комбинации от 00000000 до 01111111 представляют положительные десятичные числа от О до 127 (в шестнадцатеричной системе от 0 до 7F), a оставшиеся дво- ичные комбинации от 10000000 до 11111111 представляют от- рицательные числа.  Метод представления отрицательных чисел, называемый  «дополнением до 2», описан ниже.  1 .4.1 . «дополнение до 2» как способ представления отрицательных чисел  В этом случае кодирование отрицательных чисел осуществляет- ся в три этапа. Нужно:  1) преобразовать абсолютное десятичное значение числа в двоичное число обычным способом;  2) выполнить операцию поразрядного дополнения до 1 в по- лученном двоичном числе, т. е. заменить в нем все нули на  СДИНИЦЫ, а СДИНИЦЫ На НУЛИ;  3) добавить 1 к СМР.  Чтобы найти десятичное значение любого двоичного числа  с 1 в ССР, нужно:  1) дополнить двоичное число до 1, т. е. заменить нули на еди-  НИЦЫ, а СДИНИЦЫ на НУЛИ;  2) добавить 1 СМР;  3) преобразовать полученное двоичное число в десятичное обычным способом.  nnww.  десятичные двоичные Шестнадца- TBPWHHE 0 0000 0000 0 0 1 0000 0001 0 1 127 0111 1111 7 F -128 1000 0000 8 О --1 1111 1111 F F  Рис. 1.5. Диапазон значений З-разрядных чисел со знаком. 
Системы счисления 21  В таблице На рис. 1.5 демонстрируется представление деся- тичных чисел в 8-разрядной системе счисления с использовани- ем дополнительного кода для отрицательных чисел. Пример 4. Представить —1 в 8-разрядном дополнительном двоичном коде:  1) преобразовать в двоичное число 110 = 0000 0001 2) дополнить до 1 = 1111 1110 3) добавить 1 к СМР = 1111 1111= FF(h§g) Ответ Пример 5. Представить —127 в 8-разрядном двоичном коде: 1) преобразовать в двоичное число 12710 = 0111 1111 2) дополнить до 1 = 1000 0000 3) добавить 1 к СМР = 1000 0001 = 31 (hex) Щвет  Обратите внимание, что —12810 = 1000 00002 (80 hex) И не мо- жет быть получено описанным выше способом, так как в 8-раз- рядной системе не существует числа +128 с основанием 10.  Пример 6. Найти десятичное значение шестнадцатеричного  числа 9А: 1) преобразовать в двоичное число 9А10 = 1001 10102 2) ДОПОЛНИТЬ до 1 = 0110 0101 3) Добавить 1 к СМР = 0110 0110 Преобразовать в десятичное число = —10210 Ответ  1 .4.2. суммирование двоичных чисел со знаком Пример 7. Вычислить710 + 9010: 1) преобразовать 7 в двоичное число 0000 0111 2) преобразовать 90 в двоичное число 0101 1010 0110 0001 = 9710 Ответ Пример 8. Вычислить —710 -- 9010. Эту сумму можно переписать в виде —7 + (—90)‚ поэтому Нужно: 1) преобразовать 7 в двоичное число 0000 0111 2) дополнить до 1 1111 1000 
22 Глава 1  3) прибавить 1 —7 = 1111 1001—› 1111 1001 4) преобразовать 90 в двоичное число 0101 1010 5) дополнить до 1 1010 0101 6) прибавить 1 —90 =1010 0110 —› 10101110 Результат -9710 = 10011111 Конечный разряд переноса отбрасывается 1  Пример 9. Вычислить 4710 + 9010:  1) преобразовать 47 в двоичное число 0010 1111 2) преобразовать 90 в двоичное число 0101 1010 1000 1001 =  = Ошибка переполнения. Ответ  Ошибка переполнения возникает в том случае, когда сумма двух положительных чисел дает отрицательный результат или когда сумма двух отрицательный чисел дает положительный ре- зультат.  1.5. Числа с плавающей точкой  Формат чисел с плавающей точкой необходим для работы с очень большими и очень малыми числами. В этом формате каж- дое число имеет две части: мантиссу и порядок. Положительные и отрицательные числа представляются положительной или от- рицательной мантиссой соответственно. Числа, большие еди- ницы, представляются положительным, а меньшие единицы — отрицательным порядком. Чтобы обеспечить максимальную точность представления, двоичная точка передвигается влево и ставится перед самой старшей 1 числа, последняя становится 1 в самом старшем раз- ряде мантиссы. Если число нормализовано таким способом, то  Mal-nuocu  31 30 .................. ..24 23 ............................................... ..0  .1 подразумевается между битами 23 И 24, если число не равно нушо  Рис. 1 .6. Формат числа с плавающей точкой. 
Системы счисления 23  отпадает необходимость сохранения этой самой старшей 1. Все разряды обнуляются, если число равно нулю. Для достижения большей точности можно включить опцию удлинения мантис- сы. На рисунке 1.6 показан формат 32-разрядного числа с плава- ющей точкой. Мантисса нормализована и, следовательно, су- ществует неявная (скрытая) 1 с левой стороны бита 23, за исклю- чением того случая, когда число равно нулю.  1.5.1. Примеры преобразования чисел с плавающей точкой  Пример 1 О. Преобразовать 1238710 B число с плавающей точкой. 1. Преобразовать в шестнадцатеричное число = 3063 hex 2. Преобразовать в двоичное число = 0011 0000 01 10 001 1  3. Чтобы найти значение мантиссы, передвинуть двоичную точку влево, расположив ее перед самой старшей 1 (в дан- ном случае на 14 разрядов влево).  =.110000 0110 0011  Значение порядка равно числу разрядов, на которое была смещена двоичная точка. В данном случае это число равно 14.  4. Преобразовать 14 B ДВОИЧНОС число для представления по- рядка = 0001110  5. Знак мантиссы — положительный. Число с плавающей точкой в формате, указанном на рис. 1.6:  0 00011101000 00110001 1000 0000 0000 T  .1 подразумевается  1.5.2. Смещенные порядки  В некоторых системах к порядку числа прибавляется определен- ная константа (смещение) так, чтобы все порядки стали поло- жительными. Это существенно упрощает процедуру сравнения порядков во время вычислений. В следующих примерах к по- рядкам прибавляется параметр смещения, равный 63. 
24  Глава 1  Пример 1 1 . Преобразовать в число с плавающей точкой: = 111 1000  2) переместить двоичную точку на 7 разрядов влево .111 1000  1) двоичное значение  3) порядок = 7 + 63 = 70  4) преобразовать порядок в двоичное число 10001 10 5) знак мантиссы — отрицательный 6) число с плавающей точкой  1 100 0110 1 110 0000 0000 0000 0000 0000 Т  .1 подразумевается.  Пример 1 2. Преобразовать 0.0410 B число с плавающей точкой:  1) найти показатель степени с основанием 2, соответствую-  щий данному числу‘ = log; (0.04) = -4.64 округлить до целого числа = —4 смещенный порядок = —4 + 63 = 59  =0111011  2) найти мантиссу путем Деления числа на 2"°Р"д°*<  мантисса = = 0.64 3) преобразовать .64 в двоичное число =.10100010 4) знак — положительный = 0 5) число с плавающей точкой 1 1 00  1 1082N = (10g1oN)/(108102) 
Системы счисления 25  1.6. Представление алфавитно-цифровых символов  ASCII (American Standard Code of Information Interchange - Американский стандартный код для обмена информацией) — это код, широко используемый для представления алфавитно- цифровых символов, для связи между компьютерами и принте- рами и т. д. В течение многих лет данный код использовался в телетаипнои связи. Существует большое количество управляющих кодов, кото- рые предоставляют возможность передающему телетайпу не- посредственно управлять приемным устройством. Все симво- лы закодированы с помощью 7-разрядного кода. Восьмой разряд, называемый битом четности1‚ может добавляться к каждому кодовому слову с целью обнаружения возможных ошибок при передаче. 128 кодовых слов представляют строч- ные и прописные буквы, числа, Дополнительные символы и управляющие коды. АЗСП-коды приводятся в конце этой гла- вы в таблицах на рис. 1.7 и 1.8.  1.7. Преобразования из одной системы счисления в другую  При работе с языками программирования низкого уровня? час- то возникает необходимость в преобразовании, например, сим- вола АЗСП-кода в шестнадцатеричное или десятичное число и наоборот либо строчных букв в прописные и т. п. Есть много способов выполнения таких преобразований, некоторые из них описаны ниже.  1.7.1. Перевод всех символов в прописные  Как видно из таблицы АЗСП-кодов, единственное различие между строчными и прописными буквами заключается в значе- нии шестого разряда: логический 0 для верхнеого регистра и ло- гическая 1 — для нижнего. Поэтому для перевода всех символов в верхний регистр, т. е. в прописную форму, нужно выполнить  ' Если число всех единичных разрядов четно, то бит четности равен 1, в про- тивном случае он равен О. 2 См. гл. 3, где объясняется что такое языки низкого уровня. 
26 Глава 1  операцию логического умножения AND1 АЗСП-кода с двоич- ной маской 1011111.  Пример 13. Сделать символ прописным (перевести символ в верхний регистр).  Номер разряда 7654321 АЗСП-код буквы d = 1100100 Маска = 101 1111 AND каждой пары разрядов = 100 0100 =  1.7.2. Перевод символов в строчные  В данном случае шестой разряд должен получить значение логи- ческой 1 там, где это необходимо, путем выполнения операции логического сложения OR с двоичной маской 010 0000.  Пример 14. Сделать символ строчным (перевести символ в нижний регистр).  Номер разряда 7654321 ASCII-KOII буквы Y = 1011001 Маска = 0100000  OR каждой пары разрядов = 1111001 = АЗСП-код бщвы у Ответ  1.7.3. Преобразование АЗСН-кодов чисел от О до 9 в 4-разрядные двоичные числа  Двоичные эквиваленты чисел от 0 до 9 получаются как точные копии четырех младших АЗСП-кодов от 30 hex до 39 hex (CM. таблицу рис. 1.8). Поэтому маска для АЗСП-кода — 0001111, операция -— логическое умножение (AND).  Пример 15. Сделать символ строчным (перевести символ в нижний регистр).  Номер разряда 7654321 АЗСП-код числа 7 = 0110111  Маска = 0001111 AND каждой пары разрядов = 0000111  1 См. гл. 2, где рассматриваются логические операции AND и OR. 
д‘ I  Системы счисления 27  .._.——"-‘ij  1.7.4. Преобразование АЗСН-кодов в шестнадцатеричные числа  Преобразование в шестнадцатеричные числа немного сложнее из-за того, что шестнадцатеричный символ А не следует сразу же за 9. Поэтому для того, чтобы символы от А до F СОЧСТЭЛИСЬ надлежащим образом c числами от 10 до 15, нужно:  1) перевести буквы в ПРОПИСНЫЕ (в верхний регистр); 2) прибавить 9 к этим буквам; 3) преобразовать в двоичные числа.  Пример 1 6. Преобразовать АЗСП-код буквы b B шестнадца- теричное число.  АЗСП-код буквы b = 1100010 Прибавить 9 = 0001001 Результат 1101011 Маска с OF hex = 000111!  0001011 = Эквивалент b Ответ  1.8. Вопросы  1. Сложите следующие числа, представленные в двоично- десятичном коде 8421:  a)01000100+00110011; б)00101001+10011001; в) 0101 0101 + 01111000. 2. Заполните таблицу.  десятичное двоичное шестнадцатеричное ддК 8421  а) 7 0000 0000 0111 6) 0000 0001 0001 0000 0001 0111 B) 0000 0001 1011 -01D r) 67 000001100111 д) 065 0001 0000 0001 e) 235 0000 11101011 OED ж) 428 0100 0010 1000  3. Преобразуйте 00000482 в двоичное число с плавающей точкой. 
28 Глава 1  двоичный код Шестн. десятич. Аббревиатура Описание функции  7 6 5 4 3 2 I код код функции 0 0 0 0 0 0 0 00 0 NUL Пустой символ 0 0 0 0 0 0 1 0 1 1 зон Начало заголовка 0 0 0 0 0 1 0 0 2 2 STX Начало текста 0 0 0 0 0 1 1 о 3 з втх Конец текста 0 0 0 0 1 0 0 0 4 4 EO.T Конец Передачи 0000101 05 5 ENQ Запрос 0 0 0 0 1 1 0 0 6 6 АСК Подтверждение приема 0000111 07 7 BEL ЗВОНОК 0 0 0 1 0 0 0 0 8 8 BS Возврат о о о 1 о о 1 о 9 9 нт Горизонтальная табуляция 0 0 0 1 0 1 0 0 А 10 LF Перевод строки 0 0 0 1 0 1 1 0 В 11 VT BCPTHKMBHEW ТЗбУЛЯЦИЯ 0 0 0 1 1 0 0 0 С 12 FF Перевод страницы 0 0 0 1 1 0 1 0 D 13 CR B03BP3T K’c1P€TK" 0 0 0 1 1 1 0 0 в 14 so Переходкновомуиабору символов 0 0 о 1 1 1 1 0 F 15 S1 Возвратвосновной набор символов 0 0 1 0 0 0 0 1 0 16 DLE Смена каналов данных 0 0 1 0 0 0 1 1 1 17 DC1 Управление устройством1 0 0 1 0 0 1 0 1 2 18 DC2 Управление устройством2 О О 1 0 0 1 1 1 3 19 DC3 Управление устройством3 О 0 1 0 1 0 0 1 4 20 DC4 Управление устройством4 0 0 1 0 1 0 1 1 5 21 NAK Неподтвержцение приема 0 0 1 0 1 1 0 1 6 22 SYN Символ синхронизации 0 0 1 0 1 1 1 1 7 23 Етв Конец передачиблока О 0 1 1 0 О 0 1 8 24 CAN Отмена 0 0 1 1 0 0 1 1 9 25 Ем Конец носителя 0 0 1 1 0 1 0 1 А 26 SUB Замена (символа) 0 0 1 1 0 1 1 1 B 27 Esc Переходкуправляюшей последовательности о о 1 1 1 о о 1 с 23 Fs Разделитель фагшов О 0 1 1 1 0 1 1 D 29 GS Разделитель групп 0 0 1 1 1 1 0 1 Е 30 RS Разделитель записей 0 0 1 1 1 1 1 1 F 31 US Разделитель элементов 0100000 20 32 SP Пробел 1 1 1 1 1 1 1 7 Р 127 DEL Стирание  Рис. 1.7. Управляющие символы АЗСП-кода.  4. преобразуйте —0.3 12 x 1O*3 B Двоичное число с плавающей точкой.  5. преобразуйте в десятичное двоичное число с плавающей точкой 00000111110011001010101011110001. 
Ёдзичньпй Шестнад- десятич- символы двоичный Шестнад- десятич- Символы код цатерич- ный КОД цатерич- ный 7654321 ный 7654321 ный 0100001 21 33 ! 1010000 50 80 P 0100010 22 34 " 1010001 51 81 Q 0100011 23 35 # 1010010 52 82 к 0100100 24 36 $ 1010011 53 83 s 0100101 25 37 °/o 1010100 54 84 т 0100110 26 38 & 1010101 55 85 U 0100111 27 39 ' 1010110 56 86 v 0101000 28 40 ( 1010111 57 87 w 0101001 29 41 ) 1011000 58 88 х 0101010 2А 42 ” 1011001 59 89 у 0101011 2B 43 + 1011010 5А 90 Z 0101100 2C 44 1011011 SB 91 1 0101101 2D 45 1011100 5С 92 \ 0101110 2Е 46 - 1011101 SD 93 1 0101111 2F 47 / 1011110 SE 94 ^ 0110000 30 48 0 1011111 5F 95 ” 0110001 31 49 1 1100000 50 95 0110010 32 50 2 1100001 61 97 а 0110011 33 51 3 1100010 62 93 b 0110100 34 52 4 1100011 53 99 c 0110101 35 53 5 1100100 64 100 d 0110110 36 54 6 1100101 55 101 e 0110111 37 55 7 1100110 55 102 f 0111000 38 56 8 1100111 67 103 В 0111001 39 57 9 1101000 63 104 h 0111010 3A 58 1101001 69 105 i 0111011 зв 59 ; 1101010 6А 106 1‘ 0111100 3C 60 < 1101011 6В 107 k 0111101 3D 61 = 1101100 6С 103 1 0111110 315 62 > 1101101 6D 109 m 0111111 3F 63 ? 1101110 61:; 110 n 1000000 40 64 @ 1101111 6F 111 0 1000001 41 65 А 1110000 70 112 Р 1000010 42 66 в 1110001 71 113 ч 1000011 43 67 с 1110010 72 114 Г 1000100 44 68 D 1110011 73 115 5 1000101 45 69 Е 1110100 74 116 t 1000110 46 70 1: 1110101 75 117 11 1000111 47 71 G 1110110 76 118 V 1001000 48 72 н 1110111 77 119 W 1001001 49 73 1 1111000 78 120 x 1001010 4A 74 J 1111001 '79 121 У 1001011 4В 75 К 1111010 7A 122 Z 1001100 4c 76 L 1111011 7в 123 1 1001101 41> 77 м 1111100 7с 124 I 1001110 413 78 ы 1111101 71) 125 } 1001111 4F 79 O 1111110 ‘IE 126 "‘  Рис. 1 .8. Печатные символы АЗСП-кода. 
Глава 2  Электронные логические элементы и регистры  2.1. Логические элементы 2.2. Дешифраторы адреса 2.3. Устройства C тремя выходными состояниями 2.4. Логические схемы последовательного действия 2.5. Шинные системы 2.6. Упражнение для ознакомления с работой ОЗУ  Эта глава может служить удобным справочником по цифровым электронным устройствам, описанным в настоящей книге.  2.1. Логические элементы  В процессе работы логический элемент может находиться в од- ном из двух логических состояний, которые определяются либо высоким и низким уровнем напряжения, либо высоким и низ- ким уровнем тока. Эти состояния удобно представлять двоич- ными цифрами (битами), 0 и 1. Чтобы описать функцию любой комбинации логических элементов, можно использовать табли- цу двоичных чисел, называемую таблицей истинности. Логиче- ские схемы, полученные при соединении различных логических элементов, называются комбинационными логическими схема- ми, если в любой момент времени значения сигналов на их вы- ходах полностью определяются значениями сигналов на их вхо- дах в тот же момент времени. Если приводится таблица истинности, то двоичные комби- нации входных сигна.лов обычно записывают в порядке их воз- растания. Таблицы истинности вместе с двумя альтернативны- ми условными графическими обозначениями (BS и ANSI)1  1 Два стандарта, английский и американский:  BS — British Standarts ANSI — American National Standards Institute 
Электронные логические элементы и регистры 31  восьми стандартных устройств приведены в разделе 2. 1 . 1. Логи- ческие элементы AND, OR, NAND И NOR могут иметь два, три или четыре входа.  2.1.1. Логические элементы: таблицы истинности и условные графические обозначения  Логический элемент И (AND)  Ha выходе логическая 1 только в том случае, если на ВСЕ входы подаются логические 1.  V\\..V\ in  Вход“ Выход А В Q  оо о вз ANSI 01 0 А A ‘ то о о О 11 1 в в D  Логический элемент ИЛИ (OR)  Ha выходе логическая 1, если ХОТЯ БЫ НА ОДИН вход подает- ся логическая 1.  urns.  Вход Выход  АВ Q 00 О BS ANS. 01 1 А А 10 1 0 O 11 1 В В  Логический элемент НЕ (NOT), инвертор  Это одновходовое устройство. Логическое состояние его выхода  противоположно (комплементарно) логическому состоянию входа.  >m\¢~:c4<-.o+o»v',».-w\~¢oc~om\'uor<¢ ‘тающими  Вход Выход  А Q Альтернативное изображение  0 1 BS 1 0 A O A Q 
32 Глава 2  Логический элемент И-НЕ (NAND)  Ha выходе логический 0 только в том случае, если на ВСЕ входы подается логическая 1.  Вход Выход  АВ Q 01 1 А А д 10 1 д Q Q 1 1 0 B B т  Логический элемент ИЛИ-НЕ (NOR)  Ha выходе логический О, если ХОТЯ БЫ НА ОДИН вход пода- ется логическая 1.  I-'|-'33 o--$u—o$ ©@©'-" Ш Э ' О ш Р О  Логический элемент исключающее ИЛИ (XOR)  Ha выходе логическая 1 только в том случае, если на ОДИН И ТОЛЬКО ОДИН вход подается логическая 1.  Вход Выход  АВ Q 00 0 35 ANSI 10 1 o 0 11 0 В В 
Электронные логические элементы и регистры 33  Логический элемент исключающее ИЛИ-НЕ (XNOR)  Ha выходе логическая 1, если на ВСЕ входы подаются одинако- вые логические сигналы. Этот элемент известен также как эле- мент совпадения.  \\Ч\`Ч x'V"‘o<\Y(\\‘\ ч  вход Выход  АВ Q To 1 BS “Na 10 0 o о 11 1 в в  Усилитель с единичным коэффициентом усиления ЛОГИЧССКОС СОСТОЯНИЕ сигналов на ВХОДС И ВЫХОДС ОДНО И ТО же.  дыш-  Вход Выход  А Q Альтернативное 0 as обозначение 1 1 А о А 0  2.1.2. Коммерческие логические элементы  Двумя широко распространенными семействами логических интегральных схем (ИС) являются ТТЛ (тран3исторно-транзи- сторная логика) и КМОП (комплементарные МОИ-структуры: металл-окисел-полупроводник). Оба семейства включают боль- шое количество разнообразных интегральных схем, состоящих из многочисленных логических элементов, счетчиков и регист- ров. В таблице на рис. 2.1 указаны уровни напряжений питания и логических состояний этих ИС. ТТЛ и КМОП ИС можно ис- пользовать совместно, но в этом случае КМОП ИС должны ра- ботать с напряжением не выше 5 В. Следует отметить, что выпу- скаемые логические устройства могут работать в определенном диапазоне напряжений, характерном для каждого логического состояния. Это важно помнить, так как в реальных схемах зна- чения напряжений могут слабо варьироваться в зависимости от 
34 Глава 2  ТТЛ КМОП Напряжение питания Vcc = 5 В Vdd = OT 5 до 15 В диапазон напряжений От 0 до 0,4 в От 0 В до Vdd/2 логического 0 Диапазон напряжений Or 2,4 B до 5 В Vdd/2 до Vdd логической 1  Рис. 2.1 . Типичные уровни напряжения выпускаемых ИС.  выходной нагрузки, провалов напряжения и влияния других сигналов. Примеры выпускаемых логических устройств приве- дены в разделе 2.1.3. Типичные кодировки ТТЛ ИС начинаются с цифро-буквенной комбинации 74LS, a КМОП-микросхем — с числа 40. Ряд интегральных схем типа 74хх (например такие, как 74НС), в настоящее время изготавливаются с использованием МОП-технологии. Номер устройства следует за этим идентифи- кационным кодом. Какие-либо буквы, стоящие перед этим но- мером, в сочетании с ним или после него, дают информацию от- носительно конструкции устройства. Более детальную инфор- мацию, касающуюся выпускаемых логических интегральных схем, можно получить либо с помощью каталогов производите- лей, либо в рекламных проспектах.  2.1.3. Примеры ТТЛ VIC и КМОП VIC  “I 131 121 “J ‘OIJJ Ч \/сс 4А 48 40 ЗА ЗВ 30 74XX08 1д 13 10 2A 23 20 земдя Счетверенный 2-входовый  “э И 1' 2! Г? а а 7Г логическим лемент  141 13| 121 111 1о| q q Vcc 4A 48 40 3A 3B 30 74XX32  1д 13 10 2A 23 20 Земля Счетверенный 2-входовый логический элемент или 11 2! Е’ 4! sl е! 7Г а 
Электронные логические элементы и регистры 35  14' 13] 12] 1 1L 10] q L Vcc 6A 60 5A 50 4А 40 74ХХ04  1А 10 2A 20 ЗА 3039МЛЯ "ч 2| 21 4| 5| djf  ‘Нех-инвертор 1  щ 131 121 пью: ч ч Vcc 4A 4B 4Q 3A 3B 30 74ХХ00  1А 18 10 2A 2В 2О3емля "11 2] НЧ 5| GIT  Счетверенная 2-входовая логическая схема И-НЕ  14L13| 12] 11L1q q q Vcc 40 4А 48 30 ЗА ЗВ 74ХХ02  Счетверенная 2-входовая ‘Q '^ ‘в 2° 2“ 25 am“ логическаясхемаИЛИ-НЕ. 1| 21 Ё 4| 5| d 71  ‘E113! ‘Ч ‘Ч “El 9| 1 Vdd 4A 4в 40 зо ЗА зв 4070  Счетверенный логический элемент 1А 1B 10 20 2A 2B Vss исключающее или 1| 21 al а! 5| GI 7|  Д“! ‘21 ‘Ч ‘Ч Ч Ж Vdd 4A4B4Q3Q3A ЗВ 4077  Счетверенный логический элемент 1А 18 10 20 2A 2B Vss ттючающ” "лжив 1! 2! I 4! 5| GI 7|  1 Аббревиатура «Нех» используется для указания того, что микросхема co-  держит 6 логических элементов. Не следует путать агу аббрсвцатурую обозначе- Нием шестнадцатеричных чисел. ’ fr 
36 Глава 2  2.2. дешифраторы адреса  Дешифратор адреса является комбинационной логической схе- мой. На рисунке 2.2 показана таблица истинности для дешифра- тора адреса 74ХХ138 ТТЛ‚ который выбирает один адрес из восьми. Значок Х в таблице истинности означает незадейство- ванные входы.  „дич_ь` ч`дМ ‘“,u.«.n_\.._.“,,5«‘“ ` „диод“ . ..._._5 A AIAHJI д. . " щ к . м... „д, _ - пдщьььщвьпць-д  Входы Выходы  Е2 Q0 О] Q2 Q3 Q4 Q5 Q6 Q7  Ё E’-'1 a-A > Ш  oooooooo><><—- oooooooo><»—->4 —---—------o><>< ._..——-»—ooc>o><><>< .---co-—v—oo><><>< .._.-—---—-._......_.o.—.._.._. .--—-—---—-—-o-—-—-—-— I-Il—|I—II—II—IoI—II—II—II—I|—I .-:----—-Q....._.—-.-.—._. .--—-:-Gn--—-—-—-—-—-— .-.-o.—._......._..—-.-._..— .-Q-—-._..—-.-....u—-.--—-._. ©r—-n—--—--—-u—-u—-—-v--v--n—-  :f.—-o--ou—o--o><><>< г) i 3  Рис. 2.2. Таблица истинности для ИС 74ХХ138.  В отсутствие требуемых разрешающих сигналов на всех вось- ми выходах Дешифратора устанавливается логическая 1. При подаче на вход ИС двоичной комбинации в пределах от 000 до 111 вместе с подлежащими разрешающими сигналами на одном из восьми выходов устанавливается логический О. Имеются три разрешающих входа: ЕО, Е1‚ Е2. Один выход выбирается только в том случае, если на входы ЕО и Е1 подается логический О, а на вход Е2 — логическая 1.  16] 15l 14] 13] 12] 11| 1q q Vcc0001 02 03040506  Рис. 2.3. Назначение выводов ИС 74ХХ138. 
Электронные логические элементы и регистры 37  2.3. Устройства с тремя выходными состояниями  В некоторых применениях, например в шинных системах, воз- никает необходимость параллельного подключения выходов ло- гических элементов. В этих случаях ДЛЯ того, чтобы избежать конфликтных ситуаций при обращении к шине1, важно, чтобы в любое время только один из логических элементов вырабатывая логический сигнал. Все выходы других логических элементов должны эффективно отключаться.  2.3.1 . Буфер с тремя состояниями  Существует несколько способов отсоединения выходов логиче- ских элементов при помощи электроники, самый распростра- ненный из них — использование буферного выходного устрой- ства с тремя состояниями. Третье состояние известно как состо- яние высокого импеданса (высокого 2), оно соответствует эф- фективному электрическому отключению логической схемы от выходного контакта ИС. Это третье состояние контролируется сигналом, подаваемым на вывод разрешения по выходу (ОЕ). На рисунке 2.4 приведены таблица истинности и условное графи-  “мню ‚щи “м ...... „ц Ф” “ц ... .\ u- n ww vvv--  данные (А) ОЕ Выход EQ)  0 0 0 A Q 0 1 Высокий Z 1 0 1 1 1 Высокий Z Разрешение „- .- . по выходу  Рис. 2.4. Буфер с тремя состояниями (таблица истинности и условное гра- фическое обозначение).  ческое обозначение буфера с тремя состояниями. Промышлен- Ная ТТЛ ИС — Счетверенный буфер с тремя состояниями -— пока- зана на рис. 2.5.  1 Конфликтная ситуашш возникает, когда два устройства пытаются пере- дать шине два противоположных логических сигнала в одно и то же время. Это Обычно вызывает протекания через выходы обоих устройств сильного разруша- ющего тока. 
38 Глава 2  141191121 “I ‘°|j Я Vcc 405 4A 40305 ЗА зо 74ХХ125  ‘OE ‘д Ю 205 2^ 2° Земля Рис. 2.5. Счетверенный буфер c тремя т Ё d A d d fl СОСТОЯНИЯМИ.  2.3.2. Управление входами статического ОЗУ  Логическая схема статического ОЗУ на рис. 2.6 показывает ис- пользование логических элементов и буферов с тремя состояни- ями для ввода/вывода данных в оперативном запоминающем ус- тройстве (ОЗУ). Кружечки у входов логических элементов ука- зывают на то, что сигнал инвертируется на этих входах. Имеются три управляющих входа, которые соединены с внутренними логическими элементами: разрешение по выходу (ОЕ), разрешение записи (WE) И выбор микросхемы (CS).  Обратимся к рисунку 2.6:  АО А1 -"  Адресный вход Массив памяти  А9_'  E-S----1—d’flA Й? у /  Управляющие Z 4 входы Буферы Ld X в _ с тремя  OE ___g состояниями  00 - - - - - - - - о - D7 ВВОД-ВЫВОД данных  Рис. 2.6. Внутреннее управление статическим ОЗУ. 
Электронные логические элементы и регистры 39  Входы Выходы Примечание CS WE OE А В 0 0 0 1 0 Данные записываются в ОЗУ 0 0 1 1 0 Данные записываются в ОЗУ 0 1 0 0 1 Данные считываются из ОЗУ 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 Никакие данные не записываются 1 1 О О 0 в ОЗУ и не считываются из ОЗУ 1 1 1 0 0  Рис. 2.7. Таблица истинности для управляющих входов ОЗУ.  CS Подача сигнала низкого уровня на этот вход разрешает обращение к микросхеме памяти. В процессорной сис- теме она обычно подключена к выходу дешифратора адреса.  WE Для записи данных в память необходимо подать сигнал низкого уровня на этот вход. Сигнал может быть снят с управляющей линии WR (запись) микропроцессора.  ОЕ Подача сигнала низкого уровня на этот вход подключа- ет выходной буфер к шине данных. Управляющий сиг- нал RD (чтение) от микропроцессора может быть ис- пользован как сигнал разрешения вывода данных.  На рисунке 2.7. приведена таблица истинности для управля- ющих входов ОЗУ. Практические упражнения по записи данных в память и чте- ния их из памяти описываются в разделе 2.6.  2.3.3. З-разрядные буферы с тремя состояниями  Микросхема 74ХХ240 (рис. 2.8) — пример инвертирующего 8—разрядного буфера с тремя состояниями. ИС может приме- няться для изолирования З-разрядной параллельной шины дан- ных. Обратите внимание, что имеются два контакта для подачи сигнала разрешения по выходу (ОЕ)‚ каждый из которых соеди- нен с группой из 4 логических элементов. Входы и выходы дан- ных нумеруются обычным образом: от 0 до 7. Назначение выво- дов этой ИС показано на рис. 2.9. 
40 Глава 2  Выходы  о п‘? 2 з 4 5 7  00 D1 D2 D3 D4 D5 D6 D7  BE OE Входы  Рис. 2.8. Логическая схема ИС 74ХХ240.  20] 19L13| 17[ 16L 15] 14 131 14 11 _ Vcc 0E2 00 от 02 оз 04 05 ов 07 74хх24о ОЕ1 00 01 02 0з 04 05 06 07 Земля 1! 2! э! 4| б! 6|  Рис. 2.9. Назначение выводов ИС 74ХХ240.  Горизонтальная черта над обозначением выходов указывает на то, что выходной сигнал не совпадает с входным сигналом (если на вход подается логическая 1, то на выходе будет логиче- ский 0, и наоборот). Горизонтальная черта над обозначением ОЕ указывает на то, что выход будет задействован при подаче на вход ОЕ логического 0.  2.3.4. В-разрядные двунаправленные буферы с тремя состояниями  ИС 74ХХ245 (рис. 2.10) — пример З-разрядного двунаправленно- го буфера с тремя состояниями. Его также называют октальным приемопередатчиком. Данная ИС содержит восемь пар буферных усилителей с еди- ничным коэффициентом усиления. Она может использоваться для управления направлением передачи потока данных по З-разрядной шине данных. Имеются выводы ОЕ и DD (направ- ление передачи данных). 
Электронные логические элементы и регистры 41  ТО Т I  Ввод/ вывод данных Ё‘? Т‘ Т’ ‘Г Y 11 Да x|4 xsr X; х! 1  ВВОД/ВЫВОД данных  X0 Х  OE DD Рис. 2.10. Логическая схема ИС 74ХХ245. го! 19! 1§L17| 16| 151 141 таим 111 VccOE X0 X1 X2 X3 X4 X5 X6 X7 74XX245 DD Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y73eM11q P 211 Н 6 7 в 9 10 - ис. . . азначение ‘T 2‘ з‘ Tr 5] Г I I Г I выводов ИС 74ХХ245.  Таблица истинности, представленная на рис. 2.12, показыва- ет, как выбираются состояния выходов и направление передачи данных.  ВХОДЫ Выходы Примечание ОЕ DD А В О 0 0 1 Данные передаются от Y к Х 0 1 1 О Данные поступают от Х к Y 1 0 0 0 Вывод запрещен 1 1 0 О Вывод запрещен  Рис. 2. 12. Таблица истинности микросхемы 74ХХ245. 
42 Глава 2  2.4. Логические схемы последовательного действия  Выходное состояние логической схемы последовательного дей- ствия зависит от предыдущего состояния (или предыдущих со- стояний) входов и их текущего состояния.  2.4.1 . Фиксатор (триггер-защелка) В-типа  Фиксатор В-типа (рис. 2.13) является базовой схемой последова- тельного действия. Эта схема с фиксацией состояния хранит один бит данных до того момента, пока на синхронизирУЮЩий вход не подается импульс, приводящий к появлению значения хранимого бита на выходе схемы. Хранимое значение бита изме- няется при изменении сигнала на входе данных. Синхронизиру- ющий импульс иногда называют стробирующим импульсом.  Вход данных Выход данных  Вход синхронизации  Рис. 2. 1 3. Фиксатор В-типа.  Временная диаграмма на рис. 2.14 иллюстрирует работу этой схемы. Видно, что состояние выхода может измениться только на переднем фронте синхронизирующего сигнала в момент его перехода к низкому уровню. В некоторых устройствах это изме- нение данных происходит на заднем фронте синхронизирующего импульса.  Логическое состояние  А г J J J J J  Выход  -———_. ____..  0  Рис. 2.14. Фиксатор В-типа, временная диаграмма. 
Электронные логические элементы и регистры 43  2.4.2. 8—ра3ряднь|й буфер с тремя состояниями  Логическая схема ИС 74ХХ374‚ показанная на рис. 2.15, состоит из восьми фиксаторов В-типа, имеющих выходы с тремя состо- яниями. Такое устройство может применяться с шинной систе- мой для ввода или вывода данных. Все фиксаторы имеют общий синхронизирующий вход.  Выходы  Буферы (то стремя состояниями „к J J J-  Фиксаторы О-типа  Ф п _ь О ю  I Синхро-С низация  ca си С 5 D6 D7 OE Входы  Рис. 2.15. Логическая схема ИС 74ХХ374.  VccQ7 D7 D6 0605 D5 D4 Q4 СИН  74ХХ374 ОЕ Q0 D0 D1 Q1 Q2 D2 D3 О33емля  ч 2| з! ч з! 6' 7| ч 9| ‘Ч ЕДЁ;‚„‚Ё‘АЁ„ЕЕЗЁ5‘$‘:°"“°  2.5. Шинные системы  Шинная система, представленная на рис. 2.17, обеспечивает простой способ параллельного соединения входов и выходов ус- Тройств. Управляющие сигналы используются для выбора уст- ройства и пересылки данных. Чтобы избежать конфликтных си- Туаций при обращении к шине, следует проявлять осторожность при соединении шины с выходами устройств. Несмотря на то, что существует несколько способов безконфликтного подклю- Чения, обычно применяются выходные устройства с тремя со- стояниями. 
Глава 2  RD WR Шина данных Адресная шина MREQ 00010203 AoA1A2A3MA5 no Ac ... LH D1 А‘ АО А1 EN  D2 пзу ^2  D3 (Адрес 00) АЗ дешифратор адреса  Q0 G102 Q3  OE CS ВО Ё A0 от м  D2 П А2  “3 (Адрес01) ^3 OE C5 ВО АО —-‹ D1 A1  D2 озу ^2 D3 (Адрес 10) A3  OE cs ВО АО -4 ш А1  D2 озу ^2  D3 A3 WE (Адрес 1 1)  OE CS  Рис. 2.17. Соединения шины простой системы организации памяти.  Рисунок 2.17 иллюстрирует использование 4-разрядной ши- ны данных и 4-разрядной адресной шины для выбора одного из четырех устройств памяти емкостью l6x4 бит. дешифратор ад- реса выбирает одно из четырех устройств, в зависимости от ко- довой комбинации, подаваемой на выводы АО и А1. Дешифратор адреса только тогда выбирает устройство памя- ти, когда Ha вход разрешения (EN) подается логический О. На линии WR или RD устанавливается логический О, в зависи- мости от режима обрашения к памяти: ввод или считывание данных. На рисунке 2.18 приведена таблица истинности для де- шифратора адреса. Общее число адресов (адресное пространство), которые мо- гут быть выбраны в системе на рис. 2.17, составляет 25 = 64. Та- ким образом, в наличии имеются адреса ячеек от 0 до 63. 
Электронные логические элементы и регистры 45  wan  Входы Выходы Примечание EN A1 A0 Q0 Q1 Q2 Q3 1 0 0 1 1 1 1 1 0 1 1 1 1 1 Ни один из адресов 1 1 0 1 1 1 1 Не Выбран 1 1 1 1 1 1 1 О 0 0 0 1 1 1 Выбрано ПЗУ 1 0 0 1 1 0 1 1 Выбрано ПЗУ 2 О 1 0 1 1 0 1 Выбрано ОЗУ 1 0 1 1 1 1 1 0 Выбрано ОЗУ 2  Рис. 2.18. Таблица истинности дешифратора адреса.  Пример А. Определить местоположение данных, если на ад- ресной шине (см. рис. 2.17) находится число 2910. Преобразовать 2910 в 6-разрядное двоичное число = 01 1 1О1смр. Таким образом,  А1 = 1 СМР __ A1 = О А2 = 1 Дает ячейку 1101 = 1310 A3 = 1 _____д A4 = 1 —" A5 = 5 __ В устройстве 01 = ПЗУ 2 (CM. рис.2.18)  Ответ: данные расположены по адресу 13. ПЗУ 2.  Этот пример демонстрирует использование старших разря- дов адресных линий для выбора устройства, в то время как ад- ресные линии низкого порядка, соответствующие младшим раз- рядам, выбирают ячейку в пределах данного устройства. Про- Граммирование на ассемблере требует от программиста знания Величины диапазона разрешенных адресов, но фактический вы- бор микросхемы памяти, как правило, не вызывает трудностей.  2.6. Упражнение для ознакомления с работой ОЗУ  Цель данного упражнения, для выполнения которого использу- ется З-разрядное ОЗУ емкостью 2К‚ заключается в том, чтобы за- 
46 Глава 2  5B 5B 11<OM 11<OM —..—WE m—|os —_10E o o—1os 5B OB OB OB OB 19 18 17 1 1 14 13  Vdd A8 A9 we OE A10 cs D7 D15 5 4 D3  A1 A0\DO D1 D2 Vs  1I;”"'11.11  OB OB OB OB  K логическим К логическим перекпючателям перекпючателям данных адресов и семисегментному индикатору  Рис. 2.19. Упражнение 2.6. Монтажная схема.  писать в 16 ячеек памяти битовые комбинации для семисегмент- ного индикатора с целью индикации чисел от О до F. НСИСПОЛЬЗУ- емые адресные входы микросхемы памяти Должны быть заземле- ны, иначе расположение данных в памяти будет неопределен-  470 Ом  1  Число семисегментный код на индикаторе dp a b с d e f g  _aJ_  а Ь Ч :|-° О О 1_С:|._а 1000 001 9 е 1 11001111 г т 2 10010010 dp d 9 б : р 101110 о {_:.._..:5B О  Рис. 2.20. Упражнение 2.6. Семисегментные кодовые комбинации. 
Электронные логические элементы и регистры 47  ным. Монтажная схема приведена на рис. 2.19, a первые несколь- ко линий семисегментного кода представлены на рис. 2.20. Требуемые устройства:  :Mc«~:.w...u ` ` „т.  Количество Устройства Примечание Y 1 6118 ОЗУ 2 Кбайт ОЗУ 1 Макетная плата Для сборки схемы 2 Резисторы 1 кОм «Утягивающие» резисторы 1 Семисегментный Используется индшсатор с общим анодов индикатор 1 Резисторная матрица Токоограничивающие резисторы для 8 х 470 Ом семисегментного индикатора 2 Кнопочные выключатели Переключатели разрешения вывода и разрешения записи 2 Блоки переключателей Они описываются в гл. 14, но можно использовать любые логические переключатели  Часть двоичных кодовых комбинаций для семисегментного индикатора с общим анодом приведена в таблице на рис. 2.20, подключение выводов зависит от типа используемого индика- тора (соответствующую информацию можно найти в техниче- ской документации производителя). В случае индикатора с об- Щим анодом включение сегмента происходит при подаче на не- го логического О. Для обеспечения работы схемы потребуются токоограничивающие резисторы, включаемые между сегмента- ми индикатора и выводами данных микросхемы.  Последовательность операций Шт записи данных в память 1. Разомкнуть переключатель ОЕ. 2. Установить данные на переключателях входов данных. 3. Установить адрес на переключателях адресов. 4. Нажать и отпустить переключатель WE.  ll/U1 чтения данных  1. Замкнуть ОЕ. 2. Установить адрес на переключателях адресных входов. 
Глава З  З-разрядный микропроцессор  3.1 . Введение в микропроцессоры 3.2. 8-разрядная микропроцессорная система 3.3. Микропроцессор Zilog Z80  B главах 3, 4 и 5 изложены основные понятия, необходимые при изучении электронных систем, построенных на основе микро- процессоров. Цель этой главы — обзор базисных элементов 8-разрядной микропроцессорной системы. Излагаемый мате- риал носит в основном ознакомительный характер и уже изве- стен тем, кто изучал микропроцессорные системы.  3.1. Введение в микропроцессоры  Микропроцессорная система имеет две различные, но взаимо- зависимые части: программные и аппаратные средства (см. рис. 3.1). Ни одна из этих двух частей не сможет функциониро- вать без другой. Программы, записанные в ПЗУ, можно на- звать микропрограммным обеспечением. Программа состоит из последовательности команд (инструкций) для микропро- цессора, хранящихся в памяти. Микропроцессор выбирает эти команды из памяти и выполняет их. Он управляет всеми пере- сылками данных и осуществляет арифметические и логиче- ские операции. Каждый тип микропроцессора1 обладает своим собствен- ным набором команд в машинных кодах, размер (длина) ко- манды может составлять от 1 до 5 байт двоичного кода (см. раз- дел З.3.4). Команды, объединенные в одну «программу», в ис-  1 B данном случае слово «тип» может означать некоторое семейство микро- процессоров, разработанное одним и тем же производителем. 
З-разрядный микропроцессор 49  Все электронное и механическое оборудование  Все программы и документация  Программы, _ записанные в ПЗУ  Рис. 3.1. Компоненты микропроцессорной системы.  ходном виде могут быть записаны на низкоуровневом языке — языке ассемблера1 или на языках высокого уровня2, например на Си или Паскале. Обычно при программировании на языке низ- кого уровня используется какой-нибудь текстовый редактор и ассемблер. Результатом работы ассемблера является файл с рас- ширением .сот, содержащий последовательность машинных кодов. Ассемблер может также создать файл с расширением .hex, который содержит машинные коды, записанные в форме АБСП-кодов, а также файл с расширением .1st, содержащий как исходную программу, записанную в текстовом виде, так и ма- шинный код.  3.2. 8-разрядная микропроцессорная система  На рисунке 3.2 показана логическая блок-схема микропроцес- сорной системы. Аппаратные средства включают собственно микропроцессои дешифратор адреса, постоянное запоминаю- щее устройство (ПЗЮ, оперативное запоминающее устройство (ОЗУ) и параллельные регистры ввода/вывода.  1 Каждый тип микропроцессоров имеет свой собственный транслятор ма- шинных кодов (ассемблер) и язык, представляющий собой некоторый набор символов или мнемонических образов команд, например Id a, b. 2 Языки высокого уровня используются при написании программ для любо- го типа микропроцессоров, для которых имеется подходящий транслятор (см. гл. 7). 
50 Глава З  Синхронизация  ПЗУ  4%  И ем е HeM:g§pE\gaH3e Прерывание Вывод данных Обозначения: INT Прерывание MREO Запрос памяти RD Управляющая линия чтения WR Управляющая линия записи ОЕ Разрешение по выходу CS Выбор микросхемы памяти WE Разрешение записи NMI Немаскируемое прерывание  Рис. 3.2. Микропроцессорная система. 3.2.1. Работа системы  Регистры ввода/ вывода обеспечивают взаимодействие системы с периферийным оборудованием. Они позволяют пересылать З-разрядные слова данных в систему и обратно из системы, свя- зывая ее c такими устройствами, как принтер, клавиатура или светоизлучающие индикаторы. Последовательность З-разрядных команд (см. раздел 3.3.4), предварительно записанная в память, считывается микропро- цессором с шины данных. Длина команды может составлять от 1 до 5 байт. Номинальное значение скорости обработки команд 
З-раэрядный микропроцессор 51  определяется тактовой частотой. Типичная тактовая частота (частота синхронизации) 8-разрядных микропроцессоров — от 5 до 20 МГц.  3.2.2. Микропроцессор  Более детально микропроцессор описывается в разделе 3.3, поэ- тому здесь рассматривается только принцип его работы. После подачи сигнала reset (c6poc — установка микропроцессора в ис- ходное состояние) адрес первой команды подается на адресную шину, а затем заявляются сигналы управления пересылкой дан- ных микропроцессора: MREQ и RD. Микропроцессор выбирает байт команды из памяти Через шину данных. Команда декодиру- ется‚ затем процессор генерирует некоторую последователь- ность управляющих сигналов для управления как внутренними, так и внешними операциями. Если требуются дополнительные данные для завершения команды, они выбираются из памяти. Затем команда выполняется. Этот процесс продолжается до тех пор, пока процессор не выполнит команду остановки цикла (halt) или команду условного перехода (1оор).  3.2.3. Постоянное запоминающее устройство (ПЗУ)  микропрограммное обеспечение, записанное в ПЗУ, которое является энергонезависимым запоминающим устройством1, представляет собой набор машинных кодовё используемых Данным микропроцессором. В ПЗУ записывается программа инициализации и другая постоянно хранимая информация, необходимая для нормального функционирования микропро- цессора. ПЗУ хранит стартовую программу начала работы, на- зываемую программой начальной загрузки (bootstrap), или уп- равляющую программу для инициализации системы. В специ- ализированной системе3 ПЗУ может содержать всю программу работы системы.  ‘ Содержимое энергонезависимой памяти не будет потеряно в случае от- ключения электроэнергии. 2 Машинный код — это набор команд микропроцессора в двоичном коде, обычно записываемый в шестнадцатеричной форме. Например, машинный код Загрузки в А содержимого из В (ld a, b) будет записан как 78Н. 3 Специализированная система — это система, предназначенная для выпол- нения конкретных функций. 
52 Глава 3  3.2.4. Оперативное запоминающее устройство (ОЗУ)  ОЗУ является запоминающим устройством, позволяющим не только считывать данные, но и записывать их в память. ОЗУ мо- жет быть как энергозависимым, так и энергонезависимым уст- ройством. Этот тип памяти используется для хранения пользо- вательских программ и данных. Небольшая часть ОЗУ исполь- зуется в качестве стека (см. раздел 3.2.10).  3.2.5. Схемы синхронизации и сброса  Для синхронизации работы всей системы у микропроцессора должен быть вход для подачи сигнала синхронизации. Этот сиг- нал представляет собой последовательность прямоугольных им- пульсов постоянной частоты в диапазоне напряжений от О до 5 В. Для генерации такого сигнала имеются однокристальные схемы. На входе сброса обычно поддерживается состояние ло- гической 1. Установка логического 0 заставляет систему возвра- щаться в исходное состояние. На рисунке 3.3 приведена схема,  100 кОм  5 В Е К выводу сброса  I Нажать для сброса  Ф  22н  ОВ  Рис. 3.3. Автосброс и ручной сброс.  которая вынуждает микропроцессор автоматически возвра- щаться к исходному стартовому адресу при включении схемы. Кнопка сброса позволяет выполнить ручной сброс.  3.2.6. Адресная шина  Адресная шина состоит из 16 линий (проводов), обозначаемых номерами от АО до А15. По адресной шине передаются адре- са, вырабатываемые микропроцессором. Адрес определяет 
З-разрядный микропроцессор 53  ячейку памяти, из которой или в которую будут пересылаться по шине данных необходимые для работы микропроцессора данные. С помощью 16 адресных линий можно создать адрес- ное пространство объемом 216, что составляет порядка 64 Кбайт.  3.2.7. Шина данных  Двунаправленная шина имеет восемь линий, обозначенных номе- рами от D0 до D7. Эта шина позволяет пересылать данные из микропроцессора в любой узел микропроцессорной системы и наоборот. Временная диаграмма пересылки данных приведена на рис. 3.10.  3.2.8. Управляющая шина  Управляющая шина состоит из некоторого числа линий, часть которых передает сигналы внутрь микропроцессора, а часть — из него. Семь управляющих линий показаны на рис. 3.2. Здесь сигналы MREQ, RD и WR являются сигналами, исходящими от микропроцессора, а сигналы «Сброс», «Синхронизация», NMI и «Прерывание» (см. рис. 3.2) являются сигналами, предназна- ченными для микропроцессора. На входе прерывания («Преры- вание» или NMI) обычно поддерживается логическая 1. появляющийся на нем логический О заставляет микропроцес- сор временно приостанавливать выполнение текущей програм- мы и выполнять некоторую подпрограмму, вызванную этим прерыванием (см. раздел 3.3.7).  3.2.9. дешифратор адреса  Все устройства в системе с управлением памятью могут быть вы- браны дешифратором адреса согласно карте распределения па- мяти, приведенной на рис. 3.4. Дешифратор выбирает одно из четырех устройств по адресным линиям А14 и А15. Эти линии подключаются к входу дешифратора адреса таким образом, что ПЗУ выбирается при подаче двоичной комбинации 00, ОЗУ -— 01, ввод — 10, вывод -—- 11 (СМ. рис. 3.5). 
54 Глава 3  0000 ПЗУ  ОЗУ 6000 5FFF 7FFF eooo Ввод 8001 BFFF 9000 Вывод com He используется I FFFF  Рис. 3.4. Карта распределения памяти.  З.2.10. Стек  Стек —- своеобразная записная книжка микропроцессора. Он используется автоматически для хранения адресов возврата в том случае, если:  1) выполняются команды call и rst;  2) обрабатываются прерывания.  Содержимое регистров, используемых в подпрограммах, мо- жет быть скопировано в стек посредством команды push И воз- вращено оттуда с помощью команды рор (или pull). Стек является зарезервированнь1м блоком памяти в ОЗУ, данные записываются и считываются в него по правилу «по- следним вошел — первым вышел» (LIFO). Указатель стека хра- нит последний адрес ячейки, в которую были записаны дан- нь1е. Стек должен быть инициализирован в начале работы про- граммы. _ Вершина (самый высокий адрес) стека фиксируется некото- рым 16-разрядным адресом, загруженным в регистр указателя стека SP (CM. рис. 3.7). Указатель стека получает отрицательное приращение при записи каждого байта в стеке и положительное приращение при считывании каждого байта (см. раздел 3.3.6, где можно найти пример программирования, демонстрирую- 
З-разрядный микропроцессор 55  ,---jj  пасы-гм- .  Адресные линии 13 12 11 10 9 8 7 6 5 4 3 2 1 0 П3Увначале О 0 0 0 0 0 0 0 0 0 0  Адреса потом  Ф  ОЗУ вначале Адреса логом  Ф ›-- ь-в ›-в ь-в но Ё ›-в 1- 1- ›-в ›-в 1- ›-в  ‚Ф  Ф Ф Ф Ф  Регистры ввода Регистры вывода  Ф ФФ Ф ФФ ФФ ФФ ФФ  Рис. 3.5. Селектор адресных линий.  щий работу стека для одного сегмента программы для микро- процессора 21103 Z80).  3.3. Микропроцессор Zilog Z80  Микропроцессор 21103 280 рассматривается в этом разделе как пример 8-разрядного микропроцессора. Значительная часть представленного здесь материала получена из книги 21103 Products Specification Data Book и приводится благодаря разре- шению фирмы 21103, 1пс. Характеристики данного микропроцессора (МП), указанные в сопроводительной документации, перечислены ниже.  1. Одна из версий МП 21103 280 —- устройство на п-канальных МОП-структурах — характеризуется низкой стоимостью и высокой производительностью. Тактовые частоты — 4 МГц и 6,17 МГц.  2. Другая версия МП 21103 280 — устройство на КМОП- структурах — характеризуется высокой производительно- стью и низкой потребляемой мощностью. Тактовая часто- та — до 20 МГц.  3. Имеется двойной набор регистров общего назначения и флаговых регистров, которые при использовании команд обмена обеспечивают приоритетный/фоновый режим ра- боты и очень быструю обработку прерываний. 
56 Глава 3  4. Имеются два 16-разрядных регистра.  5. Три режима маскируемых прерываний. Режимы О, 1 и 2  ОПИСЫВЭЮТСЯ В рЗЗДСЛС  3.3.1. Общее описание  На рисунке 3.6 показана блок-схема, которая демонстрирует внутреннее устройство и основные функции микропроцессора Z80. Ввод команд и ввод/вывод данных осуществляются через шину данных. Адресные данные, полученные микропроцессо- ром, перецаются на адресную шину. Микропроцессор состоит  из трех основных частей:  1) блока управления (команды поступают в регистр команд, дешифруются и затем инициируют генерацию управляю- щих сигналов, исходящих от блока синхронизации и уп-  равления);  3.3.7.  2) блока арифметических и логических операций;  3) регистров общего и специального назначения (рис. 3.7).  8-разрядная шина данных  о _ ч , А I Интерфеис о шины данных Ё у >$ : т Ь 8 - ‘б floe,:::{¢paTop Регистр ‘Внутренняя шинаданных“ Ё Ё Д команд Y йд ‚_ О +5 B —`› T ч- L >. Ё Ё о земля ч L Массив Ё 9 ‘д у Синхронизация РЭГИСТРОВ I I‘, БЛОК Синхронизация д _._ управления Mn Mn ‹ г- Адреснаялогика и буферы Зсистемньж Буправлякццих и управляющих входов МП I 16'pa3p"m"a”  Рис. 3.6. Блок-схема микропроцессора Zilog Z80. 
З-разрядный микропроцессор 57  5%.. 8-разрядная двунаправленная шина данных  I ‘I I '7 Регистр Мультиплексор оман -— к д A F I I в С (аккумулятор) (регистр дешифратор состояния) команд D E El: H L Контроллер I R АЛУ ПОСЛЭДОВЗТЁЛЬНОСТИ прерывание) регенерация (apW¢’MeTV"<0' V управляющих Индексные регистры _ логическое устроиство) команд |Хи IY -——--———| ' SP (указатель стека) _i PC (счетчик команд) | К §__ 16-ра3рядная адресная шина вывода V_ инхронизация Еброс УМПЕО Ё но F% wn +———.m I  Рис. 3.7. Внутренняя организация микропроцессора.  Арифметические и логические операции выполняются с по- мощью аккумулятора (А), арифметико—логического устройства (АЛУ) и регистра состояния (F). АЛУ является комбинационной логической схемой, выполняющей как арифметические, так и логические операции. Такие команды, как операции циклического сдвига и сдвига вправо или влево на один разряд, выполняются в сумматоре. Ре- зультат некоторых операций, например, add (СЛОЖСНИС) и sub (вычитание), остается в сумматоре. Регистр состояния отслежи- вает результаты определенных операций (см. разделе 3.3.2). Регистры выбираются мультиплексором. Шесть 8-разряд- ных регистров (В, С, D, E, Н, L) могут быть использованы в про- граммах самостоятельно (8 разрядов) или парами, как 16-раз- рядные регистры. Для некоторых регистров имеются специаль- ные команды: например, регистр В применяется как счетчик Цикла, а регистр HL может быть использован как указатель ад- реса. Существуют также два регистра специального назначения: 1 (от английского interrupt — прерывание) и R (от английского refresh —— регенерация). 
58 Глава 3  Регистры А, В, С, D, Е, Н, L И F продублированы. Регистры альтернативного набора помечаются штрихом: А‘, В‘, С’, D’, Е’, Н‘, L’ и F’. Передача данных между этими двумя наборами реги- стров осуществляется путем использовании набора команд об- мена. Эти регистры могут применяться для увеличения быстро- действия при обработке прерываний.  3.3.2. Регистр состояния  Основное назначение регистра состояния (регистр F, рис. 3.7):  1) облегчать выполнение ассемблерных команд переходов саП и jump (например, команды jp nz,start, означающей «возврат к началу, если не О»);  2) обнаруживать ошибки переполнения, возникающие при вычислениях с дополнительным кодом («дополнение до 2»), которые могут возникнуть в том случае, если склады- ваются два больших числа одного и того же знака, или ес- ли вычитаются два больших числа разных знаков.  На рисунке 3.8 показаны назначения разрядов регистра со- стояния. Каждый разряд устанавливается (логическая 1), или сбрасывается (логический О) во время выполнения таких ко- манд‚ как add (ADD — сложение), sub (SUBtract — вычитание), ср (СогпРаге - сравнение), Состояние разрядов показывает, ка- ким является результат: положительным, отрицательным, рав-  Ретстр состояния  Разряд 7 6 5 4 3 2 1 0  Разряд Назначение Примечание разряда 7 Знак Установить, если отрицательный, очистить. если положительный 6 ноль Установить, если ноль, очистить, если НЕ ноль 4 Полуперенос Установить, если есть перенос из первых четырех разрядов, очистить в противном случае 2 ПСРСПОЛНСННС Установить при переполнении дополнительного кода, очистить в противном случае 1 СЛОЖСННС/ Установить — для вычитания, очистить — для сложения 0 ВЬГЧИТЗНИ‘? Установить, если есть перенос, очистить в противном случае 5&3 Перенос Для внутреннего использования  Рис. 3.8. Регистр состояния (F). 
З-разрядный микропроцессор 59  _——:%  ным нулю, есть ли перенос или полуперенос разряда (см. рис. 3.8) или произошло переполнение. Логический 0 указывает, что флажок не установлен или сброшен. Логическая 1 указывает, что флажок установлен.  Пример 1. Флажки состояния. Таблица на рис.3.9 показывает результат выполнения коман- ды add a,n:  содержимое сумматора (регистр А) добавляется к содержи- мому ячейки памяти, которая следует сразу за кодом опера- ции. Результат сохраняется в сумматоре.  Код операции add a,n —- 11000110 (C6 hex)  Машин- Числов Число Результата ный код аккумулято п аккумул S Z H V N C C6 00 0000 0000 0000 0000 0000 0000 0 1 0 0 0 0 С6 00 0001 0000 0000 0000 0001 0000 0 0 0 0 0 0 C6 01 0001 1111 0000 0001 0010 0000 0 0 1 0 0 0 С6 01 1111 1111 0000 0001 0000 0000 0 1 1 0 0 1 С6 90 1000 0000 1001 0000 0001 0000 0 0 0 1 0 1 С6 70 1000 0000 01110000 11110000 1 0 0 0 0 0 С6 70 0111 0000 0111 0000 1110 0000 1 0 0 1 0 0  Рис. 3.9. Результаты выполнения команды add a,n.  B крайней слева колонке на рис. 3.9 показан машинный код в шестнадцатеричной форме, за кодом операции сразу же следу- ет число п.  3.3.3. Временная диаграмма микропроцессора  Временная диаграмма на рис. 3.10 отражает работу управляющей шины, адресной шины и шины данных во время считывания и записи данных. Чтение или запись занимают по времени три пе- риода тактовых импульсов. Полное время выполнения каждой Операции составляет 150 нс, если тактовая частота равна 20 МГц. Номера пунктов в приведенном ниже анализе временной ди- аграммы на рис. 3.10 соответствуют цифрам, отмечающим ха- рактерные точки на временной диаграмме. 
60 Глава 3  Т1 Т2 Т3 Т1 Т2 Т3  Тактовые импульсы 1 . . S 6 ' . .д_  X  ,1 д ш : д  А0-А1  MREQ  RD Ё к L 1 H . Ж “)CX° Х D0-D7 _ H _ I  WR  Чтение Запись  Рис. 3. 1 О. Временная диаграмма операций чтения/записи.  1. Адрес ячейки памяти, к которой обращается процессор, выдается на адресную шину.  2. Спустя половину периода тактового импульса активизи- руются управляющие сигналы MREQ И RD.  3. Микропроцессор считывает данные на заднем фронте (отрицательном перепаде) тактового импульса T3. 4. ЛИНИИ MREQ И RD переводятся в неактивное состояние (логическая 1).  5. Адрес ячейки памяти удаляется с адресной шины.  6. Адрес ячейки памяти, в которую должны быть записаны данные, выдается на адресную шину.  7. Спустя половину периода тактового импульса, после уста- новки параметров адресного сигнала на шине, активизи— руется управляющий сигнал MREQ. OH может использо- ваться в качестве сигнала разрешения выбора микросхемы памяти.  8. Микропроцессор выдает данные, которые должны быть записаны в память на шину данных. 
З-разрядный микропроцессор 61  9.После установки параметров сигналов на шине данных активизируется управляющий сигнал WR, который явля- ется сигналом записи/чтения для микросхем памяти.  10. Линии WR И MREQ переводятся в неактивное состояние на половину периода тактового импульса раньше, чем будет изменена информация на адресной шине или шине данных.  3.3.4. Команды и режимы адресации  Микропроцессор Z80 обладает наиболее мощным и гибким на- бором команд среди всех наборов, применяемых в 8—разрядных микропроцессорах. Он включает в себя такую уникальную опе- рацию, как пересылка целого блока данных для более быстрого и эффективного обмена данными памяти или между памятью и устройством ввода/вывода. Он также позволяет проводить опе- рации на любом бите в любой ячейке памяти. Каждая команда на языке машинных кодов имеет свой соб- ственный код, называемый кодом операции (орсос1е). Для испол- нения некоторой команды может быть затребована дополни- тельная информация. Эта дополнительная информация, назы- ваемая операндами‚ может быть включена как часть байта кода операции или может находиться в одном или нескольких бай- тах, следующих сразу же за кодом операции. Следовательно, код операции определяет операцию, которая должна быть выполне- на над операндами, которые хранятся в регистрах микропроцес- сора или во внешней памяти. Режим адресации точно определяет способ фактического об- ращения к данному операнду. Различные режимы адресации используются для того, чтобы:  1) предоставить пользователю разнообразные программные средства, например указатели памяти, счетчики для уп- равления циклом, возможность индексации данных и программной настройки (модификации адресов загрузоч- ного модуля);  2) уменьшить число разрядов в адресном поле команды.  Основные режимы адресации, используемые в 8-разрядной системе:  1) неявный (регистровый):  ld a,b —- скопировать содержимое регистра В в А, 
62  Глава 3  2) непосредственный: Id a,n — загрузить З-разрядное число в регистр А, 3) абсолютный: jp nn —- перейти на 16-разрядный адрес, 4) относительный:  jr n —— относительный переход вперед на 129 адресов или назад на 126 адресов,  5) прямой:  Id a,(nn) -- скопировать содержимое ячейки памяти-пл в регистр А,  6) косвенный  Id a,(bc) ——- скопировать содержимое ячейки памяти, адрес которой записан в регистре ВС, в регистр А. п = 8-разрядное число, пп = 16-разрядный адрес.  3.3.5. Примеры режимов адресации  Неявный, или регистровый, режим. Команды, которые работают исключительно с регистрами, обычно используют неявный ре- жим адресации, называемый также регистровым режимом. Та- кие команды, как дополнение (до 1) содержимого аккумулято- ра, не нуждаются в дополнительной информации, так как под- разумевается, что операнд находится в аккумуляторе.  Пример 2. Дополнение аккумулятора.  Машинный код 2F 3DH = 00111101 C2H = 11000010  Непосредственный. В этом режиме за кодом операции следу-  cpl Если содержимое аккумулятора  ПОСЛС ВЫПОЛНСНИЯ КОМЗНДЫ  ет одно- или двухбайтовый операнд.  Пример З. Id a,5B Машинный код 3E 5B Загрузить в регистр А число 5ВН 
З-разрядный микропроцессор 63  -——-*1‘  ld bc,413 1 Машинный код Загрузить в регистр В  013141 число 41 и в регистр С число 31 Пример 4. jp 3025 Машинный код Записать в регистр С3 25 30 РС число 3025  Прямой (абсолютный). За кодом операции, который может составлять 1 или 2 байта, следуют два байта адреса, по которому должен быть записан операнд или откуда он должен быть извле- чен.  Пример5. Id (040BH),bc Машинный код Содержимое регистров ВС ED 43 OB 04 ДОЛЖНО быть записано в память по адресу 040ВН.  Косвенный. Адрес операнда предварительно загружен в пару регистров. Поэтому этой команде может соответствовать един- ственный байт кода операции.  Пример 6. ld a,(bc) Машинный код Данные 5СН находятся в ОА памяти по адресу 3В45Н. 3В45Н был загружен в ре-  гистры ВС. После выпол- нения регистр А содержит 5СН.  Относительный. В 8-разрядной системе относительная адре- сация имеет 2-байтовый формат, и поэтому она обеспечивает более эффективные переходы по сравнению с абсолютной адре- саЦией. За байтом кода операции перехода следует байт косвен- НОГО адреса, который отсчитывают либо вперед на 127 ячеек па- Мяти, либо назад на 128 ячеек памяти от числа, находящегося в регистре РС (это адрес следующей команды).  Пример 7. Адрес следующей команды 1000Н.  jr 12Н Машинный код 18 12 Перед выборкой РС=1000 После выборки РС=1002 После вып олнения РС=1014 
64 Глава 3  Пример 8. Адрес следующей команды — 1000Н.  jr -20H‘ Машинный код Перед выборкой РС = 1000 18 Е0 После выборки РС = 1002 После выполнения РС = 0РЕ22  3.3.6. Программа  Следующий файл <wmz.lst>, представляющий короткую про- грамму на языке ассемблера, иллюстрирует работу указателя стека и счетчика команд. Псевдокоманда3 «org» указывает на на- чальный адрес программы, а «equ» присоединяет адреса к мет- кам4. Чтобы выполнить команду са11‚ микропроцессор сначала по- мещает (push) содержимое счетчика команд (РС) в стек. Содер- жимое счетчика команд восстанавливается после выполнения подпрограммы. Описание команды djnz п, используемой в данной програм- ме‚ приводится ниже.  Вычесть 1 из содержимого регистра В. Если результат не ра- вен нулю (если флажок нуля не установлен в результате тако- го вычитания) прибавить байт, который хранится по следую- щему адресу, к числу в счетчике команд с использованием дополнительного кода (дополнения до 2).  В программе, приведенной в качестве примера, машинный код по адресу 0308Н есть 10FB.  10 — это команда djnz n.  FB — число, которое нужно прибавить к содержимому счет- чика команд, чтобы перейти на адресу цикла LOOP.  1 Дополнительный код для 20Н есть ЕОН (см. гл. 1). 2 Сложение с использованием дополнительного кода  1002 = 0001 0000 0000 0010 +ОЕ = 1111 1111 1110 0000  00001111 1110 0010 = 0FE2H 3 П севдокоманды используются для того, чтобы дать ассемблерную инфор- мацию. Они не являются частью ассемблера, предоставляемого производителем микропроцессора и предназначенного для его программирования. Разные про- граммисты, разрабатывающие ассемблерные программ ы, могут использовать незначительно отличающиеся друг от друга команды. 4 При написании программ обычно удобнее использовать относительные метки для любых адресов и констант, появляющихся в программе. Это делает программу более «читабельной» и значительно упрощает ее модификацию при использовании компьютеров с разным распределением памяти. 
З-разрядный микропроцессор 65  Содержимое счетчика команд в этот момент равно 030АН‚ так как в счетчике всегда находится адрес следующей команды. Заметим, что аббревиатура FBH означает расширение со зна- ком1 при сложении. Поэтому 0000 0011 00001010 +1111111111111011  0000 0011 0000 0101 = 0305Н новое содержимое счетчика  Пример 9. Вызов подпрограммьт.  Следующий листинг файла, приведенный на рис. 3.11, являет- ся примером простой программы, иллюстрИрУЮЩей вызов неко- торой подпрограммы из основной программы. Таблица трасси- ровки, показывающая операции со стеком, приведена на рис. 3.12.  Программа на языке ассемблера и в машинных кодах org 100H начальный адрес программы stack equ 600Н инициализировать указатель стека screen equ OFFOCH 2 поштрограмьта вьтвода на экран ' - M:2IiD:[}1H-l>I.ir'{- ' - Метка п п Йбманда- Примечание ‚ ко 0100 31д00 06 16 sp, stack 3aIDY3Vfl'b y1<&38r8IIb СТЕК?! 0103 01 78 56 16 Ьс, 5678Н 33IPY3VFTI> ЧИСЛО В BC 0106 CD 00 03 start: can subrtn вьтзвагь подПРШРаММУ 0109 {следующая команда} 0300 С5 subrtn: push bc сохранить содержимое ВС 0301 06 02 16 Ь,02 загрузить 2 в В 0303 OE 2А 16 с, "'" загрузитьА5СП-код2АвС 0305 CD ОС FF loop: call screen напечатать "' 0308 10 FB djnz 1оор В—1, если В не 0,1оор 03ОА С1 рор Ьс восстановить содержимое ВС 03ОВ С9 ret возвратиться в основную программу  Рис. 3.1 1 . Распечатка файла программы.  на  1 «Расширение со знаком». означает, что если седьмой разряд, например, 8- разрядного числа равен 0, то тогда для преобразования этого числа в 16-разряд- ное число, разряды от 8 до 15 заполняются «нулями». Аналогично, если седьмой бит 8-разрядного числа равен 1, то разряды от 8 до 15 заполняются «единицами». 2 Некоторые трансляторы требуют наличия нуля перед шестнадцатеричньт- Mn числами, которые начинаются с буквенного символа (А, В, С, D, E или F), для указания того факта, что это число, а не метка. 
‘(Оманда ВС РС SP данные следующий адрес стека 16 sp, Stack 0103 0600 ld bc, 5678Н 56 78 0106 call subrtn (старший байт) 05FF 01 (Младший баЙТ) 0300 05FE 09 push be OSFD 73 0301 05FC 56 16 b. 02 02 78 0303 16 с‚ 2Ан 02 2А 0305 са11 screen 05FB 03 (Напечатать *) FFOC 05FA 03 djnz loop 0308 OSFC 56 01 2А 0305 са11 screen 05FB 03 (Напечатать *) FFOC 05FA 03 djnz loop 0308 OSFC 56 00 2А 030А рор Ьс 56 78 030В 05FE 01 {Ct 1009 0600 Рис. 3.12. Таблица трассировки для примера 9. Основная программа Подпрограмма Адрес данные Адрес данные 0000 00010000 0000 00110001 0000 00110000 0000 1100 0101 0000 0001 0000 0001 0000 0000 0000 0011 0000 0001 0000 0110 0000 0001 0000 0010 0000 0110 0000 0011 0000 0010 0000 0010 0000 0001 0000 0011 0000 0001 0000 00110000 0011 0000 1110 0000 00010000 0100 0111 1000 0000 00110000 0100 00101010 0000 00010000 0101 01010110 0000 00110000 0101 11001101 0000000100000110 11001101 0000001100000110 00001100 0000000100000111 00000000 0000001100000111 11111111 0000 0001 0000 1000 0000 0011 0000 0011 0000 1000 0001 0000 0000 000100001001 0000 001100001001 1111 1011 0000 00110000 1010 1100 0001 д 0000 001100001011 11001001  Рис. 3.13. Таблица трассировки для примера 9. 
З-разрядный микропроцессор 67  ‚т-и-‘Ё  Важно помнить, что все команды и данные хранятся в двоич- ном коде, как видно из рис. 3.13. Для команды call требуется пять внешних операций с па- мятью. Она выполняется микропроцессором 280 3a 17 тактовых импульсов. Если тактовая частота равна 20 МГЦ, то полное вре- мя выполнения этой команды составляет 850 нс. Это время можно сравнить со временем выполнения данной команды про- цессором 80386 фирмы Intel с тактовой частотой 33 МГц, где ко- манда call выполняется за 12 тактовых импульсов. При указан- ной частоте этот процессор затрачивает 12/33 >< 106 (= 363,6 нс) на выполнение данной команды, т. е. в среднем в два с полови- ной раза быстрее, чем микропроцессор Z80.  3.3.7. Прерывания  Аппаратные прерывания повышают гибкость использования микропроцессора. Они позволяют процессорной системе вы- полнять несколько задач одновременно, например обрабаты- вать данные и обслуживать периферийные устройства. У микропроцессора может быть несколько выводов (контак- тов) для подачи сигналов прерываний. МП Z80 имеет два таких вывода: INT (маскируемое прерывание) и NMI (I-ICM8.CKI/IDYCMOC прерывание). Сигнал логического 0 на одном из этих выводов мо- жет прервать обработку команд в любой момент времени. Преры- вание обычно приостанавливает выполнение текущей задачи или процесса, инициирует выполнение служебной подпрограммы, а затем возвращает систему к выполнению текущей программы или процесса. В дополнение к механизмам прерываний, внешние шины микропроцессорной системы Z80 могут управляться путем установки сигнала логического 0 на выводе BUSRQ (BUS ReQuest —- запрос шины). Запрос шины. При активизации линии BUSRQ микропроцес- сор приостанавливает текушие операции и переводит как шину данных, так и адресную шину в состояние высокого импеданса. Управляющие сигналы, которые не могут находиться в трех со- стояниях, переводятся в неактивное состояние. Подтверждение запроса в Z80 осуществляется путем установки логического 0 на Линии BUSAK (BUS AcKnowledge — подтверждение шины). Это Средство используется главным образом для прямого доступа к Памяти (ПДП), т, е. для непосредственной пересылки данных Между периферийными устройствами и памятью микропроцес- С0рной системы. 
68 Глава 3  .___  NMI (немаскируемое прерывание). Как видно из его названия, такое прерывание нельзя запретить. Оно будет принято микро- процессором по завершении выполнения текущей команды программы. Если немаскируемое прерывание получено при вы- даче запроса шины (BU SRQ), оно будет обработано после сня- тия BUSRQ. NMI приводит к загрузке содержимого счетчика команд (ре- гистра РС) в стек и загрузке адреса 0066Н в счетчик. Либо пере- ход, либо служебная подпрограмма должны быть записаны на- чиная с этого адреса (0066Н). В конце служебной подпрограм- мы должен стоять оператор retn для возврата из немаскируемо- го прерывания. INT (маскируемое прерывание, или просто прерывание). Это прерывание можно разрешить командой ei И запретить коман- дой di. Cy]_I_1CCTByIOT три режима работы — 0, 1 и 2, которые вы- бираются с помощью команд im 0, im 1 И im 2 COOTBCTCTBCHHO. Подпрограммы прерываний, использующие этот режим, дол- жны заканчиваться командой reti. Команда ei B подпрограмме прерывания должна предшествовать команде reti (CM. приме- ры 11 и 12). Прерывание, режим 0. Z80 работает в этом режиме после сброса или после выполнения команды im 0. Микропроцессор ожидает появления на шине данных или команды rst. или ко- манды са11. Обе эти команды приводят к загрузке содержимого счетчика команд в стек и затем выполнению перехода по неко- торому адресу. Команда rst является однобайтовой командой, обеспечивающей переход по одному из восьми адресов (ООН, 08H, 10Н‚ 18H, 20H, 28H, 30H, 38H). Прерывание, режим 1. Этот режим устанавливается по ко- манде im 1. Этот режим аналогичен режиму немаскируемого прерывания, за исключением того, что переход осуществляется по адресу 0038Н. Прерывание, режим 2 (векторное прерывание). Этот режим ус- танавливается по команде im 2. Вектор прерывания — это адрес, поставляемый периферийным устройством, которое иницииру- ет данное прерывание. Он используется в младшем байте указа- теля памяти на начальный адрес подпрограммы обработки пре- рывания. Используется косвенная адресация. 16-разрядный адрес подпрограммы прерывания образуется следующим образом: 
З-разрядный микропоцессор 69  \...—-—-—-—'jj  АО > 0 (должен быть нулем для двухбайтового адреса);  А1 — А7 от периферийного устройства выдаются на линии данных;  А8 — А15 из регистра 1 (который предварительно был загружен старшим байтом адреса таблицы векторов прерываний).  Эта таблица может содержать до 128 16-ра3рядных адресов, где хранятся программы обработки прерываний. Это обеспечи- вает 128 периферийных устройств своей собственной подпрог- раммой прерывания при подаче на параллельный порт 7-ра3- рядного адреса.  Пример 10. Векторная адресация. Начальный адрес таблицы векторов прерываний равен 8000Н, следовательно, в регистр 1 микропроцессора загружается число 80H. B системе имеется четыре устройства, которым соот- ветствуют векторные значения 00, 02, 04, 06.  “My, ....... LQAFJA -..- их: н...  Номер  Вектор“Ц.Адрес устройства обработчика прерывания l 00 A000 2 02 А050 3 04 A07F 4 06 AOA2 Рис. 3.14. Адреса подпрограмм обработки прерываний. Адрес Адрес обработчика __ прерывания _§000 00 Ё)! A0 80 02 50 _0003 A0 EM 7F ШЗ АО Жб А2 80 07 АО Рис. 3.1 5. Таблица векторов пре-  рываний, хранимая в памяти. 
70 Глава 3  МИКРОПРОЦЕССОР I Шина данных вывод Параллельный данных ввод/вывод рерыв rue Ввод IINT данных Й Устройство1 Адрес 00 Адресная - шина t‘ ' Данные 8002 L... 8003 Устройствоз Адрес04 А050 A051 Устройство 4 А052 Адрес 06  З-разрядная шина  Рис. 3.16. МП-система в режиме векторной адресации.  Информация об адресах обработчиков прерываний представ- лена в таблице на рис. 3.14, а таблица векторов прерываний — на рис. 3.15. Схема, показывающая значения разрядов ячеек памяти и регистров для случая, когда прерывание инициировано устрой- ством 2, представлена на рис. 3. 16.  3.3.8. Короткая подпрограмма прерывания  Содержимое любых регистров, используемое в подпрограммах прерываний, должно быть сначала перенесено в стек с по- мощью команды push и извлечено оттуда в обратном порядке с помощью команды рор в конце подпрограммы. Пустые опера— торы для немаскируемого и маскируемого режима 1 показаны ниже, за ними следует загрузочная подпрограмма главной про- граммы.  Пример 1 1 . Подпрограмма немаскируемого прерывания.  Адрес Машинный Ассемблер Комментарий код 0066 f5 push af ; только загрузить в стек  регистры, используемые в подпрограмме 
8—разрядный микропоцессор 71  Адрес Машинный Ассемблер Комментарий код 0067 с5 push bc 0068 d5 push dc {подпрограмма} 0080 с11 рор с1е 0081 cl pop bc 0082 й рор af 0083 ed 45 rent ;возвратиться из немас-  кируемою прерывания  Пример 1 2. Подпрограмма прерывания режима 1.  Адрес Машинный Ассемблер Комментарий код 0038 f5 push af 0039 c5 push bc 003A d5 push dc {подпрограмма} 0050 dl pop de 0051 cl pop bc 0052 й рор af 0053 fb ei ; снова разрешить преры- 0054 ed 4d reti вание ; возвратиться из преры- вания  \nvv\r\vVV\\V'  Пример 1 3. Загрузочная подпрограмма главной программы. Микропроцессор 280 после сброса возвращается к адресу 0000. Программы начинают работать с адреса 0100. Использует CH распределение памяти, представленное на рис. 3.4.  -  Адрес Машинный Ассемблер Комментарий КОД 0000 31 FF 5F ld sp, 5FFFH ; инициализировать указатель стека 0003 ed 56 im 1 ; инициализировать  режим прерывания 1 
72 Глава З Адрес Машинный Ассемблер Комментарий код 0005 fb ei ; разрешить прерывание 0006 с. 00 01 jp 0100Н ; Перейти к тому адресу, с ; которою стартует основ- 0100 ; ная программа 
Теория и программирование  Глава 4  Типы микропроцессоров  4.1.Типы микропроцессоров  4.2. Способы увеличения производительности‘ микропроцессоров  4.3. Компьютер с полным набором команд (CISC) 4.4. Компьютер с сокращенным набором команд (RISC) 4.5. Однокристальные микроконтроллеры  Главная цель данной главы заключается в том, чтобы ознако- миться с тремя различными подходами K архитектуре микро- процессоров: так называемыми CISC-, RISC- и Однокристаль- ной архитектур ами. На рисунке 4.1 показана взаимосвязь между этими тремя подходами.  МИКРОЭЛЕКТРОННЫЕ УСТРОЙСТВА  микропроцессоры  l I Однокристальный RISC clsc микроконтроллер  Рис. 4.1. Дерево микроэлектронных устройств.  4.1. Типы микропроцессоров  RISC И С1$С являются двумя альтернативными подходами к конструкции микропроцессоров. Основные особенности CISC- архитектуры перечислены в разделе 4.3, а ШЗС-архитектуры —; В разделе 4.4. 
74 Глава 4  Системы, в состав которых входят микропроцессоры, можно разделить на:  1) автономные, 2) специализированные, 3) встроенные.  Типичным примером автономной системы является персо- нальный компьютер (ПК), описанный в гл. 5. Однокристальный микроконтроллер (раздел 4.5) особенно по- лезен для специализированных систем, которые предназначены для конкретных приложений, например, для управления пе- чатью, измерений потока воздуха или автоматической регистра- ции скорости передачи данных. Встроенной системой называется система, в которой микро- процессор является частью другой системы, например такой, как Двигатель машины, самолет или система вооружения. В та- ких системах, как правило, необходим жесткий повременной контроль работы процессора. Осуществляется он средствами языка ассемблера или же языка программирования высокого уровня АДА, специально предназначенного для этой цели.  4.1.1. Факторы, влияющие на конструкцию системы  Конструкция системы зависит от того, что является главным критерием при ее создании —- стоимость или быстродействие. При сравнении микропроцессорных систем обычно принима- ются во внимание следующие факторы: 1) скорость обработки и передачи данных, 2) стоимость системы, 3) средства ввода/вывода, 4) физический размер.  4.1.2. Скорость обработки и передачи данных Факторы, влияющие на скорость вычислений:  1) тактовая частота, на которой работает данный микропро- цессор;  2) ширина системной шины данных;  3) время выполнения команд в микропроцессоре; 
Типы микропроцессоров 75  ....——.———j  4) конструкция системы;  5) выбор программных средств и методов программирова- ния.  Разработчики постоянно стремятся повысить быстродейст- вие микропроцессорной системы. Очевидно, чем выше быстро- действие системы, тем быстрее пользователь получит нужные ему результаты и тем точнее будут эти результаты. Тактовая частота настольных компьютеров, от которой на- прямую зависит скорость обработки данных, в последнее деся- тилетие увеличилась более чем в 100 раз. Создатели микропро- цессорных систем вынуждены ограничиваться тактовыми час- тотами, лежащими в некотором диапазоне частот, обычно опре- деляемом производителем конкретного микропроцессора. В последние годы ширина шины данных была увеличена с 8 до 16, а затем до 32 бит. При более широкой шине данных уменьшается число обращений к памяти, что снижает суммар- ное время доступа к памяти. Время выполнения команд, тактовая частота и ширина ши- ны данных определяются типом микропроцессора, выбранным для данной системы. Методы уменьшения времени выполнения команд, используемые производителями микропроцессоров, изложены в разделе 4.2. Оптимизация построения программ и применение опти- мальных методов программирования могут помочь достичь максимального быстродействия системы. Например, каждая программа должна быть разработана таким образом, чтобы про- цессор не производил ненужных вычислений во время ее вы- полнения. Код должен быть оптимизирован, т.е. при выполне- нии конкретной функции необходимо использовать наиболее Эффективные команды.  4.1.3. Стоимость системы  Следующие факторы будут влиять на стоимость микропроцес- сорной системы: 1) стоимость компонентов, 2) число интегральных схем, 3) ширина адресной шины, 4) ширина шины данных, 5) тип памяти. 
76 Глава 4  ъ  Стоимость отдельных компонентов микропроцессорной си- стемы будет, естественно, зависеть от рыночной цены на мо- мент производства этой системы. Вообще, самые последние разработки тех или иных устройств стоят значительно дороже аналогичных устройств, находящихся в продаже в течение Не- скольких лет. Число интегральных схем (ИС) будет влиять на общую сто- имость, причем помимо стоимости самих ИС должны учиты- ваться затраты на плату, межсоединения ИС и тестирование. С этой точки зрения однокристальный микроконтроллер (раз- дел 4.5) имеет преимущество над микропроцессорными систе- мами. Вообще говоря, чем шире адресная шина или шина дан- ных, тем дороже система. Если не возникает необходимости в использовании всех возможностей адресации памяти, ширину адресной шины можно уменьшить. Однако здесь нужно при- нять во внимание возможность дальнейшего усовершенствова- ния системы. Если снижение стоимости системы является бо- лее важным, чем ее быстродействие, то можно выбрать процес- сор, который будет работать с шиной данных, ширина которой равна половине разрядности выводимых данных, т. е. 16-раз- рядный процессор может быть использован в системе с 8-раз- рядной шиной данных. Кристаллы памяти с меньшим временем доступа к памяти обычно дороже, поэтому увеличение быстродействия приводит к увеличению ее стоимости.  4.1.4. Средства ввода/вывода  Микропроцессоры обычно имеют два вида средств ввода: па- раллельную шину данных и линии прерывания. Единственным средством вывода является параллельная шина данных. Все дру- гие средства ввода/ вывода должны быть конструктивной частью системы и могут включать как параллельные, так и последова- тельные порты. В то же время однокристальный микроконтрол- лер будет иметь параллельные, последовательные и, возможно, аналоговые средства ввода и вывода.  4.1.5. Физический размер  Физический размер модуля в большой степени определяется ко- личеством необходимых контактов, что в свою очередь зависит от ширины шин. Требуемое число соединений определяется 
Типы микропроцессоров 77  суммой соединений для адресной ШИНЫ, шины Данных и управ- ляющей шины, а также линий электропитания. На некоторых микросхемах соединения являются мультиплексными, т. е. многофункциональными.  4.2. Способы увеличения производительности микропроцессоров  В этом разделе обсуждаются некоторые способы увеличения производительности микропроцессоров. При описании каждого способа излагается только принцип его реализации. Осуществ- ление этих способов на практике может быть довольно сложным. Ниже изложены следующие способы улучшения производи- тельности микропроцессоров:  1) конвейерная обработка (раздел 4.2.1); 2) K3IJ_IVlpOBaHV[C (раздел 4.2.2); 3) перекрытие окон регистров (раздел 4.2.3);  4) управление и синхронизация микропроцессора (раздел 4.2.4).  4.2.1 . Конвейерная обработка  Конвейерная обработка —— это способ увеличения скорости об- работки команд путем разделения задания на некоторое число сегментов, выполняемых параллельно. Каждый сегмент, обыч- но состоящий из комбинационной логической схемы, отделен от других сегментов регистром. Конвейерная обработка обычно относится к командам и арифметическим операциям. Арифме- тический конвейер демонстрируется в примере 2. Конвейер команд считывает последовательные команды из памяти, в то время как ранее прочитанные команды уже обраба- тываются в других сегментах. Это приводит к перекрытию по Времени командных фаз fetch (выборка) и execute (исполнение), Что позволяет исполнять одну команду за один тактовый им- Пульс (см. пример 1).  Пример 1 . Конвейерная обработка команды. На рисунке 4.2 показан конвейер команд из пяти сегментов. Если каждый сегмент занимает по времени один тактовый цикл, 
78 Глава 4  СЕГМЕНТ ПРОЦЕСС ВЫПОЛНЯЕМЫЕ КОМАНДЫ 1 Команда выборки А В С D Е 2 Считывание/дешифрация ЁЁА D E 3 Any С D E 4 Считывание операндов В C D 5 Сохранение результата В C D Е  Тактовые  12З456789ц„к„ы  Рис. 4.2. Использование З-сегментного конвейера для обработки пяти ко- манд А, В‚ С, D и Е.  то процессор фактически работает со скоростью обработки од- ной команды за один цикл.  Пример 2. Арифметический конвейер. Этот пример иллюстрирует 3-сегментную систему, использу- юшую для вычисления выражения  Ai * Bi + Ci f0ri= 1, 2, 3,..., 9 Синхронизация N Bi  Сегмент 1 ВВОД  Сегмент 2 УМНОЖЕНИЕ  Сегмент 3  сложение и вывод  Сумматор  Результат  Рис. 4.3{‘KoH3encp арифметических Вычислений. 
Типы микропроцессоров 79  номер Сегмент 1 Сегмент 2 Сегмент З тактового ИМПУЛЬСа 111 R2 R3 R4 115 R6 1 Al Bl Cl 2 А2 B2 C2 3 A3 B3 C3 A2"'B2 C2 Al "‘B1+Cl 4 A4 B4 C4 A3 " B3 C3 A2 "' B2+C2 5 А5 В5 С5 А4 "‘ B4 C4 A3 "' B3 +C3 6 A6 B6 C6 A5 "‘ B5 C5 A4 * B4+C4 7 A7 B7 C7 A6 "‘ B6 C6 АЗ " В5+С5 8 A8 B8 C8 A7 " B7 C7 A6 " В6+С6 9 А9 В9 С9 А7 ‘ B7+C7 1o A8 " B8 +C8 11 А9 * В9+С9  Рис. 4.4. Таблица содержимого регистров.  регистры и комбинационную логику. Рисунок 4.3 демонстриру- ет, как эти операции разбиваются на три сегмента. Результат вы- числений каждого сегмента сохраняется в регистре и затем на следующем тактовом импульсе передается в следующий сег- мент. Операции в сегментах следующие:  Сегмент 1 (Ввод) Ai —> 111, Bi —> R2, Ci —> R3 Сегмент 2 (Умножение) 111 * 112 —› 114, 113 —› 115  Сегмент 3 (Сложение) (114+115) —› 116  Таблица на рис. 4.4 показывает содержимое регистров после каждого тактового импульса. Три задания, которые выполняют- ся девять раз (27 отдельных операций), выполняются в итоге за 11 тактовых циклов. В этом примере 27 заданий выполняются за 11 тактовых цик- лов, что дает увеличение скорости в 2,45 раза (27/ 11 = 2,45). Те- Оретически максимальная скорость использования конвейера Увеличивается пропорционально числу сегментов, в данном случае — в три раза.  4.2.2. Кэширование  Логические операции в микропроцессоре обычно выполняют- СЯ быстрее, чем обращение к оперативной памяти, поэтому Скорость вычислений ограничена, главным образом, временем 
80 Глава 4  доступа к оперативной памяти. Для того, чтобы преодолеть этот барьер, используется специальная высокоскоростная память, называемая кэш-памятью, или просто кэшем. Кэш-память уве- личивает скорость вычислений, обеспечивая более высокую скорость доступа микропроцессора к текущим программам и данным. Скорость доступа к кэш-памяти может превышать скорость доступа к оперативной памяти почти в семь раз. Кэщ может быть или частью микропроцессора, или отдельным, но непосредственно связанным с микропроцессором, устройст- вом. Кэш применяется для хранения сегментов программ, вы- полняемых в данный момент времени, а также для часто запра- шиваемых микропроцессором данных для текущих вычисле- ний. Важно отметить, что конструкция кэш-памяти должна быть такой, чтобы поиск Необходимой информации внутри нее осуществлялся с высокой эффективностью, ведь поиск не- обходимо производить всякий раз, как только происходит об- ращение к памяти. Примером может служить микропроцессор 68030 фирмы Motorola, имеющий встроенный кэш команд размером 256 байт и встроенный кэш данных такого же объема. И тот и другой кэш являются кэш-памятью с прямым отображением. Это означает, что каждое слово памяти имеет строго определенное местополо- жение внутри кэша. Кэш-память с прямым отображением фак- тически является уменьшенной копией оперативной памяти, поскольку очень близка к последней по своей организации.  4.2.3. Перекрывающиеся окна регистров  При работе с подпрограммами, вызываемыми из основной про- граммы, часто возникает необходимость передавать из нее чис- ловые значения либо в главную программу, либо в другие под- программы, работающие совместно с ней. Это можно осущест- вить путем выделения для этой цели блока оперативной памяти. Однако, чтобы избежать необходимости обращения к оператив- ной памяти, процессоры можно сконструировать с достаточно большим количеством регистров, и некоторые из них могут ис- пользоваться для передачи переменных из одной подпрограммы в другую. Подобная организация известна как перекрывающие- ся окна регистров. На рисунке 4.5 показана организация файла регистров, вклю- чающего 74 регистра, которые разбиты на три группы. Имеются 
Типымикропроцессоров 81  ms "лото R64 R” A НИ R55 D A а о  0 1 Общие  длявсех регистров 9  R32 R33 fig R49 в С в а. с R41 т? R57  Рис. 4.5. Перекрывающиеся окна регистров.  10 глобальных регистров, четыре группы по 10 локальных реги- стров и четыре группы по шесть регистров, которые являются общими для двух локальных групп. Такая конфигурация регистров очень удобна с точки зрения требований языков программирования высокого уровня, таких как Си и Паскаль, поскольку:  1) глобальные регистры предусмотрены для глобальных пе- ременных;  2) локальные регистры предусмотрены для локальных пере- меннь1х;  З) регистры общего назначения используются для обмена параметрами и результатами без обращения к оператив- ной памяти.  Общее количество регистров для каждого окна (так назь1вае- мый размер окна) определяется выражением:  GLOBAL + LOCAL + 2"'COMMON = 10 + 10 + 6*2 = 32 (рис. 4.5). 
82 Главв 4  4.2.4. Управление микропроцессором и его синхронизация  Импульсы, вырабатываемые генератором тактовых импульсов, поступают на бистабильнь1е мультивибраторы и регистры, включая и регистры в блоке управления. Однако содержимое регистров изменяет свое состояние только при условии получе- ния сигнала разрешения от блока управления. Существуют два основных способа организации управления: аппаратное и мик- ропрограммное.  микропрограммное управление  При микропрограммном управлении микропрограмма хранит- ся в ПЗУ. Основная схема работы показана на рис. 4.6. Некото- рая внешняя команда вызывает некоторую последовательность микрокоманд из ПЗУ.  Внешний Генератор ВХОД последовательности L управдя-  Управляющий 7 ‘ОШ-ее ПЗУ адресный регистр  Уравляющий регистр данных  выход  Следующая адресная информация  Рис. 4.6. Организация микропрограммного управления.  Каждая микрокоманда пересылается в управляющий регистр данных, который обеспечивает как внутренние, так и внешние управляющие сигналы. микропрограммное управление обычно используется в процессорах, где применяется архитектура со сложными KO’ мандами.  Аппаратное управление  При аппаратном управлении используется комбинационная ло- гическая схема, работающая с синхронизирующими импульса- ми, поступающими от последовательного счетчика. Такое уп- равление имеет преимущество в быстродействии, но лучше под- ходит для работь1 с простыми командами фиксированной длины (рис. 4.7).  Управляющий 
Типы микропроцессоров 83  д Код операции Адрес, регистр или операция ввода/вывода]  15 14 1211 0 Биты  | = о для режима прямой адресации | = 1 для режима косвенной адресации  Рис. 4.7. Типичная команда фиксированной длины.  Регистр команд  Ц 4-разрядный счетчику П риращение дешифратор4Х 16, F5 1413 12 11 10 1 0 I ОЧИСТКЭ вырабатывающий * Синхронизация gSrr;%cI::(1)eBnoBaTenbH Ь|Х дешифратор 3 Х 8 7 6 5 4 З 2 1 0 15 ч T1 то I 07 D0 A11 A1 АО  УПРАВЛЯЮШАЯ ЛОГИЧЕСКАЯ СХЕМА  '4"???  Управляющие выходы  Рис. 4.8. Пример аппаратного управления.  Аппаратная система управления, показанная на рис. 4.8, де- шифрирует микропроцессорные команды фиксированной дли- ны и вырабатывает управляющие сигналы. Формат Данных ко- манд представляет собой три поля, первое из которых отобража- ет режим адресации, второе — код операции, третье -— адрес.  4.3. Компьютер c полным набором команд (С|$С)  ПРИ создании набора команд для компьютера необходимо учи- тывать не только конструкции машинного языка, но и требова- HHS, предъявляемые языками программирования высокого Уровня. Один из способов повышения общей производительно- СТИ компьютера заключается в использовании сложных команд 
84  Глава 4  на уровне машинных кодов с тем, чтобы упростить трансляцию с языков высокого уровня. Наиболее важными характеристиками С1ЗС-процессоров являются:  1) 2)  3) 4)  5) б)  7)  большое число команд, обычно до 250;  команды, которые предназначены для выполнения специ- ализированных заданий и используются довольно редко;  как правило, от 5 до 20 различных адресных режимов; форматы с переменной длиной команды;  КОМННДЫ, которые управляют операндами В ПНМЯТИ;  СПСЦИЗЛИЗИРОВЗННЫС КОМЗНДЫ, которые предназначены ДЛЯ ВЫПОЛНСНИЯ НСКОТОРЫХ процедур ВЫСОКОУРОВНСВЫХ ЯЗЫКОВ И ПОЗВОЛЯЮТ сократить МЗШИННЫЙ КОД;  ВЫПОЛНСНИС КОМЭНД микрокода.  В качестве примера СЮС-микропроцессоров в следующем разделе приводятся основные характеристики микропроцессо- ра МС68000.  4.3.1 . микропроцессор мсввооо фирмы Motorola  (© фирмы Motorola)  Характеристики микропроцессора МС68ООО фирмы Motorola:  1.  32-разрядная внутренняя шина данных и 32-разрядные регистры.  16-разрядная внешняя шина данных. Старший (от D8 до D15) И младший (от D0 до D7) байты шины данных имеют отдельные стробирующие сигнальные линии, UDS И LDS соответственно, что упрощает управление 8-разрядными устройствами.  . 24—ра3рядная адресная шина (от АО до A23), обеспечиваю-  щая возможность адресации 224 (16 Мбайт) или 4M СЛОВ. Логическое состояние линии АО, которая нужна лишь для байтовой операции, определяет состояние линий UDS И LDS. LDS = 1, если АО = 1, и UDS = 1, если АО = О.  Разделение регистров на восемь регистров данных и семь адресных регистров памяти. 
Типы микропроцессоров 85  5. Возможность синхронной и асинхронной передачи по шине данных1. Синхронная шинная передача применяется в си- стемах, содержащих, например, устройства серии 6800, которые не имеют асинхронного режима.  6. Выполнение команд микрокода.  7. Наличие двух режимов работы — режима пользователя и режима диспетчера, — выбираемых функциональными кодами на управляющих линиях РСО, РС1 и РС2. Режим диспетчера является привилегированным уровнем работы и используется, например, при работе с операционными системами. В этом режиме доступны некоторые специаль- ные команды и регистры.  8. Управление памятью ввода/вывода.  9. Многие команды могут манипулировать байтами, слова- ми или длинными словами2, на что можно указывать при- соединением сокращений соответственно «.В», «.W» И «.L» к мнемонике операции.  10. Команды ассемблера имеют общий формат, обратный то- му, который принят в микропроцессоре Z80:  операция <исходный операнд>, <конечный операнд> 11. 14 режимов адресации: прямая регистровая, косвенная ре-  гистровая, абсолютная, относительная по счетчику ко- манд, непосредственная и неявная.  1 Синхронной называется такая передача данных, при которой генератор синхронизирующих импульсов контролирует операции пересылок Данных и все передачи занимают по времени определенное число тактов. Асинхронной Называется передача данных, при которой период передачи заканчивается при Получении специального сигнала уведомления (в случае микропроцессора 53000 данный сигнал называется DTACK). Такой тип передачи позволяет Включать в состав системы устройства с широким диапазоном значений време- "H доступа. 2 Байт = 8 бит, слово = 16 бит, длинное слово = 32 бит. 
86 Глава 4  \/сс Адресная шина А1-А23 Земля Синхро- ‚Ёанных низация - МП ' М” Управление Состояние FC0‘fi Mceaooo f UDS 3J°;H“;§°““°“ процессора рС1Н ms pc2{-—~ DTACK д Упразэлениее Е ‘-‘ Fl управление пери ерииными ‹._. д а би джем устройствами VMA за „Еде т VPA ACK ‚ц BERR ш Управление Управление системной “ESE ‘PU ПОЭОЫВЗНИЯМИ HALT Ш Обозначения сигнальных линий E Pa3p9“J9“V'9 FCx Функциональные коды для VMA on-9'7'CTB'4T9“bHb'|7' адрес пользователя или состояние “амят” диспетчера BERR Ошибка Шины |Р|_х Управление прерываниями R/W чТение/запись \/РА Действительный адрес СТрОб MIla,l1UJel'0 баЙТа периферийного Устройства да““'='х AS Строб адреса DTACK n°W39l3>'<»’19““9 "ередачи UDS Строб старшего байта данных 5-a””'°'X BR Запрос шины BGACK no-”‘T39D"<»’19H”9 BG Предоставление шины  ПОЭДОСТЗВЛЭНИЯ ШИНЫ  Рис. 4.9. Сигналы ввода/ вывода микропроцессора 68000.  4.4. Компьютер c сокращенным набором команд (RISC)  Идея ВВС-архитектуры — попытаться уменьшить время ис- полнения команд (добиться исполнения одной операции за один такт) путем упрощения набора команд. Наиболее важные характеристики микропроцессора с ВВС-архитектурой:  1) простой формат, относительно небольшое количество ко- манд‚  2) относительно небольшое количество адресных режимов, а 
Типы микропроцессоров 87  именно: регистровая адресация, непосредственная и от- носительная,  3) относительно большое количество регистров, что способ- ствует обработке операций внутри пространства регист- ров микропроцессора,  4) перекрывающиеся окна регистров,  5) обращения к памяти, ограниченные только загрузкой и записью команд,  6) выполнение одной команды за один такт с использовани- ем конвейеризации,  7) аппаратное, а не микропрограммное управление.  4.4.1. Микропроцессор МС88100 фирмы Motorola (© фирмы Motorola)  Микропроцессор МС88100 фирмы Motorola имеет следующие характеристики:  1) 32-разрядные регистры, шина данных и адресная шина, 2) 32-разрядные регистры общего назначения,  АдРЕскодА >  /L КОД \г  ДАННЫЕ дисп ЕТЧЕРА/ код дисп ЕТЧЕРА/ ПОЛЬЗОВАТЕЛЯ ПОЛЬЗОВАТЕЛЯ :› ЧТЕНИЕ/ЗАПИСЬ ДАННЫХ у, ВЫБОРКА КОДА БЛОКИРОВКА шины ДАННЫХ И п. Ёкодовьдй ОТВЕТ РАЗРЕШЕНИЕ БАЙТА D.AHHb|X/4 r зшивкд ОТВЕТ ДАННЬК СИНХРОНИЗАЦИЯ РАЗРЕШЕНИЕ ФАЗОВОЙ БЛОКИРОВКИ сврос _ Земля ПРЕРЫВАНИЕ  РАЗ РЕШЕНИЕ ПРОВЕРКИ ШИНЫ  Рис. 4.10. Сигналы ввода/вывода микропроцессора МС88100. 
88 Глава 4  3) раздельные порты памяти данных й команд, 4) конвейерная загрузка и запись,  5) 51 команда, эффективное выполнение за один такт путем использования конвейерной обработки,  6) 4-байтовые команды фиксированной длины,  7) режимы «диспетчера» и «пользователя».  4.5. Однокристальные микроконтроллеры  Все рассмотренные до сих пор процессоры сконструированы для работы в многочиповых (многокристальных) системах со многими микросхемами, и они не могут работать без внешней памяти. Однокристальный микроконтроллер, помимо регист- ров, арифметико—логического устройства и всего остального, что содержится в микропроцессоре, содержит также ОЗУ и ПЗУ и, возможно, аналого-цифровой преобразователь (АЦП)1 и тай— мер. Примером такого процессора является рассматриваемый ни- же микроконтроллер Philips 83/87С752 (8ХС752).  4.5.1. Микроконтроллер Philips 83/876752 (8XC752) (© фирм Philips Semiconductors И Signetics)  Микроконтроллер 8ХС752 — это однокристальный, З-разряд- ный КМОП-микроконтроллер? Основные характеристики дан- ной ИС перечислены ниже, а сигналы ввода/вывода показаны на рис. 4.11. Это устройство имеет 28-штырьковый корпус, при- чем многие контакты являются многофункциональными (пред- назначены для выполнения 2-3 функций). Пример применения микроконтроллера 8ХС752 рассматри- вается B гл. 5, где можно найти дополнительную информацию о данной ИС. Основные характеристики микроконтроллера 8ХС752 следу- ющие:  1 АЦП рассматриваюгсяв гл. 11. ‘ . _ 2 КМОП —— комплементарные струкгурьйнпа мегшш-ошсел-полупровод- НИК. 
Типы микропроцессоров 89  вводя/вы  \::‘.3335.;AHA П O!" O B ЫИ  АЦП  ВВОДА/ВЫВОДА 3  Внешний кристалл}  Аналоговое входное напряжение  8ХС752 Avcc  Avss  64-байт ОЗУ  .. .;.;.;.;.;.;.;.~_:_:,:_:, ,.  I  СБРОС Ё-КбЗЙТ  ПЗУ/СППЗУ  Рис. 4.1 1 . Сигналы ввода/вывода микроконтроллера 8ХС752.  1.  Двадцать одна линия ввода/вывода, использующая три порта (О, 1 и 3).  . Встроенный на кристалле генератор тактовых импуль-  сов с допустимыми частотами от 3,5 МГц до 16 МГц. Тактовые импульсы могут исходить и с внешнего крис- талла.  Встроенная на кристалле память состоит из:  0 программируемой памяти объемом 2К х 8 бит ПЗУ (83С752) или СППЗУ1 (87С752);  0 памяти данных объемом 64 >‹ 8 бит ОЗУ; О специального регистра функций объемом 128 байт.  5 каналов З-разрядного АЦП. Преобразование А в D 33.1-II/I~  мает по времени 40 машинных циклов (40 мкс с частотой 2 МГЦ).  1 СП ПЗУ -— стираемое, программируемое постоянное запоминающее уст- Ройство (кристалл c СППЗУ обычно используется для разработок приложе-  ний) 
90 Глава 4 5. 1б-разрядный автоматический перезагружаемый генера- тор тактовых импульсов.  6. 12С1 — последовательная шина ввода/вывода. Позволяет работать в качестве главного (master) или подчиненного (slave) устройства на небольшом сегменте сети.  7. З-разрядный вывод широтно-импульсной модуляции.  8. Семь фиксированных приоритетных линий прерывания.  1 PC — специальная звание-интегрируемая схемотехника ШИНЫ фирмы Philips. 
“шахт ""  Глава 5  применения микропроцессоров  5.1 . Системы управления и измерительная аппаратура: измеритель потока воздуха  5.2. Системы связи: цифровая обработка сигнала 5.3. Потребительские системы: настольный компьютер  В этой главе рассматриваются три применения микропроцессо- ров, относящиеся к трем различным областям электроники. В разделе 5.1 рассматривается использование микроконтрол- лера для измерения потока воздуха и, в определенных преде- лах, для управления этим потоком. Эта электронная система была выбрана потому, что ее легко изучать и она интересна с точки зрения разработки отдельного проекта. Требования к аппаратным средствам здесь минимальны, и всю систему можно собрать на монтажной плате. Хотя программирование системы следовало бы проводить на языке встроенного ассем- блера используемого микроконтроллера, производители ре- комендуют создавать программное обеспечение на языке Си. К сожалению, для этого необходим специальный компилятор языка Си. В разделе 5.2 описывается метод цифровой обработки сигна- Лов, применяемый в технике связи. Для тех, кто хотел бы приоб- рести дополнительный опыт в области обработки цифровых сигналов, здесь открывается возможность создания интересно- ГО проекта. В последующих главах в большинстве практических упраж- Нений предполагается использование персонального компью- Тера, поэтому в разделе 5.3 описываются основные характери- СТики персонального компьютера общего назначения. 
92 Глава 5  т на  5.1 . Системы управления и измерительная аппаратура:  измеритель потока воздуха (по документации Applications Note AN429 c разрешения фирм Philips Semiconductors И Signetics)  Приведенная здесь информация взята из документации Philips Semiconductors Microcontroller Products Applications Note AN429. B этой документации описывается недорогое устройст- во для измерения потока воздуха на основе микроконтроллера Philips 83/87C7S21. B конструкцию измерителя потока воздуха включены датчики, которые позволяют этому микроконтролле- ру измерять три параметра: скорость воздуха, давление и темпе- ратуру. Используемое программное обеспечение корректирует величину измеренного потока воздуха с учетом температуры и относительного давления, исходя из замеряемого потока возду- ха. Панель управления измерителя потока должна выглядеть так, как показано на рис. 5. 1.  7-сегментные индикаторы  СВЕТОДИОДЫ  F Поток Температура Давление Заданное воздуха значение  Установка заданного значения  Рис. 5.1 . Панель управления измерителя потока воздуха.  1 Микроконтроллер 83/87С752 рассматривался в гл. 4. 
Применения микропроцессоров 93  ’_______‚_._  5.1.1. Аппаратное обеспечение  На рисунке 5.2 приведена таблица, иллюстрирующая работу па- Hem! управления. Установка заданного значения позволяет вь1- бирать определенное значение потока, при достижении которо- го можно подать аварийный сигнал или выполнить какое-либо другое действие. С помощью программных средств установку заданного значения потока можно использовать для индикации достижения слишком высокого, слишком низкого или задан- ного значения потока. Конкретная величина заданного значения потока устанавли- вается путем поворота с помощью отвертки специального винта на передней панели. На рисунке 5.3 показана схема индикации измерителя потока воздуха.  cm Измеряемая величина Переключатель Поток воздуха Поток воздуха в кубических футах за минуту (CF M) Нет Температура Температура воздуха в градусах Цельсия SW1 Давление Давление воздуха в фунтах на квадратный дюйм SW2 Заданное значение Высокий или низкий аварийный уровень потока SW3  Рис. 5.2. Описание панели управления.  Рисунок 5.3 иллюстрирует один из примеров схемы мульти- плексной индикации, в которой есть четыре элемента — три се- мисегментных индикатора и, как одно целое, четыре отдельных светодиода (Поток, Температура, Давление, Заданное значе- ние). Светодиоды (СИД) соединены между собой таким обра- 3ом‚ что образуют один элемент индикации. Эти четыре элемента подключены к одной общей 8-разряд- ной шине данных, выводимой из порта 3 микропроцессора че- рез сильноточные формирователи и токоограничивающие ре- Зисторы. Четыре элемента индикации мультиплексируются (поочередно включаются) с использованием сигналов порта 0 Микропроцессора, который поочередно замыкает общий катод Каждого индикатора на землю через полевой транзистор, когда данные для соответствующего элемента находятся на выводах Порта З. Принципиальная схема всей системы показана на рис. 5.4. В таблице на рис. 5.5 приведены сигналы, посылаемые к 
94 Глава 5  NUOQO  Ё Ё Ом .: CI Ё _ 9 I I I I I I сегментов Ё 3 9 в ,9 5 - ТЕМПЕРАТУРА Vcc Ё cg Ё |x1oo| |x1.o| |xo.1 | ; Ф ц О ' о s о Земля зАдАнное ЗНАЧЕНИЕ Земля Земля ПОЛЭВЬПЭ Светодиоды транзисторы С е о- \/сс ASOLH Мультиплекси- VCC ход рующие входы \/сс Х 1.0 Х1О.О Земля  Рис. 5.3. Принципиальная схема индикации измерителя потока воздуха.  axc7s2 1 KOM  AVCC XTAL1 Внешняя  значение 100 XTAL 2 Схема  AVSS Уз: RST I...‘ Vac 10 мкФ  Земля  Рис. 5.4. Принцнпиальная схема измерителя потока воздуха, 
Применения микропроцессоров 95 порт 1.3 Порт 1.4 Нажатая Измеряемая клавиша величина ВЫСОКИЙ ВЫСОКИЙ Нет Поток воздуха НИЗКИЙ ВЫСОКИИ SW1 Температура ВЫСОКИЙ НИЗКИЙ SW2 Давление воздуха НИЗКИЙ НИЗКИЙ 5w3 Заданное значение  Рис. 5.5. Таблица переключений.  выводам 1.3 и 1.4 микропроцессора при нажатии кнопок на панели. В таблице на рис. 5.6 показаны конфигурация порта 1 и поступающие на него входные сигналы.  Сигнал Входы Порт 1 Вывод Кон и а ия Величина П имечание (контакт) ф ryp ц р 1.0 АЦП, вход 0 Датчик Система измеряет давление воздуха давления относительно атмосферного давления. воздуха Датчик давления КР100А выводит разницу напряжений, которая затем усиливается для получения некоторого значения в диапазоне между Vcc и Vdd. ОН калибруется с помощью резистора R1. 1.1 АЦП, вход 1 Заданное Заданное значение -—— это напряжение, значение регулируемое с помощью резистора R2. 1.2 АЦП, вход 2 Температу- Датчик температуры обеспечивает ра воздуха некоторое абсолютное напряжение, пропорциональное температуре. В схему датчика включен усилитель, который устанавливает разность потенциалов между AVss и AVdd. Выходное напряжение датчика калибруется с помошью резистора R3. 1-3 Логический Кнопочные Три переключателя выбирают Одно 14 вход перекпю- из четырех логических условий, чатели как показано в таблице на рис. 5.5. 15 Логический Поток Измерение скорости воздуха выполняется вход воздуха воздушно-турбинным тахометром, подключаемый через оптрон. 1-6 Логический Релейный Реле можно использовать для подачи выход контроль сигнала тревоги или для выполнения какого-либо иного действия с целью зашиты оборудования. P"°. 5.6. Входные сигналы порта 1, 
96 Глава 5  5.1.2. Разработка программного обеспечения  Программное обеспечение для измерителя потока воздуха поч- ти полностью написано на языке высокого уровня Си с исполь- зованием специального программного пакета поддержки разра- боток. Программа состоит из основной программы, функции main(), И Четырех подпрограмм обработки прерываний. Блок- схема функции main() показана на рис. 5.7.  ВКЛЮЧЕНИЕ СБРОС ПИТАНИЯ инициализировать переменную Считать числовое значение потока воздуха 35 Установлен Считать числовое флаг показать о 0,0 значение температуры NoFLOw? Считать числовое . Нед значение давления [ Считать состояние 1 Э клавиши Скорректировать поток воздуха с учетом да темпе а ы и давления р Тур Нажата SW1? Показать Ё температуру гСчитать заданное значение] Нет Заданное Да значение больше Нет Нажата SW2? Показать давленЁЫ измеренного потока воздуха? Нет Еазомкнуть еле Ёамкнуть репе да р j _l Нажата SW3? Показать заданное значение Нет Установлен ФЛЭГ Да UPDATE? CFM Ё МАХ Показать EEETW ' Да . Нет [ Сбросить флаг ЦРОАТЕД ' n0'<333Tb ”0T°'< —1 воздуха  Рис. 5.7. Измеритель потока воздуха, блок-схема основной программы. 
Применения микропроцессоров 97  Отображаемая информация определяется состоянием кла- виш на панели управления и флагом NOFLOW (нет потока). Ес- ли величина потока воздуха превышает 30 куб. фут/мин (СРМ), на индикаторе высвечивается ошибка (ЕЕЕ). Прерывания обрабатывают четыре подпрограммы:  INT 3 Multip1ex() выполняет регенерацию индикаторов; INT 6 ReadSwitch() указывает, была ли нажата клавиша; INT 0 Ca1cCFM() вычисляет поток воздуха; INT 1 Overfl0w() указывает на переполнение.  INT 3 MuItiplex()  Работает независимо. Таймер 1 генерирует прерывание по ли- нии INT 3 приблизительно каждую миллисекунду. Это исполь- зуется для «карусельного» мультиплексирования четырех свето- диодных индикаторных элементов путем поочередного задейст- вования выводов Р0.О‚ Р0.1‚ Р0.2 и Р0.4 соответственно, что обеспечивает регенерацию каждого индикаторного элемента приблизительно каждые 4 мс.  INT 6 F?eadSwitch()  Предварительное пересчетное устройство с широтно-импульс- ной модуляцией сконфигурировано для периодической генера- Ции через каждые 10,3 мс прерывания по линии INT 6. После 32 прерываний устанавливается флаг UPDATE (O6HOBI/1Tb), BbI3bI— вающий переключение на чтение вводимых данных и обновле- ние информации на индикаторе каждые 330 мс.  INT 0 CalcCFM()  Скорость воздуха определяется временным интервалом между прерываниями по линии INT 0, которые связаны с таймером 0. Таймер 0 хронирует младшие 16 разрядов 24-разрядного регист- Pa c частотой 1МГц. Таким образом, этот регистр хранит время В микросекундах.  /NT 1 Overflow()  ЕСЛИ временной интервал, определяемый прерыванием по ли- НИИ INT О, слишком велик, что приводит к сильному возраста- Нию старших 8 разрядов регистра таймера О, то устанавливается 
98 Глава 5  флаг NOFLOW (нет потока). В этом случае на индикаторе вы- свечивается значение 00.0.  5.2. Системы связи: цифровая обработка сигнала (digital signal processing — DSP)  B этом разделе описывается использование микропроцессоров для обработки сигналов1. Для цифровой обработки сигналов можно использовать специальные интегральные схемы, обеспе- чивающие достаточно высокое быстродействие, однако для большей гибкости предпочтительно применять специализиро- ванные ВЗР-микропроцессоры. Все операции над сигналами должны выполняться в реальном масштабе времени, поэтому од- ним из наиболее важных требований, предъявляемых к таким микропроцессорам, является наличие встроенных аппаратных функций умножения и деления. Для поддержки высокого быст- родействия современные ИС цифровой обработки сигналов имеют встроенную память в виде ПЗУ, ОЗУ и кэша. Они могут, кроме того, иметь как параллельные, так и последовательные порты. Такие специализированные ИС выпускаются фирмой Texas Instruments, которая также выпускает специальный комп- лект для макетирования «DSP Starter Kits» B помощь разработ-  АМПЛ ИТУДЗ Н есущая  Рис. 5.8. Амплитудная модуля- ция — амплитудно-частотная Частота диаграмма.  НБП ВБП  Амплитуда  Рис. 5.9. Однополосная моду- ляция — амплитудно-частотная НБП Частота диаграмма-  1 Обработка сигнала — это техника селекции, фильтрации и усиления cur- налов связи. 
Применения микропроцессоров 99  оБП- Фильтр ВХОД —{ Смеситель! ш нижних частот Демодулированный v Гетеродин V СИГНаП полосовои „_ Фильтр Цифровои Фазовый сдвиг ПООЦЭССОО + О Фильтр J Bl СмесительО нижних частот  Рис. 5. 1 O. Демодулятор однополосных сигналов фазового типа.  чику систем цифровой обработки сигналов. Для иллюстрации возможностей использования цифровой обработки сигналов на рис. 5.10 показана блок-схема однополосного АМ-приемника для приема амплитудно-модулированньт‘ сигналов в одной боко- вой полосе (ОБПР, а на рис. 5.11 изображена блок-схема еще од- ного варианта приемника, где цифровая обработка использует- ся для фильтрации сигналов.  ОБП‘ Фильтр ВХОД Ч Смеситель! W НИЖНИХ  частот Демодулированный Гетеродин СИ ГН ад Полосовой ` Фильтр Г“ Цифровои Фазовый сдвиг "роцессор  + 9О° Ц Фильтр J {Смеситель О |—-D-‘ нижних  Ч астот  Рис. 5. 1 1 . Приемник однополосных сигналов с ВБР-фильтром.  1 Амплитудная модуляция — это способ передачи информационных сигна- лов, при котором предназначенная для передачи информация используется для Изменения амплитуды несущей волны. Несущая — это синусоидальная волна Постоянной амплитуды. Частота несущей должна быть неизменной и значитель- Ho более высокой, чем наивысшая частота модуляции. 2 При базовой амплитудной модуляции возникают две боковые полосы и несу- Wax (рис. 5.8). Эта система хороша для простых приемников сишалов, но она Крайне расточительна, если принять во внимание требуемую мощность приемни- ков и передатчиков и разделение каналов. Поскольку обе боковые полосы несут Одну и ту же информацию, то на самом деле достаточно передавать лишь одну из НИХ. При использовании модуляции с одной боковой полосой выделяется либо Нижняя боковая полоса (НБП), либо верхняя боковая полоса (ВБП), см. рис. 5.9. 
100 Глава 5  Вход радиосигнала F CU = - cg AHaIl0l'0BblVl u: L. „ за Цифровом ““"°“ Ё 3 процессор Ц Ф Ё’: О о. н  :._._.:;.  и '-cf-2 .’.’.’. д). Ь. . ‚ . . . .- >1-. -Z\-!-I-I-I-Z-I-Z-  Рис. 5.12. Функциональная схема ВЗР-приемника.  Согласно рис. 5.10, после предварительной селекции в поло- совом фильтре (ПФ), принимаемый сигнал разветвляется и по- дается на 1- и О-смесители1. Синусоидальный сигнал с гетеро- дина (Г) непосредственно подается на вход смесителя I И с фазо- вым сдвигом + 90° на вход смесителя Q. Сигналы звуковых час- тот с выходов смесителей после усиления подаются на схемы преобразования Гильберта (НТМ-фильтры). Когда с этих пре- образователей два сигнала поступают на суммирующую схему Е, сдвиг фаз, внесенный смесителями и фильтрами, приводит к исчезновению одной боковой полосы и увеличению мощности сигнала в другой. И наконец, демодулированный сигнал прохо- дит через фильтр нижних частот (ФНЧ) и усиливается. Схема на рис. 5.11 является модификацией схемы на рис. 5.10, вместо схем фильтрации и суммирования используется цифро- вой процессор сигналов. На рисунке 5. 12 представлены основные элементы ВЗР-при- емника. В схеме на рис. 5.12 после селекции входного сигнала 1- и Q- СИГНЗЛЫ направляются к аналоге-цифровым преобразователям (АЦП)?  АЦП, которые включают схемы выборки и хранения3, про-  1 Обозначения 1 и Q вообще используются для указания синфазных и квад- ратурных (квадратура -- сдвиг по фазе на 90°) каналов соответственно. Фаза Q отстоит от 1 либо на + 90°, либо на — 90°. 3 Аналоговый сигнал может представлять собой простую синусоидальную волну или сложную волну, состоящую из многих синусоидальных компонент. Аналоговые сигналы могут иметь любое значение между их максимальными И минимальными значениями. Типы АЦП рассматриваются в гл. 11. 3 При оцифровке изменяющегося со временем аналогового сигнала необхо- димо хранить выборку в течение периода преобразования. 
Применения микропроцессоров 101  изводят выборку аналогового сигнала с частотой, по меньшей мере в два раза превышающей наивысшую частоту входного сигнала1. Частота синхронизации при преобразовании зависит как от типа АЦП, так и от разрядности выходного сигнала. Ана- логовый выходной сигнал получается с помощью цифро-анало- гового преобразователя (ЦАП)? Схема цифровой фильтрации обрабатывает цифровые экви- валенты выборок, взятых через равные промежутки времени. Эти выборки представляют мгновенные значения аналогового входного сигнала. Основная идея большинства способов цифро- вой фильтрации заключается в усреднении последовательных выборок, которые затем взвешиваются3 для реализации требуе- мых характеристик фильтра. Хотя этот ВБР-вариант однополос- ного демодулятора является более сложным по сравнению с его аналоговым эквивалентом, он обладает двумя важными преиму- ществами:  1) путем изменения программного обеспечения можно реа- лизовать демодуляцию сигналов при других способах мо- дуляции;  2) можно реализовать такие технические характеристики фильтров, которые либо труднодостижимы, либо вообще невозможны при использовании обычной аналоговой схемы.  5.3. Потребительские системы: настольный компьютер  Настольные компьютеры с высокими эксплуатационными ха- рактеристиками, предназначенные как для домашнего исполь- зования, так и для коммерческой деятельности, стали доступны C начала 80-х годов.  А  ‘ Это необходимо для предотвращения эффекта «наложения спектров» (по- Явление ложных низкочастотных составляющих в спектре дискретизированно- ГО сигнала), что является некоторым видом Искажения, ВНОСИМОГО при оциф- ровке сигнала. 2 См. гл. 10, где объясняется, что такое ЦАП. 3 Взвешивание -- это процесс умножения некоторой велшшны на заданный Множитель. 
102 Глава 5  Персональный компьютер (ПК) относится к классу на- стольных компьютеров, разработанных фирмой 1ВМ. За по- следние 20 лет персональные компьютеры постоянно совер- Шенствовались, следуя за все более новыми и более совершен- ными разработками микропроцессоров фирмы Intel. Попу- лярность персональных компьютеров обусловлена тремя фак- торами:  1) рекламой -— как самих персональных компьютеров, так и неотделимых от них операционных систем фирмы Microsoft,  2) очень широким выбором прикладных программ,  3) архитектурой аппаратного обеспечения, многократно уве- личиваюшей гибкость этого устройства общего Назначе- ния, что позволяет пользователю выбирать из большого набора модулей подходящие сменяемые схемные платы в соответствии со своими интересами и финансовыми воз- можностями.  При выборе компьютера для лаборатории прикладной электроники пункт 3 был одним из главных факторов появле- ния у автора интереса к персональным компьютерам. К пла- там1, непосредственно вставляемым в разъемы (слоты) мате- ринской платы ПК, относятся программируемый параллель- ный интерфейс ввода/вывода2, интерфейс для подключения устройств со средней скоростью передачи данных (накопители на гибких дисках и т. д.), транспьютеры (сверхбольшие интег- рированные схемы, содержащие микропроцессор, средства межпроцессорной связи, собственную оперативную память и средства доступа к внешней памяти) и средства подключения к сети (сетевые платы).  5.3.1. Компьютерная система  Цифровые компоненты настольных компьютеров обладают сходной структурой. Аппаратные модули компьютера располо- жены вблизи конкретного микропроцессора и связаны с ним  1 Платы — это печатные платы, укомплектованные наборами микросхем и внешними соединителями. 1 См. гл. 9, где рассматривается параллельный интерфейс. 
Применения микропроцессоров 103  Последовательный  \ порт  КЛЭВИЭТУРЭ МОНИТОР ПОРТ Параллельный принтера порт  Рис. 5.13. Порты персонального компьютера.  посредством системы шин. На рисунке 5.14 показаны общие компоненты компьютерной системы, а задняя панель типично- го ПК показана на рис. 5.13. В персональном компьютере большинство важных компо- нентов, включая микропроцессор, ПЗУ и ОЗУ, находятся на ма- теринской плате. Щелевые разъемы (торцевые соединители)‘ также установлены на материнской плате: они обеспечивают соединения с шиной управления, адресной шиной и шиной Данных. В Щелевые разъемы можно вставить самые разнообраз- ные платы. При включении компьютер первым делом начнет считывать команды загрузки, записанные в ПЗУ. Затем он загружает в опе- ративную память операционную систему, которая обычно хра- нится на жестком диске. Последним шагом в процессе загрузки компьютера будет загрузка прикладной программы с жесткого, гибкого или компакт-диска (CD). Как правило, в ПК имеется, по меньшей мере, один парал- лельный принтерный порт и один последовательный порт. Параллельный принтерный порт можно использовать для вь1- сокоскоростной передачи данных с другого компьютера. По-  ‘ Щелевые разъемы, используемые на материнской плате, часто называют слотами (slots). 
Применения микропроцессоров 105  следовательный порт, часто называемый «СОМ-портом», ис- пользуется для связи с периферийными устройствамид на- пример с модемом или плоттером. Можно использовать прин- тер, принимающий данные или в последовательной, или па- раллельной форме3 .  не  1 Периферийные устройства —- любые вспомогательные устройства, nonco- единенные к компьютеру. 2 Последовательная передача данных обсуждается в гл. 8. 3 Параллельная передача данных обсуждается в гл. 9. 
Глава 6  Структура г ц программного обеспечения  6.1 . Разработка программного обеспечения 6.2. Конструирование программ методом сверху вниз 6.3. Структурное программирование 6.4. Псевдокод 6.5. Блок-схемы  В этой главе рассматриваются основные принципы создания программного обеспечения. Ее Цель — дать читателю общее представление о структуре программных средств перед тем, как он приступит к работе над программным кодом. Главный «видимый» результат какого-либо программного проекта -— работающая программа, поэтому зачастую хочется немедленно приступить к написанию кода, особенно если речь идет о программах небольших размеров. К сожалению, обычно это приводит к плохо структурированным программам, с кото- рыми довольно трудно работать. Если вы поддались искушению сразу же приступить к написанию кода (как, я думаю, делает большинство из вас), неплохо было бы вначале бросить ретро- спективный взгляд на само проектирование. Таким образом вы можете проверить, насколько ваша программа отвечает основ- ным принципам построения программных средств. Применяя такой подход систематически, на ранней стадии разработки программного обеспечения приходится тратить много времени. Программный код при этом появляется не так быстро, и польза от подобной методики не всегда очевидна. Од- нако следует помнить, что различные методы построения про- граммных средств разработаны, исходя из принципов, которые были выведены после долгого опыта успешной работы как от- дельных программистов, так и компаний по разработке про- граммных средств. Создание программ не является отдельным направлением в естественных науках, суть заключается в`том, 
Структура программного обеспечения 107  чтобы использовать некий метод, который позволит получать хорошо написанные, «читабельные» программы.  6.1. Разработка программного обеспечения  Помимо вышесказанного, структурное программирование (вклю- чая хорошо написанную документацию) предпочтительнее по следующим причинам:  1. Если необходима помощь при отладке программы, то го- раздо удобнее работать со структурированной программой.  2. Большие проекты требуют включения в них объектных модулей, разрабатываемых или созданных ранее незави- симо друг от друга, что неизбежно приводит к необходи- мости разбиения какого-либо проекта на несколько от- дельно взятых частей.  3. Программное обеспечение часто эксплуатируется не его создателями, а совершенно другими людьми, и им необ- ходимо понимать структуру программы. Один из способов организации разработки программного про- дукта заключается в том, чтобы разбить его на несколько частей, каждая из которых решает определенную задачу или представляет собой фазу развития одного и того же процесса. Следующие пять  цап.  Фаза Примечание Результат Анализ Цель состоит в том, чтобы добиться Документация ясного понимания предназначения по техническим системы и концепций, требованиям лежащих в ее основе. Проектирование Определяет способ достижения Структурная схема требуемых характеристик. или программа на псевдо-языке. Реализация Кодирование проекта программы Программный код на языке программирования. Тестирование Тестирование Работающие подсистем и отладка функций ФУНкции ОТЛаДка функций Тестирование Тестирование законченной системы Работающая Системы в целом, а при необходимости таюке система Отладка аппаратных и программных средств. документация  Рис. 6.1 . Подзадачи разработки программного продукта. 
108 Главв 6  фаз, учитывающих требования заказчика и интересы пользовате- ля (рис. 6.1), позволяют добиться работающей системы/проектад На каждой фазе решается конкретная задача. Конечный результат каждой фазы является основой для начала следующей.  6.2. Конструирование программ методом сверху вниз  Смысл любого процесса типа «с верху- вниз» (или от сложного к простому) заключается в том, чтобы начать с общей идеи (или устройства), а затем последовательно разбирать ее на все мень- шие и меньшие части. Такой подход к конструированию про- граммы обеспечивает систематический анализ программного задания. На рисунке 6.2 показана структурная схема, представ- ленная в виде дерева, где компоненты нижнего ряда являются составными частями компонента верхнего ряда.  Преобразовать температуру ` 1  7 [т ‚ Выбрать Ввести Преобра- Вывести преобразование температуру зовать результат ’ I . :I ‘ Напечатать _ выб Tb Вычислить Вычислить Вычислить M H on Ира (выразить) (выразить) (выразить) ею 1 ЦЮ РиКдляС СиКдляР СиРдляК  Рис. 6.2. Структурная схема примера А.  Пример А. Структурная схема температурного преобразова- теля. Нарисовать структурную схему программы, целью которой является преобразование температур между шкалами Цельсия, Фаренгейта и Кельвина.  1 Под системой понимается весь комплекс предпринятых действий, mono- чая и взаимодействие с аппаратными средствами. -- Hpwu. перев. 
Структура программного обеспечения 109  _...-—--T2’  6.3. Структурное программирование Правила структурного программирования:  1. Модули программы должны быть не очень большими, а их назначение — легким для понимания.  2. Модули программы должны иметь лишь одну точку входа в начале каждого модуля и одну точку выхода в конце.  3. Программы должны использовать комбинации компо- нентов только трех простых типовых конструкций:  0 последовательности: две операции или много опера- ций, следующих по очереди одна за другой,  0 выбора: выбор одной составной части из двух или более возможных,  0 итерации: повтор одной или нескольких операций при определенном условии.  6.3. 1 . Структурное программирование Джексона (СПд)  Техника структурного программирования Джексона основана на 4-х типах компонентов, перечисленных ниже.  1. Элементарный — не имеющий никаких подразбиений на составляющие компоненты.  2. Последовательность — два или более компонентов, следу- ющие последовательно друг за другом.  3. Выбор — один компонент, выбираемый из некоторого чис- ла альтернатив.  4. Итерашш — один компонент, повторяемый ноль раз или больше.  Каждый компонент типа последовательности, выбора или итерации может быть, в свою очередь, компонентом последова- тельности, выбора и итерации, и, таким образом, может быть Сформирована структура любой степени сложности. 
110 Главаб  Элементарный  Элементарные операции включают в себя следующее: Инициализация Открыть файлы Программа, программируемые порты ввода/вывода  Программное завершение Закрыть файлы Выход в систему (в операционную среду) Ввод/Вывод Ввод данных из файлов или с клавиа- туры Вывод данных на экран или принтер Счет Арифметическая или логическая операции Последовательность  На рисунке 6.3 показана некая последовательность АВС, разде- ленная на три отдельные части.  LABC  7ILe‘1Lé1  Рис. 6.3. Последовательность.  Выбор  Компонент выбора показывает, что можно сделать выбор лишь в том случае, если из нескольких альтернатив должен быть вь1— бран один единственный компонент. Небольшой кружок в  Авс] д В Г - J A  °LB°|L°°|  E  Рис. 6.4. Выбор. 
Структура программного обеспечения 1 11  квадратах во втором ряду показывает, что АВС является компо— нентом выбора, и что Должен быть отобран один из трех предло- женных компонентов (рис. 6.4.).  Итерация  Итерация состоит из одного компонента, который повторяется ноль раз или больше. Диаграмма (рис. 6.5) показывает процесс А с повторяющимся процессом В. Звездочка указывает на то, что процесс В должен быть повторен ноль раз или больше.  А 1 Т  *_  Ш  Рис. 6.5. Итерация.  Пример Б. СПД-схема. На рисунке 6.6 структурная схема примера А модифицирова- на с тем, чтобы учесть правила структурного программирования Джексона (СПД). Применение правил приведено в таблице На рис. 6.7.  Преобразовать температуру О L Т 1  Напечатать Выбрать * *  Вычислить меню опцию . .  —|  __|:_Т 4 ___l_: Г О О О Опция С Опция F Опция К |TB::fi::)aTypy ggsagipa  L  O Вычислить и вывести С и F для К  О Вычислить Вычислить и вывести и вывести РиКшяС СиКдляР  Рис. 6.6. СПД-схема. 
112 Главаб  Название комтжет Разложение компонента на части Преобразовать Последовательность Напечатать меню температуру трех компонентов Выбрать опцию Вычислить Напечатать меню Элементарньпй компонент, Нет вывод на экран Выбрать опцию Выбор из трех компонентов Опция С Опция F Опция K Вычислить Итерация и последовательность Ввести температуру двух компонентов Преобразовать Ввести Элементарный компонент, Нет температуру ввод с клавиатуры Преобразовать Выбор из трех компонентов F И K для С С и К для F C И F для K Вычислить Элементарный компонент, Нет и вывести вывод результата  вычислений на экран  Рис. 6.7. Краткое изложение СПД-схемы.  6.4. Псевдокод (структурированный английский) Псевдокод, иногда называемый структурированным англий-  ским, является полезным средством в процессе разработки программы и может использоваться при следующих обстоя-  ТСЛЬСТВЗХЁ  1) как промежуточный шаг между процессами построения программы в диаграммах и на языке команд;  2) непосредственно для описания алгоритма счета;  3) в документации программы для описания ее логики с PIC‘ пользованием формальной записи.  Перевод проекта программы, написанной в псевдокодах, на язык высокого уровня, такого как Си, является относительно про’ 
Структура программного обеспечения 113  стой процедурой. Соглашения, принятые в языке Си, использу- ются в последующих компонентах. Запись не только выбора, но и итерации может зависеть от типа выражения. Операторы отношения, логические операторы и операторы побитовых операций перечисляются ниже. Все они могут применяться в выражениях. Каждый из них сравнивает величину х с величиной у, например х > у.  Операторы отношения  < меньше <= меньше или равно => больше или равно > больше != не равно == равно  Операторы побитовых операций  & побитовая операция И (AND) | побитовая операция ИЛИ (OR) ^ побитовая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR) << сдвиг влево >> сдвиг вправо ~ дополнение до 1 (отрицание1)  Логические операторы  Это те операторы, результатом вычисления которых может быть либо О (ложь), либо 1 (истина):  && И (AND) || ИЛИ (OR)  6.4. 1 . Последовательность  Последовательные компоненты могут представлять собой либо Элементарные строки кодов, либо целые функции. Функции оп- ределяют в начале программы, когда дают им имена.  1 ^‘ заменяет единицы на нули и наоборот. 
114 Глава 6  6.4.2. Выбор  Определенный компонент выбирается из двух или более частей.  Могут применяться две формы выбора:  1. С помощью оператора if else. Заметьте: else является нео- бязательным параметром.  if (выражение) оператор 1 else оператор 2  2. С помощью операторов switch И case  switch (выражение) case значение 1 : оператор l case значение 2 : оператор 2 case значение 3 : оператор 3 case значение п : оператор п  6.4.3. Итерация Существуют две альтернативы:  1. Для неопределенного числа итераций используется опе- ратор while  while (выражение) оператор  Пример итерации, которая выполняется всегда  while (1) :I 
Структура программного обеспечения 115  .....--—-1?‘  2. Для определенного числа итераций используется опера- тор for  for (начальное значение; конечное значение +1; значение шага) оператор  Еслий -— определенная переменная и итерациядолэпша быть по- вторена 11 раз от О до 10, оператор for будет иметь следующий вид  f0r(i = О; i < 11; i++)  Пример В. Псевдокод. Данный пример является одним из вариантов псевдокода СПД-схем с рис. 6.6:  main компонент print выбрать опцию С, F ИЛИ К  input выбор зшйтсщвыбор ) { case C : Ca1cCon(1) case F : Ca1cCon(2) case K : Са1сСоп(3)  }  Са1сСоп(переменная) /* Вычислить переменную преобразования = 1, 2 или 3 */ {  input температура  switch(r1epeMeHHa;1) { case 1 pI'int{BbI‘1I/ICJICHI/I6 F И К} case 2 pl'int{BbI‘1I/ICJICHI/I6 C и К} case 3 pl'int{BbI‘1I/ICJICHI/I6 С и F}  }  }while(TeMnepaTypa != выходная величина)  6.5. Блок-схемы  Блок- схемы являются полезным вспомогательным средством Для описания того, как работает конкретная программа. Схема в 
116 Главаб  Ввод выбора С, F или K Ф Ввод температуры выбор = С да Вычислить и напечатать F И К для С ? Нет да в в В б = F ЫЧИСЛИТЬ ы Op и напечатать С и К для F ‘Р Нет Выбор = K да Вычислить с и напечатать С и F для К 7 Нет Температура = Нет э выходная величина ? да КОНЕЦ  Рис. 6.8. Блок-схема примера А.  виде диаграммы особенно хорошо подчеркивает логику про- граммы, процесс счета и управления программой. Блок-схема совершенно не зависит от выбранных языков программирова- ния, она полезна при написании программы и на машинных ко- дах, и на языках высокого уровня.  Пример Г. Блок-схема. На рисунке 6.8 показана блок-схема для примера преобразо- вания температуры. Полный текст программы на языке Си мож- но найти в гл. 7. 
TW“""‘  Глава 7  Программирование на языке Си  7.1 . Введение в язык Си 7.2. Восемь этапов программирования на языке Си 7.3. Создание программ на языке Си 7.4. Отладка программы 7.5. Примеры программ и упражнения 7.6. Выбранные ответы  Основные понятия и упражнения, изложенные в данной книге, предназначены для студентов инженерных специальностей, по- этому язык программирования, используемый при работе над этими упражнениями, должен отвечать определенным требова- ниям: быть пригодным для инженерного дела, общепризнан- ным и профессиональным. Язык Си был впервые создан в Ве11 Laboratory B начале 70-х годов, успешно развивался в течение 80-х и на сегодняшний день стал самым распространенным язы- ком программирования. Существует большое количество книг разного уровня сложности, посвященных этому языку, и чита- телю отнюдь не помешало бы изучение в процессе обучения ка- кой-либо специальной книги по данной тематике. В главе 7 Приводится информация, необходимая читателю при работе над упражнениями, предлагаемыми в последующих главах. Перед началом работы необходимо сделать два важных заме- чания, касающихся программных файлов:  1. Всегда сохраняйте исходный и исполняемый файл каждой программы, над которой вы работаете.  2. Когда у вас со временем появится большое количество программ, важно помнить, что записывать имена про- грамм следует таким образом, чтобы по ним можно было легко определить их назначение (имен программ, совпа- 
118 Глава?  дающих с именами пользователей, или таких как «рго3_имя», следует избегать). Имена программ могут со- держать максимум восемь символов (DOS).  7.1. Введение в язык Си  Высокоуровневые языки, например такие, как Си, компилиру- ют выполняемый файл, который написан в двоичных машин- ных кодах и специально для микропроцессора, который эти ко- ды понимает. Для того, чтобы написать программу на языке Си, вы должны обладать подходящим программным обеспечением, надлежащим образом установленным на вашем компьютере. В комплект программ обычно входят текстовый редактор, биб- лиотечные файлы, компилятор, компоновщик, файлы помощи и примеры программ. Термин переносимость означает, что программа, написанная на одной системе, будет работать и на другой системе с таким же микропроцессором. Программы на языке Си в целом более портативны по сравнению с программами, написанными на других языках. Если изменение программ необходимо, то в ка- чественно написанной программе достаточно будет изменить лишь несколько строчек кода в ее начале. Компиляторы языка Си, как правило, доступны на многих системах и функциони- руют как на З-разрядных микропроцессорах, так и на супер- компьютерах. Язык программирования Си — это язык, ориентированный на программистов, он дает возможность обращаться непосред- ственно (напрямую) к аппаратным средствам и позволяет рабо- тать с отдельными битами в памяти. Он обладает большим коли- чеством операторов, что позволяет записывать выражения в ко- роткой форме. Такие задачи, как, например, преобразование данных из одного формата в другой, в языке Си записываются проще, чем в ряде других языков программирования. В Си так- же имеется B наличии большая библиотека полезных функций, которые удовлетворяют потребностям широкого круга програм- мистов. Наконец, есть возможность поработать с файлом помощи. Не- плохо было бы заглянуть в файл помощи всякий раз, когда вы сталкиваетесь с незнакомой функцией. Файл помощи даст вам ссылки на файлы, необходимые при работе с конкретной функ- циеи. 
Программирование на языке Си 119  a-"""-—:'?  7.2. Восемь этапов программирования на языке Си  Этап 1. Определение цели продраммы (требования пользователя!  Вам необходимо сделать следующее:  1. Описать в общих чертах, что вы хотите, чтобы делала ваша программа?  2. Решить, какие начальные данные необходимы для вашей программы?  3. Точно определить все возможные операции с числами или текстом.  4. Установить, какую конечную информацию вы хотели бы получить в результате работы своей программы.  Этап 2. Построение программы  Используйте один из методов построения своей программы, описанный в гл. 6.  Этап 3. Запись кода  Здесь речь идет о процессе перевода идеи программы на язык Си. Любой текстовой редактор используется для создания того, что носит название файла исходного кода (файл, содержащий Текст программы). Данный файл исполняет роль «отображе- НИЯ» вашей программы действий, изложенной на языке Си. Пример исходного файла приведен на листинге 7.3.1. Коммен- Тарии в нем приводятся внутри скобок /* */‚ например /* Комментарии */. Вложенные комментарии не разрешены. Все функции приводятся в начале программы (за исключением Выражения main()) И являются ее частью. Все переменные дол- Жны быть задекларированы либо перед строкой main(), если Приведенные переменные доступны для всех функций про- граммы (в этом случае они называются «глобальными» пере- менными global), либо в начале каждой функции (тогда они но- °ЯТ название локальных переменных 1оса1). Тип данных — int (дВУХбайтовое целое число), char (СИМВОЛЬНОС), float (четырех-  Эйтовое Вещественное) и т. д. -—— должен быть определен Зара- Нее. 
120 Глава 7  шт  На этом этапе программа получает имя с расширением «.с»_ Например, программа, приведенная на листинге 7.3.1, могла бы иметь название ascii.c.  Этап 4. компилирование  Работа компилятора заключается в переводе исходного файла в последовательность машинных двоичных кодов. Различные микропроцессоры понимают различные машинные коды, поэ- тому компилятор должен преобразовать исходный файл B ма- шинный язык конкретного микропроцессора. Результат работы компилятора — файл, записываемый в памяти с расширением obj, например, когда программа Ascii.c, приведенная на листин- ге 7.3.1, преобразуется компилятором, она получит название ascii.obj. n 5. МПОН ка к  Если программа была скомпилирована без ошибок, то компо- новщик создает при работе выполняемый файл. Вообще у компоновщика три назначения:  1) собрать необходимый загрузочный программный код для системы, в которой он будет исполняться,  2) собрать вместе библиотечные файлы в окончательном ва- рианте программы,  3) собрать воедино любые другие файлы, написанные ранее (и предназначенные для данного проекта).  Если все нужные файлы представлены, компоновщик со- здаст файл с расширением .ехе (на листинге 7.3.1 это файл азсйехе).  Qmgn 6. Работа программы  Запустить на исполнение программу можно путем простого на- бора имени программы в командной строке (для листинга 7.3.1 надо набрать «ascii»). Для некоторых программ, например ДЛЯ тех, которые требуют наличия входных данных из какого-либо файла, целесообразно было бы сначала создать файл с конт- рольными данными, предназначенными для тестирования ра- ботающей программы. 
Программирование на языке Си 121  __....—.—-——  Этап 7, Тестирование и отладка прорраммы  Важно убедиться в том, что программа делает именно то, что вам нужно и для чего она предназначена. Ниже приводится список контрольных вопросов:  1. обрабатывает ли программа весь диапазон входных дан- ных подобающим образом?  2. Как реагирует программа на наличие неверных данных?  3. Соответствует ли конечный результат работы программы ее назначению?  4. Нормально ли ФУНКЦионирует работающая программа в компьютере?  Будет ли работать программа многократно?  Влияет ли она на какое-либо другое программное обеспе- чение в операционной среде, включая и саму операцион- ную среду?  Этап 8. Сохранение и изменение программы  Когда программы начинают работать, часто появляется необхо- димость провести некоторые изменения с целью решить ряд не- ожиданно возникших проблем:  1) для устранения ошибок, появляющихся в результате вво- да непроверенных данных,  2) для включения в программу другой функции или особен- ности,  3) для использования программы в другой системе (напри- мер, B другой операционной среде).  Для того, чтобы программой можно было легко управлять (имеется в виду ее изменение или устранение ряда ошибок), важно, чтобы она была хорошо задокументирована (т. е. содер- жала бы не только команды на языке Си, но и включала в себя Подробные комментарии). 
122  Глава 7  7.3. Создание программ на языке Си  Ознакомьтесь с листингом 7.3.1.  1.  Программа начинается с комментария, вложенного в скобки /* */. Здесь содержится информация об имени программы, ее назначении и каких-либо других деталях, имеющих отношение к делу, например дате создания про- граммы или имени автора. Комментарий игнорируется компилятором; его цель — дать тому, кто будет ее про- сматривать, общее представление о программе.  Затем следуют заголовки внешних файлов, необходимых при работе программы. Каждому заголовку файла пред- шествует директива #include. Все внешние файлы связаны с программой.  В этом простом примере далее следует функция main(). Все программы должны содержать main(); слово void впе- реди указывает на то, что в конце функции main() не оста- нется никаких переменных (т. е. данная функция не воз- вратит никаких значений).  В следующей строке после функции main() стоит откры- вающая фигурная скобка { . Все функции должны обладать фигурной открывающей и закрывающей скобками {}. Хорошим стилем программирования считается писать операторы языка Си, заключенные внутри фигурных скобок с отступом —- это улучшает «читабельность» про- грамм.  После открывающей скобки любые локальные перемен- ные должны быть задекларированы. Локальные перемен- ные ——- это те переменные, которые используются в фун- кции, в которой они задекларированы. Следовательно, выражение int character определяет переменную целого типа, называемую символом (character).  Оператор printf() пересылает текст, заключенный в кавыч- ки, на экран. Заметьте, что значок \п переводит курсор эк- рана на новую строку.  . Оператор getch() ожидает ввода начального значения С  клавиатуры и сохраняет его в памяти под именем «char- acter». 
Программирование на языке Си 123  ____.«—j  8. Оператор printf() B предпоследней строке выводит текст, заключенный в кавычки, на экран, подставляет начальное значение «character» B спецификации %с и АЗСП-код это- го символа в спецификации %i.  9. Наконец, заканчивается программа закрывающейся фигур- ной скобкой} функции main().  а  /*ascii.c HporpaMMa ВЫВОДЕ! значения АБСП-кода введенного символа */ тление < stdio.h> /* описание внешнего файла для оператора printf() */ void main() { int character; printf("\n Введите символ."); character = getch(); printf("\n ASCII-KOII СИМВОЛЗ %с есть %i",charactcr,charactcr);  Листинг 7.3.1 asCii.c.  7.4. Отладка программы  Отладка программы — это процесс поиска и исправления оши- бок в программе. Существуют три главных момента, когда эти ошибки могут проявиться:  1) когда компилируется (и создается объектный файл .obj), 2) когда собирается (и создается выполняемый файл .ехе)‚ З) когда программа работает.  Компилятор окажет вам помощь при компиляции програм- МЫ (1), если вы будете читать сообщения об ошибках достаточ- Но внимательно. Есть две главные причины того, что компиля- Тор не в состоянии закончить свою работу: обнаружение либо синтаксической ошибки, либо ошибочно набранного символа при ВВОде. Синтаксическая ошибка появляется, если не соблюдены Правила языка Си. На рисунке 7.1 приведен список типичных ошибок, сообще- НИЯ о которых могут появиться в листинге 7.3.1. Заметьте, что Некоторые ошибки вызывают несколько сообщений. 
124 Глава?  7.4.1 . Типичные ошибки  Строка Ошибка Сообщение об ошибке или результат void main(); Точка с запятой после Нужно объявить оператора main() Идентификатор  int character  printf(\n Введите сим- вол. ")  Character = getch();  printf("ASCII-Kort сим- вола % с естьй 96 \п‚ character, character);  printf("ASCII-Kort сим‹ вола % с есть i 96 \n", character);  Нет точки с запятой после character  Отсутствуют кавычки перед \п  Прописная С в начале character. Система учитывает регистр.  i % BMt:(‘TO 96 i  Вторая метка символа отсутствует  Ошибка синтаксиса объявления переменных  Недопустимый символ \ Неопределяемьтй символ ‘п Введи-ц Отсутствует вызов функции ) Незаконченная строка  Неопределенный символ  Это приведет к ошибке при выполнении программы, вместо АЗСП-кода будет напечатано '1 96  Это приведет к ошибке при выполнении программы, вместо АБСП-кода будет напечатан О  Рис. 7.1 . Типичные ошибки.  7.5. Примеры программ и упражнения  Следующий набор программ представляет множество дополни-  тельных функций  и процедур.  7.5.1 . Упражнение «Вывод строк, функция printf()»  Функция printf() может быть использована как для печати строк, так и для вывода значений переменных. Листинг и экран выво- да показаны ниже.  Замечания:  1. Переменная MILES определена (define) как число 26.  2. Переменная YARDS определена (define) как число 385.  3. Переменная, названная «km», объявлена в качестве пере‘ менной вещественного типа (т. е. как число с плавающеи точкой). Под нее отводится 4 байта памяти. 
Программирование на языке Си 125  _...————j  4. %= символ формата.  5. %f напечатает число с плавающей точкой в десятичном формате.  ,-jj  /*string.c Вывод строк */ #include <stdi0.h> #define MILES 26 #define YARDS 385 void main() { float km; /* Объявление переменной, км */ km = 1.609*(MILES+YARDS/ 1760.0); /* Вычислить в км */ printf("\n Марафон — это %f километров \п \п"‚ km); }  Листинг 7.5. 1 . string.c.  L Марафон — это 42.185970 километров J  Рис. 7.2. Экран вывода листинга 7.5.1  Вопросы:  А. В каком формате мы получим ответ, используя специфи- кацию %е?  Б. Размер поля вывода и количество цифр после десятичной точки определяются путем подстановки некоторого числа между значками % и f. Что получится в результате, если мы установим спецификацию %4.2f?  7.5.2. Упражнение «Вывод числа байтов, зарезервированных под переменные»  Эта программа использует функцию языка Си sizeof(). ЦСЛЬ -— показать число байтов, зарезервированных под различные типы переменных. Скомпилируйте и запустите эту программу. Лис- тинг и окно вывода приведены ниже. 
126 Глава 7  /*sizc.c Эта программа выводит число байтов, выделяемых системой под различные типы переменных */ #include<stdio.h> void main() { Drintf("\n"); printf("HAHE‘IATATb РАЗМЕР в БАЙТАХ\п"); printf(“char %d/n", sizeof(char)); printf("int %d/n", sizeof(int)); printf("long %d/n", sizeof(long)); printf("fl0at %d/n", sizeof(fl0at)); printf("doublc %d/n", sizeof(double));  Листинг 7.5.2. size.c.  НАПЕЧАТАТЬ РАЗМЕР В БАЙТАХ  char 1 int 2 long 4 float 4 double 8  Рис. 7.3. Экран вывода листинга 7.5.2.  7.5.3. Упражнение «Преобразователь числа»  Преобразовать десятичное число в шестнадцатеричное или нао- борот. Следует сделать следующие замечания:  1. Функция scanf() обеспечивает ввод с клавиатуры. Дейст- вие этого оператора заканчивается с вводом сигнала воз- врата каретки (CR). Спецификация %d заставляет функ- цию scanf() считывать десятичное число. Амперсенд (&) пе- ред идентификатором переменной необходим при ис- пользовании этой функции для ввода числа.  2. Спецификация %Х вынуждает функцию scanf() считывать шестнадцатеричное число, а функция pn'ntf() выводит его на экран. 
Программирование на языке Си 127  __‚———  /* number.c Использует функцию scanf() для ввода данных */ #include<stdio.h> void main() { int datain; printf(“BBcnme десятичное целое число "); scanf("%d»,&datain); .. printf("\n%d десятичное = %Х шестнадцатеричное \n\n",datain,datain); ргйпгГ("\п\пВведите шестнадцатеричное число"); scanf("%X",&datain); printf("\n%X шестнадцатеричное = %с1 десятичное \n\n",datain,datain);  Листинг 7.5.3. number.c.  Введите десятичное целое число 25 25 десятичное = 19 шестнадцатеричное Введите шестнадцатеричное число а4 А4 шестнадцатеричное = 164 десятичное  Рис. 7.4. Окно вывода листинга 7.5.3.  На рисунке 7.4 показано окно вывода при соответствующих значениях введенных чисел:  десятичное число 25 шестнадцатеричное число а4  7.5.4. Упражнение «Очистка экрана»  Часто возникает потребность во время работы программы очи- стить экран. Этого можно достичь несколькими путями в зави- симости от системы или версии языка Си, с которой вы работа- ere. Ниже приведены три варианта очистки экрана, используйте их по очереди в предыдущей программе.  1. После директивы #inc1ude<stdio.h> вставьте директиву #include<stdlib.h> и, если нужно очистить экран, вставьте оператор system("cls").  2. Если хотите очистить экран, вставьте оператор printf("\033[2J"). 
128 Глава 7  3. После директивы #1'ncIude<stdio.h> вставьте новую дирек- тиву #include<conio.h> и, если нужно очистить экран, вставьте оператор clrsrc().  7.5.5. Упражнение «Цикл for»  Это упражнение по повторению какого-либо преобразования (итерация). Такую возможность предоставляет нам цикл for. Окно вывода показано на рис. 7.5, а листинг дан ниже. Обратите внимание на следующее:  1. В функции for:  ° идентификатор i инициализирован (т. е. i получил началь- ное значение переменной, в данном случае оно равно 1);  0 максимальная величина i yCTaHOBJIeHa, B данном случае она меньше 11;  0 шаг цикла установлен, в данном случае оператор i++ оз- начаетй =i+ 1. Элементы программы между скобками будут выполняться вплоть до 10, включая само число 10.  2. Двойка между значками % и d обеспечивает поле вывода длиной в два разряда.  /*for.c Итерация с использованием цикла for*/ #includc<stdio.h> #includc<stdlib.h> void main() { т: 1; float f = 1; /* инициализирует переменную ‘f и устанавливает ее начальное значение, равное 1*/« ' system("cls"); for(i = 1;i<11;i++) /* Llrcpaunsx */ { f = РЕ; printf("/n%2d факториал = %.0f",i,t); }  } Листинг 7.5.5. for.c. 
Программирование на языке Си 129  ГЁЙ 14мжториал=1 2 Факториал = 2 3 Факториал = 6 4 Факториал = 24 5 Факториал = 120 6 Факториал = 720 7 Факториал = 5040 8 Факториал = 40320 9 Факториал = 362880 10 Факториал = 3628800  Ф  Рис. 7.5. Окно вывода листинга 7.5.5.  7.5.6. Упражнение «Квадраты чисел»  А. Напишите программу, которая печатает квадраты чисел от 1 до 20.  Б. Напишите программу, которая позволяет ввести число п и напечатать число n2. Эта программа должна повторять процесс пять раз, прежде чем закончить свою работу.  7.5.7. Упражнение «Запись данных в массив»  На рисунке 7.6 представлена структурная схема этого упражне- ния. В листинге показано, как записать данные в массив. В дан- ном случае массив называется data и обозначение [21] указь1ва- ет Ha то, что 20 целых чисел могут быть сохранены в памяти от местоположения data[0] до data[19]. Позиция под номером [20] зарезервирована для символа конца массива, который простав- ляется там автоматически. Отметьте следующее:  1) %х указывает на ввод или печать числа в шестнадцатерич- ном формате,  2) \t означает табуляцию,  Запись данных I [ _ 1 ‚ 1 Напеч атать Ввести Напечатать и записать записанные команды данные данные  Рис. 7.6. Структурная схема для листинга 7.5.7. 
130 Глава 7  3) необходимо очистить входной буфер с помощью функции fi'lush(), иначе функция scanf() будет неправильно воспри- нимать введенное число, если оно не шестнадцатеричное.  /*storc.c Записать данные в массив */ Т #inc|ude<stdi0.h> #incIude< std1ib.h> void main() { 1nt 1; int data[21]; /* Объявить массив, который может вместить 20 целых чисел в ячейках памяти от 0 до 19 */ system("cls"); printf("\n Введите 20 шестнадцатеричных чисел, нажимайте <Enter> после каждого введенного числа\п\п"); for(i = 0;i < 20; i++) { printf("%2d",i+1); /* Напечатать Данные под номерами от 1 до 20 */ scanf("%X"&data[i]); /* Записать данные под номером i */ fflush(stdin); /* Освободить входной буфер */ } printf("\n\n\n Ввод данных завершен\п"); or(i = О; i < 20; i++) /* Повторное чтение данных */ printf("\n%d\t%x",i + 1,data[i]); }  Листинг 7.5.7. store.c.  7.5.8. Упражнение «Изменения в упражнении 7.5.7»  А. Измените программу с учетом ввода чисел и их печати В десятичном виде.  Б. Найдите разницу между использованием спецификаций %х и %Х в функции printf(). 
П‘  Программирование на языке Си 131  .---F‘-——  7.5.9. Упражнение «Запись данных на диск»  На рисунке 7.7 приведена структурная схема для этого упражне- ния. Отметьте следующие моменты:  1.  Напечатать команды, * ввести имя Файла  Этот листинг разбит на функции: main(), DataIn() и DiscStore().  При написании базовых функций языка Си всегда ис- пользуются строчные буквы. Соглашение об использова- нии как строчных, так и прописных букв при написании имен функций программы удобно с точки зрения повы- шения «читабельности» программы (по имени функции можно судить о ее предназначении). Это также гарантиру- ет отсутствие конфликтов между выбранными именами функций и ключевыми словами языка Си.  Изменение числа TOTAL B начале программы необходи- мо для того, чтобы изменить число вводимых байтов.  Идентификатор filename —— это локальная переменная  функции main(), поэтому ее нужно передать дРУГим функ- циям, чтобы они могли с ней работать.  Эта программа использует условный оператор в форме функции if().  Когда файл открывается, автоматически появляется некое число, называемое handle. B данном случае это число будет записано под именем переменной fd. Данное число всегда  Записать данные на диск  L _ g Й _ - :l_ Зап исать  Ввести и записать данные На диск  ДЭННЫЭ В МЭССИВ  _ _t_ - 3 ть Открыть фаил аниса - данные в фаил  1  I_ ii Подтверждение о о записи данных gggfufigige B Файл  Рис. 7.7. Структурная схема листинга 7.5.9. 
132 Глава?  н?  ы  /*discstor.c Ввести данные в массив, назвать файл, открыть его на ди- ске и записать данные на диск "‘/ #include<stdio.h> #include<dos.h>  #include<io.h> /"' Определить функцию открытия “‘/ #include<sys\stat.h> /* Определить S_IW RITE */ #define TOTAL 20 /* Изменить число байтов путем изменения числа после TOTAL */  char data[TOTAL+1]; /* Определить глобальный массив */ void Dataln(char[14]); /"' Определить функции */ void DiscStore(char[ 14]); void main() { char fi1cname[14]; /* Записывает имя файла "‘/ data[TOTAL + 1] ='/0'; printf("\nBBoz1 данных и их запись в массив\п"); DataIn(f1lename) /* Вызывает Dataln И передает имя файла */ Disc Store(filename) /"' Вызывает DiscStorc И передает имя файла */  } void DataIn(char filename[ 14])  { int i; system("cls"); printf("\n Введите %i два шестнадцатеричных числа\п\п”‚Т0ТАЬ); for(i = 0; i < TOTAL; i++) /"' Итерация "‘/  printf("%2d",i + 1); scanf("%X",&data[i]); fl'lush(stdin); } printf("\n\nBBez1HTe имя дискового файла"); scanf("%s",filename);  }  void DiscStorc(char filename[14]) { int fd,bytes = 0; fd = creat(fi1ename,S_IWRITE); /* Создать или открыть файл “‘/  ___;-U4  Листинг 7.5.9. discstor.c. 
Программирование на языке Си 133  .---——  if(f = = -1) /* Выбор */ printf(”\nHeJIb3s1 создать файл: %s",f11ename); else bytes = write(fd,data,TOTAL); /* Записать в файл fd ИЗ массива данных TOTAL байтов */ if(bytes == = -1) printf("Hm<a1<He байты не пишутся в файл: %s",filename); else printf("\n %d записано в файл: %s",bytes,filename); close(fd); \ я  Листинг 7.5.9. (Продолжение)  используется, когда происходит обращение к файлу. Если оно равно —1‚ то это будет означать появление ошибки, по— этому в программе оно сравнивается с —1 (fd == —-1). 3a- МСТЬТС, что если вы напишете (fd = -1), ТО это будет озна— чать, что вы присвоили переменной fd значение —1.  7.5.1 О. Упражнение «Тестирование упражнения 7.5.9» А. Проверьте, правильно ли записаны данные в дисковом файле. 1. Запустите программу.  2. Введите последовательность шестнадцатеричных чисел, представляющих «читабельные», легко узнаваемые АЗСП-коды, такие как:  41 42 43 44 45 46 47 48 49 4а 4Ь 4с 4d 4e 4f 51 52 53 54  3. Воспользуйтесь командой DOS type filename для показа co- держимого файла. Если были использованы данные, по- казанные выше, то вы должны увидеть на экране следую- щее:  ABCDEFGHIJKLMNOPQRST  Б. Используйте диск только для чтения с целью получения сообщения об ошибке «Нельзя создать файл» 
134 Глава 7  7.5.1 1. Упражнение «Загрузка данных с дискового файла»  На рисунке 7.8 приведена структурная схема для данного nuc- тинга. Отметьте следующее:  1. Функция DiscLoad() возвращает действительное число байтов, загруженных в память. Только одна переменная может быть возвращена из функции.  2. Сначала должна быть исполнена программа discstor с тем, чтобы появился файл, открытый для чтения.  3. В строке read() число байтов в файле впервые определяет- ся при помощи функции filelength().  4. Когда печатаются данные, любые двоичные числа с еди- ницей в самом старшем разряде должны принимать отри- цательные значения. Для того, чтобы сохранить отрица- тельный знак, все свободные разряды в левой стороне за- полняются единицами, и поэтому будут напечатаны с Пре- обладанием символов FF.  Загрузить данные с диска  I I  l__  Напечатать Заг зить нные py да Напечатать команд ы, из дискового „ - данные ввести имя фаила фаила L ‚  4 ‚ _ „ П фат |[дзздзгдзфай„]  I _  O  Подтвердить о чтение данных из файла  Сообщение об ошибке  Рис. 7.8. Структурная схема для листинга 7.5.11. 
Программирование на языке Си 135  ___‚_‚_‚_——  ‚.—-————  /*disc1oad.c Загрузить данные с дискового файла */  #include<stdio.h> /* Требуется для функций printf() И scanf() */ #include<stdlib.h> /* Требуется для функции system()*/ #include<io.h> /* Требуется для функций ореп() и read()*/ #include<sys\stat.h> /* Чтобы определить S_IREAD */  int DiscLoad(char[14]); /* Объявление ФУНКЦИЙ */ void PrintData(int); char data[100]; /* Массив байтов */ void main() { int bytes,i; char f1lename[ 14]; system(“cls"); printf("\n3arpy3HTe данные с дискового файла\п"); ргйпп'("\пВведите название дискового файла >"); scanf «%s>>,fi1ename); ,_ _ bytes = DoscLoad(filename); /* Вызов функции Disbljoadfi "'/ PrintData(bytes); 5 } int DiscLoad(char f11ename[14]) { int fd,bytes = 0; fd = open(f1lename,S_IREAD);  if(fd = = -1) printf("\nHeJ1b35I открыть файл: %s\n",filename); else  { read(fd,data,(bytes = fi1elength(fd))); printf("\n%d байтов загружено из %s\n", bytes filename);  } close(fd); return bytes; /* Число прочитанных байтов из файла будет передано обратно в главную программу */  void PrintData(int bytes) { int i; for(i = 0; i < bytes; i++) /* Напечатать данные */ printf("\n%2d %4X", i + 1,data[i]);  he  листинг 7.5.11. disc1oad.c. 
136  Глава 7  7.5.12. Упражнение «Альтернативная загрузка  данных с дискового файла»  Ниже приводится альтернативный листинг загрузки данных с дискового файла, в котором используется ввод из командной строки. Заметьте следующее:  1. Аргументы командной строки — int argc и char *argv[] —  позволяют воспринимать данные, которые требует про- грамма, при помощи последовательности строк символов, разделенных пробелами, вслед за именем самой програм- мы. argc записывает число строк, название программы идет в первой строке. *argv — указатель адреса массива. Таблица, приведенная на рисунке 7.9 и создаваемая в про- цессе работы программы, содержит адрес каждой команд- ной строки. Каждая строка затем последовательно запи- сывается в память.  argv[1], адрес имени дискового файла, передается функ- ции DiscLoad() из главной программы main().  Пример А. int argc И char *argv[]. Если в каталоге EXERCISE программа выполняется путем ввода из командной строки  discld2 <datafile>,  то программа создает таблицу, такую как на рис. 7.9, в которой приведены адреса каждой строки. Затем появляется следующая таблица (рис. 7.10), в которой записываются эти строки.  Адрес Содержимое FFD6 FFDC FFD8 FFFF3 РИС. 7.9. СТРОКИ GJIDCCOB КО‘ мы мандной строки. Массив строк argv[] Адрес Строка [0] FFDC c:\exerc1§e\d1§kld2.exe Рис. 7.10. Строки, сохра- [1] РРРЗ datafile НСННЫС в адресах, данных В таблице рис. 7 .9. 
Программирование на языке Си 137  _.......—-———j  /*discld2.c Загрузить данные с дискового файла. Ввести имя файла с командной строки "‘/  #inc|ude<stdio.h> /* Требуется для функций printf() И scanf() */ #inc|ude<stdlib.h> /* Требуется для system()*/ #1'nc|ude<io.h> /* Требуется для функций ореп() и read()*/  #include<sys\stat.h> /"' Чтобы определить S_IREAD */ int DiscLoad(char filename[ 14]); /* Объявление функций */ void PrintData(int); char data[100]; /* Массив байтов */ void main(int argc, char *argv[]) { int bytes,i; if(argc < 2) /* Убедиться в том, что имя дискового файла было введено */ { printf("\nBBemm: ИМЯ файла после discld2 \n"); exit(1);  system("cls"); printf("\n3arpy3m‘c данные с дискового файла \п"); bytes = DiscLoad(argv[1]); /* Вызов функции DiscLoad() */ PrintData(bytes); } int DiscLoad(char f1lename[ 14]) { int fd,bytes = 0; fd = open(f11ename,S_IREAD);  mm==4) printf("\n Нельзя открыть файл: %s\n",f_1lename); else г  { read(fd,data(bytes = fi|elength(fd))); ‚ printf("\n%d байтов загружено из %з\п”‚ьутев‚й1епатё); } close(fd);  &.._____  Листинг 7.5.12. disc1d2.c. 
138 Глава?  на  Ё return bytes; /* Число прочитанных байтов из файла будет передано обратно в главную программу */ } void PrintData(int bytes) { . int i; for(i = 0; i < bytes; i++) /* Напечатать данные "‘/  printf("\n%2d %4X", i + l,data[i]);  Листинг 7.5.1 2. (Продолжение)  7.5.13. Упражнение «Преобразование температуры»  Одним из способов представления пользователям возможно- сти выбрать какой-либо из нескольких вариантов является ме- ню. Следующая программа демонстрирует этот способ органи- зации интерактивного взаимодействия пользователя и маши- ны. Листинг для этого упражнения можно найти на структур- ной схеме рис. 6.6, но чтобы не искать эту схему в книге, мы  Преобразовать температуру  г_1_._„ I  -k -k 55i?«”»3‘”  Напечатать меню  с с с Опция С Опция F Опция К Преобразовать " У ' J  Вычислить‘?  и вывести ‘ C и F для К  I ВЫЧИСЛИТЬО и вывести F и К для С  и вывести р С и К для F  Рис. 7.11. Повторение СПД-схемь1‚ приведенной в гл. 6. 
Программирование на языке Си 139  для удобства повторяем ее снова (рис. 7.11). Отметьте для себя следующее:  1. Остановимся на операторе menu=toupper(getch()). Про- грамма сначала ждет ввода символа с клавиатуры, и если он не с верхнего регистра, то введенный символ будет пе-  ‚пицц-пи  /*tempconv.c Преобразователь шкал температур */  #inc|ude < stdio.h> /* Требуется для функции getch() */ #inc|ude < string.h> /* Требуется для строковой функции toupper() */ void Ce1sius(float); /* Преобразовать С в F И K */ void Fahrenheit(float); /* Преобразовать F B С и K */ void Kelvin(float); /* Преобразовать K B С и F */ int CalcTemp(char);  void main()  {  char menu = 'X';  system("cls"); /* Напечатать меню ........................................................................ ..*/ printf("\n\n\n\n Преобразование Шкал Температур\п\п"); printf("\n Введите С для F И К"); printf("\n F для С и К"); printf("\n K для К и F”); printf("\n Q для выхода \п"); /* Выбрать опцию ........................................................................... ..*/  while(menu! ='C’ & menu! = ‘F’ & menu ! = ‘K’ /* Итерация до выбора С, F или К */ {  menu = toupper(getch()); /* Получает символ с клавиатуры и переводит его на верхний регистр, если это необходимо "'/ if(menu = =‘Q') exit(l ); }  LL  листинг 7.5.1 З. tempconv.c. 
140 Глава 7  whi|e(Ca1cTemp(menu) = = 1); } int Ca1cTemp(char menu) { float temp; int г = 1; system("cls"); printf("\nBnezmTe %c температуру и нажмите <Enter> ...",mpnu); scanf("%f' ,&temp);  switch(menu) /* Выбрать функцию */ { case 'C' : Celsius(temp); break; case ‘F’ : Fahrenheit(temp); break; case ‘K’ : Ke1vin(temp);  } printf("\n\n Нажмите Q для выхода или любую ДРУГУЮ клавишу для продолжения \п"); if(toupper(getchO) = = 'Q') г = 0; return г; } void Cclsius(float temp) { printf("\n\n %.2foC = %.2foF И %.2fK\n",temp, temp*9/5 + 32,temp + 273); } void Fahrenheit(float temp) { //"Пустая" функция } void Kelvin(float temp) { / /" Пустая" функция }  Листинг 7.5. 1 З. (Продолжение) 
Программирование на языке Си 141  реведен на верхний регистр и затем записан в качестве пе- ременной меню.  2. Функции switch(), case и break используются вместе для выбора некоторого действия в зависимости от символа, приведенного в меню. Команда break выполняется после каждого выбора за исключением последнего, в противном случае все выбранные опции будут задействованы в конце функции switch().  3. Функции Ke1vin() И Fahrenheit() B данном листинге явля- ются «пустыми» функциями, удобными для тестирования меню с большим количеством опций. Отладку такой про- граммы делать легче: можно написать одну функцию и тут же ее проверить, а остальные сделать «пустыми», т. е. про- сто не определять их.  4. // — альтернативный способ задания комментария на од- ной строке.  7.5.14. Упражнение «Определение функций» Напишите функции Fahrcnheit() И Ke1vin().  7.6. Выбранные ответы 1. Ответ 7.5.1  А. Марафон равен 4.218597е + 01 километров. 2. Ответ 7.5.1 Б. Марафон равен 42.19 километров. 3. Ответ 7.5.6 А. Листинг 7.6.1 
142  Глава 7  {  }  /* square5.c выдает квадраты пяти чисел */ #include < stdio.h> void main()  int number, si; printf("\033[2J"); for(i = 1; i < 6; i++) { printf("BBe11me целое число < 180"); scanf("%d",&number); Ц и _ printf("\n Квадрат %3d = %3d\n\n", numbcx,‘ n1}inbcr*nuxIiber); }  Листинг 7.6. 1 . square5.c. 
Упражнения по интерфейсу  Глава 8 Последовательный интерфейс  8.1 . Последовательная передача данных  8.2. Аппаратные средства последовательного интерфейса  8.3. Упражнения 8.4. Вопросы  ВНИМАНИЕ! Все последующие главы этой кнши содержат прак- тические упражнения, включающие в себя процедуру подключения к компьютеру внешних устройств. Крайне важно, чтобы соедине- ния компьютера с любыми схемами былн предварительно провере- ны компетентным лицом. Информация и соединительные схемы в книге изложены автором вполне добросовестно, но он не может быть ответственным за ущерб, причиненный оборУдованию и, хотя это крайне маловероятно, за ущерб здоровью любому лицу, выпол- няющему данные упражнения.  Эта глава знакомит читателя с последовательной передачей данных, в ней приводятся простые упражнения по использова- Нию С ОМ-портов.  8.1. Последовательная передача данных  При последовательной передаче данных бнты, образующие КОДЫ символов, пересылаются по очереди один за другим по единственному проводнику, возвратным проводом является Земля. Персональные компьютеры (ПК) часто имеют два ком- мУникационньтх порта (обычно называемых СОМ-портами). менно эти порты используются для асинхронной последова- 
144 Глава 8  Символ Бит АЗСП-код четности А 0 100 0001 а 1 110 0001 В 0 100 0010 Ь 1 110 0010 00 . E Ё ho Рис. 8.1 . АЗСП-код с контролем четно- сти единиц.  тельной передачи данных путем посылки и получения ASCII- кода. Этот протокол передачи данных известен как стандарт RS232C1. Ha рисунке 8.2 показано, как выглядит передаваемый сигнал при пересылке символа «R». Каждому символу предшествует стартовый бит (логический 0), и передача символа заканчивает- ся стоповым битом (логическая 1). Может также использоваться контрольный бит четностиё который передается перед стопо- вь1м битом. Длина стопового бита3 может составлять 1, 1.5 или 2 обычных бита. Число изменений состояния канала передачи данных в се- кунду называется скоростью передачи в бодах. В системе с дву- мя возможными состояниями скорость передачи в бодах равна числу битов, передаваемых за секунду (бит/с). При пересылке данных между компьютерами (или между компьютером и периферийным устройством) оба компьютера должны работать в одном и том же режиме‘ так, чтобы во время  ‘ Несмотря на то, что термин RS232 все еще в обиходе, на самом деле он был заменен в 1987 году на термин EIA-232-D. Здесь Е1А является аббревиатурой от Electronic Industries Association (Ассоциация электронной индустрии) (USA)- В-версия данного протокола ставит эту спецификацию в один ряд с протокола- ми ССГГТ \/.24‚ \/.28 и 13021 10. 2 Добавление бита четности является простым методом обнаружения оши- бок при передаче данных. Один дополнительный разряд прибавляется для того‚ чтобы можно было сделать четным или нечетным полное количество единип или нулей в передаваемой последовательности битов (см. рис. 8.1). Одна ошиб- ка изменит число единиц или нулей с четного числа на нечетное или наоборот a И таким образом ошибка будет обнаружена. 3 Столовый бит переменной длины был необходим для работы с некоторЫ‘ ми сравнительно медленными механическими системами. 4 Режим — это термин, используемый для указания способа программиро‘ вания схемы приемника/передатчика. 
Последовательный интерфейс 145  н мер бита СТЁРТО- Битчет- Стопо- О выибит О 1 2 3 4 5 6 ности выйбит  в Fl:;?l::1’(')BaT9flbHOCTb О О 1 О О 1 О 1 1 1  I д I ASCII-K011 для R : ' CMP  1111121: 1:.-—g1g1g1n--.g1  Г  Рис. 8.2. Сигнал стандарта RS232 при передаче символа «R».-  передачи какого-либо символа тактовый генератор на принима- ющем компьютере работал Ha той же частоте, что и на передаю- щем компьютере. Такая система является асинхронной, так как минимальное число символов, передаваемых в секунду, опреде- ляется скоростью работы передатчика, т. е. передатчик может сделать паузу любой длительности между символами. Во время любых пауз линия находится в состоянии логической 11, поэто- му естественно в качестве стартового бита при передаче исполь- зовать логический 0. Один из наиболее распространенных способов пересылки би- тов в системе асинхронной передачи данных показан на рис. 8.2. Здесь логический 0 представлен уровнем напряжения, превыша- ющим +3 В (обычно +10 В), алогическая 1 — уровнем напряже- ния, меньшим -—3 В (обычно —10 В). Нулевое напряжение указь1-  <А>‹ а >‹В>‹Ь›‹С>< с >  ll010001010l0O00l]111111100l0000l0lll(I)l0001ll101100001110110001101111ll  Рис. 8.3. Передача строки символов.  ‘ ЭТО СОСТОЯНИЕ ИЗВССТНО как «СОСТОЯНИЕ ПОКОЯ». ЛОГИЧЕСКИЕ СОСТОЯНИЯ  Можно указывать и в терминах телетайпной связи, т. е. логическая 1 = mark (то- К0Вая посылка) и логический 0 = space (короткая пауза). 
146 Глава 8  mode Дул: .p туда .8! Номер „орта 1, 2, 3 или 4 Последовательный порт  Скорость передачи данных 1 или 2 стоповых бита  N - без бита четности, Е - проверка на четность, О - проверка на нечетность  Пример Напечатайте > mode сот1:9600,п‚8,1 ‚р.  Рис. 8.4. Режим командной строки MS-DOS.  вает на неработающую систему или разрыв на линии. Символ «R» B 7-разрядной системе АЗСП-кода есть 1010010 (52 в шестнадца- теричной системе). СМР кода, перед которым находится логиче- ский 0 (стартовый бит), посылается первым. Битовая последова- тельность заканчивается необязательным битом четности и, на- конец, стоповым битом. На рисунке 8.3 показан код для некото- рой строки последовательных символов. Режим работы ИС приемника/передатчика может быть за- программирован путем использования:  1) пакета программ; 2) реншма командной строки MS—DOS (рис. 8.4);  3) некоторой команды в Си-программе.  8.2. Аппаратные средства последовательного интерфейса  Специальные ИС, называемые универсальными асинхронными приемопередатчиками (universal asynchronous receiver\transmit— ters — UART)1, преобразуют данные из параллельного (ТТЛ) формата, получаемого от шины данных микропроцессора, В последовательный (RS232). Эти устройства можно рассматри- вать как устройства с двумя внутренними секциями: преобра- зователем параллельного формата в последовательный, назы- ваемым передатчиком, и преобразователем последовательно-  1 Эти ИС называют также асинхронными коммуникационными адаптерами или асинхронными коммуникационными элементами. 
Последовательный интерфейс 147  .—---""'1—  го формата в параллельный, называемым приемником. Пере- датчик подставляет бит четности, стартовый и стоповый биты. Приемник проверяет формат и четность полученных данных. Приемник и передатчик могут работать одновременно, такой способ передачи называются «полным дуплексом»1. Скорости передачи и приема данных контролируются внут- ренним или внешним генератором тактовых импульсов, работа- ющим на частоте, кратной скорости передачи данных. Внутрен- ний регистр состояния, который хранит «флажки» состояний приема, передачи и ошибок, может быть прочитан программ- ным способом. Стандартным соединителем является 25-штырьковый разъем В-типа (Штепсельная часть). Однако в некоторых случаях при- меняется 9-штырьковый разъем, который пригоден для соеди-  Экран Передаваемые данные (дополнительный канал) Передаваемые данные (Выход) Синхронизация передатчика -— i 15 3 - поинимаомые даддыо (вход) Принимаемые данные ‚ (дополнительный канал) 2:1 4 38ПР00 ПЕРЕДЗТЧИКЭ (ВЫХОД) Синхронизация приемника 5 cfi сброс передатчика (вход) Локальная петлевая конфигурация в готовность модема (вход) Запрос передатчика (дополнительный канал) 7 Ch «Земля» ОИГНЗЛЗ Готовность терминала (Выход) а указатель несущей Указатель качества/ Удаленная петлевая конфигурация -” 9 c— зарезервировано для тестирования Указатель °Ы3°°°В д; 10¢ зарезервировано Ann тестирования Переключатель скорости __ передачи данных 1 к‘; Без назначения Синхронизация передатчика —— __ УКЗЗЗТЭЛЬ НЭСУЩЁЙ (дополнительным канал) Режим тестирования —- Сброс передатчика  (дополнительный канал)  Рис. 8.5. Назначение контактов СОМ-порта.  1 Передача только в одном направлении называется симплексной связью. Передача в обоих направлениях, но не в одно и то же время, называется полудуп- лексной связью. 
148 Глава 8  Экран Передаваемые данные  Принимаемые данные  Сброс передатчика  1 2 3 4 Запрос передатчика 5 6 Готовность модема 7  `\ / \ / 7 Off“ \ / ~ ф «Земля» сигнала / -\\ "` 8 4“ / ’ х" 8 Указатель несущей \\ 20 D/ 20 Готовность терминала  Рис. 8.6. Линии интерфейса RS232.  нения наиболее часто используемых управляющих линий. На- значение выводов 25-штырькового разъема показано на рисун- ке 8.5. Наиболее часто используемые выводы отмечены на ри- сунке полужирным шрифтом. Многие соединительные кабели требуют того, чтобы вы- вод 2 был взаимозаменяем с выводом 3, а вывод 4 —— с выводом 5. На рисунке 8.6 показана внутренняя конфигурация типично- го кабеля. Как правило, производители периферийных уст- ройств либо указывают для них разводку контактов соедини- тельного кабеля, либо предоставляют покупателю подходя- ший кабель.  8.3. Упражнения  В начале работы следует проверить адрес последовательного порта используемого компьютера. Типичные адреса СОМ-пор- тов ПКдля пересылки и получения данных приведены ниже:  1 последовательный порт: 3F8 hex 2 последовательный порт: 2138 hex  8.3.1. Упражнение «Тестирование петлевой конфигурации»  Необходимо отослать некий символ с вывода «Передаваемые данные» (вывод 2) И получить его на выводе «Принимаемые данные» (вывод 3) того же порта. Для этого теста нужен лишь 
Последовательный интерфейс 149  Рис. 8.7. Оборудование для упражнения 8.3.1.  один компьютер. Вывод 2 «Передаваемые данные» соединен с выводом 3 «Принимаемые данные» того же самого порта. Существует несколько наборов соединений, поставляемых производителями оборудования. Один из них приведен на рис. 8.7, и вместе с 25-жильным кабелем он подходит для уп- ражнений как в этой главе, так и в гл. 12. Структурная схема программного обеспечения к этому уп- ражнению показана на рис. 8.8.  Тестировать последовательный порт  Г а l'_"" Получить или *  Напеча ть меню Та отослать символ  I I  _ [— V д _ Ввести симводо Напечатать Выйти из О отослать его символ, программы к порту полученный из порта и возвратиться в систему  Рис. 8.8. Структурная схема к упражнению 8.3.1.  /*seria11.c Тестирование последовательного порта */ #include<stdio.h> #include<conio.h> int Address = 0x3f8; /* Адрес порта СОМ1, заменить на 0x2f8, если используется порт СОМ2 */ void main()  L  листинг 8.3.1 . serial1.c. 
150 Глава8  printf("\033[2J"); /* Очистка экрана */ printf("\n Передача данных через последовательный порт"); printf("\n R для получения данных"); printf("\n S ДЛЯ отсылки данных»); printf("\n Q для выхода из программьщп"); while (1) { switch(toupper(getch())) { case ‘S’: printf("\n Введите символ с клавиатуры для его пересылки"); outp(Address,getch()); printf("\nS, R, ОТ’); break; о case ‘R’: printf("\n Полученный символ > 9Бс"‚йвр(А‹1‹1ге$$)); printf("\nS, R, ОТ’); break; case ‘Q’: exit(1); } fflush(stdin); }  } а J  Листинг 8.3. 1 . (Продолжение)  Тестирование 8. 3. 1.  1. Соедините выводы 2 и 3 СОМ-порта. 2. Нажмите на клавиатуре S, a затем введите символ.  З. Нажмите R: тот же самый символ должен быть получен На экране.  4. Отсоедините выводы 2 и 3. При нажатии R на экране дол- жен быть получен другой символ.  8.3.2. Упражнение «Исследование сигналов СОМ-порта»  Для выполнения этого упражнения потребуется запоминающий осциллограф. Выполните следующее: 
Последовательный интерфейс 151  Соедините вход запоминающего осциллографа с линией контакт 2 — контакт 3, а «землю» осциллографа с контак- том 7 СОМ-порта.  Установите осциллограф в режиме ждущей развертки, за- пускаемой при отсылке символа с клавиатуры. Вход дол- жен быть установлен на прием сигнала постоянного тока; чувствительность -— 5 В на деление.  Используйте программу, разработанную для упражне- ния 8.3.1, чтобы вывести символ.  Отрегулируйте развертку осциллографа таким образом, чтобы символ из 10 битов был виден Целиком. Параметры установки горизонтальной развертки будут зависеть от скорости передачи данных в бодах.  Скопируйте не менее шести разверток сигналов строчных и прописных символов. Используйте различные скорости передачи данных, биты данных, стоповые биты и биты четности.  Отметьте уровни напряжений, соответствующие сигналам логической 1 и логического О.  Измерьте период для каждого бита и для символа. Соотне- сите это со скоростью передачи данных, измеряемой в бо- дах.  Переведите формы сигнала на двоичный «язык» и пока- жите, что они являются прообразами АЗСП-кодов нажа- тых клавиш.  8.3.3. Упражнение «Связь между двумя  компьютерами»  Цель данного упражнения — пересылка символов между двумя компьютерами. Таким образом, для выполнения упражнения Нужен второй компьютер. Соедините СОМ-порты двух компь- ютеров друт с другом, как показано на рис. 8.9. Вывод 2 одного компьютера должен быть соединен с выводом 3 другого.  1.  Убедитесь в том, что оба компьютера работают в одном и том же реишме.  Запустите программу к упражнению 8.3.1 Ha обоих компь- ютерах. 
152 Глава 8  Рис. 8.9. Соединения для упражне- ния 8.3.3.  3. Отошлите символ с одного компьютера и получите его на другом. Система должна одинаково работать в обоих на- правлениях (полудуплекс).  4. Используйте режим командной строки MS-DOS для изме- нения режима работы на обоих компьютерах. Выясните, что произойдет в том случае, когда компьютеры будут ра- ботать с разными скоростями передачи данных или будут передавать символы с разным количеством разрядов дан- ных.  8.3.4. Упражнение «Передача текста»  Разработайте программу (листинг 8.3.1) так, чтобы можно было передать по линии связи строку из 20 символов. Главная проблема при пересылке текста через СОМ-порт заключается в том, что необходимо указать передающему компьютеру ин- формацию о том, что отосланный им символ принят и прочи- тан. Это достигается квитированием установления связи по управляющим линиями или, если желательно сохранить трех- проводную систему, приемник может послать сигнал под- тверждения приема, когда символ будет прочитан. Альтерна- тивным способом может быть пересылка текста в виде пакета с предварительно согласованным числом символов из файла.  8.4. Вопросы  1. Почему каждому символу предшествует стартовый бит?  2. Приведите два важных преимущества использования напряжений противоположной полярности для переда- чи логических состояний, а не обычных ТТЛ-уровней 5 и О В.  3. Какое логическое состояние передается между симво- лами? 
Последовательный интерфейс 153  д-{Тг  4. 3a какое время будет передан 7-ра3ряднЬ1й символ с до- полнительным битом четности при скорости передачи 1000 бод?  5. Каким образом принимающее устройство узнает о том, что передающее устройство не подключено, если исполь- зуется трехпроводная система, в которой соединены вы- воды 2, 3 M 7? 
Глава 9  Параллельный интерфейс  9.1. ИС Intel 82С55А РР| 9.2. Упражнения с шаговым двигателем  При выполнении упражнений, приведенных ниже в главах 9, 10 и 11, используется плата в ПК, содержащая ИС программи- руемого параллельного интерфейса (programmable parallel interface — PPI) Intel 8255. Информация, касающаяся работы ИС 8255 РР1‚ получена из сопроводительной документации к этой микросхеме и печатается здесь по разрешению фирмы 1те1 Corporation (UK) Ltd. Аппаратные средства, используемые в этих упражнениях, описаны в гл. 14. Блок светодиодов показан на рис. 9.16 в конце этой главы. Параллельная передача данных -— это такая система переда- чи‚ в которой каждый бит двоичного слова передается по своему собственному проводУ (одиночной линии). Таким образом, для передачи 16-разряДнь1х слов потребуется 16 проводников. Один дополнительный провод необходим в качестве общего провода, или провода зазелтения. В некоторых кабелях с целью уменьше- ния интерференции импульсов, проходящих по соседним про- водам, каждый провод образует скрученную пару с проводом за- земления.  9.1 . ИС Intel 82С55А РР|  Платы с ИС 8255 РР1 выпускаются несколькими производите- лями. Такая плата является Ценным дополнением к персональ- ному компьютеру, используемому для сопряжения различных устройств c HK, так как она значительно проще в использова- нии по сравнению с последовательным (СОМ) портом и облада- ет значительно большими возможностями по сравнению с па- раллельным принтерным портом. 
Параллельный интерфейс 155  Порт Адрес Адрес (hex) (hex)  Пример Реальный  А 300 —— В 301 —— C 302 ;n_paeneHI4e 303  Рис. 9.1. Типичные РР1-адреса.  K сожалению, для РР1-плат нет стандарта, определяющего все соединения и адреса, поэтому и назначение контактов, и ад- реса приведены только в качестве примера. Свободные проме- жутки в таблицах на рис. 9.1 и рис. 9.2 предназначены для адре- сов и номеров контактов конкретной платы пользователя, и их следует заполнить самостоятельно. Соответствующая информа- Ция приводится производителем платы в сопроводительной до- кументации. Адреса, указанные в программах, также носят лишь иллюстративный характер и, возможно, их нужно будет изменить. Для программируемого параллельного интерфейса требуется последовательность из четырех адресов. Самый млад-  дм...  Номер разряда 7 6 5 4 3 2 1 о  Порт А Пример 30 31 32 33 34 35 36 37  I I I L I I I I ПортВ Пример 3 4 5 6 7 8 9 10  I I I I I I I J  Порт С Пример 22 23 24 25 26 27 28 29  г I I I I I T J  Земля Пример 21  Реальный I:  jun...  Рис. 9.2. Типичная разводка контактов РР1-платы. 
156 Глава 9  mm”! адрес называется базовым адресом (base). Ha остальные три адреса ссылаются как на base +1, base +2 И base +3. Обычно на самой плате предусмотрена некоторая форма выбора адреса. Следует позаботиться лишь о том, чтобы выбранный адрес не был задействован другим приложением, например сетевым mi- терфейсом. Рассматриваемая ИС РР1 имеет три З-разрядных порта, ко- торые могут быть сконфигурированы несколькими способами, описываемыми ниже. Существует три режима работы (режим 0, режим 1 и режим 3). Записанное в управляющем регистре РР1 8-разрядное слово конфигурирует режим и направление потока данных для каждого порта. Это управляющее слово включается в программу перед любыми другими командами. Выходные напряжения соответствуют стандартным ТТЛ- уровням (0 B для логического 0 и 5 В для логической 1). B приведенных ниже упражнениях используется РР1 в режи- ме 0. Включены некоторые детали работы РР1 в режиме 1 для иллюстрации метода квитирования установления связи при пе- редачи данных. Режим 2, соответствующий полудуплексной пе- редаче через порт А, описываться не будет. На рисунке 9.1 приведена таблица, в которой указаны типич- ные шестнадцатеричные адреса, используемые в плате парал- лельного ввода/вывода на основе ИС 8255 РР1. На рисунке 9.2 приведена таблица типичной разводки кон- тактов 37-жильного кабеля для 24 разрядов и заземления. В не- которых случаях возможно использование шины питания 5 В, но для экспериментов лучше использовать внешний источник питания. Убедитесь в том, что все общие провода соединены между собой!  9.1.1. РР|-режим О (базовый ввод/вывод)  Этот режим обеспечивает простые операции ввода/ вывода дан- ных для портов А, В и С. Порт С разделен на два 4-разрядных порта (разряды с 0 по 3 и с 4 по 7). Другие особенности этого ре- жима таковы:  1) все порты устанавливаются на ввод данных после сброса; 2) выходные сигналы фиксируются;  3) порты очищаются, когда в управляющий регистр РР1 за- писывается информация. 
Параллельный интерфейс 157  Управляющее слово для режима 0  ._1.fi  Номер Bgipma L6 1 5 L4 L 3 I Zj 1 I 0 Код 1 0 0 А CH 0 В CL -1 = порт А А =0 для ввода, 1 для вывода В = порт В В =0 для ввода, 1 для вывода  CL = порт С разряды о — 3 CL =0 для ввода‚ 1 для вывода CH = порт С разряды 4 — 7 CH = 0 для ввода 1 для вывода  Рис. 9.3. Управляющее слово для режима 0.  Пример управляющего слова для режима О  Сконфигурируйте РР1 для ввода данных из порта А, вывода в порт В и ввода из порта С.  Бит 0 = 1 (замените CL на 1) Бит 1 = 0 (замените В на 0) Бит 3 = 1 (замените СН на 1) Бит 4 = 1 (замените А на 1) Управляющее слово 10011001 = 99 Нех.  9.1.2. Упражнение «Вывод чисел в режиме О»  Цель данного упражнения — показать правильность работы си- стемы вывода при пересылке двоичных чисел K порту В. На ри- сунке 9.4 приведена схема аппаратных соединений, а ниже — программа на языке Си.  Рис. 9.4. Тест вывода данных в режиме 0.  ПЬЮТЭР  Обозначение: БП — блок питания  П5В +58  ЧФФдСдЮ-‘О  \lOi(JIb0-DIO-‘O 
158  Глава 9  Структура программного обеспечения Для теста вывода данных в режиме О  Сконфигурировать РР1,  режим О, порты А и С для ввода данных, порт В для вывода данных.  Напечатать команды пока не конец (while not end)  {  }  Ввести два шестнадцатеричных символа с клавиатуры. Вывести двоичное чисел в порт В.  Выход (exit)  /*output.c Вывод данных в порт В. Порт В должен быть соединен с блоком светодиодов */ #include < dos.h > #include < stdio.h > /* Требуется для функции scanf() */ int Output(); /* Название для функции, используемой в программе */ int Control = Ох3О3; /* Адрес управляющего регистра */ im B_Address = 0x301; /* Базовый адрес + 1 */ int config = 0х99 /* 99 hex конфигурирует порт следующим образом: порт А для ввода порт В для вывода порт CL для ввода порт СН для ввода */ void main()  {  int menu; /* Определение внутренней переменной "‘/ outp(Control,config); /* Конфигурирование РР1 */ printf("\n\n\n\tBblBO}l ДАННЫХ В ПОРТ В"); printf("\n\n\tHa>KMnTe НЕшестнадцатеричный символ для выхода из программы"); while(Output()); /* Продолжать, пока функция output не будет равна О */ exit(1); }  Листинг 9. 1 .2. 0utput.c. 
Параллельный интерфейс 159  int Output() { int data,x; printf("\n\n\t Введите некоторое ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО, нажмите <ENTER>"); fflush(stdin); /* Освободить буфер клавиатуры */ x = scanf("%2X",&data); /* Получить данные от клавиатуры */ outp(B_Address,data); /* Отослать данные в порт */ return х; /* хравен О для НЕшестнадцатеричною числа */  Листинг 9. 1 .2. (Продолжение)  9.1.3. Упражнение «Тестирование ввода в режиме О»  Цель данного упражнения — протестировать систему ввода данных. Приведенная программа сканирует порт А и показы- вает логические состояния переключателей, подключенных к порту А. На рисунке 9.5 показаны соединения с РР1‚ необходи- мые для выполнения данного упражнения.  переключат 0  Компьютер  Блок переклю- чателей  Земля  Разрешение  рис. 9.5. Тест ввода данных в режиме О. 
160 Глава 9  Структура программного обеспечения для теста ввода данных в режиме О  Сконфигурировать РР1 порт А для ввода данных, порты В и С для вывода данных, Напечатать команды и битовый заголовок.  Пока не нажата клавиша  Ввести с порта А и напечатать результат на экране Выход (exit)  B листинге 9.1.3 на рис. 9.6 приведена таблица трассировки для сегмента программы, заключенного внутри прямоугольни- ка. Этот сегмент предназначен для того, чтобы показать, как  /*input.c Ввод данных из параллельного порта А. Порт А соединен с блоком переключателей */ #include < dos.h > #include < stdio.h >  int Input(); int A_Address = 0x300; /* Адрес порта А */ int Control = 0x303; /* Адрес управляющего регистра. "f/ int Config = 0x99; /* Конфигурация:  порт А для ввода порт В для вывода порт CL для ввода  , _ порт СН для ввода */ уою mam()  { outp(Control,Config); /* Конфигурирование PPI */ clrscr(); printf("\n\n\n\t ВВОД ДАННЫХ ИЗ ПОРТА А"); printf("\n\n Нажмите любую клавишу ДЛЯ выхода из программы"); printf("\033[15;5H Бит 7 6 5 4 3 21 О"); ’ printf("\O33[16;5H Положение"); while(!Input()); /* Продолжать, пока функция Input() не выведет 1 */ exit(1); } int Input();  { int data,i;  Листинг 9.1 .3. input.c. 
Параллельный интерфейс 161  ...--v—-j  data = inp(A__Address); /* Ввод данных из порта В */ printf("\033[16;12H"); /* Позиционирование курсора */ for(i = 7;i -—1;i——) printf(" %1x",(data>>i)&1); /* Сдвиг данных на i разрядов и затем объединение по AND с 1 */  тгйпщ" == %2x",data); return kbhit(); }  Листинг 9.1.3. (Продолжение)  воспроизводятся на экране «логические» положения переклю- чателей, подключенных к порту А.  data = inp(A_Address); /* Ввод данных из порта В */ printf("\033[16;12H"); /* Позиционирование курсора */ for(i = 7; i >—1;i—-) printf(" %1x",(data >> i)&l); /* Сдвиг данных на i разрядов и затем объединение по AND с 1 */  i двоичные Экран О/Р Примечание данные 76 54321 О data 7 1100 0101 Число от переключателей data >> i xxxxxxxl Сдвиг данных вправо (data >> i)&l l Пборазрядное AND I о ъединение по с printf("1x",(data >>i)&1) 1 1*Li[grC{;=;aa;fITa13r§é1;IgHymM¢py data>>i 6 xxxxxxll Повюритьдля1=6 (data >> i)&l 1 pn'ntf("1x",(data >> i)&1) 1 data>>i 5 ххххх110 Понторитьдля1=5 (data > > i)&1 0 printf("1x",(data > > i)&1) 0 data>>i 4 xxx1l00 ПовторитЬдля1=4 (data > > i)&1 0 printf("1x".(data > > i)&1) 0 Итерация продолжается, Пока i не будет равно О  Рис. 9.6. Таблица трассировки для выделенного сегмента листинга 9.1.3. 
162 Глава 9  9.1.4. РР|-режим 1, стробируемый ввод/вывод  Программируемый параллельный интерфейс в режиме 1 обес- печивает возможность пересылки данных к портам или из пор- тов А или В в сочетании со стробирующими сигналами или сиг- налами квитирования (сигналами процедуры установления свя- зи). Особенности режима 1 следующие:  1) два 8-ра3рядных порта (А и В); 2) порт С используется для управления портами А и В;  3) два последних порта могут быть портами ввода или вы- вода;  4) входные и выходные сигналы фиксируются;  5) возможна организация прерываний по линиям СО и C3.  Управляющее слово для режима 1  Номер разряда 7 6 5 4 3 2 1 0 код [1]o]1[A]A]1TBjB А = портА А = 0 для вывода] для ввода В = порт В В = 0 для вывода,1 для ввода  Рис. 9.7. Управляющее слово режима 1.  Пример управляющего слова для режима 1  Запрограммируем порт А для ввода данных и В для вывода.  Управляющее слово = 10111100 = ВС hex  квитирование установления связи  В режиме 1 порт С используется для сигналов квитирования, ис- пользуемых в процедуре установления связи для передачи дан- ных. Квитирование установления связи —-— это протокол, кото- рый определяет процедуру сообщения инициатором пересылки данных о том, что данные готовы для передачи, и получателем данных о том, что он их получил. Управляющие сигналы квити- рования для вывода данных указаны в таблице на рис. 9.8; их временная диаграмма приведена на рис. 9.9. 
Параллельный интерфейс 163  Вывод данные Метка _ Примечание/действие  Порт А Порт В  C7 C] OBF Этот ВЫХОДНОЙ сигнал переходит в состояние НИЗКОГО уровня после записи выводимых данных в порт Он возвращается в состояние ВЫСОКОГО уровня, когда АСК переходит к НИЗКОМУ уровню.  С6 С2 АСК Периферийное устройство устанвливает НИЗКИЙ уровень на этом выводе после приема данных.  OBF = ВЫХОДНОЙ буфер заполнен АСК = Подтверждение  Рис. 9.8. Сигналы квитирования для вывода данных в режиме 1.  Данные записаны в порт К периферийному ф - устройству оТ`С1/С7 1 - j OBF о 1‘ \ __/ _ А  Устанавливается сигналом АСК  От периферийного 1 устройства к С2/С6 ` I ACK Данные  Рис. 9.9. Временная диаграмма сигналов квитирования для вывода данных в режиме 1.  9.1.5. Упражнение «РР|-режим 1, тест вывода данных»  Тест вывода Данных в режиме 1 : СТруктурная схема и работа  На рисунке 9.1 1 представлена структурная схема программно- ГО обеспечения для данного упражнения. Аппаратное обеспе- Чение показано на рис. 9.10. Обратите внимание, что Для этого Упражнения нужен блок переключателей и второй блок свето— диодов. 
164 Глава9  КОМПЬЮТЕР  ЧФШЬФЮФФ flUJU|&(n)l\)-‘O  перец лющпыюй  ЧФФЬФЮ-ЪФ  ЧФФбФЮ-‘Ф  VCC  Земля  VUIUI&(Jl\)-‘O  Vcc Земля  Земля  Разрешение  Рис. 9.10. Тест вывода данных в режиме 1.  При выполнении программы происходят следующие события:  1) запрашивается ввод шестнадцатеричного числа с клавиа-  ТУРЫ;  2) если контрольный переключатель на линии С2 установ- лен на логическую 1, программа выведет на экран сообще-  ние: «Ожидание логического О на С2»;  3) если на линии С2 установлен логический 0, Данные буДУТ отосланы к порту В, включится контрольный СИД на JIM‘  НИИ С1; 
Параллельный интерфейс 165 РР!-режим 1, тест вывода для порта В Г I l _ Напечатать Вывести * заголовок шестнадцатеричное и комнады число в порт В Г l— Ё 1 Ввести Ввести Вывести шестнадцатеричное ЧИСЛО С Клавиатуры состояние С2 число в порт В ' I _ . ‘ —. Ожидать * вывести Ожидать * логический 0 логическую 1 На С2 число в порт В На C2  Рис. 9.1 1. Структурная схема программного обеспечения для теста вывода  данных в режиме 1.  4) затем программа выведет сообщение «Ожидание логиче-  ской 1 на С2»;  5) когда переключатель на линии С2 переводится на состоя-  ние логической 1, выключается контрольный СИД;  6) повторение всех этапов, начиная с шага 1.  /*outmode1.c Вывод данных из порта В с сигналами квитирования. Порт В должен быть подключен к блоку светодиодов, один све- тодиод должен быть подключен к С1 и один логический переклю- чатель к С2. */ #include < dos.h > #include < stdio.h> /* Требуется для функции scanf() */ int Output(); /* Имя функции, используемой в программе */ int Control = 0x303; /* Адрес управляющего регистра */ int B_Address = 0x301; /* Адрес base + 1 */ int C_Address = 0x302; /* Адрес base + 2 */ int config = ОхВС /* ВС конфигурирует порты следующим образом: порт Адля ввода, порт В для вывода "'/ void main()  {  L...___  Листинг 9.1.5. outmode1.c. 
166 Глава9  ед  int menu; /* Определение переменной Целого типа */ clrscr(); outp(Control,config); /* Конфигурирование РР1 */ printf("\n\n\n\tBbIBO,[l ДАННЫХ ИЗ ПОРТА В"); printf("\n\n\n\tHa>KMnTe НЕшестнадцатеричный символ для выхода из программы"); printf("\n\nBBezmTe логический 0 на С2"); while (Output()); /* Продолжать, пока функция output He будет равна 0 */ exit(1); } int Output(); { int data,x, k = 2; printf("\033[16; 1 Н Введите шестнадцатеричное число, нажмите <ENTER>"); fl'lush(stdin); /* Очистка буфера клавиатуры */ х = 5сапГ("%2Х"‚&дата); /* Получение данных с клавиатуры */ do ' ` { outp(B_Address,data); /* Отсылка данных в порт */ к = inp(C_Address) & 2; printf("\033[18; 1 H Данные отослали импульс логической 1 на С2 для подтверждения приема");  while (k! = О); printf("\033[18; 1Н СИД, подключенный к С1‚ мигает, когда C2 возвращается к логическому 0"); printf("\033[16;1H "); return x; /* x равен 0 для НЕшестнадЦатеричного числа */  › д  Листинг 9. 1 ‘.5. (Продолжение)  9.1.6. Упражнение «Тест ввода данных в режиме 1»  Сигналы квитирования для ввода данных указаны в таблице H3 рис. 9.12; их временная диаграмма приведена на рис. 9.13. 
Параллельный интерфейс 167  Вход .данные Метка _ Примечание/деиствие  Порт А Порт В  С4 С2 STB Сигнал НИЗКОГО уровня на этом входе от периферийного устройства загружает данные во входной регистр.  С5 С1 IBF Сигнал ВЫСОКОГО уровня на ВЫХОДЕ уведомляет, что данные загружены во входной регистр. Переходит в состояние НИЗКОГО уровня после ___ считывания данных. STB = Стробирующий входной сигнал IBF = Входной буфер заполнен  Рис. 9.12. Сигналы квитирования для ввода данных в режиме 1.  Аппаратные соединения для данного упражнения аналогич- ны соединениям для теста вывода данных в режиме 1, за исклю- чением следующих:  1) соединение с С1 переносится на С5; 2) соединение с С2 переносится на С4;  3) блок переключателей подключается к порту А.  Данные посылаются в порт  От периферийного 1 д и устройства к С2/С4 \ И (переключатель) ЗТВ 0 T  K периферийному 1  устройству от С1/С5 1" :` (СИД) IBF 0 g ' Данные X  ‘Г T  Новые Данные считываются из порта данные  Рис. 9.1 З. Временная диаграмма сигналов квитирования для ввода данных В Режиме 1. 
168 Глава 9  Программное обеспечение для этого упражнения приведено в листинге 9.1.6. В этом листинге объясняется также принцип работы программы. По существу, на С4 должен быть установлен логический 0 перед вводом данных с порта А.  н  /*inmode1 .с Программа теста ввода данных из порта А c сигналами */ /* квитирования 1*/ /* Ввод данных из порта А. Порт А должен быть подключен к блоку */ /* переключателей*/ /* СИД должен быть подключен к С5, а логический переключатель —*/  /* к С4*/ #include< dos.h> #include< stdio.h> /* Требуется для функции scanf() */ int Input(); /* Имя функции, используемой в программе */  int Control = 0x303; /* Адрес управляющего регистра */ int A_Address = 0x301; /* Адрес base + 1 */ int B_Address = 0x300; /* Базовый адрес (base)*/ int C__Address = 0x302; /* Адрес base + 2 */ int config = 0xBC; /* BC конфигурирует порт следующим образом: порт А для ввода порт В для вывода порта С4 для квитирования ввода порт С5 для квитирования вывода */ void main() { clrscr(); outp(Contro1,conf1g); /"' Конфигурирование РР1 */ printf("\n\n\n\tB ВОД ДАННЫХ ИЗ ПОРТА А"); printf("\n\n\tHa>1<Mme <Enter> для ввода данных и любую другую клавишу для выхода из программы"); printf("\033[12;1HBBenm*e двоичное число в порт А"); ргйпгГ("\пПодайте импульс логического О на С4 СИД на С5 должен включиться"); printf("\nHax<Mme <Enter> для ввода данных"); printf("\nI/I3 порта A СИД на С5 должен выключиться"); while (Input()); /* Повтор цикла, пока не будет возвращен 0 */ exit(1);  ___...J Листинг 9.1.6. inmode1.c. 
Параллельный интерфейс 169  .....‚——  Г__  } int Input();  {  int k, r = 1; if(getch() = = 13) printf("033[18;1H Данные: %0Х"‚ inp(A_Address)); else r = 0; return r;  Листинг 9.1 .6. (Продолжение)  9.2. Упражнения с шаговым двигателем  Этот раздел содержит три упражнения, включающие в себя разра- ботку программ для управления скорости и направления вращения шагового двигателя. Двигатель, подключенный к порту В, управля- ется двоичными переключателями, подключенными к порту А.  9.2. 1 . Упражнение «Управление шаговым двигателем»  1. Разработайте программу, которая будет управлять шаго- вым двигателем, т. е. позволит задавать две скорости вра- щения по часовой стрелке, две скорости вращения против часовой стрелки и обеспечит возможность остановки дви- гателя (см. структурную схему На рис. 9.14).  Управление ШЗГОВЫМ двигателем Напечатать Выбрать скорость!‘ заголовок и направление И коман ы вращения  I ‚ T  Медленноео Быстрое о Быстрое Медленное ОСТЭНОВИТЬ вращение вращение вращение вращение двиГаТедь по часовой по часовой против часовой против часовой стрелке стрелке стрелки стрелки  Рис. 9.14. Структурная схема программного обеспечения для управления шаговым двигателем. 
170 Глава 9  0  Блок пере- +5 В ключателей  ЧФШЬФЮ-‘Ф  Земля Разрешение  1234  Шаговый двигатель  ЧФШЬФЮФФ  0 1 2 3 4 5 6 7  Vcc Земля Зе unq  Vcc Земля  Рис. 9.15. Аппаратные средства для управления шаговым двигателем.  2. Аппаратные соединения выполните по схеме, показанной на рис. 9.15.  3. Отрегулируйте задержки в программе таким образом, что- бы B быстром и медленном режимах работы шаговый дви- гатель вращался плавно. Обратите внимание, что первая задержка для каждой последовательности сделана более короткой с учетом компьютерного времени возврата из цикла. Если программный код, управляющий вращением двигателя, будет передаваться слишком быстро, то двига- тель начнет вибрировать. 
Параллельный интерфейс 171  Структура программного обеспечения для упражнения 9.2. 1.  инициализировать РР1-режим 0, порт А для ввода данных и порт В для вывода. Напечатать команды.  Все переключатели установить к логическому 0 для остановки мотора.  Переключатели установить K логической 1 для реализации операций в соответствии с приведенной ниже таблицей.  -. "&'»$'._’.~:-1:2-::. '~"$4’-“N'Q'3'E1:1.\‘.1x\Vl~\':3:3§I32~¥&\'i' т ' - - - -- - -  переключатель Режим десятичное значение (в состоянии логической 1)  Остановка 0 О Медленное вращение 1 по часовой стрелке 1 Быстрое вращение 2 по часовой стрелке 2 Быстрое вращение 4  против часовой стрелки 3 Медленное вращение 8 против часовой стрелки  мы». ‚щоь  пока не кончится (while not end) { ввод режима с порта А вывод числовой последовательности для одного поворота шагового двигателя. Последовательность чисел для вращения двигателя по часовой стрелке: 3, 6, 12, 9.  }  выход (exit) 
172 Глава 9  /*motor.c Программа управления шаговым двигателем. Скорость и направление вращения двигателя поступают из порта А. Порты с А0 по АЗ подключаются к блоку переключателей. Числовая последова- тельность для управления шаговым двигателем выводится в порт В. Порты с В0 по B3 подключаются к блоку светодиодов и двигателю.*/ #include<dos.h> #include< stdio.h>  int A__Address = 0x300; /* Адрес порта А */ int B_Address = 0x301; /* Адрес порта В */ int Control = 0x303; /* Управляющий адрес */ int Config = 0x99; /* Конфигурация, порт А на ввод,  порт В на вывод */ int Input(); void Rotate(int,int); int clockwise = 0; int anticlock = 1;  int slow = 1000; /* Эти две скорости могут быть подстроены в соответствии */ int fas = 100; /* с быстродействием компьютера.  Чем больше число, тем медленнее двигатель */ void main() { outp(Contro1,Config); clrscr(); printf("\n\n\n\t\tY1'IPABIIEHI/IE ШАГ ОВЫМ ДВИГАТЕЛЕМ»); printf("\n\n\tYr1paBJ1eHne двигателем с помощью блока переключа- телей"); printf("\n\tEcIm все переключатели установлены в положение логического 0, то"); ргйтГСдвигатель остановится"); printf("\n\tHa)KMnTe любую клавишу для выхода из программы"); printf("\n\n\t\tPE)KI/IM ПЕРЕКЛЮЧЕНИЯ"); printf("\n\t\t 0 медленное вращение по часовой стрелке"); printf("\n\t\t 1 быстрое вращение по часовой стрелке"); printf("\n\t\t 2 быстрое вращение против часовой стрелки"); printf("\n\t\t 3 медленное вращение против часовой стрелш");  Листинг 9.2.1. motor.c. 
Параллельный интерфейс 173  while(!Input()); exit( 1); } int Input; { printf("%i", inp(A__Address)); switch(inp(A__Address) & OXOF) {  case 1: Rotate(sIow,clockwise); break; case 2: Rotate(fast,clockwise); break; case 4: Rotate (fast,anticlock); break; case 8: Rotate(s1ow,anticlock); break; default: printf("\033[20;10H Двигатель оспаневился"); } return kbhit();  } void Rotate(int speed, int direction)  { int i; int data[2][4] = {3,6, 12,9, /* Код для вращения по часовой стрелке */ 9‚12‚6‚3}; /* Коддля вращения против часовой стрелки */ delay(speed * 5/10); printf("\033[20;10H "); f0r(i = 0; i < 4; i++) { outp(B__Address,data[direction][i]); /* Отсылка кода к мотору */ delay(speed);  } }  L;  дистинг 9.2.1 . (Продолжение) 
174 Глава 9  9.2.2. Упражнение «Управление двигателем; три скорости вращения»  Измените программное обеспечение упражнения 9.2.1 таким образом, чтобы можно было задавать низкую, среднюю и вь1со- кую скорость вращения двигателя в каждом направлении.  9.2.3. Упражнение «Управление двумя шаговыми двигателями»  Подключите еще один шаговый двигатель к неиспользованным выводам порта В и измените программное обеспечение ДЛЯ уп- равления работой Двух шаговых Двигателей с помощью одного набора переключателей.  Рис. 9.1 6. Блок светодиодов. 
“тать-чь-  Глава 10  цифро-аналоговый параллельный интерфейс  10.1. Цифро-аналоговое преобразование  10.2. Упражнения по преобразованию цифрового сигнала в аналоговый  10.3. Функциональный генератор 10.4. Вопросы  В главах 10 и 11 рассматривается использование РР1—порта‚ ко- торый обсуждался в гл. 9, для преобразования сигналов из циф- ровой формы в аналоговую (гл. 10) и из аналоговой формы в Цифровую (гл. 11).  10.1. цифро-аналоговое преобразование  цифро-аналоговый преобразователь (ЦАП) вырабатывает вы- ходное напряжение, величина которого пропорциональна дво- ичному сигналу (числу), подаваемому на вход преобразователя. Существует большое количество ИС, использующих различ- Ные методы для выполнения цифро-аналогового преобразова- Ния. Для иллюстрации этого процесса ниже приводится описа- Ние метода 4-ра3рядного R—2R лестничного преобразования (Рис. 10.1). Обратимся к рис. 10.1. Здесь Vs является опорным напряже- Нием, обычно снимаемым с эталонного источника постоянного ТОКа, питающего R-ZR-cxeMy. Сопротивление лестничной схе- МЫ, нагружаюшей источник Vs, постоянно, и его величина Обычно лежит в диапазоне от 1 до 5 кОм, поэтому ток от источ- Ника Vs должен быть постоянным. Положение каждого аналого- 3080 переключателя устанавливается в соответствии с двоичным 
176 Глава 10  V’ ZR ZR ZR ZR  ГЭА W8  ZR  о О Аналоговые переключатели  Земля  ходной ток Подается, е Анал ОГО ВЬ|Й  выход  Ьмещенпе  Сор 4-разрядньпй регистр CMP  l I 1 l  '-——-—--— 4-разрядньяй —-———-J Земля Двоичный вход  ОУ  Земля  Рис. 10.1 . R—2R ЦАП.  сигналом на выходах регистра. Логический О, полученный от этого регистра, замыкает соответствующий переключатель на «землю», а логическая 1 обеспечивает его переключение на вход операционного усилителя (0.10. B силу очень высокого коэффициента усиления операцион- ного усилителя между его инвертирующим (—) и неинвертирую- щим (+) входами существует только очень малая разность потен- циалов. В этом случае говорят, что инвертирующий вход опера- ционного усилителя виртуально заземлен. Таким образом, ток, потребляемый К-2К-схемой‚ не изменяется при изменении по- ложений аналоговых переключателей. Ток 1, потребляемый от источника Vs, B каждом узле1 К—2К-цепи разбивается на два равных по величине тока. Таким образом, ток, протекающий через переключатели A, B, C и D, будет равен соответственно 0.5 I, 0.25 I, 0.125 I и О.О625 1. B таблице на рис. 10.2 указана взаимосвязь между положе- ниями переключателей, током, протекающим через каждый ne- реключатель, током на входе операционного усилителя и вы- ходным напряжением, создаваемым на резисторе обратной связи Rf. При расчете выходного напряжения предполагается,  ‘ .V3e/I электрической цепи означает точку соединения двух или более 1<oMrI0' нентов этой цепи. 
.m=:8§E:m: 5.30.82. mdsnomh N.o _. .о:д  тьмы: 58... „все ЮЗ «No З _ _ _ _ «S: „Её о.о ЮЗ mud то о _ _ _ ЮЗ: теще «Sod о.о nae З _ о _ _ дь! 5... о.о о.о mud то о о _ _ „го: 58... мысов ЮЗ о.о и.о _ _ o _ до: „Юса о.о ЮЗ о.о и.о о _ о _ 83: ыиыюдо иыюоо о.о о.о и.о _ о о _ 3: „по о.о о.о о.о и.о о о о _ 2.37. :53 «Sod ЮЗ mud о.о _ _ _ o идя 53 о.о RS иыо о.о о _ _ о «Sm: Reno „все о.о mad о.о _ о _ о дм! ES о.о о.о mud о.о о о _ o $2: 53¢ «Sod ЮЗ о.о о.о _ _ о о 2.7 „ЮЗ о.о ЮЗ о.о о.о о _ o o тыча: „Юго «Sod о.о о.о о.о _ o o о о.о о.о о.о о.о о.о о.о о о о о E я +5 _..._...Eo_._ D о щ < а о щ < oszmxcacaz >0 То s:o...aro_5.oao: m_m:m»ar9§oa0: ФО ЗЁОХЗШ ФЁОХШ От. ¥O._. 00007 O._0.=.—O_N¥0.—.OQ—._ 0S—._0¥nO_hO_._  . Ё юно... o..o::o: ЕЗЧ 
178 Глава 10  что Rf= 2 кОм и 1 = 5 MA. Как видно из таблицы на рис. 10.5, при положительном опорном напряжении величина выходного сигнала будет изменяться от О В к отрицательным значениям, Выходной сигнал можно сделать симметричным относительно О В путем подачи некоторого тока смещения, равного —0.5 1, в точке, указанной на рис. 10.1. Одно из важных требований, предъявляемых к схемам цифро-аналогового преобразования, — линейность. Линей- ность схемы определяется тем, насколько точно величина аналогового сигнала соответствует подаваемым на вход дво- ичнь1м числам. В идеальном цифро-аналоговом преобразо- вателе выходное напряжение должно уменьшаться ступенча- тым образом равными шагами при увеличении значений двоичного входного сигнала, как это видно из таблицы на рис. 10.2.  10.2. Упражнения по преобразованию цифрового сигнала в аналоговый  При выполнении всех упражнений, приведенных в гл. 10, 11 и 12, применяется ИС ZN425, представляющая собой ЦАП/АЦП, но можно использовать и любые Другие аналогичные интег- ральные схемы. Для некоторых современных ИС потребуется меньшее число компонентов в АЦП-схемах, описываемых в гл. 11 и 12.  10.2.1. Упражнение «Тестирование цифро-аналогового преобразователя»  Цель данного упражнения — создание интерфейсной схемы цифро-аналогового преобразования и присоединения ее к PFI- порту компьютера. Приведены как логическая схема цифро- аналогового интерфейса (рис. 10.3), так и листинг программы. Аппаратные и программные средства следует разрабатывать И тестировать отдельно. Назначение выводов используемых И показано на рис. 10.4. Схема тестирования ЦАП с использованием источника ПИ‘ тания с выходными напряжениями +5 В, 0 В и —5 В и блока пе‘ реключателей показана на рис. 10.5. 
Буферный усилитель  (+) 741  - Аналоговый - выход  \|O)U’0«h(D70-‘O  Земля  | | I I I I I  ЦАП  Рис. 1 0.3. Логическая схема ЦАП.  В-разрядный ЦАП/АЦП ZN 425 ОУ 741 1 '— Земля scum" 16 ‘т L 8 2 .... ЦАП/АЦП VS in .... 15 L_ (...) up Dc... ___ 7 3 —ч C5900 от L’ 14 3_. (..)|/p 0/P ... 4 _4 Бит 7 13 4__J Dc- Б 12 5 Бито We F" Вид сверху 6 -- Бит1 5"‘T5 —- 11 Примечание 7 —- Бит 2 Бит4 L. 10 Ha выводе 2 должен быть логический 0 в -1 V 3 9 для ЦАП и логическая 1 для АЦП cc БИТ Vs —- внутренний источник для R—2R-uenm O/P — аналоговый выход  Рис. 10.4. Назначение выводов ИС.  Вольтметр или ЭЛО  -`1Ф0'!ЬФЮ—ЪФ  S CD б I- св 3‘ ё Ф Q Ф С  Блок  Рис. 10.5. Схема тестирования ЦАП. 
180 Глава 10  Тестирование схемы  По возможности протестируйте аппаратные средства интерфей- са, прежде чем подключать их к компьютеру. На рисунке 10.5 приведена схема тестирования ЦАП. Для тестирования ЦАП:  1) после тщательной проверки схемы подключите источник питания (+5 В, Земля, —5 В);  2) подсоедините вход к набору двоичных переключателей; 3) подсоедините выход к вольтметру или ЭЛО;  4) удостоверьтесь, что значения аналогового сигнала на вы- ходе прямо пропорциональны вводимым двоичным Чис- лам; проверьте весь диапазон чисел от О до 11111111.  Структура программного обеспечения  инициализировать РР1-порт В на вывод данных Напечатать команды пока не нажата клавиша на клавиатуре Цикл по i ( for(i = 0; i < 256; i++)) вывод i B порт В выход (exit)  Тестирование программного обеспечения  1. Будем считать, что листинг 1О.2.1 успешно скомпилиро- ван. Протестируйте программное обеспечение путем non- ключения блока светодиодов к РР1-порту В. Удосто— верьтесь, что при исполнении программы выходной сиг— нал рассчитывается в диапазоне от О до 11111111.  2. Теперь подключите ЦАП к компьютеру и проверьте пра- вильность работь1 системы. 
цифро-аналоговый параллельный интерфейс 181  _,..j  г.  /*dac1.c Выходной сигнал в данной программе рассчитывается в диапазоне от 0 до 255 в двоичном формате. При этом напряжение выходного сигнала, вырабатываемого ЦАП, должно уменьшаться пошаговым образом, начиная с 0 В и достигая через 255 шагов максимального отрицательного значения. Протестируйте про- граММНЫй выход с помощью блока светодиодов, подключенного к РР1-порту В. Наконец, протестируйте ЦАП, подключенный к порту В */  #include < conio.h > /* Для функции kbhit() */ #include < stdio.h > /* Для функции printf() */ #incIude < dos.h > /* Для функции outp() */ int B_Address = 0x301 /* Изменить, если это необходимо */ int Control = 0x303; /* Управляющий адрес для РР1-вывода "'/ int Config = 0x90; /* Конфигурация РР1 */  void main() { int i; outp(Control,Config); /* Конфигурирование РР1 */ printf("\n\n\t1'[POTECTI/IPOBATb выходной СИГНАЛ ЦАП"); printf("\n\n\tHa)KMme любую клавишу для выхода из программьцп"); while(1) { for(i = 0; i <256; i++) { outp(B__Address,i); delay(50); /* Только для тестирования с помощью блока светодиодов */ printf("%i\t", i); /* Только для тестирования */ if (kbhit()) exit(1);  }  L’  Листинг 10.2.1 . с1ас1.с. 
182 Глава 10  10.3. Функциональный генератор (генератор сигналов специальной формы)  Упражнения этого раздела иллюстрируют использование мик- ропроцессора для генерирования периодических сигналов спе- циальной формы. Частота этих сигналов будет ограничена ско- ростью обработки данных.  10.3.1. Упражнение «Функциональный генератор»  Данное упражнение демонстрирует генерацию с помощью ком- пьютера одного из наиболее простых сигналов специальной формы. Электронно-лучевой осциллограф (ЭЛО) подключен к выходу схемы, используемой в упражнении 1О.2.1. Модифици- рованный листинг приведен ниже. Показан лишь листинг для ступенчатой функции. Сигнал такой формы появляется на эк- ране ЭЛО в пилообразном виде, если его рассматривать при большой скорости развертки. Для сигналов прямоугольной, си- нусоидальной и треугольной форм предусмотрены соответст- венно функции Squarewave-(), Sinewave() и Triangu1ar() соответ- ственно, указанные на листинге как «пустые» операторы.  Функциональный генератор Сконфигурировать Выбрать форму РР| сигнала Напечатать меню 9 O О Сигнал 0 CTV”e“'*a"°"" Меандр Синусоида ТРЭУГОЛЬНОЙ СИГНаЛ формы  Рис. 10.6. Структурная схема программного обеспечения к упражнениям 10.3.1 И 10.3.2.  /*dac2.c Функциональный генератор */ #include < string.h > /* Для строковой функции toupper() */ #include < conio.h > /* Для функции kbhit() */ #include < stdio.h > /* Для функций printf(), getch() */ #include < dos.h > /* Для функции outp() */ #inc1ude < math.h > /* Для функции sin() */ над  Листинг 10.3.1 . dac2.c. 
цифро-аналоговый параллельный интерфейс 183  .—:j~  int B__Address = 0x301; /* Адрес порта В */  int Control = 0x303; /* Управляющий регистр РР1 */ int Config = 0x90; /* Конфигурация РР1 */ void Staircase(); /* Определение ступенчатой функции */  void Squarewave(); void Sinewave(); void Triangu1ar(); void main(); { char menu; outp(Contro1,Config); /* Конфигурирование РР1 */ while(menu ! = 'Q') /* Печать меню на экране */ { с|г5сг(); printf("\033[2.T\n\n\t\tBbIXO,Z[HOI7I СИГНАЛ СПЕЦИАЛЬНОЙ ФОРМ Ы ОТ ЦАП\п"); printf("\n\tT для sTaircase (ступенчатый сигнал)"); printf("\n\tS для Squarewave (меандр)"); printf("«\n\tIzu1H slnewave (синусоида)"); printf("\n\tR для tRiangularwave (сигнал треугольной формы)"); printf("\n\tQ для выхода из программы\п"); /* ввод символа и его перевод в верхний регистр; переключение на выбранную функцию */ switch(toupper(getch())) {  case ‘T’: Staircase(); break; case ‘S’: Squarewave(); break; case ‘Г: Sinewave(); break; case ‘R’: Triar1gu1ar(); break; case ‘Q’: exit(1);  }  L  Листинг 10.3.1. (Продолжение) 
184 Глава 10  void Staircase() { 1nt 1; clrscr(); printf("Hax<Mm~e любую клавишушпя возврата в МЕНЮ"); while(!kbhit()) { for(i = 0; i < 256; i++) outp(B_Addrcss,i);  }  void Squarewavc() { /* пустой оператор "‘/ } void Sincwave() { /* пустой оператор "‘/ } void Triangular() { /* пустой оператор */  }  Листинг 10.3.1. (Продолжение)  Тестирование упражнения 10.3. 1  1. В результате работы программы для данного упражнения  на экране осциллографа, подключенного к выходу ЦАП, будет воспроизводиться сигнал ступенчатой формы с 256 ступеньками. В отличие от выходного сигнала R—2R-uenn (рис. 10.2), данный выходной сигнал будет увеличиваться начиная с нуля в положительную сторону.  Проверьте линейность системы. Все ступеньки должны быть одинаковыми.  10.3.2. Упражнение «Полный вариант  функционального генератора»  Заполните пустые операторы листинга 10.3.1. Листинг 10.3.2 демонстрирует один из способов генерации синусоиды. ‘Iro- 
цифро-аналоговый параллельный интерфейс 185  ..._—  быуспешно скомпилировать и запустить данную программу, в начало листинга 10.3.1 должны быть добавлены следующие строки: #inc1ude<math.h> и #define pi 3.14. При выполнении этой программы и наблюдении выходного сигнала на экране осциллографа между появлением каждой синусоиды может наблюдаться короткая пауза. Это связано с тем, что компью- теру требуется некоторое время на инициализацию нового цикла.  Структура функции Sinewa ve() Вычислить значения синуса для одного цикла.  Хранить эти значения в некотором массиве пока не нажата клавиша на клавиатуре вывод последовательности чисел из массива.  #include<math.h> /* Требуется для функции sin() */ #define pi 3.14 void Sinewave() { double sine[256]; /* Определение массива из 255 чисел с плавающей точкой */ int i; printf("\nHa)KMprre любую клавишу для возврата в МЕНЮ"); for(i = О; i < 256; i++) sir1e[i] = 128*(1 + sin(2*pi*i/256)); /* Загрузка значений sin B массив "‘/ while(!kbhit()) { for(i = О; i < 256; i++) outp(B_Addrcss,sine[i]);  }  L.  Листинг 10.3.2. 
186 Глава 10 10.4. Вопросы  1. Обратимся к рис. 10.1. Для V = 5 В, R = 5 кОм и макси- мального напряжения V = 10 В при подаче на вход двоич- ного числа 1111 определите:  а) величину Rf, 6) V0 для двоичного числа 0001 на входе, в) V0 для двоичного числа 1000 на входе.  2. Тот же вопрос, что и в пунктах б) и в) вопроса 10.4.1‚ но для выходного напряжения от + 5 до —5 В.  3. Тот же вопрос, что и 10.4.1‚ но для 8-разрядного ЦАП. 
. чин к“. .  Глава 11  Аналого-цифровой параллельный интерфейс  11.1. Аналого-цифровые преобразователи  1 1.2. Упражнения по аналого-цифровому преобразованию сигнала  11 .3. Вопросы  Эта глава описывает аналогово-Цифровое преобразование сиг- нала через РР1 порт, который рассматривался в гл. 9.  1 1.1 . Аналого-цифровые преобразователи  Назначение аналоге-цифрового преобразователя (АЦП) за- ключается в том, чтобы поставить в соответствие дискретным уровням напряжения аналогового сигнала некоторые двоичные числа (оцифровать аналоговый сигнал). В электронной системе длина‘ двоичных чисел должна быть точно определена. Длина числа может, например, составлять 4, 8, 12 или 16 бит (разря- дов). Большинство выпускаемых в настоящее время преобразо- вателей являются 8- или 12-разряднь1ми. При использовании восьми бит максимальное число уровней напряжения (называ- емых уровнями квантования), которым можно поставить в соот- ветствие двоичные числа, будет равно 2 = 256. Если предполо- жить, что максимальная величина входного напряжения будет равна 2 В, то мы получим интервал квантования? 2/256 = 7.843 мВ. Когда аналоговый сигнал по своей величине точно не попадает ни на один из уровней квантования, появляется ошибка кван- тования.  1 «Длиной» некоторого числа или кода называют число разрядов этого чис- Ila или кода. 3 Число интервалов равно числу уровней минус один уровень. 
188 Глава 1 1  В продаже имеется большое количество ИС АЦП, которые осуществляют аналого-Цифровое преобразование различны- ми способами. Вообще, чем выше быстродействие преобразо- вателя, тем он дороже. В этой главе будет идти речь лишь об аналого-цифровом преобразовании сигналов постоянного то- ка или сигналов очень низких частот. Для многих АЦП при преобразовании сигналов переменного тока необходимо PIC- пользовать некоторый тип схемы выборки и хранения. Эта схема, обычно состоящая из небольшого конденсатора с под- ходящей схемой коммутации, хранит мгновенное значение аналогового напряжения (выборку) в то время, когда происхо- дит преобразование выборки в двоичное число. В следующих разделах будут рассмотрены два метода аналого-цифрового преобразования.  11.1.1. Аналого-цифровой преобразователь с динамической компенсацией  Блок-схема аналогово-цифрового преобразователя с динамиче- ской компенсацией показана на рис. 11.1.  Схема работает следующим образом: 1. Аналоговый сигнал подается на аналоговый вход.  2. Активизируется линия «начало преобразования» (сброс счетчика).  Счетчик начинает считать от нуля.  4. ЦАП преобразует двоичный выходной сигнал счетчика в аналоговый сигнал.  5. Компаратор сравнивает выходной сигнал ЦАП с аналого- вым входным сигналом. Если второй больше первою, компаратор со своего выхода останавливает счетчик с по- мощью управляющей логической схемы.  6. Управляющая логическая схема разрешает запись в вы- ходной регистр и тем самым обеспечивает загрузку выход- ного сигнала счетчика в этот регистр.  7. Активизируется линия «конец преобразования».  Главный недостаток АЦП с динамической компенсацией за- ключается в относительно больших затратах времени на преоб- 
Аналого-цифровой параллельный интерфаайс 189  Аналоговый вх°д ' Ш Компаратор цифро‘ (2) аналоговый преобразователь Регистр "‘› Цифровой _› выход Генератор „ Двоичныи УПРЗВЛЯЮЩЗЯ синхронизирующих импульсов счетчик ЛОГИЧЭСКЗЯ СХЭМЗ Запуск преобразования % I  Преобразование завершено ё  Рис. 11.1. АЦП с динамической компенсацией.  разование входных сигналов большой амплитуды. Это обуслов- лено тем фактом, что сигнал ЦАП должен пилообразно возра- стать, начиная с нуля. Максимальная скорость преобразования ограничена временем, затрачиваемым на установление выход- ного сигнала ЦАП после каждого приращения выходного сиг- нала счетчика. Время преобразования для АЦП с динамической компен- сацией пропорционально тактовой частоте и числу уровней квантования, на которые разбивается аналоговый сигнал. З-разрядный АЦП имеет 256 уровней квантования. Время Преобразования должно оцениваться для преобразования максимального входного сигнала. Для аналого-цифрового Преобразования максимального входного сигнала потребуется 256 тактовых импульсов. Если используемая тактовая частота Равна 1 МГц, то длительность каждого тактового импульса со- Ставит 1 мкс. Время преобразования в этом случае будет равно 256 мкс. На рисунке 11.2 показана временная диаграмма для 4-раз- РЯдного АЦП с динамической компенсацией. На этой диаграм- 
190 Глава 11  Тактовые ' ' ' ’ ' и ' I  Запуск : 5 Ё I I : : : I Ё I I I преобразования 1 Ё ‚ % f j j 3 —f ч IT- (сброс счетчика) ‚ . . - . - . . . j , I A“a"0"°Bb'r4 mm’ * :3‘: ‘ Ё‘ ' ‘Ь ° ": ‘ -J1_ -Q'i - ‘L’ BXOJZ1HOl71Cl4l'H3J110oo---r-t-'---‘---'---'---:--- . . om I . j I I 0110”""""‘ ‘ ' ‘ ' ":"‘ . : . : : Выходной _ _ _'_ ,_ _‘_ _ _ r _ _ ' : : . : - СИГНЗЛЦАП OO1‘___:_T_‘____T__ : : : : : : 0010' "г" ' _ 1 : ' . - I 0001‘ ‘, . . . . I ; I I 0000 - : ; д ' ‹ . . -  Выходной сигнал ‚ I компаратора  Рис. 1 1 .2. Временная диаграмма 4-разрядного АЦП с динамической ком- пенсацией.  1  ме аналоговый входной сигнал создает двоичный выходной сиг- нал 1001 (9 в десятичной системе).  11.1.2. АЦП параллельного, или мгновенного, преобразования  Использование блока компараторов — альтернативный и Ha- много более быстрый способ преобразования аналоговых сиг- налов в двоичные коды. Этот более дорогой способ, поскольку он требует использования отдельного компаратора ДЛЯ каждого уровня квантования. На рисунке 11.3 приведена логическая схема З-разрядного аналого-Цифрового преобразователя мгно- венного действия. Все выходы компараторов с опорными Ha- пряжениями ниже уровня входного сигнала изменят свое co- СТОЯНИС. Затем комбинационная логическая схема преобразует выходные сигналы компараторов в З-разрядные двоичные K0‘ ды. На рисунке 11.4 приведена таблица истинности данной ло* гической схемы. 
Аналого-цифровой параллельный интерфейс 191  Аналоговый д вход 7  .1В .2В .3В .4B .5B .6B .7B  c b a З-разрядньъй цифровой выход  Рис. 1 1 .3. З-разрядный АЦП параллельного преобразования.  Входы Выходы ABCDEFG a b c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 0 0 1 0 0 0 0 01 1 0 1 0 0 0 0 01 1 1 0 1 1 0 0 01 1 1 1 1 0 0 0 01 1 1 1 1 1 0 1 О 1 1 1 1 1 1 1 1 0 Рис.11.4. Таблица истинности цлялоги- 1 1 1 I I I 1 1 1 1 ческой схемы АЦП параллельного преоб- разования.  1 1.2. Упражнения по аналого-цифровому преобразованию сигнала  В упражнениях в данной главе в качестве АЦП используется ИС ZN425E.  11.2.1 . Упражнение «Тестирование Ацп»  Цель данного упражнения — сконструировать АЦП-плату на основе ИС АЦП с динамической компенсацией, работающую Через РР1. Приведен листинг программы и схема аппаратных 
192 Глава 11  +58  . ксветодиодам‘ 5 Сброс :или РР|-портуА: в I . . . . . . . - ..' 7  Состояние  Аналоговый  Земля  Рис. 11 .5. Схема АЦП с динамической компенсацией.  соединений. Если тактовый сигнал вырабатывается программ- ным способом, то можно спроектировать такую систему, для ко- торой потребуется лишь три управляющих соединения с компь- ютером (сброс, синхронизация, состояние). Двоичный выход- ной сигнал будет равен числу тактовых импульсов, поступаю- щих с компьютера. При использовании АЦП, в котором цифровой выходной сигнал не пропорционален числу тактовых импульсов, цифро- вой выходной сигнал нужно будет считывать B параллельный порт компьютера. Программное и аппаратное обеспечение может разрабаты- ваться Pl тестироваться отдельно ДРУГ от дРУГа. На рисунке 11.5 показана логическая схема, работающая следующим образом:  1. Сбрасывается счетчик и запускается генератор тактовых импульсов.  2. Сигнал на выходе О/Р АЦП пилообразно увеличивается на одну ступеньку с приходом каждого тактового импульса.  3. Когда величина сигнала на выходе О/Р «переходит» черСЗ уровень приложенного аналогового входного сигнала, вы- ход компаратора изменяет свое состояние.  4. Сигнал состояния преобразования используется для оста‘ новки генератора тактовых сигналов.  5. Считывается двоичный выходной сигнал АЦП. 
Аналого-цифровой параллельный интерфейс 193  г}  Компоненты, используемые в схеме на рис. 11.5 перечисле- ны ниже.  Количество Наименование Примечание  1 АЦП ZN425E Такой же, как в гл. 10 1 Компаратор 531 Назначение контактов то же  самое, что и в ОУ 741 ИС 741 может замещать ИС 531  2 Резисторы 47 кОм R2, используемый для уста- новки динамического диапа- зона, имеет стартовую величи-  ну 47 кОм 1 Резистор 1 кОм 1 Конденсатор 220 нФ 1 Небольшой кремниевый Он не позволяет выходному диод сигналу опускаться ниже 0 Вольт  Тестирование схемы  Соединения ДЛЯ тестирования показаны на рис. 11.6 и перечис- лены ниже:  1) блок светодиодов — к двоичному выходу АЦП;  2) источник постоянного тока с регулируемым выходным на- пряжением от 0 до 10 В -— к аналоговому входу;  3) логический переключатель — ко входу сброса; 4) СИД или вольтметр — к выходу состояния;  5) низкочастотный генератор тактовых импульсов -— к синх- ронизирующему входу.  Операции: 1) установите величину восодного напряжения 10 В;  2) переключатель сброса установите в состояние логическо- го 0, а затем в состояние логической 1, на выходе состояния должен установиться высокий уровень (логическая 1); 
194 Глава11  Источник питания +5 О -5  ч 5 В СИД БЛОК ЕЗЁЁЕНЫЙ Состояние О В Й СИД » АЦП-плата C6 Л 5 в - DOC огический Аналоговым 0 В 9 B ВХОД Синхронизация переключатбъ’ _ Ъ Б/Р 1 БП Низкочастот- постоянного тока ный генератор с регулируемым тактовых напряжением импульсов TL; o B ° т ‘О В в о в +5 в Й ` Земля  Рис. 1 1.6. Схемные соединения при тестировании.  3) запустите генератор тактовых импульсов; светодиоды в блоке светодиодов должны отображать процесс счета, на- чиная с 0;  4) когда выход состояния переходит на низкий уровень (ло- гический О), генератор тактовых импульсов прекращает работу;  5) повторите операции, начиная c пункта 2, регулируя сопро- тивление резистора R2 до тех пор, пока счетчик не досчита- ет до 250 (при напряжении 10 В на аналоговом входе);  6) проверьте правильность счета при подаче более низкого напряжения.  Структура программы для упражнения 11.2. 1  Определить RESET = О, MARK = 3, SPACE = 1, вводимое состояние STATE инициализировать РР1 Напечатать команды пока не нажата клавиша на клавиатуре  RESET Ожидать логический О на входе состояния выполнять 
Аналого-цифровой параллельный интерфейс 195  { MARK  Подсчет приращения Тест на максимальное число SPACE Короткая задержка }пока STATE He paBHO 0 напечатать Показание на Двоичном входе  } }  /*adctest.c Тестирование АЦП, подключенного к РР1-плате */  #include <conio.h> /* Для функции kbhit() */ #include <stdio.h> /* Для функций printf(), getch() */ #include <dos.h> /* Для функции outp() */  /* СБРОС ГЕНЕРАТОРА ТАКТОВЬ1Х ИМПУЛЬСОВ*/ #define RESET outp(0x302,0) /* СО к О, С1 к О */ #defme MARK outp(0x302,3) /* СО к 1, С1 к 1 */ #define SPACE outp(0x302,1) /* СО к 1, С1 к О */ #defme STATE (inp(0x302) & 16) /* Вводит состояние на С4 и маску только для бита 4*/  int A_Address = Ох3ОО /* Адрес РР1-порта А */ int Control = 0x303; /* Адрес управляющего РР1- регистра */ int Config = Ох9А; /* А на ввод, В на ввод, CL на  вывод, СН на ввод */ void main()  {  int count; outp(Contro1,Config); clrscr(); printf("\n\n Тест АЦП"); printf("\n\n Нажмите любую клавишу для выхода их программы”); while(!kbhit()) `  RESET; count = О; pintf("\033[14; ЮН Oxcmxanne логического О на входе состояния");  do Q  дистинг 1 1 .2.1 . adctest.c. 
196  Глава 11  } }  if(kbhit()) exit(1); }while(STATE ! = О); printf("\033[14;10H Состояние = О Посылка тактового импульса"); do { MARK; if(++count > 255) printf("\033[16;10H Превышен уровень максимального входно- го сигнала"); else { SPACE; delay(50); print("*"); } }while(STATE = = 0); printf("\033[16;lOH Показание == %d  /"‘ Для тестирования программы "'/  ",inp(A_Addrcss));  Листинг 1 1 .2.1 . (Продолжение)  Тестирование программного обеспечения упражнения 1 1.2. 1  1.  .U‘:"E-‘~’!‘9  C4. Подключите СИД к выходу сброса СО. Подключите СИД к выходу синхронизации С1.  Переключите вход состояния к уровню логической 1.  щение «Охоищание логического Она входе состояъшя».  6. Переключите вход состояния к логическому 0.  7. СИД сброса должен включиться.  Подключите логический переключатель к входу состояния  Запустите программу. Светодиоды сброса и синхронизацт‘ должны быть погашены. На экране должно появиться coo5' 
Аналого-цифровой параллельный интерфейс 197  8.СИД синхронизации должен периодически переключаться (из состояния ВКЛЮЧЕНО в состояние ВЫКЛЮЧЕНО). Экран должен показывать сообщение «На входе состоя- ния логический О. Пересылка синхронизирующего им- пульса».  9.Переключите вход состояния к логической 1. Повторите все операции, начиная с пункта 6.  10. На экране должно высвечиваться число, считанное с бло- ка переключателей, подключенного к порту А.  Тестирование системы  1. Реализуйте следующие соединения между платой АЦП и РР1-портом:  Сброс — к СО Синхронизация —— к С1 Состояние — к С4 Двоичный выход -— к порту А  2. Убедитесь, что источник постоянного тока с регулируемым напряжением соединен с аналоговым входом и запустите программу.  3. Изменение величины постоянного напряжения на этом вхо- де от 0 до 10 В должно приводить к пропорциональному изменению величины двоичного числа на выходе. Со- ставьте таблицу, занесите в нее числа, отображаемые на экране при изменении входного напряжения с шагом 0,5 В. Нарисуйте график зависимости величин выводимых чисел от входного напряжения.  1 1.2.2. Упражнение «Вольтметр»  В данном упражнении в интерфейсную схему включены аппа- ратные средства, которые использовались для упражнения 1 1.2.1. Вольтметр предназначен для индикации напряжений от О до 10 В и должен иметь высокое входное сопротивление (свыше 1 МОм). В листинге 11.2.1 необходимо сделать небольшое изме- Нение для того, чтобы на экране появлялось сообщение «Пере- грузка», когда счетчик досчитает до 251. 
198 Глава 11  +12 в  Высокоомный вход › (т) оу  ____„›_ K аналоговому входу АЦП  -12в  l_.0B  Рис. 11.7. Схема с высоким входным сопротивлением.  Земля  Один из способов обеспечения высокого входного сопротив- ления —— использование простой буферной схемы на основе опе- рационного усилителя типа показанной на рис. 11.7. В такой схеме операционный усилитель должен питаться от двухполяр- ного источника постоянного тока +/—12 B. Кроме того, нужно обеспечить возможность регулировки сопротивления резистора R2 для того, чтобы напряжению величиной 10 В соответствова- ло число 250.  11.2.3. Упражнение «двухдиапазонный вольтметр»  Это упражнение можно рассматривать как проект. Его Цель состоит в добавлении в вольтметр еще одного диапазона изме— рений (от О до 1 В). Выбор диапазона должен осуществляться либо автоматически, либо с клавиатуры компьютера. Обрати- те внимание, что для этого потребуется еще одна управляю- щая линия. На рисунке 11.8 показана структурная схема двух- диапазонного вольтметра‚ а рис. 11.9 иллюстрирует один из способов изменения коэффициента усиления операционного усилителя.  1 Синх Ониза Mg Сигнальный *E'?LL'§"‘ вход ‘И Cfinm~4__l Входной ПлатаА П остояние ч буфер Ц **3-——-—›— Параллельныи и выбор А ВХОД/ ВЫХОД диапазона двоичный сигнал Компьютера ДИЭПЭЗОН  Рис. 11 .8. Структурная схема двухдиапазонного вольтметра. 
Аналого-цифровой параллельный интерфейс 199  +12 B Высокоомный вход ("') ОУ ' K аналоговому входу АЦП (-) R R - 12 B Ё %—E——{- Выбор диапазона ' - - - J 10 KOM Земля  1_ов  Рис. 1 1 .9. Схема с высоким входным сопротивлением.  Для изменения коэффициента усиления, определяемого со- отношением величин резисторов в схеме, и следовательно, для выбора того или иного диапазона можно использовать аналого- вый переключатель или реле. Коэффициент усиления по напря- жению для схемы на рис. 11.9 определяется выражением:  Gv=ao+Rym,  где R — сопротивление одного из резисторов в кОм.  11.3.Вопрось|  Частота синхронизации для 8-разрядного АЦП с динамической компенсацией равна 2 МГ Ц, а максимальная величина входного сигнала —5 В. Определите:  1. Время преобразования сигнала величиной 5 В. 2. Время преобразования сигнала величиной 1 В.  3. Ошибку квантования в процентах от 1 B, если сигнал ве- личиной 1 В не соответствует точно уровню квантования. 
Глава 12  Параллельный принтерный порт  12.1 . Параллельный принтерный порт 1 2.2. Упражнения по вводу/выводу данных 12.3. Упражнения C шаговым двигателем 1 2.4. Упражнения с функциональным генератором 12.5. Упражнения с вольтметром  Упражнения, описанные в предыдущих главах, повторяются в этой главе, но уже с использованием параллельного принтерно- го порта.  12.1. Параллельный принтерный порт Преимущества использования принтерного порта:  1) нет необходимости в приобретении дополнительных карт для компьютера;  2) НЭЗНЭЧСНИС КОНТЭКТОВ ЯВЛЯСТСЯ стандартным ДЛЯ ВССХ пер- СОНЗЛЬНЫХ компьютеров.  Недостатки:  1) принтер должен отключаться от компьютера при проведе- нии экспериментов;  2) параллельный принтерный порт менее гибок в работе и предоставляет для использования меньшее число разрядов-  Параллельный принтерный порт — это 25-контактная гнез- довая часть разъема В-типа. Имеются три адреса, связанные с этим портом (base, base + 1, base + 2). Фактический базовый ал- рес (base) МОЖНО найти в сопроводительных документах к ком- пьютеру или из программы тестирования компьютера. Обычные базовые адреса —— 378 hex или ЗВС hex. Данный порт имеет 8 разрядов вывода данных и несколько разрядов для линий управления. Некоторые из последних ис— 
Параллельный принтерный порт 201  Разряд (П Разряд 1 Разряд 2 Разряд З Разряд 4 Разряд 5  > Адрес base  Разряд 6 Разряд L. Разряд П Разряд 6 Разряд 5 L Разряд 4 Адрес base + 1  Разряд З_  Рис. 1 2. 1 . Назначение контактов принтерного порта.  пользуются только для вывода управляющей информации, не- которые — для ввода, и некоторые могут быть запрограммиро- ваны как для ввода, так и для вывода. В качестве логических уровней используются ТТЛ—уровни напряжения (0 и 5 В), как и для РР1. Наиболее удобные входы и выходы используются для выполнения упражнений, приведенных в настоящей книге, при этом еще довольно много выводов (контактов) остаются неза- действованными. По базовому адресу вывода «располагаются» контакты со второго по восьмой с самым младшим разрядом на контакте 2. Имеется 5 битов ввода по адресу base + 1, разводка контактов для этих разрядов показана на рис. 12.1.  12.2. Упражнения по вводу/выводу данных  12.2.1. Упражнение «Вывод данных через принтерный порт»  Это повторение упражнения 9.1.2. Цель данного упражнения — показать, что система вывода работает правильно, путем пере- сылки двоичных чисел по базовому адресу принтерного порта. Аппаратные соединения показаны на рис. 12.2. 
202 Глава 12  Параллельный принтерный  ФФЧФСЛЗФЮ  0 1 2 3 4 5 6 7  Y0 О‘!  \lO)UI-b0Df0-to  Рис. 1 2.2. Подключение блока светодиодов к принтерному порту.  12.2.2. Упражнение «Ввод/вывод данных через принтерный порт»  Данное упражнение проверяет как ввод, так и вывод Данных. Двоичнь1е числа считываются с блока переключателей, соеди- ненного с контактами base + 1 принтерного порта. Выводи- мые данные отображаются так же, как в предыдущем упраж- нении. Дополнительные аппаратные соединения показаны на  рис. 12.3.  Параллельный принтерный порт (ввод)  Vdithhfdh)-‘O  ч O) 01 д Ф Ю -t О < Блок 8 перключателей  Рис. 1 2.3. Подключение блока переключателей к принтерному порту. 
Параллельный принтерный порт 203  Г/титрппьс Вывод данных на принтерный порт. Контакты 2—-9 соединены с блоком светодиодов */ #include < dos.h > #include < stdio.h > #include < conio.h > int Out_Address = 0хЗЬс; /* Базовый адрес принтерного порта */ void main() { int data,error = 1; clrscr(); printf("\033[5;5H Введите две шестнадцатеричные цифры"); printf("\033[7;5H Любую другую буквенную клавишу для выхода из программы"); printf("\033[8;5H И нажмите <Enter>"); printf( "\O3 3 [20 ; SH Адрес % ОХ" ‚ Out_Address); do  printf("\033[5;37H "); g0toxy(35,5);  fflush(stdin); error = scanf("%2X",&data); /* Данные с клавиатуры */ outp(Out_Addre.ss,data)°, /* Пересылка данных к порту‘ ‘I  }  while(error ! = О);  }  Листинг 12.2.1 . outprint.c.  Этот программный листинг выглядит более сложно по сравнению с обычным, и в него включены несколько новых технических приемов. Структурная схема программы показа- На на рис. 12.4. Скомпилируйте и запустите эту программу. Входные сигналы, выдаваемые блоком переключателей, будут отображаться на экране. Обратите внимание, что бит 7 инвер- тирован. Трассировочная таблица для раздела листинга, за- ключенного внутри прямоугольника, показана на рис. 12.5. Обращаясь K трассировочной таблице (рис. 12.5) той части программы, которая заключена в листинге 12.2.2 внутри прямо- Угольника, мы видим, что для ввода двух шестнадцатеричных 
204 Глава 12  Ввод/ вывод через принтерный порт Напечатать * меню Выбрать функцию Напечатать ВЫбРЭТЬ меню Функцию О ВВОД Вывод ВЫХОД * * Напечатать Ввести Напечатать Ё Ёёщатур ы информацию из порта информацию И вывести в „орт * П Ввести два * Сканировать Напечатать Напечатать вывести порт и ждать номера вводимые Шестадцате‘ в „орт изменения разрядов биты pm“ Ых Символа и проверить их истинность  Рис. 12.4. Структурная схема программного обеспечения для упражне- ния 12.2.2.  чисел без использования клавиши <Enter> getch() используется дважды с функцией for(). Проверяется правильность ввода Шестнадцатеричных чисел, и затем введенные числа преобразу- ются в двоичные. Два числа, введенные с клавиатуры, объеди- няются для формирования 8-разрядного двоичного кода.  /*inoutptr.c Ввод с базового адреса параллельного принтерного пор- та. Выводимые данные по адресу base + 1. Порт ввода должен быть подключен к блоку переключателей. Порт вывода должен быть под- ключен к блоку светодиодов.*/ #include <dos.h> #incIude <stdio.h> #inc|ude <string.h> #incIude <conio.h> void Input();  void Output(); int Out_Address = 0x3bc; /* Вставить базовый адрес принтерного  порта */ ___,_1 Листинг 12.2.2. inoutptr.c. 
.S_=:.Eo§o2mn: =Ёщщ o._o::2.o:oam ‚май Emacs: gunman SB 3:53 mamromoasoomah .m.N w .o:n_  ._n__2_2mq._oa: 3.508 Ezmam om uo.#s.n.om_n_m B56 ошцчю въхдцшьзшьовшч „ФЗЗЮТФЁЗЦС  ш ы Ёёизё щ щ ЕЁ „ЕЁ езэмавёииьд ‚т. ь. s_§.e§a§u._ ++_ ;-A_ д „с ё 8 +s%usS ом ы re vv Завёз изд. <P.E мощи c_.2_E.__§u..._ ‚м. ‚м. „о„.„.„э„а„„а„„п„_ ^++_ :12 д не ё о €__u3 xw... отчим 33: „б: Тч vv вшить... ‚Е. ъЕФЁЕЬвФЦ д цошш o3::.w.Q 0.53.53: n «SE23.  (I 
206 Глава 12  int In_Address = 0x3bd; /* Вставить базовый адрес плюс 1 */ void main() { int menu; while (1) { clrscr(); printf("\033[5;5H ВВОД ДАННЫХ / ВЫВОД"); printf("\033[7;5H Ввод с принтерного порта (нажмите <I>) %3x",In_Address"); printf("\033[8;5H Вывод в принтернЬ1й порт (нажмите <O>) %3x",Out_Address"); printf("\033[9;5H Выход (нажмите <Q>)"); menu = toupper(getch());  switch(menu); { case ‘I’: Input(); break; case ‘О’: Output(); break;  case ‘Q’: exit(1); } } } void Input() { int data,change,i; clrscr(); printf("\033[5;5H Нажмите любую клавишу для выхода в главное меню "); printf("\033[7;5H Соединения с 25—контактным принтерным портом О-типа"); printf("\033[8;5H Контакт 15 FAULT == бит 3 "); printf("\033[9;5H Контакт 13 SLCT = бит 4 "); printf("\033[10;5H Контакт 12 РЕ = бит 5 "); printf("\033[11;5H Контакт 10 ACKNLG = бит 6"); printf("\033[12;5H Контакт 11 BUSY = бит 7 (инвертирован) "); printf("\033[20;10H Адрес %0X",In_Address); while(1)  {  Листинг 12.2.2. (Продолжение) 
Параллельный принтерный порт 207  do  change = inp(In_Address); if(kbhit()) return; }while(change == data); data = change; printf("\033[13;5H Ввод данных = %2x",data); printf("\033[15;5H Биты 7 6 5 4 3 "); printf("\033[16;5H Состояние "); for(i = 7;i>2; i——) printf(" %1x",(data>>i)&1);  } void Output()  { int i,data; char valid[17] ="0123456789ABCDEF"; char k, *ptr; clrscr(); printf("\033[5;5H Введите две шестнадцатеричные цифры"); printf("\033[7;5H Нажмите любую другую клавишу для выхода в МЕНЮ"); printf("\033[20;5H Адрес %0Х hex",Out_Address); while(1) /* Установка Непрерывного цикла */ { data = 0; printf("\033[10;37H");  g0t0xy(35,5); {от = 1; i > -1; i——) /* Ввод шестнадцатеричного символа */  { k = (toupper(getch()); if((ptr = strchr(valid,k)) == 0) return; /* Возврат в меню, если введенный символ недействителен */ data = data + (ptr-va1id)<<(i*4); } /* CM. таблицу трассировки ниже */ ` outp(Out_Address,data); /* Пересылка данных в порт */ г  L  Листинг 12.2.2. (Продолжение) 
208 Глава 12  12.3. Упражнения с шаговым двигателем  Данные упражнения являются повторением упражнений с ma- I‘OBbIM двигателем, описанных в гл. 9.  12.3.1. Упражнение «Шаговый двигатель; две скорости вращения в каждом направлении»  Цель данного упражнения —- разработка программы на языке Си для управления скоростью и направлением вращения шаго- вого двигателя. Двигатель и Четыре переключателя из блока пе- реключателей подключены к принтерному порту (см.рис. 12.6). Структура программы показана на рис. 9.14.  "Компьютер ‚(дыша  1234  Шаговый параллельным __ __ . двигатель принтерный '  порт  ФФЧФШдФЮ чФшашю-ЬО чаэшьщю-о  Voc  «soon-oswro-o  ч О’! ш 5 Co) Ю — о Блок переключателей  Земля  Разрешение  Рис. 1 2.6. Аппаратное обеспечение к упражнению 12.3.1. 
Параллельный принтерный порт 209  Время задержки в программе должно подстраиваться таким образом, чтобы двигатель в быстром и медленном режимах ра- боты вращался плавно. Первая задержка для каждой последова- тельности делается более короткой с учетом компьютерного времени для возврата из цикла. Если программный код управле- ния двигателем будет пересылаться слишком быстро, двигатель начнет вибрировать.  /* motorptr.c Управление двигателем. Скорость и направление вра- щения двигателя управляются через принтерный порт. Контакты 15, 13, 12 и 10 должны быть соединены с блоком переключателей. Кон- такты 2, 3, 4 и 5 должны быть соединены с блоком светодиодов и дви- гателем.*/ #include <dos.h> #include <stdio.h> #include <string.h> #include <conio.h> int Out_Address = 0x3bc; /* Базовый адрес принтерного порта */ int In_Address = 0x3bd; /* Базовый адрес + 1 */ int clockwise = 0; int anticlockwise = 1;  int s1ow= 100; /* Эти две скорости устанавливаются в зависимости от быстродействия */ int fast= 10; /* компьютера; чем больше число, тем  медленнее двигатель */ void Rotate(int,int); void main() { int K = 1; clrscr(); printf("\033[5;5H УПРАВЛЕНИЕ ШАГОВЫМ ДВИГАТЕЛЕМ"); printf("\033[6;5H Управление двигателем с помощью блока переключателей "); printf( "\033[7 ;5 H Если все переключатели установлены на логический 0, "); printf("To двигатель остановится "); printf("\033[9;5 H НАЖМИТЕ ЛЮБУЮ КЛАВИШУ ДЛЯ ВЫХОДА ИЗ ПРОГРАММЫ "); printf("\033[ I 1;5H БИТ ЧИСЛО РЕЖИМ ");  НМ  Листинг 1 2.3.1 . тогогрггс. 
210 Глава 12  printf("\033[12;5H 0 1 медленное вращение по часовой стрелке "); printf("\033[13;5H 1 2 быстрое вращение по часовой стрелке "); printf("\033[14;5H 2 4 быстрое вращение против часовой стрелки "); printf("\033[15;5H 3 8 медленное вращение против часовой стрелки"); printf("\033[17;5H ВВСДСННОС число = "); do { /* Ввод и сдвиг на 3 разряда вправо */ K = ((inp(In__Address)>>3) & 0x0F); printf("\033[17;22H %li ",K);  switch(K) { case 1 Rotate(slow,clockwise); break; case 2 Rotate(fast,clockwise); break; case 4 Rotate(fast,anticlockwise); break; case 8 Rotate(s1ow,anticlockwise); break; default : printf(”\033[20; 10Н Двигатель остановлен"); } } while(!kbhit()); clrscr();  }  void Rotate(int speed,int direction) { int i; int data[2] [4] = {3,6, 12,9, /* Код для вращения по часовой стрелке */ 9‚12‚6‚3}; /* Код для вращения против часовой стрелки */ delay(speed*9/10); printf("\033[20;10H ........... .."); for(i = 0; i < 4; i ++) { outp(Out_Address,data[direction][i]); /"‘ Пересылка кода к двигателю */ delay(speed) ; }  › д  Листинг 12.3.1. (Продолжение) 
Параллельный принтерный порт 211  12.3.2. Упражнение «Шаговый двигатель; три скорости в каждом направлении»  Измените программное обеспечение таким образом, чтобы можно было задавать три скорости вращения двигателя (Hua- KyIO, среднюю и высокую) в каждом направлении. Один из спо- собов -— использование одного переключателя для выбора на- правления и трех других — для выбора скорости.  12.3.З. Упражнение «Два двигателя, две скорости»  Модифицируйте первоначальную систему для управления рабо- той двух шаговых двигателей с использованием одного набора четырех переключателей.  12.4. Упражнения с функциональным генератором  12.4.1 . Упражнение «Функциональный генератор»  Это повторение упражнения 10.3, использующего принтерный порт. Цель данного упражнения — создание схемы цифро-ана- логового интерфейса и ее подключение к параллельному прин— терному порту персонального компьютера. Структура програм— много обеспечения и тестирование для данного упражнения полностью описаны в гл. 10, поэтому здесь будут приведены только логическая схема (рис. 12.7) и листинг программы.  Компьютер +53 E Ёонтдкт РАЗНЫЕ " дёгэёёёё-ЁЁЁЁ | о 2 0 ‘Mp Усе 513 = з 1 д‘ "3 4 2 B I д 3 в от I 5 3 я 8' 5 4 ° выбор ’ | › _ дм Ё Ё Ё д :Аналоговыи а 9 7 ccp vs in | ВЫХОД 3253 MJEM-n ЦАП K Земля  Рис. 1 2.7. Логическая схема ЦАП к упражнению 12.4.1. 
212 Глава 12  ы  В приведенной схеме используется ИС ЦАП/АЦП ZN425E. Как уже отмечалось выше, аппаратные и программные средства нужно разрабатывать и тестировать отдельно друг от друга. Для выполнения данного упражнения потребуется источник питания с выходными напряжениями +5, 0 и —-5 B. B IIOIIOJII-Ie~ ние к компонентам системы, показанным в логической схеме на рис. 12.7, параллельно входам можно подключить блок светоди- одов для получения дополнительной информации. Информа- ция о назначении контактов используемой ИС имеется в гл. 10.  /* wformptr.c Генератор сигнала волновой формы */  #include <string.h> /* Для строковой функции юцррег() */ #include <conio.h> /* Для функции kbhit() */ #include <stdio.h> /* Для функций printf(), getch() */ #include <dos.h> /* Для функции outp() */ #include <math.h> /* Для функции sin() */ int Out_Address = 0x3bc; /* Базовый адрес принтерного порта "‘/ void Staircase(); /* Определение функций "‘/  void Squarewave(); void Sinewave(); void Triangular(); void main()  {  while( 1) /* Напечатать меню на экране */ { clrscr(); printf("\033[2J\n\n\t\t СИГНАЛ СПЕЦИАЛЬНОЙ ФОРМЫ ОТ ЦАП\п");  printf("\n\t T для sTaircase (ступенчатый сигнал)"); printf("\n\t S для Squarewave (MeaHIIp)"); printf("\n\t I для slnewave (синусоида) "); printf("\n\t Кдля tR1'angula1wave (сигнал треугольной формы)"): printf("\n\t Q для выхода из программы\п"); switch(toupper(getch ())) {  Листинг 12.4.1. wformptr.c. 
Параллельный принтерный порт 213  case ‘T’ Staircase(); break; case ‘S’ Squarewave(); break; case ‘I’ Sinewave(); break; case ‘R’ Triangular(); break; case ‘Q’ exit(1); } } } void Staircase() { 1nt i; clrscr();  printf( "Нажмите любую клавишу для возврата ‘н МЕНЮ"); while(!kbhit()); { for(i = 0; i <256; i++) { outp(Out_Address,i); delay(50); /* Только для целей тестирования "‘/  } }  void Squarewave() { /* Пустой оператор "‘/ } void Sinewave() { /* Пустой оператор "‘/ } void Triangular() { /* Пустой оператор "‘/  }  Листинг 12.4.1. (Продолжение) 
214 Глава 12  12.4.2. Упражнение «Полный вариант функционального генератора»  Заполните пустые операторы листинга 12.4.1. Листинг 10.3.2 ИЛ- люстрирует один из способов формирования синусоиды. Для ус- пешной компиляции и запуска этой программы необходимо до- бавить в начале листинга 12.4.1 строку «#define pi 3.14». При вы- полнении зтой программы и наблюдении выходного сигнала на экране осциллографа между появлениями отдельных синусоид может наблюдаться короткая пауза. Это связано с тем, что компь- ютеру требуется некоторое время на инициализацию нового цик- ла.  12.5. Упражнения c вольтметром 12.5.1. Упражнение «АЦП»  Упражнения с вольтметром уже описывались в гл. 11 с вводом данных через РР1. Данные упражнения могут быть выполнены с использованием принтерного порта только в том случае, если выходной сигнал АЦП пропорционален числу поданных такто- вых импульсов, как это имеет место в АЦП с динамической компенсацией, о котором шла речь в гл. 11. Цель данного уп- ражнения заключается в создании платы АЦП с использовани- ем ИС АЦП с динамической компенсацией. Между компьюте- ром и платой потребуется ввести лишь три сигнальные линии: синхронизацию, сброс и состояние. Двоичное число, представля- ющее аналоговый входной сигнал, равно числу тактовых им-  + 5 В Разряд _ „ _____„ о " ' ' Соединения : ё : 1 1 KOM принтерного порта 1 — — — — ""1 ' “ ё Ё Ё сб : ' I 3 5 9°C‘! Контакт 2' ' Ё ё I ‘ ' ‘KOHTBKT 3 I >_< 5 I 5 Синхрони3ация`1 : l as 8 : З I „_____ I 1 Земля 1 I 1 Аналоговый Контакт 10 вход R2 ———— — — R1 ди°д 47 КОМ 220 нФ :Ё 0 B  Рис. 1 2.8. Схема АЦП с динамической компенсацией. 
Параллельный принтерный порт 215  Вольтметр  | ы Д__  иконстанты информацию АЦП  Определить Распечатать  ‘А’ переменные команды и Управление  1': 1 K ;_ J;  H n a Проверить * nOCI18Tbv ‘А’ а еч тать Сброс Состояние тактовым тактовыи импульс импульс Напечатать напряжение  Выйти из I L ВЫЙТИ ИЗ Ожидать программы Послать Протестировать Послать программы состояние при нажатии SpACE для числа тактовых MARK при Haxawm O клавиши у импульсов > 250 у клавиши  Рис. 12.9. Структурная схема программного обеспечения для упражне- ния 12.5.1.  пульсов‚ подсчитываемых и выдаваемых компьютером. Прин- ципиальная схема платы показана на рис. 12.8, структурная схе- ма программного обеспечения -— на рис. 12.9, а программа -— B листинге 12.5.1. Все схемные компоненты те же самые, что и компоненты АЦП-платы, описанной в гл. 11. Схема должна быть протестирована так, как описано ниже, а затем ее следует подключить к компьютеру. Схема на рис. 12.8 функционирует следующим образом:  1) после сброса выходной сигнал ИС ZN425 будет увеличи- ваться ступенчатым образом на одну ступеньку с каждым тактовым импульсом;  2) когда сигнал на выходе О/ Р АЦП превысит приложенный аналоговый входной сигнал, выходной сигнал компаратора изменит свое логическое состояние;  3) сигнал состояния преобразования изменит свое состояние и вынудит компьютер приостановить пересылку тактовых импульсов;  4) значение сигнала на двоичном выходе АЦП будет равно числу поданных тактовых импульсов.  Тестирование схемы  Выполните следующие подключения: 1) блок светодиодов —- K двоичному выходу АЦП;  2) источник постоянного тока с регулируемым напряжением от 0 до 10 В — K аналоговому входу; 
216 Глава12  3) логический переключатель — ко входу сброса; 4) СИД — к выходу состояния;  5) низкочастотный генератор тактовых импульсов — ко вхо- ду синхронизации.  Операции: 1) установите величину входного напряжения 10 В;  2) переключатель сброса установите в состояние логическо- го 0, а затем в состояние логической 1;  3) запустите генератор тактовых импульсов;  4) выход состояния должен переключиться в состояние высо- кого уровня;  5) светодиоды B блоке светодиодов должны начать индика- цию счета‚ начиная с нуля;  6) если выход состояния переходит в состояние низкого уров- ня, остановите генератор тактовых импульсов;  7) повторите операции, начиная с пункта 2, регулируя сопро- тивление резистора R2 до тех пор, пока счетчик не досчита- ет до 250 (при напряжении 10 В на аналоговом входе);  /*adc2ptr.c Основная программа для работы с вольтметром */ /* Соединения с принтерным портом, линией сброса (контакт 2), ли- нией синхронизации (контакт 3), линией состояния (контакт 10) */  #include <string.h> /* Для строковой функции toupper() */ #include <conio.h> /* Для функции kbhit() */ #include <stdio.h> /* Для функций printf(), getch() */ #include <dos.h> /* Для функции outp() */  #define STATUS (inp(In_Address) & 64) #defme RESET outp(Out_Address,0);  #define SPACE outp(Out_Address,1); #defme MARK outp(Out_Address,3); int Out_Address = 0x3bc; /* Адрес принтерного порта вывода */ int In_Address = 0x3bd; /* Адрес принтерного порта ввода */ void тайно  в д  Листинг 12.5.1. adc2ptr.c. 
Параллельный принтерный порт 217  Г int clock; printf("\033[2J\n\n\tTECTI/IPOBAHI/IE AI1l'I\n"); printf("\n\tCBPOC (RESET) с контакта 2 '°); printf("\n\tCI/IHXPOHI/I3Al.II/[fl (CLOCK) с контакта 3 "); printf("\n\tCOCTOHHI/IE (STATUS) Ha контакт 10 "); Ё while( 1) { clock = 0; RESET; printf("\033[l0; 10Н Ожидание перехода сигнала СОСТОЯНИЕ в состояние низкого уровня"); do { if (kbhit()) exit(1); }while(STATUS ! = 0); printf("\033[10;10H Пересылка тактовых импульсов до тех пор, пока сигнал СОСТОЯНИЕ не перейдет в состояние  высокого уровня "); do { SPACE; printf("\033[14;10H "); if (clock ++>250) { printf("\033[16;10H П Е Р Е ПО Л Н Е Н И Е\п"); clock = 0; } MARK; printf("\033[14; 10Н %i",clock); /* Только для целей тестирования */ if(kbhit()) exit(1); }while(STATUS == 0); printf("\033[16;10H Данные = %i ",clock); }  L  Листинг 12.5.1 . (Продолжение) 
218 Глава 12  8) проверьте правильность счета при подаче на аналоговый вход более низкого напряжения.  1 2.5.2. Упражнение «Вольтметр»  В данном упражнении в интерфейсную схему включены аппарат- ные средства, которые использовались для упражнения 12.5.1. Вольтметр предназначен для индикации напряжений от 0 до 10 В и должен иметь высокое входное сопротивление (свыше 1 МОм). Вместо числа подсчитанных тактовых импульсов на экран должно выводиться значение напряжения.  +12 В Высокоомный вход (+) ОУ ___›_ Каналоговому входуАЦП (-) I ~12 B _ Земля  |_ов  Рис. 12.10. Схема с высоким входным сопротивлением.  Один из способов обеспечения высокого входного сопротивле- ния — использование простой буферной схемы на основе опера- ционного усилителя типа показанной на рис. 12.10. В такой схе- ме операционный усилитель должен питаться от двухполярного источника постоянного тока +/— 12 B.  12.5.3. Упражнение «двухдиапазонный вольтметр»  Это упражнение можно рассматривать как проект. Его цель со- стоит в добавлении в вольтметр еще одного диапазона измере- ний (от 0 до 1 В). Выбор диапазона должен осуществляться либо  со Сигнальный s g KOHTBKT 2 о. —›— а Синхронизация ›$ Ф Вход 8% A П С тоян е контакт 3 I ’$ Б ›Ё Ц ‘плата °° “ Контакт 10 Ё т: Ё о S Ф Ё Е э$ ц ц Ф о 2 Q С P у ц о CU I P о 9 Диапазон З’ Ё. 8 сё Ё ё Контакт4 I: с п:  Рис. 12.11. Блок-схема двухдиапазонного вольтметра. 
Параллельный принтерный порт 219  автоматически, либо с клавиатуры компьютера. Обратите вни- мание, что для этого потребуется еще одна управляющая линия. Структурная схема двухдиапазонного вольтметра показана На рис. 12.11. Роль входного буфера с высоким входным сопротивлением и переключателя диапазонов может выполнять операционный усилитель. Для изменения коэффициента усиления, определяе- мого соотношением величин резисторов B схеме, и, следова- тельно, для выбора того или иного диапазона можно использо- вать аналоговый переключатель или реле (см. гл. 11). 
Глава 13  дополнительные упражнения  13.1. Теория частотомера 13.2. Упражнения с частотомером 13.3. Последовательная передача данных  1 3.4. Управление шаговым двигателем по линии последовательной передачи данных  В этой главе описываются два упражнения, которые могут быть развиты в интересные проекты. Каждому из них предшествует краткое теоретическое введение.  13.1 . Теория частотомера  Частотомер — это электронная схема, которая подсчитывает число периодов сигнала, вырабатываемого некоторым источни- ком переменного тока за определенный промежуток времени. Базовый интерфейс (рис. 13.1) состоит из триггера Шмитта, формирующего прямоугольные импульсы из входного сигнала, логического элемента, пропускающего этот сигнал в течение за- данного промежутка времени, и двоичного счетчика, осуществ- ляющего подсчет циклов сигнала. Триггер Шмитта и логиче- ский элемент объединены в одной ИС. Все эти устройства опи- сываются ниже. Счет начинается с момента подачи сигнала сброса, который устанавливает (сбрасывает) счетчик в нулевое состояние. Затем стробирующий управляющий сигнал ввода открывает логиче- ский элемент. Это дает возможность прямоугольным импульсам с триггера Шмитта проходить на вход синхронизации (тактовый вход) счетчика. Время счета импульсов определяется программ- ным образом. По истечении некоторого промежутка времени‚ необходимого для установкш выходного сигнала счетчика, счи-  1 Процесс подсчета каждого импульса занимает некоторое время, связанное с последовательным изменением состояний внутри счетчика. 
Дополнительные упражнения 221  Сигнальный Триггер Шмитта „ Вт д ч Двоичныи Логическим счетчик элемент И-НЕ Земля  Рис. 13.1. Принцип работы счетчика.  тывается информация с выхода счетчика. Длительность времен- ного интервала, в течение которого осуществляется подсчет им- пульсов‚ должна быть варьируемой для обеспечения возможно- сти калибровки системы с целью индикации правильного зна- чения частоты.  13.1.1. Триггер Шмитта  Триггер Шмитта по своей сути является устройством сопряже- ния аналогового входа с цифровой схемой. Эта схема формирует прямоугольные импульсы из входного сигнала таким образом, чтобы времена нарастания и спада сигнала (см. рис. 13.2) обес- печивали возможность использования этого сигнала в цифро- вой логической схеме. Аналоговые сигналы могут обладать бес- численным количеством уровней напряжений или тока в диапа- зоне от их максимального до минимального значений, тогда как цифровые сигналы имеют лишь два1 дискретных уровня. Сигна- лы, не обладающие малым временем нарастания и спада, не пригодны в качестве входных сигналов для логических схем по следующим причинам:  1) ТТЛ-устройства имеют тенденцию перехода в неустойчи- вое состояние при изменении уровня выходного сигнала, что приводит к возникновению так называемого эффекта дребезга после такого изменения.  ' В некоторых системах связи цифровые сигналы имеют несколько дискрет- ных уровней. 
222 Глава 13  Амплитуда 9096—-  Сокращения:  Т1 — время, затраченное на воз- растаниеамплитуды с10% до 90% максимальной  время величины. ; ‘ j j T2 — время, затраченное на спад —) ( -) ' (— амплитуды с 90% до 10% Т1 Т2 максимальной величины.  Рис. 13.2.  2) КМОП-устройства имеют тенденцию к перегреву при од- новременном переключении полевых транзисторов, нахо- дящихся в состояниях логического О и логической 1.  Главная особенность работы триггера Шмитга заключается в том, что его передаточная характеристика содержит петлю гис- терезиса, показанную на рис. 13.3. Из этого рисунка видно, что входной сигнал должен возрасти до 1,6 В, прежде чем выходной сигнал перейдет из состояния логической 1 в состояние логиче- ского О. Входной сигнал должен уменьшиться до величины 0,8 В, прежде чем выходной сигнал возвратится обратно в состо- яние логической 1. Поэтому, если входной сигнал изменяется медленно, то не возникает никакой неустойчивости, возможной  4.0 3.6 ) ;. ш 3.2 . - ‚Ё. - - д; 1" 1A Vcc‘14 Ё 2.8 . Петля гистерезиса - 2" ‘в 2^ “3 Х д _ - д - з- 2в *'12 32.4 .. _ 4“1C “I1 5 ° 2 1 5"10 2C "10 Ё 2.0 ./\ ,\¢___._ ‚_ 6‘1Q 2D'9 Ё 16 I‘ ; _ ' 7' 8 Q ' - ° ° -° ° 5 ' d Выводы ИС 74хх1З ё 1.2 0.8  О 0.4 0.8 1.2 1.6 2.0 2.4 2.8 3.2 3.8 Входное напряжение, В  Рис. 1 3.3. Типичная передаточная характеристика триггера Шмитта. 
Дополнительные упражнения 223  4.0 3.6 . I . . %%%%% их 2.8 2.4 2.0 1.6  Выходное напряжение, В  1.2  0.8  0.4  О 0.4 0.8 1.2 1.6 2._0 2.4 2.8 3.2 3.6 Входное напряжение, В  Рис. 1 3.4. Типичная передаточная характеристика (вход/вщод) стандарт- ного логического элемента И-НЕ. - ' '  при однопороговом переключении. Типичной ИС рассматрива- емого типа является ИС 74хх1 3 с двумя 4-входовыми логически- ми элементами И-НЕ, включающими в себя схемы триггеров Шмитга. При использовании логического элемента И-НЕ, если на все четыре входа подается логическая 1, то на выходе устанавлива- ется логический О‚ при всех других возможных входных комби- нациях на выходе устанавливается логическая 1. Для сравнения на рис. 13.4 приводится типичная передаточная характеристика стандартного логического элемента И-НЕ.  13.1.2. Двоичный счетчик  Двоичные счетчики строятся на основе бистабильных логиче- ских элементов или транзисторных схем. Бистабильные мульти- вибраторы, или триггеры, имеют два устойчивых выходных со- стояния — логический О и логическую 1. Выходное состояние бистабильного мультивибратора можно изменить одним из сле- дующих четырех способов изменения состояния на входе (в за- висимости от схемотехнической реализации мультивибратора): 
224 Глава 13  сигнал Стробирующий сигнал . . Входной сигнал ' ' ' ‘ ' счетчика I I | N I ж | ! | ‘ I N l N ж | Выходной бит1  Выходной бит 2 Выходной бит 3  Рис. 13.5. Временная диаграмма двоичного счетчика со сквозным пере- носом.  1) изменением состояния от 0 K 1; 2) изменением состояния от 1 к 0; 3) отрицательным перепадом уровня сигнала; 4) положительным перепадом уровня сигнала.  На рисунке 13.5 иллюстрируется временная диаграмма про- цесса подсчета девяти Циклов входного сигнала двоичным счетчиком. В конце временного интервала счета импульсов получаем следующие значения разрядов на выходе счетчика: разряд 0 — логическая 1, разряды 1 и 2 —- логический О, разряд 3 —— логическая 1, что в результате дает двоичное число 1001 ‚ или 9 в десятичной системе счисления. Измеренная частота зависит от периода стробирующего сигнала. Хотя существует несколько вариантов схемотехнической ре- ализации двоичного счетчика, в упражнениях будут использо-  Кас ад 1 Каскад2 каск I 3  Выходы  Вход Синхр.  Триггер  Рис. 1 3.6. Трехкаскадный двоичный счетчик со сквозным переносом. 
Дополнительные упражнения 225  ёёёёначение  32 64 128 256 512 1024 2048 4096 819216384;  012 013 01406 05 07 04 Vss  1 2 3 4 5 6 7 8  Рис. 1 3.7. Логическая схема и назначение выводов счетчика 4020.  ваться только схемы, известные как счетчики со сквозным пере- носом. Счетчик со сквозным переносом — это схема, в которой выход одного бистабильного мультивибратора (триггера) непос- редственно подключен ко входу следующего за ним мультивиб- ратора, как показано на рис. 13.6. Выходная частота бистабиль- ного мультивибратора равна половине входной частоты. КМОП ИС 4020 является подходящей ИС для следующих упражнений. Эта схема представляет собой 14-каскадный дво- ичный счетчик со сквозным переносом, имеющий входы синх- ронизации и сброса. Сигнал на выходе каждого каскада изменя- ет состояние на отрицательном перепаде уровня сигнала на вхо- де этого каскада. Логическая диаграмма счетчика показана на рис. 13.7. Десяти- чное значение каждого разряда равно 2N , где N — номер каскада. Обратите внимание, что выходы каскадов 2 и 3 HC}1OCTy1'IHbI.  13.2. Упражнения c '-laCTOTOMepOM  B следующих упражнениях для измерения частоты используется ИС 4020.  13.2. 1 . Упражнения «Базовый счетчик»  Цель данного упражнения заключается в разработке платы со- пряжения частотомера и сопутствующего программного обес- печения для персонального компьютера с использованием РР1- порта. Счетчик будет измерять И отображать на экране монито- 
226 Глава 13  С1 Строб . С 4 о 2 о Сброс СбрОС Сигнальный . П. О инхр. Выходы ( Q) вход 4 5 6 7 3 9 10 11 12 ВЫХОД за 1/2 74LS13 C4 диапазон А7 Счет A0 Земля Земля  Рис. 13.8. Логическая схема частотомера.  ра соответствующие частоты. Амплитуда входного сигнала дол- жна лежать в интервале от 2 до 5 В (см. рис.13.8). логическую схему можно собрать или на макетной, или на печатной плате. Рекомендуется всегда проверять работу аппаратных средств, прежде чем присоединять их к компьютеру. На рисунке 13.9 по- казана испытательная установка. Генератор сигналов подстра- ивается для вывода подходящей частоты. Два переключателя логических состояний используются для подачи стробирующе- го сигнала и сигнала сброса. Светодиоды будут выдавать ин- формацию о работе счетчика. Для индикации переполнения также следует использовать один светодиод. Чтобы гарантиро-  5 В Блок светодиодов  Источник сигнала  5 В Блок переключателей  Земля  Рис. 1 3.9. Установка для испытания частотомера. 
Дополнительные упражнения 227  вать надежную работу триггера Шмитта‚ минимальное значение амплитуды измеряемого сигналы должно быть 2 В, а максималь- ное значение — 5 В. Как видно из рис. 13.8, Ha котором изображена логическая схема счетчика, при получении логической 1 на все выходы счетчика от A0 до А7 число сосчитанных циклов будет равно сумме всех степеней двойки от 24 до 2“ . Поэтому максимальное сосчитанное число будет равно  16 + 32 + 64 + 128 + 256 + 512 +1024 + 2048 = 4080  Показание счетчика (сосчитанное число) увеличивается на 1 при подсчете каждых новых 16 циклов, поступающих на вход счетчика. Чтобы получить правильное число входных циклов, программа умножает сосчитанное число на 16, а затем прибав- ляет 8, что обеспечивает точность i 8 ЦИКЛОВ. Измеренная час- тота будет зависеть от времени, в течение которого входной ло- гический элемент был открыт для счета. Прежде чем считывать показание счетчика, нужно выждать короткий промежуток вре- мени (несколько миллисекунд) после запирания логического  ЭЛСМСНТЭ. ЭТО ООССПСЧИВЭСТ гарантию ТОГО, ЧТО BCC CKBO3HbIC ПС- рСНОСЫ ЗЭВСрШСНЫ.  Структура программного обеспечения для упражнения 13.2.1.  инициализировать Порт А используется для ввода показаний РР1‚ счетчика  Порт С: бит 1 используется для очистки счетчика  Порт С:бит 0 используется для стробиро- вания  Порт С: бит 4 получает флажок переполне-  ния Номер разряда 7 6 5 4 3 2 1 О 1 0 0 A CH O B CL Управляющее слово 1 0 0 1 1 0 1 0 = 9A hex  Напечатать команды  Напечатать ЧАСТОТА в фиксированной позиции на экране пока нет ввода c клавиатуры  { 
228 Глава 13  Сбросить счетчик и закрыть логический элемент  Ждать 1 мс Открыть входной логический элемент  Ждать 1 мс Закрыть входной логический элемент Проверить флажок переполнения Прочитать счетчик = п Рассчитать циклы = ((n*16) + 8)  Рассчитать частоту = Циклы*1000/т; Напечатать сосчитанное число и частоту Очистить счетчик {C0 B состояние логического 0}  }  выход (exit)  13.2.2. Упражнение «Четырехдиапазонный счетчик»  Измеряемый частотный диапазон можно изменять путем изме- нения счетного интервала и умножения входного сигнала с порта А на надлежащий множитель. Модифицируйте програм- мное обеспечение для обеспечения измерения частоты в четы- рех различных диапазонах, выбираемых посредством меню. Меню должно также включать пункт автоматического выбора, соответствующий автоматическому программному выбору час- тотного диапазона. Автоматический выбор будет работать быстрее, если счетчик сначала «проверяет» самый верхний диа- пазон, а затем «спускается вниз» в следующий диапазон, если сосчитанное число ниже некоторого заданного значения. Аль-  диапазоны счетчика  диапазон Полоса частот (Гц) Точность (:t Гц)  1 8 — 4088 8 2 32 — 16352 32 3 64 - 32704 64 4  128 — 65 408 128  Рис. 1 3.10. Диапазоны частотомера. 
Дополнительные упражнения 229  ТСРНЭТИВНЫМ ВЭрИЭНТОМ ЯВЛЯЕТСЯ первоначальная «проверка» СЭМОГО НИЗКОЧЭСТОТНОГО ДИЭПЭЗОНЭ И ЗЭТСМ ПСрСХОД K CJICflyIO-  щему диапазону, если обнаружен сигнал переполнения для дан- ного диапазона.  1 3.2.3. Упражнение «Увеличение точности до i 1 Гц»  Используйте 4-разрядный счетчик, например ИС 74LS93, для получения двоичных ступеней (каскадов), отсутствующих в счетчике ИС 4020. Как порт А, так и порт В используются для ввода 14-разрядного числа, что дает возможность счета от 0 до 32767. Если порт А используется для 8 младших разрядов,  /*counter.c Эта программа посылает сигнал сброса счетчика от С1, стробирующий сигнал от СО и вводит показания счетчика через порт А. Время задержки потребует подстройки в зависимости от быстро- действия компьютера. */ #include <doS.h> #include <stdi0.h> #include <math.h> #inc|ude <conio.h> #define RESET 2 /* СО к логическому О, С1 к логической 1 */ #define OPEN 1 /* СО к логической 1, С1 к логическому О */ #define CLOSE 0 /* СО к логическому О, С1 к логическому О * /  #define OVER 16 /* Используется для проверки наличия логи- ческой 1 на С4*/  int Count(void); int A_Address = 0x300; /* Задать адрес */ int C_Address = 0x302; /* Задать адрес */ int Control == 0x303; /* Задать адрес */ int Config = 0x9A; /* Задать конфигурацию: порт А на ввод, порт В на ввод, порт CL Ha вывод, порт СН на ввод*/ void main()  {  Листинг 13.2.1 . counter.c. 
230 Глава 13  outp(Control,Config); outp(C_Address,0); clrscr(); printf("\033[3;5H ЧАСТОТОМЕР. Нажмите любую клавишу для выхода из программы "); whi|e(!Count()); exit(1); } int Count() { int t = 100; /* Изменить t для изменения час- тотного диапазона */ float frequ,n; printf(”\033[5;5H "); 0utp(C_Address,RESET); de|ay(1); /* Пауза 1 мс */ 0utp(C__Address,OPEN); delay(t); /* Пауза t мс */ outp(C_Address,CLOSE); if(inp(C_Address) && OVER) printf("\033[16;10H Переполнение "); else  { n = inp(A_Address); fregu=((n*16)+8)*(1000/t); printf("\033[l6;10H ЧИСЛО ИМПУЛЬСОВ %4.0f ЧАСТОТА %8.2f +/-8 Fu>>,n,frequ);  } return kbhit();  }  Листинг 1 3.2.1 . (Продолжение)  а порт В — ДЛЯ 6 старших разрядов, то сосчитанное число будеТ равно  соит = inp(A_Address) + (inp(B_Address) & 0x3F) * 512  Обратите внимание, что шестнадцатеричное число 3F Mac- кирует два неиспользуемых разряда порта В. 
Дополнительные упражнения 231  С1Строб 4020 б СО Сброс - Синхр. С рос C"r"a"';:':;': Выходы (О) _‘ 6 7 Е 51 1011121314 1/274L513 I [__ B5 L__ l ВО А7 A4 Сброс‘ Синхр.  Выходы(О)1 2 З 4 Ь-ддз  Земля Ь . —g Земля  Рис. 13.11. Логическая схема счетчика.  1З.2.4. Упражнение «Автоматическая калибровка»  Усовершенствуйте программу таким образом, чтобы компьютер подстраивал время задержки при выборе режима калибровки и подаче сигнала известной частоты. Нет никакой необходимости в калибровке программного обеспечения каждый раз, когда оно используется. Калибровка в основном понадобится при инстал- ляции, поэтому время задержки необходимо записать в файл, чтобы его можно было считывать в процессе работы программы, например при появлении меню на экране. А возможное новое время задержки могло бы быть записано в этот файл при калиб- ровке счетчика.  1З.2.5. Упражнение «Входная схема счетчика»  Разработайте такую входную схему, чтобы интерфейсная плата могла работать в широком диапазоне значений амплитуды вход- ного напряжения (от 0,1 В до 10 В), а также имела входной им- педанс, сравнимый с импедансом типичного электронно-луче- Вого осциллографа (ЭЛО) (1МОм с параллельно включенной емкостью 30 пФ). Данное упражнение требует от читателя пони- мания принципов работы аналоговых схем. Входная схема счет- чика должна удовлетворять следующим техническим требова- Ниям: 
232 Глава 13  Вход  К триггеру Шмитга  за Ф Диод, препятствующий " А появлению отрицательного напряжения на выходе  Земля  Рис. 13.12. Входная схема частотомера.  1) иметь высокий входной импеданс, Эквивалентный рези- стору с сопротивлением 1 МОм, который шунтируется конденсатором емкостью 30 пФ;  2) включать усилитель с коэффициентом усиления 20;  3) включать схему ограничения, не позволяющую амплитуде сигнала превысить величину +5 В.  Схему на основе операционного усилителя (рис. 13.12) мож- но принять за базовую. Однако она имеет два недостатка:  1) требуется двухполярнь1й источник питания i 5 В;  2) граничная частота схемы, зависящая от типа выбранного операционного усилителя, может быть слишком низкой.  13.3. Последовательная передача данных  В главе 8 описывался последовательный вывод данных из компьютера с использованием СОМ-порта. Этот способ пере- Дачи данных очень удобен для работы со многими вспомога- тельными устройствами, но в то же время он имеет ограниче— ния в силу того, что сигнал передается в формате АЗСП-кода. Для многих приложений пересылка данных в двоичном коде является более быстрой и более удобной. Кроме того, она по- зволяет экспериментатору структурировать свой собственный поток данных. Существуют несколько способов последова‘ тельной пересылки двоичных данных, два из которых изложе‘ ны ниже. 
Дополнительные упражнения 233  1. Данные могут пересылаться в пакетах с кодом заголовка в начале пакета. Заголовок может включать в себя такую ин- формацию, как длина пакета, кому он посылается и конт- рольную информацию для обнаружения ошибок при пе- редаче.  2. Для Целей управления код может быть послан в виде не- больших пакетов фиксированной длины.  Конечно, можно просто вставить в компьютер некоторую плату, предназначенную специально для пересылки двоичного кода. Однако единственное средство, обычно доступное для экспериментатора, -— это использование одного или нескольких разрядов параллельного принтерного порта компьютера или PPI-Hopra. Первый шаг состоит в определении типа используемых дан- ных. Если речь идет просто о пересылке чисел, то можно ис- пользовать двоично-десятичный код 8421 (см. гл. 1).  Пример А. Переслать десятичное число 345 ‚О B формате дво- ично-десятичного кода с использованием нулевого разряда принтерного порта или РР1-порта.  Преобразовать 345 B двоичное число 001 101000101смр Поместить данные в файл и послать их, используя оператор цикла for(): int Out_Address = адрес PPI—nopma или принтерного порта int i; int data[l3]={10l00010l 100}; f0r(i = 0; i <13; i++) 0utp(Out_AddreSs,i)  Если используется любой ДРУГОЙ разряд порта, то состояние логической 1 представляется числом 2“. Следовательно, при ис- пользовании третьего разряда 23 = 8 И передаваемая последова- тельность в этом файле выглядела бы как {808000808800}.  13.4. Управление шаговым двигателем по линии последовательной передачи данных  В следующих упражнениях двоичные данные используются для дконтроля скорости и направления вращения шаговых двигате- 
234 Глава 13  лей. В первом упражнении используется 4-проводное соедине- ние, обеспечивающее наиболее простую аппаратную реализа- цию интерфейса.  13.4.1. Упражнение «Управление двумя шаговыми двигателями по 4-проводной линии последовательной передачи данных»  Цель данного упражнения заключается в управлении скоростью и направлением вращения двух шаговых двигателей по последо- вательной линии передачи данных. Необходимо собрать не- большую интерфейсную схему последовательно-параллельного преобразования и разработать программу на языке Си. Можно использовать либо РР1-порт‚ либо принтернь1й порт.  Описание системы  Блок-схема аппаратной реализации интерфейса показана на рис. 13.13. Здесь 4 провода, соединенные с компьютером, пред- назначены для выполнения функций синхронизации, сброса, передачи данных, общего провода.  Синхронизация Сдвиг регистра Сброс 74LS164  Данные Выходы со Q1 02 св 04 Q5 ов Q7  4- аз дный Входы данных реЁИСЁЁ ‘Схема | задержки  С . 14Ls11s Инхр  Логическая 1  св Вьъходь. данных  П реобразователь Преобразователь кода А коа В ТП  ДВИГЭТЭЛЬ A Двигатель В  Рис. 13.13. Структурная схема системы последовательного управления шаговым двигателем. 
Дополнительные упражнения 235  у Регистр сдвига использует сигналы синхронизации, сброса и данных для преобразования поступающего кода из последова- тельной формы в параллельную. Регистр данных хранит этот дкод, пока следующее кодовое слово пересылается и преобразу- ется. Каждый преобразователь кода изменяет данные из двух- разрядного в четырехразрядный формат, необходимый для ра- боты двигателей.  Управление шаговым двигателем  Для управления скоростью и направлением вращения шагово- го двигателя необходимо подводить к нему постоянно повто- ряюшуюся последовательность из четырех 4-разрядных двоич- ных чисел. Для передачи 4 различных чисел нужны лишь два разряда (см. рис. 13.15). Необходимо также отослать один стар- товый бит, указывающий регистру сдвига на конец слова дан- ных. Таким образом, каждое слово данных будет состоять из 5 бит, как это показано на рис. 13.14., иллюстрирующем пере- сылку комбинации 00 к двигателю А и комбинации 10 к двига- телю В. Как показано на рис. 13.14, сигнал данных пересылается по проводу данных на вход данных регистра сдвига. Во время пере- дачи данных на входе сброса регистра сдвига удерживается уро- вень логической 1 (через провод сброса), а по проводнику синх- ронизации передаются пять тактовых импульсов. Биты данных сдвигаются в регистре сдвига до тех пор, пока стартовый бит не достигает выхода Q4. Сигнал с этого выхода проходит через схему задержки и затем используется для выбор- ки (стробирования) сигналов с выходов регистра сдвига Q0, Q1, Q2 И Q3 B регистр данных. Две пары сигналов с выходов регист- ра данных снимаются для двух схем преобразователей кода, ко- торые вырабатывают 4-разрядный код, необходимый для управ- ления двигателями.  Сигнал  синхронизации  Разрешающий Старт Двигатель А_ ДВИГЭТЭЛЬ B сигнал  Сигнал данных  Рис. 13. 1 4. Временная диаграмма типичного сигнала данных. 
236 Глава 13  Аппаратное обеспечение  Преобразователи кода. Преобразователи кода переводят 2-ра3- рядные коды в 4-разрядные‚ необходимые для управления дви- гателя ми. Последовательность чисел, требующаяся для управле- ния одним двигателем, следующая: 3, 6, 12, 9 (в таблице истин- ности на рис. 13.15 эти числа представлены в двоичной систе- ме). Дополнительной логической схемы может не понадобить- ся, если входные сигналы в таблице истинности переставить так, как это показано на рис. 13.16.  Рис. 13.16.  Из таблицы истинности на этом рисунке видно, что: 1) колонка выхода а совпадает с колонкой входа А; 2) колонка выхода Ь совпадает с колонкой входа В;  3) колонка выхода с инвертирована по отношению к колон- ке выхода А;  4) колонка выхода d инвертирована по отношению к колон- ке выхода В.  Следовательно, на самом деле никаких логических опера- ций выполнять не нужно, поскольку в регистре данных имеют- ся как прямые, так и инверсные (инвертированные) выходы (рис. 13.17). Схема задержки. Простым способом обеспечения задержки сигнала на короткое время является использование двух логи- ческих элементов, показанных на рис. 13.18. В данном случае удобно использовать два логических элемента, входящих В C0“ став ИС 74LS14. Данная ИС включает шесть триггеров ШмиТГа (рис. 13.19); еще три логических элемента можно использовать 
Дополнительные упражнения 237  Выводы регистра Соединения ДаННЫХ с двигателем Ш +4‘ 0‘ +8 6"; ‚д? ___ _ Вход Выход 00 :’__B Рис. 13.17. Соединения пре- Рис. 13.18. Схема задержки. образователя данных.  ELEI ‘fl_“! ‘Ч Ч ‘L Vcc A6 06 A5 os Ад оз 74LS14  А101А2 Q2 A3 ОЗЗеМля 1l§:i4lf§71’  Рис. 13.19. Назначение контактов ИС 74LS14.  B качестве входных буферов к интерфейсной схеме, если воз- никнет необходимость работы на некотором удалении от ком- пьютера. Регистры сдвига. Регистр сдвига состоит из нескольких кас- кадно соединенных одноразрядных ячеек памяти. В регистрах сдвига можно использовать самые разнообразные схемы с двумя состояниям, лишь бы они были соединены таким образом, что-  Вывод параллельных данных  Ввод ПОСПОДОВЗТЭЛЬНЫХ D Q D Q D O D Q данных Т Т Т Т Син Син Син Син св св СВ св ‘viii’ Синхронизация д" Сброс  Рис. 13.20. Логическая схема 4—разрядного регистра сдвига. 
238 Глава 13  141 131 121 111 101 Ч Ч -— Сокращения: Vcc Q7 Q6 Q5 O4 СВ СР BSA __ данные А 74|_$164 DSB —— Данные В (не используется) DSA DSB Q0 Q1 Q2 Q3 земля CB — Сброс ведущего при установке  _ логическогоО 1| Ё d 4] з] d 71 сР—Входсинхронизации  Рис. 13.21 . Назначение контактов регистра сдвига.  бы на каждом тактовом импульсе данные продвигались в реги- стре на одну ячейку вправо или влево. Четыре В-триггера, опи- санные в гл. 2, показаны на рис. 13.20 в схеме, представляющей собой последовательно загружаемый и параллельно выгружае- мый регистр сдвига. Регистры сдвига могут сдвигать данные как вправо, так и влево, либо могут быть двунаправленными. Другими типичны- ми применениями регистров сдвига являются:  1) параллельно-последовательное преобразование данных, 2) умножение или деление двоичных чисел на степени двойки,  3) кольцевое перемещение двоичных слов (обычно для уп- равления шаговыми двигателями).  ИС 74LS 164 — это 8-разрядный регистр сдвига, сдвигающий данные вправо на каждом тактовом импульсе. Назначение вы- водов этой ИС показано на рис. 13.21. Регистр данных. Регистр данных может состоять либо из 4, либо из 8 триггеров В-типа, объединенных в одной ИС. ИС, используемая в данном упражнении, включает 4 тригге- ра как с прямыми (Q), так и с инверсными (Q) выходами. Ре- гистр данных На рис. 13.22 — это ИС 74LS175, которая хранит данные до того момента, пока следующее слово данных не будет получено из регистра сдвига.  161 151 141 131121 111 101 Ч чссозЁЁзозтЁЁоосР 74LS175  53000000 D16-1Q1seMns. 112! 34151617!!!  Рис. 13.22. Назначение контактов регистра данных. 
Дополнительные упражнения 239  Двоичная комбинация а Ь 00 23 23 01 23 67 Н 67 67 Рис. 13.23. Таблица чисел при пере- 1О 67 23 к я . даче бита.  Программное обеспечение. Разработайте программный код, который будет осуществлять пересылку трех сигналов, показан- ных на рис. 13.14. Запишите 2-разрядный код для представления каждого бита, предназначенного для вывода.  Синхронизируюший сигнал в разряде 0 — импульс логиче- ской 1‚ вывод — 01.  Сигнал сброса в разряде 1 -— логическая 1 во время пересыл- ки данных, вывод — 22.  Сигнал данных в разряде 2 может быть либо логическим 0, либо логической 1, вывод - 00 или 44. Теперь объедините три выходных сигнала для передачи синхронизация + сброс + II3.HHbI€ 0 = 23 синхронизация + сброс + данные 1 = 67 Последовательность битовых пар (ab), необходимая для вра- шения двигателя по часовой стрелке согласно рис. 13.16 следую-  щая: 00, 01, 11, 10. Файл чисел, необходимый для пересылки лю- бой битовой пары, приведен в таблице на рис. 13.23.  Последовательное управление двигателем  I?  _l'_  _ I ‚ Входные данные Входные данные ДЛЯ ДВИГЭТЁЛЯ A3 Для двигателя B: двигатель А.  *  Выход из  вигатель В: Ёёаёёъёпие ЁЁЁЁЁЪЁЦИЁ программное Ерограммное 2BEr:aa;.h(Aah-::'M вращения вращения управление управление клавиши т й ЕЁ :2-lCeOHBMOe$1° g§§::1:H»:§:oe 00171 To же‘ что И стрелке I стрелки для двигателя A  Старт ‚.  ‚_ . cwq cw-1 cw-1cw-:4 Ё - lcw-1 cw-  Рис. 13.24. Структурная схема программного обеспечения к упражне- нию 13.4.1. 
240 Глава 13  Для вращения против часовой стрелки последовательность битовых пар обращается. На рисунке 13.24 приведена структур- ная схема программы для данного упражнения, а сама програм- ма приводится в листинге 13.4.1.  Тестирование системы  Используемые аппаратные средства можно протестировать пу- тем присоединения логических переключателей таким образом, чтобы они действовали как имитаторы сигналов синхрониза- ции, сброса и данных. Если вводятся правильные сигналы, их прохождение через регистр сдвига можно проконтролировать с помощью логического пробника. Петлевое тестирование пол-’ ной системы можно провести путем подключения выводов ре- гистра данных к компьютерному РР1-порту А. Выходные сигна- лы регистра данных затем считываются после каждой посылки кодовой последовательности.  1 3.4.2. Упражнение «Использование двухпроводного кабеля и общего провода для управления двумя шаговыми двигателями»  Эта модификация предыдущего упражнения удаляет линию синхронизации из системы, поэтому возникает необходимость в генерации синхронизирующих сигналов самим интерфейсом.  R Тактовые импульсы -_-_-L- Триггер Шмитта E 74|.$13 Земля и L 1 Вход запуска Примечания  R может лежать в диапазоне от 1 KOM до 4 кОм С должно быть больше, чем 100 HCD  Рис. 1 3.25. Схема генератора тактовых импульсов. 
Дополнительные упражнения 241  Одна из возможных схем показана на рис. 13.25. Нужно будет подстроить частоту этого генератора, чтобы обеспечить его син- хронизацию с передаваемым кодом в течение пяти тактовых им- пульсов во время передачи. Для обеспечения синхронизации необходимо перезапускать генератор тактовых импульсов с по- сылкой каждого нового кодового слова. Это можно сделать пу- тем подключения входа разрешения генератора к линии сброса. Поскольку отпадает необходимость в передаче тактового HM- пульса, следует изменить СЩ-файл (листинг 13.4.1) в программе к данному упражнению.  1 3.4.3. Упражнение «Последовательное управление тремя шаговыми двигателями»  Это упражнение предполагает включение в состав аппаратных средств дополнительного шагового двигателя С (никаких других дополнительных компонентов не требуется). Нужно добавить еще одну программную последовательность для двигателя С. Передаваемое кодовое слово будет теперь 7-разрядным.  /*serialmt.c Программа для последовательного управления двумя Ша- говыми двигателями */ #include <stdio.h> #include <string.h> #include <dos.h>  void Start(); int Rotate(int); int Control = 0x303; /"‘ Адрес управляющего регистра */ int Out_Address = 0x301; /* Базовый адрес+1 */ int Config = 0х98; /"‘ 99 hex конфигурирует порты следующим образом: порт А — ввод, порт В — вывод, порт CL — вывод, порт СН — ввод "‘/ int hold = 1; /* Это число управляет скоростью вывода данных */ void main()  {  int motorA,motorB; int sequenceA = О, counterA = О; int sequenceB = 0, counterB = 0;  Листинг 13.4.1. serialmt.c. 
242 Глава 13  char Adir ='F'; char Bdir -='F'; outp(Control,Conf1g); printf("\033[2J Скорость двигателей определяется Некоторым числом. Чем\п"); ргйт1`("больше число, тем медленнее двигатель. Положительные числа\п"); ргйттвызывают вращение двигателя по часовой стрелке, а отри- Цательные\п"); ргйтГСчисла — против часовой стрелки.\п\п"); printf("Ha>KMme любую клавишу ДЛЯ выхода из программы при ра- ботаюшем двигателе.\п"); printf("\nBBe,:[me число для двигателя А"); scanf("%i",&motorA); if (motorA < 0) { motorA = motorA* — 1; Adir ='R'; } printf("\n Введите число для двигателя В"); scanf("%i",&motorB); if (motorB < 0) {  motorB = motorB* — 1;  Bdir ='R'; } do { Start(); /* C6poc и стартовый бит */ if (counterA == 0) /* Управление мотором А */ { sequenceA ++;  counterA == motorA;  } if (sequenceA > 3) sequenceA = 0;  Листинг 13.4.1 . (Продолжение)  соитегА —— —; 41 
Дополнительные упражнения 243  if (Adir =='F') /* Пересылка битовой пары к двигателю А */ Rotate(sequenceA); else Rotate(3-sequenceA); if (counterB == 0) /* Управление двигателем В */ { sequenceB++; counterB = motorB; } if(sequenceB > 3) sequenceB = 0; counterB—-—;  if (Bdir == 'F') /* Пересылка битовой пары кдвигателю В */ R0tate(sequenceB); else Rotate(3—sequenceB); }while(!kbhit()); exit( 1); } void Start() { static int start[3] = {0,6,7}; int i;  for(i = 0; i < 3; i++) { delay(hold); outp(Out_Address,start[i]); } } int Rotate(int sequence) { static int CW[4][4] = {2,3,2,3, /* 0 0 */ 3,2,6,7, /* 01 */ 6‚7,6‚7 /* 1 1 */ 6,7,2‚3}; /* 1 О */  int i;  Листинг 1 3.4.1 . (Продолжение) 
244 Глава 13  for(i = 0; i < 4; i++) { delay( hold); outp(Out_Address,CW[sequcnce] [i]); } return; }  Листинг 1 3.4.1 . (Продолжение) 
Глава 14  Контрольно-измерительная аппаратура и тестирование  14. 1 . Контрольно-измерительная аппаратура 14.2. Проблемы аппаратного обеспечения 14.3. Тестирование РР|-портов 14.4. Тестирование параллельного принтерного порта  14.5. Конструкция блоков светодиодов и переключателей  14.6. Устройство управления шаговым двигателем 14.7. Проблемы программного обеспечения  Эта глава содержит описание контрольно-измерительной аппа- ратуры, необходимой для проведения экспериментов. Здесь рассматриваются также методы тестирования, способы обнару- жения неисправностей и их устранения, конструктивные осо- бенности блоков светодиодов и переключателей, используемых для различных экспериментов. Шаговые двигатели, продаваемые для учебных Целей, обь1ч- но выпускаются в комплекте с интегральной схемой управления двигателем, смонтированной на одном с ним основании. Одна- ко для полноты картины в разделе 14.6 рассматривается под- ключение коммерческого шагового мотора к отдельной управ- ляющей ИС.  14.1. Контрольно-измерительная аппаратура Источник питания. Хотя все необходимые напряжения можно  ПОЛУЧИТЬ ОТ КОМПЬЮТСРЗ, такая «ЭКОНОМИЯ» на ОТДВЛЬНОМ ИСТОЧ- НИКС питания МОЖСТ ПрИВССТИ K ПСЧЗЛЬНЫМ ПОСЛСДСТВИЯМ -— ДО- 
246 Глава 14  статочно одного короткого замыкания, чтобы вывести из строя компьютер. Для питания экспериментальных схем следует ис- пользовать источник питания с выходными напряжениями i 5 В и 2|: 12 B. Немаловажно, если в источнике питания будет преду- смотрена индикация выходного напряжения и защита от корот- кого замыкания. Источник питания с регулируемым выходным напряжением от 0 до 10 В также будет полезен. Логический пробник. Логический пробник — недорогое и весьма полезное устройство для проверки логических состоя- ний. Однако, если логический пробник отсутствует, то его впол- не может заменить обычный вольтметр. Мультиметр (универсальный измерительный прибор). Важный контрольно-измерительный прибор для обнаружения неисп- равностей. Поскольку он необходим только для считывания На- пряжений постоянного тока до 12 В и обнаружения разрывов в электрических цепях, достаточно иметь простейший мульти- метр. Некоторые считают, что аналоговый мультиметр более Удобен, чем Цифровой. Электронно -лучевой осциллограф ( ЭЛ О). Этот контрольно-из- мерительный прибор нужен главным образом для проверки формы сравнительно низкочастотных сигналов при выполне- нии упражнений с использованием цифро-аналогового преоб- разователя, поэтому и здесь ничего сверхсложного от прибора не потребуется. Генератор сигналов. Для эксперимента со счетчиком нужен лишь простой генератор сигналов. Запоминающий осциллограф. Этот дорогой прибор требуется для выполнения упражнения с последовательным портом в гл. 8. По- скольку нужно измерять лишь сравнительно низкие частоты, сле- дует остановить свой выбор на наиболее дешевом запоминающем осциллографе, удовлетворяющим всем остальным требованиям.  14.2. Проблемы аппаратного обеспечения  В этом разделе описываются некоторые типичные проблемы И их решения.  1. Перед подачей напряжения на электрическую схему вся- кий раз дважды проверьте все соединения. По возможно- сти пригласите еще кого-нибудь для проверки.  2. Соблюдайте осторожность при подключении много‘ штырьковых электрических вилок и розеток к компьютб‘ 
Контрольно-измерительная аппаратура и тестирование 247  ру. Всегда следите за тем, чтобы вилочная и розеточная ча- сти разъема вставлялись друг в друга по прямой линии. При небрежном выполнении соединения очень легко ис- кривить штырьки, что может привести к коротким замь1- каниям.  З. Удостоверьтесь, что все заземляющие соединения выпол- нены надлежащим образом. «Земля» источника питания должна быть соединена с «землей» компьютера. Точно так же клеммы заземления на блоках переключателей, свето- диодов и контрольно-измерительных приборах должны быть соединены с общим проводом заземления, подклю- ченным к «земле» источника питания.  4. При первом включении схемы убедитесь, что интеграль- ные схемы не становятся слишком горячими. При появле- нии дыма немедленно выключите схему.  5. Используйте вольтметр для проверки того, что источник постоянного тока соединен со всеми устройствами, к ко- торым он должен быть подключен.  6. По возможности удостоверьтесь в том, что внешние уст- ройства и схемы работают надлежащим образом еще пе- ред подключением их к компьютеру.  7. Подключите блоки переключателей к блокам светодиодов и убедитесь в том, что все переключатели и все светодио- дь1 работают нормально.  8. Если источник питания имеет ограничитель выходного тока, проверьте правильность установки уровня ограни- чения. Он должен работать как эффективный ограничи- тель тока, но не должен вызывать уменьшения выходного напряжения.  9. Соблюдайте осторожность, когда вынимаете интеграль- ные схемы из плат или держателей. Лучше всего делать это с помощью маленькой отвертки ПРИ ВЫКЛЮЧЕННОМ ИСТОЧНИКЕ ПИТАНИЯ.  14.3. Тестирование РР|-портов  Для того, чтобы протестировать порты на правильность ввода и вывода данных, лучше всего использовать самые простые аппа- ратные и программные средства. С учетом этого в следующих 
248 Глава 14  разделах приведены только самые простые базовые программы. Простейший способ создания соединений с отдельными выво- дами портов -- использование модуля, аналогичного тому, сни- мок которого был приведен в гл. 8, и который выпускается про- изводителями электронного оборудования.  14.3.1. Тестирование РР|-порта на правильность вывода данных  На рисунке 14.1. показана схема соединений для выполнения теста вывода данных и листинг 14.3.1, обеспечивающий все возможные рабочие условия. Запустите эту программу три раза с тремя различными значениями переменной test, как это указа- но в листинге.  test = 0 выключает все светодиоды test = FF включает все светодиоды test = 55 включает дополнительные светодиоды.  /*ppitestl.c Установка логического 0 на всех выходах */  #include <dos.h> /* Требуется для outp() */ #include <stdio.h> /* Требуется для printf() */ int Control = 0x303; /* Проверьте правильность этих адресов для  вашего компьютера */ int A_Address = 0x300; int B_Address = 0x301; int C__Address = 0x302;  int config = 0x80; /* Установка всех портов на вывод данных "‘/ int test = 0; /* test = 0, или 0х55‚ или OxFF*/ void main() { outp(Control,config);  outp(A__Address,test); outp(B_Address,test); 0utp(C_Address,test); printf("\n Выводы %ОХ к РР1 \n",test);  Листинг 14.З.1 . ppitest1.c. 
Контрольно-измерительная аппаратура и тестирование 249  и  Компьютер  РР|-порт A  ЧФСЛЬФЮ-ЪО  PP!-nopr B 7  Логический  \lO)O'Ih¢.Ol\'J-‘O  PP!-nopT С  Источник питания  \lO)0'Ih¢.Ol\'J-KO  OB 58  Рис. 14.1 . Схема аппаратных соединений для выполнения теста вывода Данных с помощью программируемого параллельного интерфейса (РР1). 
250 Глава 14  14.3.2. Тестирование РР|-порта на правильность ввода данных  Аппаратное обеспечение для этого теста включает в себя блок переключателей, описанный в разделе 14.5. Схема подключений показана на рис. 14.2. Перед началом теста проверьте сигналы на выходах блока переключателей.  /*ppitest2.c Ввод данных с РРЪ-портов */  #include <dos.h> /* Требуется для outp() */ #include <stdio.h> /* Требуется для printf() */ #include <coni0.h> /* Требуется для got0xY() */ int Control = 0x303; /* Проверьте правильность этих адресов для  _ вашего компьютера */ 1nt A_Address = 0x300;  int B_Address = 0x301; int C_Address = 0x302; int config = 0x9B; /* Установка всех портов на ввод данных */ void main() { int Y, i; outp(Contro1,config); printf("\n Ввод с РР1—портов. Нажмите любую клавишудля выхода из программы \п"); I printf("\n ПОРТ А ПОРТ В ПОРТ С"); printf("\n765432 10 76543210 76543210\n"); Y == wherey(); while(!kbhit())  g0t0Xy(1,Y); f0r(i = 7; i >—1; i——) printf(" %i ",((inp(A_Address) >>i)&1)); printf(""); for(i = 7; i >—1; i——) printf("%i",((inp(B_Address) >> i)&1)); printf(""); for(i = 7; i >—1; i——) printf("%i",((inp(C_Address) >> i)&1));  › } д  Листинг 1 4.3.2. ppitest2.c. 
Контрольно-измерительная аппаратура и тестирование 251  . f'f3§'Tep  PP!-nopT A  ЧФШЬФЮ-ЪО  Переключатель  0  РРЪПорТВ  ч с» сл ь со ю -ь о < „. 3 переключателем  Земля  Разрешение  РРЪП0рТС  Источник  ЧФШЬФМНО  5B  OB  Рис. 1 4.2. Схема аппаратных соединений для выполнения теста ввода дан- ных с помощью программируемого параллельного интерфейса (РР1). 
252 Глава 14  :——:.  Подсоедините блок переключателей к каждому порту пооче- редно, запустите программу ppitest2.c для каждого порта, пора- ботайте поочередно с каждым отдельным переключателем бло- ка, проверьте, что каждый бит может быть сброшен в состояние логического О и установлен в состояние логической 1.  14.4. Тестирование параллельного принтерного порта  Подключите принтерный порт так, как это показано на рис. 14.3, запустите программу ptrtestl три раза с тремя различ- ными значениями переменной test, как указано в листинге. За- тем запустите программу ptrtest2 И проверьте правильность вво- да данных, используя блок переключателей (см. рис. 14.3).  Переключатель  0  Коълпьют  ерный порт Ю Ф Ч О) О! А co ю ч от от А co N - o < Блок 3 переключателей  Земля  Разрешение  Логический пробник  Base + 1  .~l0)0‘|h03l\'.I-I-O  LL 25  Рис. 14.3. Соединения для тестирования принтерного порта. 
Контрольно-измерительная аппаратура и тестирование 253  14.4.1. Программа для теста вывода данных  /*ptrtest1.c Вывод 0 на принтерный порт*/  #include <d0s.h> #include <stdio.h> int 0ut_Address = 0x3bc; /* Базовый адрес принтерного порта */ int test = 0; /* ICSI = 0, или 0Х55 или 0XFF"'/ void main()  { outp(Out_Address,test);  printf( "Вывод %0X Ha принтерный 11opT",test); }  Листинг 14.4. 1 . ptrtestl.c.  14.4.2. Программа для теста ввода данных  /*ptrtest1.c Ввод Данных с принтерного порта*/ #include <d0s.h> #include <stdio.h> #include <conio.h>  int In_Address = 0x3bd; /* Базовый адрес +1 */ void main() { int data,i,Y; printf("\n Ввод с принтера. Нажмите любую клавишу для выхода из программы");  printf("\n Ввод с контакта 11 инвертирован\п\п\п"); printf("\n Выводы (контакты) 11 10 12 13 15"); printf("\n БиТЫ 7 6 5 4 3\п"); Y = wherey(); while(!kbhit()) { data = inp(In_Address); gotoxy(9,Y); for(i = 7, i > 2; i ———) printf("%i ",(data > > i)&l); }  }  Листинг 14.4.2. ptrtest2.c. 
254 Глава 14  14.5. Конструкция блоков светодиодов и переключателей  Двумя полезными устройствами, необходимыми для выполне- ния многих упражнений, являются блок светодиодов (СИД) для использования в качестве выходного 8-разрядного индикатора и блок переключателей для «питания» входов. Конкретные при- меры этих устройств приводятся в следующих подразделах. Аль- тернативный подход заключается в использовании комбиниро- ванного блока индикаторов и переключателей, как это описы- вается в разделе 14.5.3.  14.5.1 . Блок светодиодов  В своей основе блок светодиодов состоит из восьми входных клемм и восьми светодиодов. Однако между этими клеммами и светодиодами необходимо включение некоторого буфера, что- бы блок не нагружал1 схему, к которой он подключен. Сущест- вуют две альтернативные схемы. На рисунке 14.4 показан свето- диод с буферным логическим элементом. Для блока потребует- ся восемь подобных схем.  Вход + 5 В  [Логическая 1 включает СШ  Рис. 14.4. Включение светодиода через буферный логический элемент И—НЕ.  Это наиболее предпочтительный способ включения светоди- ода через буферный логический элемент И-НЕ ТТЛ-семейства. Яркость свечения светодиода зависит от прямого тока, который может изменяться в диапазоне от 1 мА до 40 мА. Обычная ТТЛ- схема может принимать? ток величиной 16 мА в состоянии логи-  1 «Нагрузка» в этом смысле вызывает потребление дополнительного тока С выходов нагружаемой схемы, что может привести к нарушению ее работы. 2 «Принимать» в данном контексте означает пропускать или проводить (ток) без опасности повреждения микросхемы. 
Контрольно-измерительная аппаратура и тестирование 255  н Н Н Н Н Н Н Н ‘и 0 -9 -9 0 -9 -9 18 17 16 15 14 13 12 11  гюзд Земля 9 1 6  1 1 1 1 1 1 1 1 „  Октальный вход  Примечания Логическая 1 включает светодиоды R = 220 OM  Рис. 14.5. 8—разрядный формирователь для блока светодиодов.  ческого О. Эта величина определяет минимальное сопротивле- ние резистора R = 220 OM. Компоненты, необходимые для светодиодов с буферными логическими элементами И-НЕ:  КОЛИЧЭСТВО НЗИМЭНОВЗНИЭ  2 7400, счетверенные, 2-входовые логические элементы И-НЕ 8 Резисторы 220 Ом 8 Светодиоды 0 Клеммы Монтажная или печатная схема  1  На рисунке 14.5 показаны восемь светодиодов, подключен- ных к 8—разрядному формирователю Дарлингтона с общим эмиттером (ULN2803A). Компоненты, необходимые для формирователя Дарлингтона (рис. 14.5):  Количество Наименование  1 Формирователь Дарлингтона 283ОА 8 Резисторы 220 Ом 8 Светодиоды 10 Клеммы  Монтажная или печатная схема 
256 Глава 14  14.5.2. Блок переключателей  Подходящая схема блока переключателей показана на рис. 14.6. В ней используется ИС 74LS245 (разводку контактов см. в гл. 2). Для расширения функциональных возможностей блока пере- ключателей схема дополнена выводом (клеммой) для подачи сигнала разрешения. Этот вывод должен быть соединен с «зем- лей», если он не используется.  Входные контакты 74LS245 Выходные Контакты  + 5 В Разрешение Земля  Выходные клеммы  Примечания При замыкании переключателя на выходе логический O R = 1 кОм  Рис. 14.6. Схема блока переключателей.  Компоненты, необходимые для блока переключателей (рис. 14.6):  -.':3: ‘<€\‘k&7.i*-‘;'¢$.*3:3>2$:i:t3.’-‘.»':1‘.i'.'.~': . . . . . . . . . . . _ . _ _ _ _ . „  Количество Наименование 1 ИС 74LS245 8 Резисторы 1 кОм 8 Однополюсные переключатели 12 Клеммы  Монтажная или печатная схема  14.5.3. Экономичный блок переключателей /светодиодов  На рисунке 14.8 показана схема «экономичного» варианта блока пе- реключателей, использующая 8—разрядный переключатель с двух- рядным расположением выводов. Светодиоды включены в схему 
КОНТРОЛЬНО-ИЗМЭрИТЭЛЬНЭЯ аппаратура И тестирование  257  Рис. 14.7. Блок переключатсъчей/светодиодов.  :3- :=  Ё-:-:‹:-:-:-:-с-гти.-:-юч-с-'  т т т т т т т т г | Ё ь о o.o7EL(L$O/_e LL/_wCW1 0—— Входные контакты Земб‘; P 141.5245 он Выходные контакты 1:3} СЙДА и и и и г ‚г и 4 R2 R2 R2 R2 R2 R2 R2 R2 На? о о Ь о о о о о о  Входные/выходные клеммы  Примечания СИДА включается при выборе светодиодов R1 = 1 КОМ R2 = 270 Ом  Земля Земля 4153  SH  Рис. 14-8- КОМбИНИРОВаННЫЙ блок переключателей/светодиодов. 
258 Глава 14  ТаКИМ образом, чтобы обеспечивать индикацию как вводимых, так и выводимых сигналов. В приведенной электрической схеме свето- диод А загорается, когда переключатели находятся в выключенном состоянии. Снимок этого блока приведен на рис. 14.7.  1 4.6. Устройство управления шаговым двигателем  Шаговые двигатели, продаваемые для учебных целей, обычно выпускаются в комплекте с интегральной схемой управления  Рис. 14.9. Коммерческий шаго- вый двигатель.  Бит3  Vss D4 O4 S4 Земля L293E S1 Земля  S3 Q3 D3 EN2  EN1 D1 O1  S2 02 D2Vss  1 Шаговый двигатель  ОВ  5 B Бит 1 Бит О  Рис. 1 4. 1 0. Шаговый двигатель и ИС управления двигателем. 
Контрольно-измерительная аппаратура и тестирование 259  двигателем (драйвером), смонтированной на одном с ним осно- вании. Если используется отдельный коммерческий шаговый двигатель, его можно подключить к И С управления шаговым двигателем L283E no схеме, показанной на рис. 14.10. Детальное описание соединений должно быть приведено в сопроводитель- ной документации к шаговому двигателю.  14.7. Проблемы программного обеспечения  Последний раздел имеет отношение к проблемам исполняемого программного обеспечения. Очевидно, что конкретная про- грамма должна быть успешно скомпилирована с целью получе- ния исполняемого файла (имя.ехе). Важно соблюдать меры предосторожности при работе со сво- ими программами. Используйте по меньшей мере два диска: один для разработки программы и другой для ее резервирова- ния, на втором следует хранить законченную работу. А не то можно получить разрыв сердца, если будет поврежден единст- венный диск, на котором хранятся все ваши программы, и с не- го не удастся прочитать записанную туда информацию. Не за- бывайте, что диски — очень «деликатные» устройства и должны всегда переноситься в коробках. Ниже перечислены те моменты, на которые следует обратить особое внимание в том случае, когда возникают какие-либо проблемы с функционированием интерфейса.  1. Если не удается передать данные с использованием неко- торой аппаратной реализации интерфейса‚ то первое, что приходит в голову, это реализоватьцданный интерфейс 5: другим компьютером. ОСТЕРЕГАИТЕСЬ ПОДОБНОИ ПРАКТИКИ! Испорченный интерфейс может повредить все имеющиеся компьютеры. Однако неплохой идеей яв- ляется проверка и замена соединительных кабелей.  2. Если при выводе данных через порт получается не та ин- формация, которая ожидается, замените оператор printf() Ha оператор ощр() и посмотрите, что появится на экране.  3. Если при вводе данных через порт получается не та ин- формация, которая ожидается, замените оператор getch() на inp() и посмотрите, как вводятся данные с терминала. 
260  Глава 14  Большинство компиляторов позволяют работать в режиме пошаговой проверки, т. е. исполнять программный код по одной команде за один раз. Это полезный режим для об- наружения точки «зависания» программы. При этом мож- но также отслеживать значения переменных.  И вновь следует подчеркнуть, что отсутствие заземления может Привести к необычным результатам. Иногда только некоторые специфические состояния схемы будут казать- ся необычными, например появление логического О или логической 1 на всех входах. 
Список литературы  Black, Ulysses D. (1989) Data Networks. Prentice Hall Coleman, Derek (1994) Object-oriented Development. Prentice Hall Dewar, R. B. K. and Smosna, M. (1990) Microprocessors: A Programmer's View. McGraw—Hill Mano, M. M. (1993) Computer Systems Architecture. Prentice Hall Mitchell (1986) 32-bit Microprocessors. Collins Waite, Mitchell and Prata, Stephen (1990) New C Primer Plus. Howard W. Sams & Co. Waites, Nick and Knot, Geoffrey (1990) A Level, BTEC and First Degree Computing. Business Education Publisher Ltd Whitworth, Ian R. (1984) 16-bit Microprocessors. Collins Wilkinson (1987) Digital Design Systems. Prentice Hall Zaks, Rodnay (198 2) Programming the Z80. Sybex  Литература, выпущенная производителями  (1993) 80C51—Based 8-Bit Microcontrollers. North American Philips Corporation (1998) TMS329 DSP Product Overview. Texas Instruments (1995) Z80 Microprocessor Family. Zilog ( 1987) Microsoft MS—DOS User’s Guide and User’s Reference. Microsoft Corporation.  Дополнительно рекомендованная литература на русском языке  Данкан Р. Профессиональная работа в MS-DOS: M.: Мир, 1992 Джамса К. Учимся программировать на языке С++: М.: Мир, 2001 
Предметный указатель  # include 122 \п 122 АО 52 ANSI 30 ASCII-K021 25-29 Base 156, 200, 201 BS 30 BUSAK 67 BUSRQ 67 CB 238 CP 238 CS 38, 39, 50 С1$С 73, 83—86 сот-порт 103, 143, 147, 148-152 ВО 53 DD 40 define 124 ВЗР-микропроцессоры 98 Е0 36 EN 44 fi'7ush() 130 for getch () 122 hex 18 НТЫ-фильтры INT 50, 67, 68 int character 122 I/P 226 тат () 122 MREQ 50,60 NMI 50, 67,68  ОЕ 37—-39‚ 50 О/Р 179,192,215 РС 64 РР1 154,156—169 РР1-порт 247-252 pr1'ntf() 123 Q 32 RD 39, 44, 50, 60 read() 134 FR 178 RISC 73, 86-88 sizeo/() 125 scanf126 SP 53, 67 void 122 Vs 175 WE 38, 39, 50 WR 39, 50  Адрес базовый 156, 200, 201 , адресация векторная 69——70 АЛУ 57 АМ 99 амперсант 126 аналого-цифровой преобразова- тель 88, 100, 187-—199 арифметике-логическое устрой— ство 57 АЦП 88, 100, 187-199 
Предметный указатель 263  Байт 85 бит стартовый 144, 147 ~ СТОПОВЫЙ 144, 147 — четности 25, 144, 147 блок переключателей 256-—258 -— светодиодов 54, 254, 256 бод 144 БП 157, 254 буфер с тремя состояниями 37-40 — - — счетверенный 37 ~ — — 8—разряднь1й 39, 40, 43 — — — —— двунаправленный 40  ВБП 99 вольтметр 197-—199, 214-219 вход разрешения 44 — виртуально заземленный 176 выбор микросхемы 38  Генератор ФУНКЦиональный 182-— 186, 21 1—-2 14  Двигатель шаговый 169——174‚ 208—211‚ 233-244, 258 ДДК 17  дешифратор адреса 36, 44, 53 дополнение до 2 20, 21 доступ к памяти прямой 67 дуплекс полный 147  Запись 39 Запрос шины 67  Измеритель потока воздуха 92 импульс стробирУЮЩий 42 ~ тактовый 77 индикатор семисегментный 46, 47  индикация мультиплексная 93 ИС 33, 76, 98  Карта распределения памяти 54 квитирование 152, 162, 163, 167 КМОП 33-35, 222 код операции 61 — Двоично-десятичный 17 — машинный 51 —- семисегментный 47 компилирование 120 компоновка 120 кэширование 79, 80 кэш—память с прямым отображе- нием 80  Логическая 1 145 логический 0 145  Мантисса 22, 23 меню 138 микроконтроллер однокристаль- ный 76, 88-90 микропрограммное обеспечение 49, 51 микропроцессор 48, 55, 73—105 модуляция амплитудная 99 - широтно-импульсная 90, 97 МП 55  Направление передачи данных 40 НБП 99  Обеспечение микропрограммное 49, 51 оборудование периферийное 50 
264 Предметный указатель  ОБП 99 обработка конвейерная 77 — сигналов 98 ОЗУ 38,45, 52, 53 окна регистров перекрывающие- ся 80 операнд 61 оперативное запоминающее уст- ройсгво 38, 45, 52, 53  ПДП 67 передатчик 146, 147 передача данных последователь- ная 143, 232 — асинхронная 85 — синхронная 85 — параллельная 154 переменные глобальные 119, 122 — локальные 119, 122 переносимость 118 петля гистерезиса 222 ПЗУ 51, 53 платы 102, 103 подтверждение шины 67 полный дуплекс 147 полудуплекс 152 порт сот- 103, 143, 147, 148, 150-152 — последовательный 103 -— принтерный 103, 200——244‚ 252, 253 порядок 22, 23 порядки смещенные 23, 24 постоянное запоминающее уст- ройство 51, 53 преобразователь цифро-аналого- вый 101, 175 прерывание 67——72 — маскируемое 67, 68 — немаскируемое 50, 67, 68, 70  приемник 147 приемопередатчик октальный 40 программа начальной загрузки 51 производительность МП 77——83 пространство адресное 44 прямое преобразование двоичных чисел 15—17 псевдокод 112 ПФ 100  Разрешение по выходу 37 —- no записи 38, 39 расширение .с 120 —.com 49 .exe 120 .hex 49 .1st 49 .obj 120 регистр 176 —- верхний 25 — НИЖНИЙ 25 - состояния 57, 58 — управляющий 156 регистры спецназначения 57 режим 144, 156 —- диспетчера 85, 88 —- пользователя 85, 88 режимы адресации 61——64, 85 резистор обратной связи 178  I  C6poc 51, 52 СВ 237 сегмент 77 сигнал синхронизации 52 — выбора микэосхемы 38 — направления передачи данных 40 — записи 39 — стробирующий управляющий 42,220 
Предметный указатель 265 — чтения 39, 44 — — микропрограммное 82 СИД 93, 254 уровни квантования 187 символы алфавитно-Цифровые 25 усилитель операционный 176,  система асинхронная 145 —— шинная 43 слово 85 - длинное 85 — управляющее 154 СМР 15 состояние высокого импеданса 37, 67 — логическое 30 соединения мультиплексные 77 СПД 109—1 12 СР 238 средства аппаратные 48, 49, 146 — программные 48 ССР 19 стек 54 структурное программирование Джексона 109-112 сумматор 57 счетчик команд 64 — со сквозным переносом 225 считывание 44 схема интегральная 33, 76, 98 — логическая последовательного действия 42 — синхронизации 52  Т 225, 237 таблица истинности 30-41 — трассировки 65, 66 триггер Шмитта 220—-223 —- защелка 42 ТГЛ 33-35, 221  Указатель стека 53, 64 управление микропроцессором аппаратное 82  198, 218 устройство арифметико—логиче- ское 57 — периферийное 105 — постоянное запоминающее 49, 51, 53 — оперативное запоминающее 38, 45, 52, 53 — с тремя выходными состояния- ми 37 ~— 41  Файл выполняемый 123 — исходного кода 119 — объектный 123 — помощи 118 — регистров 80 — с расширением .com 49 — c расширением .ехе 120 — с расширением .hex 49 — c расширением .1st 49 фиксатор В-типа 42 фильтр 100 фильтрация цифровая 101 ФНЧ 100 формат команд МС 68000 85 функция языка СИ # include 122 — -— — \n 122 — — — define 124 — —- — for — — —- getch () 122 — — - int character 122 —— — — main () 122 — — -primjf() 123 — ~— - scanf 126 функции пустые 141 
266 Предметный указатель  ЦАП 101, 175 цифрово-анапоговый преобразо- ватель 101, 175  Частота тактовая 51, 74 частотомер 220, 225—232‚ числа двоичные 15—17 — с плавающей точкой 22——24 — со знаком 19-22 — шестнадцатеричные 18, 19  Шина адресная 52, 75 ~ данных 53, 74, 75 - — параллельная 76 —— управляющая 53 шинная система 43  Элементы логические 30-35 ЭЛО 182  Язык ассемблера 49 
Учебное издание  Джордж Смит  Сопряжение компьютеров с внешними устройствами  Уроки реализации  Зав. редакцией Т. Г. Хохлова Ведущий редактор Н. М. Савина Художник В. П. Григорьев Художественный редактор Н. В. Зотова Технический редактор Е. В. Денюкова Оригинал-макет подготовлен Е. В. Денюковой  Лицензия ЛР N9 010174 OT 20.05.97r.  Подписано к печати 20.10.2000 r. Формат 60 х 90/16. Бумага офсетная. Гарнитура NewtonC. Печать офсетная. Объем 8,50 бум. л. Усл.-печ. л. 17,00. Уч.-изд. л. 14,37. Изд. N9 6/9734. Тираж 5000 экз. Заказ 6853 Издательство «Мир» Министерства РФ по делам печати, телерадиовещания и средств массовых коммуникаций. 129820, Москва, 1-й Рижский пер.‚ 2  Диапозитивы изготовлены в издательстве «Мир» Отпечатано в Производственно-издательском комбинате ВИНИТИ,  140010, г. Люберцы, Московской обл., Октябрьский пр-т, 403. Тел. S54-21-86 
I ж.Смит ~  ОПРЯЖЕНИЕ КОМПЬЮТЕРОВ С ВНЕЩНИМИ урдки УСТРОИСТВАМИ реализации  Книга представляет собой практический курс по уп- равлению внешними устройствами через сот-порт, па- раллельный принтерный порт и параллельный програм- мируемый интерфейсный порт. В ней рассматривается создание на основе ПК виртуальных измерительных приборов и управляющих комплексов, обладающих преимуществами ПК: возможностью цифровой обра- ботки данных в реальном масштабе времени и сохране- ния результатов в удобном виде. Книга дает общее представление о микропроцес- сорных системах и выгодно отличается от других мате- риалов тем, что содержит описание как аппаратных, так и программных средств. Серии программных примеров знакомят читателя о ‘применением языка высокого уровня для ввода/вывода и управления внешними уст- ройствами. В целях облегчения самостоятельного изучения предмета в книгу включено множество практических за- даний и программных упражнений, в которых использу- ются минимальный набор аппаратных средств и про- стые для восприятия программы Книга может служить прекрасным учебным пособи- ем для студентов вузов и колледжей, а также продвину- тых старшеклассников, изучающих микропроцессор- ные системы.  дд" "р°"°д°°аТ°"°Й ISBN 5—O3—OO3371-8 и студентов вузов и колледжей  9 785030 033716